• Edmund Nadolski's avatar
    btrfs: add missing initialization in btrfs_check_shared · 18bf591b
    Edmund Nadolski authored
    This patch addresses an issue that causes fiemap to falsely
    report a shared extent.  The test case is as follows:
    
    xfs_io -f -d -c "pwrite -b 16k 0 64k" -c "fiemap -v" /media/scratch/file5
    sync
    xfs_io  -c "fiemap -v" /media/scratch/file5
    
    which gives the resulting output:
    
    wrote 65536/65536 bytes at offset 0
    64 KiB, 4 ops; 0.0000 sec (121.359 MiB/sec and 7766.9903 ops/sec)
    /media/scratch/file5:
     EXT: FILE-OFFSET      BLOCK-RANGE      TOTAL FLAGS
       0: [0..127]:        24576..24703       128 0x2001
    /media/scratch/file5:
     EXT: FILE-OFFSET      BLOCK-RANGE      TOTAL FLAGS
       0: [0..127]:        24576..24703       128   0x1
    
    This is because btrfs_check_shared calls find_parent_nodes
    repeatedly in a loop, passing a share_check struct to report
    the count of shared extent. But btrfs_check_shared does not
    re-initialize the count value to zero for subsequent calls
    from the loop, resulting in a false share count value. This
    is a regressive behavior from 4.13.
    
    With proper re-initialization the test result is as follows:
    
    wrote 65536/65536 bytes at offset 0
    64 KiB, 4 ops; 0.0000 sec (110.035 MiB/sec and 7042.2535 ops/sec)
    /media/scratch/file5:
     EXT: FILE-OFFSET      BLOCK-RANGE      TOTAL FLAGS
       0: [0..127]:        24576..24703       128   0x1
    /media/scratch/file5:
     EXT: FILE-OFFSET      BLOCK-RANGE      TOTAL FLAGS
       0: [0..127]:        24576..24703       128   0x1
    
    which corrects the regression.
    
    Fixes: 3ec4d323 ("btrfs: allow backref search checks for shared extents")
    Signed-off-by: default avatarEdmund Nadolski <enadolski@suse.com>
    [ add text from cover letter to changelog ]
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    18bf591b
backref.c 59.8 KB