linux/fs/ext4
Darrick J. Wong d80d448c6c ext4: fix same-dir rename when inline data directory overflows
When performing a same-directory rename, it's possible that adding or
setting the new directory entry will cause the directory to overflow
the inline data area, which causes the directory to be converted to an
extent-based directory.  Under this circumstance it is necessary to
re-read the directory when deleting the old dirent because the "old
directory" context still points to i_block in the inode table, which
is now an extent tree root!  The delete fails with an FS error, and
the subsequent fsck complains about incorrect link counts and
hardlinked directories.

Test case (originally found with flat_dir_test in the metadata_csum
test program):

# mkfs.ext4 -O inline_data /dev/sda
# mount /dev/sda /mnt
# mkdir /mnt/x
# touch /mnt/x/changelog.gz /mnt/x/copyright /mnt/x/README.Debian
# sync
# for i in /mnt/x/*; do mv $i $i.longer; done
# ls -la /mnt/x/
total 0
-rw-r--r-- 1 root root 0 Aug 25 12:03 changelog.gz.longer
-rw-r--r-- 1 root root 0 Aug 25 12:03 copyright
-rw-r--r-- 1 root root 0 Aug 25 12:03 copyright.longer
-rw-r--r-- 1 root root 0 Aug 25 12:03 README.Debian.longer

(Hey!  Why are there four files now??)

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Cc: stable@vger.kernel.org
2014-08-28 22:22:29 -04:00
..
Kconfig
Makefile
acl.c
acl.h
balloc.c ext4: remove metadata reservation checks 2014-07-15 06:02:38 -04:00
bitmap.c
block_validity.c
dir.c ext4: check inline directory before converting 2014-07-28 13:06:26 -04:00
ext4.h ext4: move i_size,i_disksize update routines to helper function 2014-08-23 17:48:28 -04:00
ext4_extents.h
ext4_jbd2.c ext4: make local functions static 2014-05-12 10:50:23 -04:00
ext4_jbd2.h ext4: make local functions static 2014-05-12 10:50:23 -04:00
extents.c ext4: fix transaction issues for ext4_fallocate and ext_zero_range 2014-08-27 18:40:00 -04:00
extents_status.c ext4: fix a potential deadlock in __ext4_es_shrink() 2014-07-12 15:32:24 -04:00
extents_status.h
file.c ext4: remove readpage() check in ext4_mmap_file() 2014-07-15 09:56:19 -04:00
fsync.c
hash.c
ialloc.c ext4: fix potential null pointer dereference in ext4_free_inode 2014-07-12 16:11:42 -04:00
indirect.c ext4: fix punch hole on files with indirect mapping 2014-07-15 06:03:38 -04:00
inline.c ext4: check inline directory before converting 2014-07-28 13:06:26 -04:00
inode.c ext4: update i_disksize coherently with block allocation on error path 2014-08-28 22:20:41 -04:00
ioctl.c
mballoc.c ext4: fix BUG_ON in mb_free_blocks() 2014-08-23 17:47:28 -04:00
mballoc.h
migrate.c ext4: add i_data_sem sanity check 2014-07-27 22:28:15 -04:00
mmp.c ext4: make local functions static 2014-05-12 10:50:23 -04:00
move_extent.c ext4: fix incorrect locking in move_extent_per_page 2014-07-27 22:32:27 -04:00
namei.c ext4: fix same-dir rename when inline data directory overflows 2014-08-28 22:22:29 -04:00
page-io.c Clean ups and miscellaneous bug fixes, in particular for the new 2014-06-08 13:03:35 -07:00
resize.c Clean ups and miscellaneous bug fixes, in particular for the new 2014-06-08 13:03:35 -07:00
super.c jbd2: fix descriptor block size handling errors with journal_csum 2014-08-28 22:22:29 -04:00
symlink.c
truncate.h
xattr.c ext4: add missing BUFFER_TRACE before ext4_journal_get_write_access 2014-05-12 22:06:43 -04:00
xattr.h
xattr_security.c
xattr_trusted.c
xattr_user.c