#! /bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (c) 2024 Oracle. All Rights Reserved. # # FS QA Test 744 # # Set up a filesystem, create a clone, mount both, and verify if the cp reflink # operation between these two mounts fails. # . ./common/preamble _begin_fstest auto clone volume tempfsid _cleanup() { cd / rm -r -f $tmp.* $UMOUNT_PROG $mnt2 &> /dev/null $UMOUNT_PROG $mnt1 &> /dev/null [ -b "$loop_dev2" ] && losetup -d $loop_dev2 [ -b "$loop_dev1" ] && losetup -d $loop_dev1 [ -n "$seq" ] && rm -rf $TEST_DIR/$seq } . ./common/filter . ./common/reflink # Modify as appropriate. _supported_fs generic _require_duplicate_fsid _require_test _require_block_device $TEST_DEV _require_test_reflink _require_cp_reflink _require_loop clone_filesystem() { local dev1=$1 local dev2=$2 _mkfs_dev $dev1 _mount $dev1 $mnt1 $XFS_IO_PROG -fc 'pwrite -S 0x61 0 9000' $mnt1/foo >> $seqres.full $UMOUNT_PROG $mnt1 # device dump of $dev1 to $dev2 dd if=$dev1 of=$dev2 conv=fsync status=none || _fail "dd failed: $?" } [ -n "$seq" ] && rm -rf $TEST_DIR/$seq mkdir $TEST_DIR/$seq mnt1=$TEST_DIR/$seq/mnt1 mnt2=$TEST_DIR/$seq/mnt2 mkdir -p $mnt1 $mnt2 loop_file1="$TEST_DIR/$seq/image1" truncate -s 300m "$loop_file1" loop_dev1=$(_create_loop_device "$loop_file1") loop_file2="$TEST_DIR/$seq/image2" truncate -s 300m "$loop_file2" loop_dev2=$(_create_loop_device "$loop_file2") clone_filesystem ${loop_dev1} ${loop_dev2} # Mounting original device _mount $loop_dev1 $mnt1 $XFS_IO_PROG -fc 'pwrite -S 0x61 0 9000' $mnt1/foo | _filter_xfs_io # Mounting cloned device _mount $loop_dev2 $mnt2 || _fail "mount of cloned device failed" # cp reflink across two different filesystems must fail _cp_reflink $mnt1/foo $mnt2/bar 2>&1 | _filter_test_dir # success, all done status=0 exit