2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (C) 2018 Red Hat, Inc. All Rights Reserved.
7 # Test metadata only copy up functionality.
10 seqres=$RESULT_DIR/$seq
11 echo "QA output created by $seq"
15 status=1 # failure is the default!
16 trap "_cleanup; exit \$status" 0 1 2 3 15
24 # get standard environment, filters and checks
28 # remove previous $seqres.full before test
31 # real QA test starts here
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
39 # remove all files from previous tests
44 lowerlink="lowerfile-link"
48 # Number of blocks allocated by filesystem on lower. Will be queried later.
54 # Check metacopy xattr
57 local target=$1 exist=$2
61 out_f=$($GETFATTR_PROG --absolute-names --only-values -n \
62 $OVL_XATTR_METACOPY $target 2>&1 | _filter_scratch)
64 if [ "$exist" == "y" ];then
65 [ "$out_f" == "" ] && return
66 echo "Metacopy xattr does not exist on ${target}. stdout=$out_f"
70 if [ "$out_f" == "" ];then
71 echo "Metacopy xattr exists on ${target} unexpectedly."
75 target_f=`echo $target | _filter_scratch`
76 msg="$target_f: trusted.overlay.metacopy: No such attribute"
78 [ "$out_f" == "$msg" ] && return
80 echo "Error while checking xattr on ${target}. stdout=$out"
83 # Check redirect xattr
89 value=$($GETFATTR_PROG --absolute-names --only-values -n \
90 $OVL_XATTR_REDIRECT $target)
92 [[ "$value" == "$expect" ]] || echo "Redirect xattr incorrect. Expected=\"$expect\", actual=\"$value\""
98 local target=$1 expected_size=$2 actual_size
100 actual_size=$(stat -c "%s" $target)
102 [ "$actual_size" == "$expected_size" ] || echo "Expected file size $expected_size but actual size is $actual_size"
107 local target=$1 expected_blocks=$2 nr_blocks
109 nr_blocks=$(stat -c "%b" $target)
111 [ "$nr_blocks" == "$expected_blocks" ] || echo "Expected $expected_blocks blocks but actual number of blocks is ${nr_blocks}."
114 check_file_contents()
116 local target=$1 expected=$2
117 local actual target_f
119 target_f=`echo $target | _filter_scratch`
123 [ "$actual" == "$expected" ] || echo "Expected file $target_f contents to be \"$expected\" but actual contents are \"$actual\""
126 check_file_size_contents()
128 local target=$1 expected_size=$2 expected_content=$3
130 check_file_size $target $expected_size
131 check_file_contents $target $expected_content
138 _overlay_scratch_mount_dirs "$_lowerdir" $upperdir $workdir -o redirect_dir=on,index=on,metacopy=on
143 $UMOUNT_PROG $SCRATCH_MNT
146 # Assumes it is called with overlay mounted.
149 local _lowerdir=$1 _target=$2 _size=$3 _blocks=$4 _data="$5"
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
156 # Do a mount cycle and check size and contents again.
157 echo "Unmount and Mount again"
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
164 # Make sure copied up file is a metacopy file.
166 check_metacopy $upperdir/$_target "y"
167 check_file_size_contents $upperdir/$_target $_size ""
168 [ -n "$_redirect" ] && check_redirect $upperdir/$_target "$_redirect"
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"
176 check_metacopy $upperdir/$_target "n"
177 check_file_size_contents $upperdir/$_target $_size "$_data"
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
191 # Query number of lower
192 lowerblocks=$(stat -c "%b" $lowerdir/$lowername)
197 ln $lowerdir/$lowername $lowerdir/$lowerlink
205 _overlay_scratch_mount_dirs $lowerdir $lowerdir2 $workdir2 -o redirect_dir=on,index=on,metacopy=on
207 chmod 400 $SCRATCH_MNT/$lowername
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
219 echo "== Check Simple Metacopy =="
221 mount_overlay $lowerdir
222 chmod 400 $SCRATCH_MNT/$lowername
223 test_common $lowerdir $lowername $lowersize $lowerblocks "$lowerdata"
225 # Test midlayer metacopy
226 echo -e "\n== Check Midlayer Metacopy =="
228 mount_overlay "$lowerdir2:$lowerdir"
229 chmod 400 $SCRATCH_MNT/$lowername
230 test_common "$lowerdir2:$lowerdir" $lowername $lowersize $lowerblocks \
233 # Test Rename Redirect
234 echo -e "\n== Check Rename Redirect =="
236 mount_overlay $lowerdir
237 mv $SCRATCH_MNT/$lowername $SCRATCH_MNT/$ufile
238 test_common $lowerdir $ufile $lowersize $lowerblocks "$lowerdata" "$lowername"
240 # Test midlayer rename redirect
241 echo -e "\n== Check Midlayer Rename Redirect =="
243 mount_overlay "$lowerdir2:$lowerdir"
244 mv $SCRATCH_MNT/$lowername $SCRATCH_MNT/$ufile
245 test_common "$lowerdir2:$lowerdir" $ufile $lowersize $lowerblocks "$lowerdata" \
249 echo -e "\n== Check Link Redirect =="
251 mount_overlay $lowerdir
252 ln $SCRATCH_MNT/$lowername $SCRATCH_MNT/$udirname/$ufile
253 test_common $lowerdir $udirname/$ufile $lowersize $lowerblocks "$lowerdata" \
256 # Test midlayer link redirect
257 echo -e "\n== Check Midlayer Link Redirect =="
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"
264 # Test lower link file gets absolute redirect upon rename
265 echo -e "\n== Check Lower Link Rename Absolute Redirect =="
268 mount_overlay $lowerdir
269 mv $SCRATCH_MNT/$lowerlink $SCRATCH_MNT/$ufile
270 test_common $lowerdir $ufile $lowersize $lowerblocks "$lowerdata" "/$lowerlink"