blob: 481d12d2b8aa85fad751df57e7870a1b32982e91 (
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2015, Oracle and/or its affiliates. All Rights Reserved.
#
# FS QA Test No. 119
#
# Reflinking two sets of files together:
# - Reflink identical parts of two identical files
# - Reflink identical parts of two other identical files
# - Reflink identical parts of all four files
# - Check that we end up with identical contents
#
. ./common/preamble
_begin_fstest auto quick clone
# Override the default cleanup function.
_cleanup()
{
cd /
rm -rf $tmp.* $testdir
}
# Import common functions.
. ./common/filter
. ./common/reflink
# real QA test starts here
_require_test_reflink
_require_arbitrary_fileset_reflink
testdir=$TEST_DIR/test-$seq
rm -rf $testdir
mkdir $testdir
echo "Create the original files"
blksz=65536
_require_congruent_file_oplen $TEST_DIR $blksz
_pwrite_byte 0x61 0 $((blksz * 8)) $testdir/file1 >> $seqres.full
_pwrite_byte 0x62 0 $((blksz * 8)) $testdir/file2 >> $seqres.full
_pwrite_byte 0x63 0 $((blksz * 8)) $testdir/file3 >> $seqres.full
_pwrite_byte 0x64 0 $((blksz * 8)) $testdir/file4 >> $seqres.full
_test_cycle_mount
md5sum $testdir/file1 | _filter_test_dir
md5sum $testdir/file2 | _filter_test_dir
md5sum $testdir/file3 | _filter_test_dir
md5sum $testdir/file4 | _filter_test_dir
_compare_range $testdir/file1 0 $testdir/file2 0 $((blksz * 8)) \
|| echo "Files 1-2 do not match (intentional)"
_compare_range $testdir/file1 0 $testdir/file3 0 $((blksz * 8)) \
|| echo "Files 1-3 do not match (intentional)"
_compare_range $testdir/file1 0 $testdir/file4 0 $((blksz * 8)) \
|| echo "Files 1-4 do not match (intentional)"
echo "Reflink the first four blocks together, 1-2 3-4"
free_before=$(stat -f -c '%a' $testdir)
_reflink_range $testdir/file1 0 $testdir/file2 0 $((blksz * 4)) >> $seqres.full
_reflink_range $testdir/file3 0 $testdir/file4 0 $((blksz * 4)) >> $seqres.full
_test_cycle_mount
free_after=$(stat -f -c '%a' $testdir)
echo "freesp changed by $free_before -> $free_after" >> $seqres.full
echo "Compare sections"
md5sum $testdir/file1 | _filter_test_dir
md5sum $testdir/file2 | _filter_test_dir
md5sum $testdir/file3 | _filter_test_dir
md5sum $testdir/file4 | _filter_test_dir
_compare_range $testdir/file1 0 $testdir/file2 0 $((blksz * 4)) \
|| echo "Sections of file 1-2 do not match"
_compare_range $testdir/file1 0 $testdir/file3 0 $((blksz * 4)) \
|| echo "Sections of file 1-3 do not match (intentional)"
_compare_range $testdir/file1 0 $testdir/file4 0 $((blksz * 4)) \
|| echo "Sections of file 1-4 do not match (intentional)"
_compare_range $testdir/file2 0 $testdir/file3 0 $((blksz * 4)) \
|| echo "Sections of file 2-3 do not match (intentional)"
_compare_range $testdir/file2 0 $testdir/file4 0 $((blksz * 4)) \
|| echo "Sections of file 2-4 do not match (intentional)"
_compare_range $testdir/file3 0 $testdir/file4 0 $((blksz * 4)) \
|| echo "Sections of file 3-4 do not match"
echo "Reflink the first two blocks together, 1-3 1-4"
free_before=$(stat -f -c '%a' $testdir)
_reflink_range $testdir/file1 0 $testdir/file3 0 $((blksz * 2)) >> $seqres.full
_reflink_range $testdir/file1 0 $testdir/file4 0 $((blksz * 2)) >> $seqres.full
_test_cycle_mount
free_after=$(stat -f -c '%a' $testdir)
echo "freesp changed by $free_before -> $free_after" >> $seqres.full
echo "Compare sections"
md5sum $testdir/file1 | _filter_test_dir
md5sum $testdir/file2 | _filter_test_dir
md5sum $testdir/file3 | _filter_test_dir
md5sum $testdir/file4 | _filter_test_dir
_compare_range $testdir/file1 0 $testdir/file2 0 $((blksz * 2)) \
|| echo "Sections of files 1-2 do not match"
_compare_range $testdir/file1 0 $testdir/file3 0 $((blksz * 2)) \
|| echo "Sections of files 1-3 do not match"
_compare_range $testdir/file1 0 $testdir/file4 0 $((blksz * 2)) \
|| echo "Sections of files 1-4 do not match"
_compare_range $testdir/file2 0 $testdir/file3 0 $((blksz * 2)) \
|| echo "Sections of files 2-3 do not match"
_compare_range $testdir/file2 0 $testdir/file4 0 $((blksz * 2)) \
|| echo "Sections of files 2-4 do not match"
_compare_range $testdir/file3 0 $testdir/file4 0 $((blksz * 2)) \
|| echo "Sections of files 3-4 do not match"
echo "Compare previously reflinked sections"
_compare_range $testdir/file1 $((blksz * 2)) $testdir/file2 \
$((blksz * 2)) $((blksz * 2)) \
|| echo "Sections of file 1-2 do not match"
_compare_range $testdir/file1 $((blksz * 2)) $testdir/file3 \
$((blksz * 2)) $((blksz * 2)) \
|| echo "Sections of file 1-3 do not match (intentional)"
_compare_range $testdir/file1 $((blksz * 2)) $testdir/file4 \
$((blksz * 2)) $((blksz * 2)) \
|| echo "Sections of file 1-4 do not match (intentional)"
_compare_range $testdir/file2 $((blksz * 2)) $testdir/file3 \
$((blksz * 2)) $((blksz * 2)) \
|| echo "Sections of file 2-3 do not match (intentional)"
_compare_range $testdir/file2 $((blksz * 2)) $testdir/file4 \
$((blksz * 2)) $((blksz * 2)) \
|| echo "Sections of file 2-4 do not match (intentional)"
_compare_range $testdir/file3 $((blksz * 2)) $testdir/file4 \
$((blksz * 2)) $((blksz * 2)) \
|| echo "Sections of file 3-4 do not match"
# success, all done
status=0
exit
|