btrfs/057: Fix false alerts due to orphan files
[xfstests-dev.git] / tests / btrfs / 108
1 #! /bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (C) 2015 SUSE Linux Products GmbH. All Rights Reserved.
4 #
5 # FS QA Test No. btrfs/108
6 #
7 # Test that a send operation works correctly with reflinked files (cloned
8 # extents which multiple files point to).
9 #
10 seq=`basename $0`
11 seqres=$RESULT_DIR/$seq
12 echo "QA output created by $seq"
13
14 tmp=/tmp/$$
15 status=1        # failure is the default!
16 trap "_cleanup; exit \$status" 0 1 2 3 15
17
18 _cleanup()
19 {
20         cd /
21         rm -fr $send_files_dir
22         rm -f $tmp.*
23 }
24
25 # get standard environment, filters and checks
26 . ./common/rc
27 . ./common/filter
28 . ./common/reflink
29
30 # real QA test starts here
31 _supported_fs btrfs
32 _supported_os Linux
33 _require_scratch
34 _require_cp_reflink
35 _require_xfs_io_command "fpunch"
36
37 send_files_dir=$TEST_DIR/btrfs-test-$seq
38
39 rm -f $seqres.full
40 rm -fr $send_files_dir
41 mkdir $send_files_dir
42
43 _scratch_mkfs >>$seqres.full 2>&1
44 _scratch_mount
45
46 # Create our test file with a single 100K extent.
47 $XFS_IO_PROG -f -c "pwrite -S 0xaa 0K 100K" $SCRATCH_MNT/foo | _filter_xfs_io
48
49 # Clone our file into a new file named bar.
50 cp --reflink=always $SCRATCH_MNT/foo $SCRATCH_MNT/bar
51
52 # Now overwrite parts of our foo file.
53 $XFS_IO_PROG -c "pwrite -S 0xbb 50K 10K" \
54         -c "pwrite -S 0xcc 90K 10K" \
55         -c "fpunch 70K 10k" \
56         $SCRATCH_MNT/foo | _filter_xfs_io
57
58 _run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/snap
59
60 echo "File digests in the original filesystem:"
61 md5sum $SCRATCH_MNT/snap/foo | _filter_scratch
62 md5sum $SCRATCH_MNT/snap/bar | _filter_scratch
63
64 _run_btrfs_util_prog send -f $send_files_dir/1.snap $SCRATCH_MNT/snap
65
66 # Now recreate the filesystem by receiving the send stream and verify we get
67 # the same file contents that the original filesystem had.
68 _scratch_unmount
69 _scratch_mkfs >>$seqres.full 2>&1
70 _scratch_mount
71
72 _run_btrfs_util_prog receive -f $send_files_dir/1.snap $SCRATCH_MNT
73
74 # We expect the destination filesystem to have exactly the same file data as
75 # the original filesystem.
76 # The btrfs send implementation had a bug where it sent a clone operation from
77 # file foo into file bar covering the whole [0, 100K[ range after creating
78 # and writing the file foo. This was incorrect because the file bar now included
79 # the updates done to file foo after we cloned foo to bar, breaking the COW
80 # nature of reflink copies (cloned extents).
81 echo "File digests in the new filesystem:"
82 md5sum $SCRATCH_MNT/snap/foo | _filter_scratch
83 md5sum $SCRATCH_MNT/snap/bar | _filter_scratch
84
85 status=0
86 exit