Skip to content
  • Filipe David Borba Manana's avatar
    Btrfs: fix send to not send non-aligned clone operations · 28e5dd8f
    Filipe David Borba Manana authored
    
    
    It is possible for the send feature to send clone operations that
    request a cloning range (offset + length) that is not aligned with
    the block size. This makes the btrfs receive command send issue a
    clone ioctl call that will fail, as the ioctl will return an -EINVAL
    error because of the unaligned range.
    
    Fix this by not sending clone operations for non block aligned ranges,
    and instead send regular write operation for these (less common) cases.
    
    The following xfstest reproduces this issue, which fails on the second
    btrfs receive command without this change:
    
      seq=`basename $0`
      seqres=$RESULT_DIR/$seq
      echo "QA output created by $seq"
    
      tmp=`mktemp -d`
    
      status=1	# failure is the default!
      trap "_cleanup; exit \$status" 0 1 2 3 15
    
      _cleanup()
      {
          rm -fr $tmp
      }
    
      # get standard environment, filters and checks
      . ./common/rc
      . ./common/filter
    
      # real QA test starts here
      _supported_fs btrfs
      _supported_os Linux
      _require_scratch
      _need_to_be_root
    
      rm -f $seqres.full
    
      _scratch_mkfs >/dev/null 2>&1
      _scratch_mount
    
      $XFS_IO_PROG -f -c "truncate 819200" $SCRATCH_MNT/foo | _filter_xfs_io
      $BTRFS_UTIL_PROG filesystem sync $SCRATCH_MNT | _filter_scratch
    
      $XFS_IO_PROG -c "falloc -k 819200 667648" $SCRATCH_MNT/foo | _filter_xfs_io
      $BTRFS_UTIL_PROG filesystem sync $SCRATCH_MNT | _filter_scratch
    
      $XFS_IO_PROG -f -c "pwrite 1482752 2978" $SCRATCH_MNT/foo | _filter_xfs_io
      $BTRFS_UTIL_PROG filesystem sync $SCRATCH_MNT | _filter_scratch
    
      $BTRFS_UTIL_PROG subvol snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1 | \
          _filter_scratch
    
      $XFS_IO_PROG -f -c "truncate 883305" $SCRATCH_MNT/foo | _filter_xfs_io
      $BTRFS_UTIL_PROG filesystem sync $SCRATCH_MNT | _filter_scratch
    
      $BTRFS_UTIL_PROG subvol snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap2 | \
          _filter_scratch
    
      $BTRFS_UTIL_PROG send $SCRATCH_MNT/mysnap1 -f $tmp/1.snap 2>&1 | _filter_scratch
      $BTRFS_UTIL_PROG send -p $SCRATCH_MNT/mysnap1 $SCRATCH_MNT/mysnap2 \
          -f $tmp/2.snap 2>&1 | _filter_scratch
    
      md5sum $SCRATCH_MNT/foo | _filter_scratch
      md5sum $SCRATCH_MNT/mysnap1/foo | _filter_scratch
      md5sum $SCRATCH_MNT/mysnap2/foo | _filter_scratch
    
      _scratch_unmount
      _check_btrfs_filesystem $SCRATCH_DEV
      _scratch_mkfs >/dev/null 2>&1
      _scratch_mount
    
      $BTRFS_UTIL_PROG receive $SCRATCH_MNT -f $tmp/1.snap
      md5sum $SCRATCH_MNT/mysnap1/foo | _filter_scratch
    
      $BTRFS_UTIL_PROG receive $SCRATCH_MNT -f $tmp/2.snap
      md5sum $SCRATCH_MNT/mysnap2/foo | _filter_scratch
    
      _scratch_unmount
      _check_btrfs_filesystem $SCRATCH_DEV
    
      status=0
      exit
    
    The tests expected output is:
    
      QA output created by 025
      FSSync 'SCRATCH_MNT'
      FSSync 'SCRATCH_MNT'
      wrote 2978/2978 bytes at offset 1482752
      XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
      FSSync 'SCRATCH_MNT'
      Create a readonly snapshot of 'SCRATCH_MNT' in 'SCRATCH_MNT/mysnap1'
      FSSync 'SCRATCH_MNT'
      Create a readonly snapshot of 'SCRATCH_MNT' in 'SCRATCH_MNT/mysnap2'
      At subvol SCRATCH_MNT/mysnap1
      At subvol SCRATCH_MNT/mysnap2
      129b8eaee8d3c2bcad49bec596591cb3  SCRATCH_MNT/foo
      42b6369eae2a8725c1aacc0440e597aa  SCRATCH_MNT/mysnap1/foo
      129b8eaee8d3c2bcad49bec596591cb3  SCRATCH_MNT/mysnap2/foo
      At subvol mysnap1
      42b6369eae2a8725c1aacc0440e597aa  SCRATCH_MNT/mysnap1/foo
      At snapshot mysnap2
      129b8eaee8d3c2bcad49bec596591cb3  SCRATCH_MNT/mysnap2/foo
    
    Signed-off-by: default avatarFilipe David Borba Manana <fdmanana@gmail.com>
    Signed-off-by: default avatarJosef Bacik <jbacik@fb.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    28e5dd8f