• Ye Bin's avatar
    ext4: fix reserved cluster accounting in __es_remove_extent() · 1da18e38
    Ye Bin authored
    When bigalloc is enabled, reserved cluster accounting for delayed
    allocation is handled in extent_status.c.  With a corrupted file
    system, it's possible for this accounting to be incorrect,
    dsicovered by Syzbot:
    
    EXT4-fs error (device loop0): ext4_validate_block_bitmap:398: comm rep:
    	bg 0: block 5: invalid block bitmap
    EXT4-fs (loop0): Delayed block allocation failed for inode 18 at logical
    	offset 0 with max blocks 32 with error 28
    EXT4-fs (loop0): This should not happen!! Data will be lost
    
    EXT4-fs (loop0): Total free blocks count 0
    EXT4-fs (loop0): Free/Dirty block details
    EXT4-fs (loop0): free_blocks=0
    EXT4-fs (loop0): dirty_blocks=32
    EXT4-fs (loop0): Block reservation details
    EXT4-fs (loop0): i_reserved_data_blocks=2
    EXT4-fs (loop0): Inode 18 (00000000845cd634):
    	i_reserved_data_blocks (1) not cleared!
    
    Above issue happens as follows:
    Assume:
    sbi->s_cluster_ratio = 16
    Step1:
    Insert delay block [0, 31] -> ei->i_reserved_data_blocks=2
    Step2:
    ext4_writepages
      mpage_map_and_submit_extent -> return failed
      mpage_release_unused_pages -> to release [0, 30]
        ext4_es_remove_extent -> remove lblk=0 end=30
          __es_remove_extent -> len1=0 len2=31-30=1
     __es_remove_extent:
     ...
     if (len2 > 0) {
      ...
    	  if (len1 > 0) {
    		  ...
    	  } else {
    		es->es_lblk = end + 1;
    		es->es_len = len2;
    		...
    	  }
      	if (count_reserved)
    		count_rsvd(inode, lblk, ...);
    	goto out; -> will return but didn't calculate 'reserved'
     ...
    Step3:
    ext4_destroy_inode -> trigger "i_reserved_data_blocks (1) not cleared!"
    
    To solve above issue if 'len2>0' call 'get_rsvd()' before goto out.
    
    Reported-by: syzbot+05a0f0ccab4a25626e38@syzkaller.appspotmail.com
    Fixes: 8fcc3a58
    
     ("ext4: rework reserved cluster accounting when invalidating pages")
    Signed-off-by: default avatarYe Bin <yebin10@huawei.com>
    Reviewed-by: default avatarEric Whitney <enwlinux@gmail.com>
    Link: https://lore.kernel.org/r/20221208033426.1832460-2-yebin@huaweicloud.com
    
    Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
    Cc: stable@kernel.org
    1da18e38
extents_status.c 60.2 KB