2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (c) 2018 Huawei. All Rights Reserved.
7 # Test fsck.overlay how to deal with redirect xattr in overlayfs.
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
29 # remove previous $seqres.full before test
32 # real QA test starts here
35 _require_scratch_nocheck
37 _require_command "$FSCK_OVERLAY_PROG" fsck.overlay
39 # remove all files from previous tests
42 OVL_XATTR_OPAQUE_VAL=y
43 OVL_XATTR_IMPURE_VAL=y
45 # Create impure directories
50 $SETFATTR_PROG -n $OVL_XATTR_IMPURE -v $OVL_XATTR_IMPURE_VAL $dir
54 # Create a redirect directory
61 $SETFATTR_PROG -n $OVL_XATTR_REDIRECT -v $value $target
64 # Check redirect xattr
70 value=$(_getfattr --absolute-names --only-values -n \
71 $OVL_XATTR_REDIRECT $target)
73 [[ "$value" == "$expect" ]] || echo "Redirect xattr incorrect"
80 value=$(_getfattr --absolute-names -d -m \
81 $OVL_XATTR_REDIRECT $target)
83 [[ -z "$value" ]] || echo "Redirect xattr not empty"
91 value=$(_getfattr --absolute-names --only-values -n \
92 $OVL_XATTR_OPAQUE $target)
94 [[ "$value" == "$OVL_XATTR_OPAQUE_VAL" ]] || \
95 echo "Opaque xattr incorrect"
110 local ttype=`stat -c "%F:%t,%T" $arg`
112 [[ "$ttype" == "character special file:0,0" ]] || \
113 echo "Valid whiteout removed incorrectly"
117 # Create test directories
118 lowerdir=$OVL_BASE_SCRATCH_MNT/lower
119 lowerdir2=$OVL_BASE_SCRATCH_MNT/lower2
120 upperdir=$OVL_BASE_SCRATCH_MNT/upper
121 workdir=$OVL_BASE_SCRATCH_MNT/workdir
125 rm -rf $lowerdir $lowerdir2 $upperdir $workdir
126 mkdir -p $lowerdir $lowerdir2 $upperdir $workdir
129 # Test invalid redirect xattr point to a nonexistent origin, should remove
130 echo "+ Invalid redirect"
132 make_redirect_dir $upperdir/testdir "invalid"
134 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
135 check_no_redirect $upperdir/testdir
137 # Test invalid redirect xattr point to a file origin, should remove
138 echo "+ Invalid redirect(2)"
140 touch $lowerdir/origin
141 make_redirect_dir $upperdir/testdir "origin"
143 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
144 check_no_redirect $upperdir/testdir
146 # Test valid redirect xattr point to a directory origin in the same directory,
148 echo "+ Valid redirect"
150 mkdir $lowerdir/origin
151 make_whiteout $upperdir/origin
152 make_redirect_dir $upperdir/testdir "origin"
153 make_impure_dir $upperdir
155 _overlay_fsck_expect $FSCK_OK $lowerdir $upperdir $workdir -p
156 check_redirect $upperdir/testdir "origin"
158 # Test valid redirect xattr point to a directory origin in different directories
160 echo "+ Valid redirect(2)"
162 mkdir $lowerdir/origin
163 make_whiteout $upperdir/origin
164 make_redirect_dir $upperdir/testdir1/testdir2 "/origin"
165 make_impure_dir $upperdir/testdir1
167 _overlay_fsck_expect $FSCK_OK $lowerdir $upperdir $workdir -p
168 check_redirect $upperdir/testdir1/testdir2 "/origin"
170 # Test valid redirect xattr but missing whiteout to cover lower target,
171 # should fix whiteout
172 echo "+ Missing whiteout"
174 mkdir $lowerdir/origin
175 make_redirect_dir $upperdir/testdir "origin"
177 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
178 check_redirect $upperdir/testdir "origin"
179 check_whiteout $upperdir/origin
181 # Test valid redirect xattrs exchanged by rename, should not remove
182 echo "+ Valid redirect(3)"
184 mkdir $lowerdir/{testdir1,testdir2}
185 make_redirect_dir $upperdir/testdir1 "testdir2"
186 make_redirect_dir $upperdir/testdir2 "testdir1"
187 make_impure_dir $upperdir
189 _overlay_fsck_expect $FSCK_OK $lowerdir $upperdir $workdir -p
190 check_redirect $upperdir/testdir1 "testdir2"
191 check_redirect $upperdir/testdir2 "testdir1"
193 # Test invalid redirect xattr with lower same name directory exists,
194 # should remove invalid redirect xattr and set opaque in yes mode
195 echo "+ Invalid redirect(3)"
197 mkdir $lowerdir/testdir
198 make_redirect_dir $upperdir/testdir "invalid"
200 # Question get yes answer: Should set opaque dir ?
201 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -y
202 check_no_redirect $upperdir/testdir
203 check_opaque $upperdir/testdir
205 # Test duplicate redirect xattrs point to one origin, should fail in
206 # auto mode, and should remove either of the duplicates in yes mode
207 echo "+ Duplicate redirect"
209 mkdir $lowerdir2/origin
210 make_redirect_dir $lowerdir/testdir1 "origin"
211 make_redirect_dir $lowerdir/testdir2 "origin"
212 make_redirect_dir $upperdir/testdir3 "origin"
214 _overlay_fsck_expect $FSCK_UNCORRECTED "$lowerdir:$lowerdir2" $upperdir $workdir -p
216 # Question get yes answer: Duplicate redirect directory, remove xattr ?
217 _overlay_fsck_expect $FSCK_NONDESTRUCT "$lowerdir:$lowerdir2" $upperdir $workdir -y
218 redirect_1=`check_redirect $lowerdir/testdir1 "origin" 2>/dev/null`
219 redirect_2=`check_redirect $lowerdir/testdir2 "origin" 2>/dev/null`
220 [[ $redirect_1 == $redirect_2 ]] && echo "Redirect xattr incorrect"
221 check_no_redirect $upperdir/testdir3
223 # Test duplicate redirect xattr duplicate with merge directory, should
224 # fail in auto mode, and should remove the redirect xattr in yes mode
225 echo "+ Duplicate redirect(2)"
227 mkdir $lowerdir/origin $upperdir/origin
228 make_redirect_dir $upperdir/testdir "origin"
230 _overlay_fsck_expect $FSCK_UNCORRECTED $lowerdir $upperdir $workdir -p
232 # Question get yes answer: Duplicate redirect directory, remove xattr ?
233 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -y
234 check_no_redirect $upperdir/testdir
236 # Test duplicate redirect xattr with lower same name directory exists,
237 # should remove the duplicate redirect xattr and set opaque in yes mode
238 echo "+ Duplicate redirect(3)"
240 mkdir $lowerdir/{origin,testdir} $upperdir/origin
241 make_redirect_dir $upperdir/testdir "invalid"
243 # Question one get yes answer: Duplicate redirect directory, remove xattr?
244 # Question two get yes answer: Should set opaque dir ?
245 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -y
246 check_no_redirect $upperdir/testdir
247 check_opaque $upperdir/testdir