• Qu Wenruo's avatar
    btrfs: fix wrong offset to zero out range beyond i_size · d2dcc8ed
    Qu Wenruo authored
    [BUG]
    The test generic/091 fails , with the following output:
    
      fsx -N 10000 -o 128000 -l 500000 -r PSIZE -t BSIZE -w BSIZE -Z -W
      mapped writes DISABLED
      Seed set to 1
      main: filesystem does not support fallocate mode FALLOC_FL_COLLAPSE_RANGE, disabling!
      main: filesystem does not support fallocate mode FALLOC_FL_INSERT_RANGE, disabling!
      skipping zero size read
      truncating to largest ever: 0xe400
      copying to largest ever: 0x1f400
      cloning to largest ever: 0x70000
      cloning to largest ever: 0x77000
      fallocating to largest ever: 0x7a120
      Mapped Read: non-zero data past EOF (0x3a7ff) page offset 0x800 is 0xf2e1 <<<
      ...
    
    [CAUSE]
    In commit c28ea613
    
     ("btrfs: subpage: fix the false data csum mismatch error")
    end_bio_extent_readpage() changes to only zero the range inside the bvec
    for incoming subpage support.
    
    But that commit is using incorrect offset to calculate the start.
    
    For subpage, we can have a case that the whole bvec is beyond isize,
    thus we need to calculate the correct offset.
    
    But the offending commit is using @end (bvec end), other than @start
    (bvec start) to calculate the start offset.
    
    This means, we only zero the last byte of the bvec, not from the isize.
    This stupid bug makes the range beyond isize is not properly zeroed, and
    failed above test.
    
    [FIX]
    Use correct @start to calculate the range start.
    Reported-by: default avatarkernel test robot <oliver.sang@intel.com>
    Fixes: c28ea613
    
     ("btrfs: subpage: fix the false data csum mismatch error")
    Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    d2dcc8ed
extent_io.c 175 KB