summaryrefslogtreecommitdiff
path: root/tests/generic/744
blob: ef1de82db99c52c1d995df52ffebbdb69eb596d7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#! /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