Skip to content
Snippets Groups Projects
  1. Apr 24, 2022
  2. Apr 22, 2022
  3. Apr 21, 2022
  4. Apr 20, 2022
  5. Apr 19, 2022
    • Ye Bin's avatar
      ext4: fix fs corruption when tring to remove a non-empty directory with IO error · 5ac69702
      Ye Bin authored
      mainline inclusion
      from mainline-v5.18-rc1
      commit 7aab5c84a0f6ec2290e2ba4a6b245178b1bf949a
      category: bugfix
      bugzilla: https://gitee.com/openeuler/kernel/issues/I52WOM
      
      
      CVE: NA
      
      --------------------------------
      
      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.com
      
      
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      
      conflicts:
      fs/ext4/namei.c
      
      Signed-off-by: default avatarYe Bin <yebin10@huawei.com>
      Reviewed-by: default avatarZhang Yi <yi.zhang@huawei.com>
      Signed-off-by: default avatarYongqiang Liu <liuyongqiang13@huawei.com>