On Wed, Oct 30, 2019 at 12:23:11PM +0000, fdmanana@xxxxxxxxxx wrote:
> From: Filipe Manana <fdmanana@xxxxxxxx>
>
> For send we currently skip clone operations when the source and destination
> files are the same. This is so because clone didn't support this case in
> its early days, but support for it was added back in May 2013 by commit
> a96fbc72884fcb ("Btrfs: allow file data clone within a file"). This change
> adds support for it.
>
> Example:
>
> $ mkfs.btrfs -f /dev/sdd
> $ mount /dev/sdd /mnt/sdd
>
> $ xfs_io -f -c "pwrite -S 0xab -b 64K 0 64K" /mnt/sdd/foobar
> $ xfs_io -c "reflink /mnt/sdd/foobar 0 64K 64K" /mnt/sdd/foobar
>
> $ btrfs subvolume snapshot -r /mnt/sdd /mnt/sdd/snap
>
> $ mkfs.btrfs -f /dev/sde
> $ mount /dev/sde /mnt/sde
>
> $ btrfs send /mnt/sdd/snap | btrfs receive /mnt/sde
>
> Without this change file foobar at the destination has a single 128Kb
> extent:
>
> $ filefrag -v /mnt/sde/snap/foobar
> Filesystem type is: 9123683e
> File size of /mnt/sde/snap/foobar is 131072 (32 blocks of 4096 bytes)
> ext: logical_offset: physical_offset: length: expected: flags:
> 0: 0.. 31: 0.. 31: 32: last,unknown_loc,delalloc,eof
> /mnt/sde/snap/foobar: 1 extent found
>
> With this we get a single 64Kb extent that is shared at file offsets 0
> and 64K, just like in the source filesystem:
>
> $ filefrag -v /mnt/sde/snap/foobar
> Filesystem type is: 9123683e
> File size of /mnt/sde/snap/foobar is 131072 (32 blocks of 4096 bytes)
> ext: logical_offset: physical_offset: length: expected: flags:
> 0: 0.. 15: 3328.. 3343: 16: shared
> 1: 16.. 31: 3328.. 3343: 16: 3344: last,shared,eof
> /mnt/sde/snap/foobar: 2 extents found
>
> Signed-off-by: Filipe Manana <fdmanana@xxxxxxxx>
Reviewed-by: Josef Bacik <josef@xxxxxxxxxxxxxx>
Thanks,
Josef