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
34 _require_scratch_nocheck
35 _require_attrs trusted
36 _require_command "$FSCK_OVERLAY_PROG" fsck.overlay
38 # remove all files from previous tests
41 OVL_XATTR_OPAQUE_VAL=y
42 OVL_XATTR_IMPURE_VAL=y
44 # Create impure directories
49 $SETFATTR_PROG -n $OVL_XATTR_IMPURE -v $OVL_XATTR_IMPURE_VAL $dir
53 # Create a redirect directory
60 $SETFATTR_PROG -n $OVL_XATTR_REDIRECT -v $value $target
63 # Check redirect xattr
69 value=$(_getfattr --absolute-names --only-values -n \
70 $OVL_XATTR_REDIRECT $target)
72 [[ "$value" == "$expect" ]] || echo "Redirect xattr incorrect"
79 value=$(_getfattr --absolute-names -d -m \
80 $OVL_XATTR_REDIRECT $target)
82 [[ -z "$value" ]] || echo "Redirect xattr not empty"
90 value=$(_getfattr --absolute-names --only-values -n \
91 $OVL_XATTR_OPAQUE $target)
93 [[ "$value" == "$OVL_XATTR_OPAQUE_VAL" ]] || \
94 echo "Opaque xattr incorrect"
109 local ttype=`stat -c "%F:%t,%T" $arg`
111 [[ "$ttype" == "character special file:0,0" ]] || \
112 echo "Valid whiteout removed incorrectly"
116 # Create test directories
117 lowerdir=$OVL_BASE_SCRATCH_MNT/lower
118 lowerdir2=$OVL_BASE_SCRATCH_MNT/lower2
119 upperdir=$OVL_BASE_SCRATCH_MNT/upper
120 workdir=$OVL_BASE_SCRATCH_MNT/workdir
124 rm -rf $lowerdir $lowerdir2 $upperdir $workdir
125 mkdir -p $lowerdir $lowerdir2 $upperdir $workdir
128 # Test invalid redirect xattr point to a nonexistent origin, should remove
129 echo "+ Invalid redirect"
131 make_redirect_dir $upperdir/testdir "invalid"
133 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
134 check_no_redirect $upperdir/testdir
136 # Test invalid redirect xattr point to a file origin, should remove
137 echo "+ Invalid redirect(2)"
139 touch $lowerdir/origin
140 make_redirect_dir $upperdir/testdir "origin"
142 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
143 check_no_redirect $upperdir/testdir
145 # Test valid redirect xattr point to a directory origin in the same directory,
147 echo "+ Valid redirect"
149 mkdir $lowerdir/origin
150 make_whiteout $upperdir/origin
151 make_redirect_dir $upperdir/testdir "origin"
152 make_impure_dir $upperdir
154 _overlay_fsck_expect $FSCK_OK $lowerdir $upperdir $workdir -p
155 check_redirect $upperdir/testdir "origin"
157 # Test valid redirect xattr point to a directory origin in different directories
159 echo "+ Valid redirect(2)"
161 mkdir $lowerdir/origin
162 make_whiteout $upperdir/origin
163 make_redirect_dir $upperdir/testdir1/testdir2 "/origin"
164 make_impure_dir $upperdir/testdir1
166 _overlay_fsck_expect $FSCK_OK $lowerdir $upperdir $workdir -p
167 check_redirect $upperdir/testdir1/testdir2 "/origin"
169 # Test valid redirect xattr but missing whiteout to cover lower target,
170 # should fix whiteout
171 echo "+ Missing whiteout"
173 mkdir $lowerdir/origin
174 make_redirect_dir $upperdir/testdir "origin"
176 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
177 check_redirect $upperdir/testdir "origin"
178 check_whiteout $upperdir/origin
180 # Test valid redirect xattrs exchanged by rename, should not remove
181 echo "+ Valid redirect(3)"
183 mkdir $lowerdir/{testdir1,testdir2}
184 make_redirect_dir $upperdir/testdir1 "testdir2"
185 make_redirect_dir $upperdir/testdir2 "testdir1"
186 make_impure_dir $upperdir
188 _overlay_fsck_expect $FSCK_OK $lowerdir $upperdir $workdir -p
189 check_redirect $upperdir/testdir1 "testdir2"
190 check_redirect $upperdir/testdir2 "testdir1"
192 # Test invalid redirect xattr with lower same name directory exists,
193 # should remove invalid redirect xattr and set opaque in yes mode
194 echo "+ Invalid redirect(3)"
196 mkdir $lowerdir/testdir
197 make_redirect_dir $upperdir/testdir "invalid"
199 # Question get yes answer: Should set opaque dir ?
200 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -y
201 check_no_redirect $upperdir/testdir
202 check_opaque $upperdir/testdir
204 # Test duplicate redirect xattrs point to one origin, should fail in
205 # auto mode, and should remove either of the duplicates in yes mode
206 echo "+ Duplicate redirect"
208 mkdir $lowerdir2/origin
209 make_redirect_dir $lowerdir/testdir1 "origin"
210 make_redirect_dir $lowerdir/testdir2 "origin"
211 make_redirect_dir $upperdir/testdir3 "origin"
213 _overlay_fsck_expect $FSCK_UNCORRECTED "$lowerdir:$lowerdir2" $upperdir $workdir -p
215 # Question get yes answer: Duplicate redirect directory, remove xattr ?
216 _overlay_fsck_expect $FSCK_NONDESTRUCT "$lowerdir:$lowerdir2" $upperdir $workdir -y
217 redirect_1=`check_redirect $lowerdir/testdir1 "origin" 2>/dev/null`
218 redirect_2=`check_redirect $lowerdir/testdir2 "origin" 2>/dev/null`
219 [[ $redirect_1 == $redirect_2 ]] && echo "Redirect xattr incorrect"
220 check_no_redirect $upperdir/testdir3
222 # Test duplicate redirect xattr duplicate with merge directory, should
223 # fail in auto mode, and should remove the redirect xattr in yes mode
224 echo "+ Duplicate redirect(2)"
226 mkdir $lowerdir/origin $upperdir/origin
227 make_redirect_dir $upperdir/testdir "origin"
229 _overlay_fsck_expect $FSCK_UNCORRECTED $lowerdir $upperdir $workdir -p
231 # Question get yes answer: Duplicate redirect directory, remove xattr ?
232 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -y
233 check_no_redirect $upperdir/testdir
235 # Test duplicate redirect xattr with lower same name directory exists,
236 # should remove the duplicate redirect xattr and set opaque in yes mode
237 echo "+ Duplicate redirect(3)"
239 mkdir $lowerdir/{origin,testdir} $upperdir/origin
240 make_redirect_dir $upperdir/testdir "invalid"
242 # Question one get yes answer: Duplicate redirect directory, remove xattr?
243 # Question two get yes answer: Should set opaque dir ?
244 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -y
245 check_no_redirect $upperdir/testdir
246 check_opaque $upperdir/testdir