• Y
    ext4: fix file system corrupted when rmdir non empty directory with IO error · 35bd50bc
    Ye Bin 提交于
    hulk inclusion
    category: bugfix
    bugzilla: 186220, https://gitee.com/openeuler/kernel/issues/I4T50S
    
    -----------------------------------------------
    
    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.
    Signed-off-by: NYe Bin <yebin10@huawei.com>
    Reviewed-by: NZhang Yi <yi.zhang@huawei.com>
    Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
    35bd50bc
namei.c 104.7 KB