Skip to content
  • Filipe Manana's avatar
    Btrfs: send, allow clone operations within the same file · 11f2069c
    Filipe Manana authored
    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 a96fbc72
    
     ("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
    
    Reviewed-by: default avatarJosef Bacik <josef@toxicpanda.com>
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    11f2069c