• B
    btrfs: return whole extents in fiemap · 71b80734
    Boris Burkov 提交于
    stable inclusion
    from stable-5.10.42
    commit c7e0c6047c4f2a9664e48e3671af80c513220a44
    bugzilla: 55093
    CVE: NA
    
    --------------------------------
    
    [ Upstream commit 15c7745c ]
    
      `xfs_io -c 'fiemap <off> <len>' <file>`
    
    can give surprising results on btrfs that differ from xfs.
    
    btrfs prints out extents trimmed to fit the user input. If the user's
    fiemap request has an offset, then rather than returning each whole
    extent which intersects that range, we also trim the start extent to not
    have start < off.
    
    Documentation in filesystems/fiemap.txt and the xfs_io man page suggests
    that returning the whole extent is expected.
    
    Some cases which all yield the same fiemap in xfs, but not btrfs:
      dd if=/dev/zero of=$f bs=4k count=1
      sudo xfs_io -c 'fiemap 0 1024' $f
        0: [0..7]: 26624..26631
      sudo xfs_io -c 'fiemap 2048 1024' $f
        0: [4..7]: 26628..26631
      sudo xfs_io -c 'fiemap 2048 4096' $f
        0: [4..7]: 26628..26631
      sudo xfs_io -c 'fiemap 3584 512' $f
        0: [7..7]: 26631..26631
      sudo xfs_io -c 'fiemap 4091 5' $f
        0: [7..6]: 26631..26630
    
    I believe this is a consequence of the logic for merging contiguous
    extents represented by separate extent items. That logic needs to track
    the last offset as it loops through the extent items, which happens to
    pick up the start offset on the first iteration, and trim off the
    beginning of the full extent. To fix it, start `off` at 0 rather than
    `start` so that we keep the iteration/merging intact without cutting off
    the start of the extent.
    
    after the fix, all the above commands give:
    
      0: [0..7]: 26624..26631
    
    The merging logic is exercised by fstest generic/483, and I have written
    a new fstest for checking we don't have backwards or zero-length fiemaps
    for cases like those above.
    Reviewed-by: NJosef Bacik <josef@toxicpanda.com>
    Signed-off-by: NBoris Burkov <boris@bur.io>
    Signed-off-by: NDavid Sterba <dsterba@suse.com>
    Signed-off-by: NSasha Levin <sashal@kernel.org>
    Signed-off-by: NChen Jun <chenjun102@huawei.com>
    Acked-by: NWeilong Chen <chenweilong@huawei.com>
    Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
    71b80734
extent_io.c 157.2 KB