• Ye Bin's avatar
    ext4: fix fs corruption when tring to remove a non-empty directory with IO error · 7aab5c84
    Ye Bin authored
    We inject IO error when rmdir non empty direcory, then got issue as follows:
    step1: mkfs.ext4 -F /dev/sda
    step2: mount /dev/sda  test
    step3: cd test
    step4: mkdir -p 1/2
    step5: rmdir 1
    	[  110.920551] ext4_empty_dir: inject fault
    	[  110.921926] EXT4-fs warning (device sda): ext4_rmdir:3113: inode #12:
    	comm rmdir: empty directory '1' has too many links (3)
    step6: cd ..
    step7: umount test
    step8: fsck.ext4 -f /dev/sda
    	e2fsck 1.42.9 (28-Dec-2013)
    	Pass 1: Checking inodes, blocks, and sizes
    	Pass 2: Checking directory structure
    	Entry '..' in .../??? (13) has deleted/unused inode 12.  Clear<y>? yes
    	Pass 3: Checking directory connectivity
    	Unconnected directory inode 13 (...)
    	Connect to /lost+found<y>? yes
    	Pass 4: Checking reference counts
    	Inode 13 ref count is 3, should be 2.  Fix<y>? yes
    	Pass 5: Checking group summary information
    
    	/dev/sda: ***** FILE SYSTEM WAS MODIFIED *****
    	/dev/sda: 12/131072 files (0.0% non-contiguous), 26157/524288 blocks
    
    ext4_rmdir
    	if (!ext4_empty_dir(inode))
    		goto end_rmdir;
    ext4_empty_dir
    	bh = ext4_read_dirblock(inode, 0, DIRENT_HTREE);
    	if (IS_ERR(bh))
    		return true;
    Now if read directory block failed, 'ext4_empty_dir' will return true, assume
    directory is empty. Obviously, it will lead to above issue.
    To solve this issue, if read directory block failed 'ext4_empty_dir' just
    return false. To avoid making things worse when file system is already
    corrupted, 'ext4_empty_dir' also return false.
    Signed-off-by: default avatarYe Bin <yebin10@huawei.com>
    Cc: stable@kernel.org
    Link: https://lore.kernel.org/r/20220228024815.3952506-1-yebin10@huawei.comSigned-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
    7aab5c84
namei.c 109 KB