• Filipe David Borba Manana's avatar
    Btrfs: use right clone root offset for compressed extents · 93de4ba8
    Filipe David Borba Manana authored
    For non compressed extents, iterate_extent_inodes() gives us offsets
    that take into account the data offset from the file extent items, while
    for compressed extents it doesn't. Therefore we have to adjust them before
    placing them in a send clone instruction. Not doing this adjustment leads to
    the receiving end requesting for a wrong a file range to the clone ioctl,
    which results in different file content from the one in the original send
    root.
    
    Issue reproducible with the following excerpt from the test I made for
    xfstests:
    
      _scratch_mkfs
      _scratch_mount "-o compress-force=lzo"
    
      $XFS_IO_PROG -f -c "truncate 118811" $SCRATCH_MNT/foo
      $XFS_IO_PROG -c "pwrite -S 0x0d -b 39987 92267 39987" $SCRATCH_MNT/foo
    
      $BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1
    
      $XFS_IO_PROG -c "pwrite -S 0x3e -b 80000 200000 80000" $SCRATCH_MNT/foo
      $BTRFS_UTIL_PROG filesystem sync $SCRATCH_MNT
      $XFS_IO_PROG -c "pwrite -S 0xdc -b 10000 250000 10000" $SCRATCH_MNT/foo
      $XFS_IO_PROG -c "pwrite -S 0xff -b 10000 300000 10000" $SCRATCH_MNT/foo
    
      # will be used for incremental send to be able to issue clone operations
      $BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/clones_snap
    
      $BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap2
    
      $FSSUM_PROG -A -f -w $tmp/1.fssum $SCRATCH_MNT/mysnap1
      $FSSUM_PROG -A -f -w $tmp/2.fssum -x $SCRATCH_MNT/mysnap2/mysnap1 \
          -x $SCRATCH_MNT/mysnap2/clones_snap $SCRATCH_MNT/mysnap2
      $FSSUM_PROG -A -f -w $tmp/clones.fssum $SCRATCH_MNT/clones_snap \
          -x $SCRATCH_MNT/clones_snap/mysnap1 -x $SCRATCH_MNT/clones_snap/mysnap2
    
      $BTRFS_UTIL_PROG send $SCRATCH_MNT/mysnap1 -f $tmp/1.snap
      $BTRFS_UTIL_PROG send $SCRATCH_MNT/clones_snap -f $tmp/clones.snap
      $BTRFS_UTIL_PROG send -p $SCRATCH_MNT/mysnap1 \
          -c $SCRATCH_MNT/clones_snap $SCRATCH_MNT/mysnap2 -f $tmp/2.snap
    
      _scratch_unmount
      _scratch_mkfs
      _scratch_mount
    
      $BTRFS_UTIL_PROG receive $SCRATCH_MNT -f $tmp/1.snap
      $FSSUM_PROG -r $tmp/1.fssum $SCRATCH_MNT/mysnap1 2>> $seqres.full
    
      $BTRFS_UTIL_PROG receive $SCRATCH_MNT -f $tmp/clones.snap
      $FSSUM_PROG -r $tmp/clones.fssum $SCRATCH_MNT/clones_snap 2>> $seqres.full
    
      $BTRFS_UTIL_PROG receive $SCRATCH_MNT -f $tmp/2.snap
      $FSSUM_PROG -r $tmp/2.fssum $SCRATCH_MNT/mysnap2 2>> $seqres.full
    Signed-off-by: default avatarFilipe David Borba Manana <fdmanana@gmail.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    93de4ba8
send.c 125 KB