• L
    Btrfs: fix a bug of snapshot-aware defrag to make it work on partial extents · e68afa49
    Liu Bo 提交于
    For partial extents, snapshot-aware defrag does not work as expected,
    since
    a) we use the wrong logical offset to search for parents, which should be
       disk_bytenr + extent_offset, not just disk_bytenr,
    b) 'offset' returned by the backref walking just refers to key.offset, not
       the 'offset' stored in btrfs_extent_data_ref which is
       (key.offset - extent_offset).
    
    The reproducer:
    $ mkfs.btrfs sda
    $ mount sda /mnt
    $ btrfs sub create /mnt/sub
    $ for i in `seq 5 -1 1`; do dd if=/dev/zero of=/mnt/sub/foo bs=5k count=1 seek=$i conv=notrunc oflag=sync; done
    $ btrfs sub snap /mnt/sub /mnt/snap1
    $ btrfs sub snap /mnt/sub /mnt/snap2
    $ sync; btrfs filesystem defrag /mnt/sub/foo;
    $ umount /mnt
    $ btrfs-debug-tree sda (Here we can check whether the defrag operation is snapshot-awared.
    
    This addresses the above two problems.
    Signed-off-by: NLiu Bo <bo.li.liu@oracle.com>
    Signed-off-by: NJosef Bacik <jbacik@fusionio.com>
    Signed-off-by: NChris Mason <chris.mason@fusionio.com>
    e68afa49
inode.c 230.5 KB