#!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020 SUSE Linux Products GmbH. All Rights Reserved. # # FS QA Test No. ceph/005 # # Test copy_file_range with infile = outfile # . ./common/preamble _begin_fstest auto quick copy_range # get standard environment . common/filter . common/attr . common/reflink # real QA test starts here _supported_fs ceph _require_xfs_io_command "copy_range" _exclude_test_mount_option "test_dummy_encryption" _require_attrs _require_test workdir=$TEST_DIR/test-$seq rm -rf $workdir mkdir $workdir check_range() { local file=$1 local off0=$2 local off1=$3 local val=$4 _read_range $file $off0 $off1 | grep -v -q $val [ $? -eq 0 ] && echo "file $file is not '$val' in [ $off0 $off1 ]" } objsz=4194304 halfobj=$(($objsz / 2)) file="$workdir/file-$objsz" copy="$workdir/copy-$objsz" dest="$workdir/dest-$objsz" backup="$file.backup" # object_size has to be a multiple of stripe_unit _ceph_create_file_layout $file $objsz 1 $objsz _ceph_create_file_layout $backup $objsz 1 $objsz $XFS_IO_PROG -c "pwrite -S 0x61 0 $objsz" $file >> $seqres.full 2>&1 $XFS_IO_PROG -c "pwrite -S 0x62 $objsz $objsz" $file >> $seqres.full 2>&1 $XFS_IO_PROG -c "pwrite -S 0x63 $(($objsz * 2)) $objsz" $file >> $seqres.full 2>&1 cp $file $backup echo " Copy single object to the end:" echo " aaaa|bbbb|cccc => aaaa|bbbb|aaaa" $XFS_IO_PROG -c "copy_range -s 0 -d $(($objsz * 2)) -l $objsz $file" "$file" check_range $file 0 $objsz 61 check_range $file $objsz $objsz 62 check_range $file $(($objsz * 2)) $objsz 61 echo " Copy single object to the beginning:" echo " aaaa|bbbb|aaaa => bbbb|bbbb|aaaa" $XFS_IO_PROG -c "copy_range -s $objsz -d 0 -l $objsz $file" "$file" check_range $file 0 $(($objsz * 2)) 62 check_range $file $(($objsz * 2)) $objsz 61 echo " Copy single object to the middle:" echo " bbbb|bbbb|aaaa => bbbb|aaaa|aaaa" $XFS_IO_PROG -c "copy_range -s $(($objsz * 2)) -d $objsz -l $objsz $file" "$file" check_range $file 0 $objsz 62 check_range $file $objsz $(($objsz * 2)) 61 cp $backup $file echo " Cross object boundary (no full object copy)" echo " aaaa|bbbb|cccc => aaaa|bbaa|aacc" $XFS_IO_PROG -c "copy_range -s 0 -d $(($objsz + $halfobj)) -l $objsz $file" "$file" check_range $file 0 $objsz 61 check_range $file $objsz $halfobj 62 check_range $file $(($objsz + $halfobj)) $objsz 61 check_range $file $(($objsz * 2 + $halfobj)) $halfobj 63 cp $backup $file echo " aaaa|bbbb|cccc => aaaa|bbaa|bbcc" $XFS_IO_PROG -c "copy_range -s $halfobj -d $(($objsz + $halfobj)) -l $objsz $file" "$file" check_range $file 0 $objsz 61 check_range $file $objsz $halfobj 62 check_range $file $(($objsz + $halfobj)) $halfobj 61 check_range $file $(($objsz * 2)) $halfobj 62 check_range $file $(($objsz * 2 + $halfobj)) $halfobj 63 cp $backup $file echo " aaaa|bbbb|cccc => aaaa|bbbb|aabb" $XFS_IO_PROG -c "copy_range -s $halfobj -d $(($objsz * 2)) -l $objsz $file" "$file" check_range $file 0 $objsz 61 check_range $file $objsz $objsz 62 check_range $file $(($objsz * 2)) $halfobj 61 check_range $file $(($objsz * 2 + $halfobj)) $halfobj 62 #success, all done status=0 exit