fstests: convert remaining tests to SPDX license tags
[xfstests-dev.git] / tests / overlay / 060
1 #! /bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (C) 2018 Red Hat, Inc. All Rights Reserved.
4 #
5 # FS QA Test No. 060
6 #
7 # Test metadata only copy up functionality.
8 #
9 seq=`basename $0`
10 seqres=$RESULT_DIR/$seq
11 echo "QA output created by $seq"
12
13 here=`pwd`
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 -f $tmp.*
22 }
23
24 # get standard environment, filters and checks
25 . ./common/rc
26 . ./common/filter
27
28 # remove previous $seqres.full before test
29 rm -f $seqres.full
30
31 # real QA test starts here
32 _supported_fs overlay
33 _supported_os Linux
34 # We use non-default scratch underlying overlay dirs, we need to check
35 # them explicity after test.
36 _require_scratch_nocheck
37 _require_scratch_overlay_features index redirect_dir metacopy
38
39 # remove all files from previous tests
40 _scratch_mkfs
41
42 # File size on lower
43 lowername="lowerfile"
44 lowerlink="lowerfile-link"
45 lowerdata="lower"
46 lowersize="4096"
47
48 # Number of blocks allocated by filesystem on lower. Will be queried later.
49 lowerblocks=""
50
51 udirname="pureupper"
52 ufile="upperfile"
53
54 # Check metacopy xattr
55 check_metacopy()
56 {
57         local target=$1 exist=$2
58         local out_f target_f
59         local msg
60
61         out_f=$($GETFATTR_PROG --absolute-names --only-values -n \
62                 $OVL_XATTR_METACOPY $target 2>&1 | _filter_scratch)
63
64         if [ "$exist" == "y" ];then
65                 [ "$out_f" == "" ] && return
66                 echo "Metacopy xattr does not exist on ${target}. stdout=$out_f"
67                 return
68         fi
69
70         if [ "$out_f" == "" ];then
71                 echo "Metacopy xattr exists on ${target} unexpectedly."
72                 return
73         fi
74
75         target_f=`echo $target | _filter_scratch`
76         msg="$target_f: trusted.overlay.metacopy: No such attribute"
77
78         [ "$out_f" == "$msg" ] && return
79
80         echo "Error while checking xattr on ${target}. stdout=$out"
81 }
82
83 # Check redirect xattr
84 check_redirect()
85 {
86         local target=$1
87         local expect=$2
88
89         value=$($GETFATTR_PROG --absolute-names --only-values -n \
90                 $OVL_XATTR_REDIRECT $target)
91
92         [[ "$value" == "$expect" ]] || echo "Redirect xattr incorrect. Expected=\"$expect\", actual=\"$value\""
93 }
94
95 # Check size
96 check_file_size()
97 {
98         local target=$1 expected_size=$2 actual_size
99
100         actual_size=$(stat -c "%s" $target)
101
102         [ "$actual_size" == "$expected_size" ] || echo "Expected file size $expected_size but actual size is $actual_size"
103 }
104
105 check_file_blocks()
106 {
107         local target=$1 expected_blocks=$2 nr_blocks
108
109         nr_blocks=$(stat -c "%b" $target)
110
111         [ "$nr_blocks" == "$expected_blocks" ] || echo "Expected $expected_blocks blocks but actual number of blocks is ${nr_blocks}."
112 }
113
114 check_file_contents()
115 {
116         local target=$1 expected=$2
117         local actual target_f
118
119         target_f=`echo $target | _filter_scratch`
120
121         read actual<$target
122
123         [ "$actual" == "$expected" ] || echo "Expected file $target_f contents to be \"$expected\" but actual contents are \"$actual\""
124 }
125
126 check_file_size_contents()
127 {
128         local target=$1 expected_size=$2 expected_content=$3
129
130         check_file_size $target $expected_size
131         check_file_contents $target $expected_content
132 }
133
134 mount_overlay()
135 {
136         local _lowerdir=$1
137
138         _overlay_scratch_mount_dirs "$_lowerdir" $upperdir $workdir -o redirect_dir=on,index=on,metacopy=on
139 }
140
141 umount_overlay()
142 {
143         $UMOUNT_PROG $SCRATCH_MNT
144 }
145
146 # Assumes it is called with overlay mounted.
147 test_common()
148 {
149         local _lowerdir=$1 _target=$2 _size=$3 _blocks=$4 _data="$5"
150         local _redirect=$6
151
152         echo "check properties of metadata copied up file"
153         check_file_size_contents $SCRATCH_MNT/$_target $_size "$_data"
154         check_file_blocks $SCRATCH_MNT/$_target $_blocks
155
156         # Do a mount cycle and check size and contents again.
157         echo "Unmount and Mount again"
158         umount_overlay
159         mount_overlay $_lowerdir
160         echo "check properties of metadata copied up file"
161         check_file_size_contents $SCRATCH_MNT/$_target $_size "$_data"
162         check_file_blocks $SCRATCH_MNT/$_target $_blocks
163
164         # Make sure copied up file is a metacopy file.
165         umount_overlay
166         check_metacopy $upperdir/$_target "y"
167         check_file_size_contents $upperdir/$_target $_size ""
168         [ -n "$_redirect" ] && check_redirect $upperdir/$_target "$_redirect"
169
170         # Trigger data copy up and check absence of metacopy xattr.
171         mount_overlay $_lowerdir
172         $XFS_IO_PROG -c "open -a $SCRATCH_MNT/$_target"
173         echo "check properties of data copied up file"
174         check_file_size_contents $SCRATCH_MNT/$_target $_size "$_data"
175         umount_overlay
176         check_metacopy $upperdir/$_target "n"
177         check_file_size_contents $upperdir/$_target $_size "$_data"
178 }
179
180 create_basic_files()
181 {
182         _scratch_mkfs
183         mkdir -p $lowerdir $lowerdir2 $upperdir $workdir $workdir2
184         mkdir -p $upperdir/$udirname
185         echo "$lowerdata" > $lowerdir/$lowername
186         chmod 600 $lowerdir/$lowername
187         # Create a file of size lowersize.
188         $XFS_IO_PROG -c "falloc 0 $lowersize" $lowerdir/$lowername
189         $XFS_IO_PROG -c "fsync" $lowerdir/$lowername
190
191         # Query number of lower
192         lowerblocks=$(stat -c "%b" $lowerdir/$lowername)
193 }
194
195 create_lower_link()
196 {
197         ln $lowerdir/$lowername $lowerdir/$lowerlink
198 }
199
200 prepare_midlayer()
201 {
202         _scratch_mkfs
203         create_basic_files
204         # Create midlayer
205         _overlay_scratch_mount_dirs $lowerdir $lowerdir2 $workdir2 -o redirect_dir=on,index=on,metacopy=on
206         # Trigger a metacopy
207         chmod 400 $SCRATCH_MNT/$lowername
208         umount_overlay
209 }
210
211 # Create test directories
212 lowerdir=$OVL_BASE_SCRATCH_MNT/lower
213 lowerdir2=$OVL_BASE_SCRATCH_MNT/lower2
214 upperdir=$OVL_BASE_SCRATCH_MNT/upper
215 workdir=$OVL_BASE_SCRATCH_MNT/workdir
216 workdir2=$OVL_BASE_SCRATCH_MNT/workdir2
217
218 # Tests start here
219 echo "== Check Simple Metacopy =="
220 create_basic_files
221 mount_overlay $lowerdir
222 chmod 400 $SCRATCH_MNT/$lowername
223 test_common $lowerdir $lowername $lowersize $lowerblocks "$lowerdata"
224
225 # Test midlayer metacopy
226 echo -e "\n== Check Midlayer Metacopy =="
227 prepare_midlayer
228 mount_overlay "$lowerdir2:$lowerdir"
229 chmod 400 $SCRATCH_MNT/$lowername
230 test_common "$lowerdir2:$lowerdir" $lowername $lowersize $lowerblocks \
231                 "$lowerdata"
232
233 # Test Rename Redirect
234 echo -e "\n== Check Rename Redirect =="
235 create_basic_files
236 mount_overlay $lowerdir
237 mv $SCRATCH_MNT/$lowername $SCRATCH_MNT/$ufile
238 test_common $lowerdir $ufile $lowersize $lowerblocks "$lowerdata" "$lowername"
239
240 # Test midlayer rename redirect
241 echo -e "\n== Check Midlayer Rename Redirect =="
242 prepare_midlayer
243 mount_overlay "$lowerdir2:$lowerdir"
244 mv $SCRATCH_MNT/$lowername $SCRATCH_MNT/$ufile
245 test_common "$lowerdir2:$lowerdir" $ufile $lowersize $lowerblocks "$lowerdata" \
246                 "$lowername"
247
248 # Test Link Redirect
249 echo -e "\n== Check Link Redirect =="
250 create_basic_files
251 mount_overlay $lowerdir
252 ln $SCRATCH_MNT/$lowername $SCRATCH_MNT/$udirname/$ufile
253 test_common $lowerdir $udirname/$ufile $lowersize $lowerblocks "$lowerdata" \
254                 "/$lowername"
255
256 # Test midlayer link redirect
257 echo -e "\n== Check Midlayer Link Redirect =="
258 prepare_midlayer
259 mount_overlay "$lowerdir2:$lowerdir"
260 ln $SCRATCH_MNT/$lowername $SCRATCH_MNT/$udirname/$ufile
261 test_common "$lowerdir2:$lowerdir" $udirname/$ufile $lowersize $lowerblocks \
262                 "$lowerdata" "/$lowername"
263
264 # Test lower link file gets absolute redirect upon rename
265 echo -e "\n== Check Lower Link Rename Absolute Redirect =="
266 create_basic_files
267 create_lower_link
268 mount_overlay $lowerdir
269 mv $SCRATCH_MNT/$lowerlink $SCRATCH_MNT/$ufile
270 test_common $lowerdir $ufile $lowersize $lowerblocks "$lowerdata" "/$lowerlink"
271
272 # success, all done
273 status=0
274 exit