2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (c) 2018 Huawei. All Rights Reserved.
7 # Test fsck.overlay how to deal with whiteouts 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 OVL_XATTR_OPAQUE_VAL=y
39 OVL_XATTR_IMPURE_VAL=y
41 # remove all files from previous tests
48 local ttype=`stat -c "%F:%t,%T" $arg`
50 [[ "$ttype" == "character special file:0,0" ]] || \
51 echo "Valid whiteout removed incorrectly"
63 # Create an opaque directory
69 $SETFATTR_PROG -n $OVL_XATTR_OPAQUE -v $OVL_XATTR_OPAQUE_VAL $target
72 # Create impure directories
77 $SETFATTR_PROG -n $OVL_XATTR_IMPURE -v $OVL_XATTR_IMPURE_VAL $dir
81 # Create a redirect directory
88 $SETFATTR_PROG -n $OVL_XATTR_REDIRECT -v $value $target
91 # Create test directories
92 lowerdir=$OVL_BASE_SCRATCH_MNT/lower
93 lowerdir2=$OVL_BASE_SCRATCH_MNT/lower2
94 upperdir=$OVL_BASE_SCRATCH_MNT/upper
95 workdir=$OVL_BASE_SCRATCH_MNT/workdir
99 rm -rf $lowerdir $lowerdir2 $upperdir $workdir
100 mkdir -p $lowerdir $lowerdir2 $upperdir $workdir
103 # Test orphan whiteout in lower and upper layer, should remove
104 echo "+ Orphan whiteout"
106 make_whiteout $lowerdir/foo $upperdir/{foo,bar}
108 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
112 # Test valid whiteout covering lower target, should not remove
113 echo "+ Valid whiteout"
115 touch $lowerdir2/{foo,bar}
116 make_whiteout $upperdir/foo $lowerdir/bar
118 _overlay_fsck_expect $FSCK_OK "$lowerdir:$lowerdir2" $upperdir $workdir -p
119 check_whiteout $upperdir/foo $lowerdir/bar
121 # Test orphan whiteout in opaque directory, should remove
122 echo "+ Orphan whiteout(2)"
124 mkdir $lowerdir/testdir
125 touch $lowerdir/testdir/foo
126 make_opaque_dir $upperdir/testdir
127 make_whiteout $upperdir/testdir/foo
129 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
132 # Test orphan whiteout whose parent path is not an merged directory,
134 echo "+ Orphan whiteout(3)"
136 mkdir $lowerdir2/{testdir1,testdir2,testdir3}
137 touch $lowerdir2/{testdir1/foo,testdir2/foo,testdir3/foo}
138 mkdir $upperdir/{testdir1,testdir2,testdir3,testdir4}
139 touch $lowerdir/testdir1
140 make_whiteout $lowerdir/testdir2
141 make_opaque_dir $lowerdir/testdir3
142 make_whiteout $upperdir/{testdir1/foo,/testdir2/foo,testdir3/foo,testdir4/foo}
144 _overlay_fsck_expect $FSCK_NONDESTRUCT "$lowerdir:$lowerdir2" $upperdir $workdir -p
145 ls $upperdir/testdir1
146 ls $upperdir/testdir2
147 ls $upperdir/testdir3
148 ls $upperdir/testdir4
150 # Test orphan whiteout in redirect directory, should remove
151 echo "+ Orphan whiteout(4)"
153 mkdir $lowerdir/{testdir,origin}
154 touch $lowerdir/testdir/foo
155 make_redirect_dir $upperdir/testdir "origin"
156 make_whiteout $upperdir/testdir/foo
158 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
161 # Test valid whiteout in redirect directory cover file in lower
162 # redirect origin directory, should not remove
163 echo "+ Valid whiteout(2)"
165 mkdir $lowerdir/origin
166 touch $lowerdir/origin/foo
167 make_impure_dir $upperdir
168 make_redirect_dir $upperdir/testdir "origin"
169 make_whiteout $upperdir/origin $upperdir/testdir/foo
171 _overlay_fsck_expect $FSCK_OK $lowerdir $upperdir $workdir -p
172 check_whiteout $upperdir/testdir/foo
174 # Test valid whiteout covering lower target whose parent directory
175 # merge with a redirect directory in the middle layer, should not remove.
176 echo "+ Valid whiteout(3)"
178 mkdir -p $lowerdir2/origin/subdir
179 touch $lowerdir2/origin/subdir/foo
180 make_redirect_dir $lowerdir/testdir "origin"
181 mkdir -p $upperdir/testdir/subdir
182 make_whiteout $lowerdir/origin $upperdir/testdir/subdir/foo
183 make_impure_dir $upperdir/testdir $upperdir
185 _overlay_fsck_expect $FSCK_OK "$lowerdir:$lowerdir2" $upperdir $workdir -p
186 check_whiteout $upperdir/testdir/subdir/foo
188 # Test invalid whiteout in opaque subdirectory in a redirect directory,
190 echo "+ Orphan whiteout(5)"
192 mkdir -p $lowerdir/origin/subdir
193 touch $lowerdir/origin/subdir/foo
194 make_redirect_dir $upperdir/testdir "origin"
195 make_opaque_dir $upperdir/testdir/subdir
196 make_whiteout $upperdir/testdir/subdir/foo
198 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
199 ls $upperdir/testdir/subdir
201 # Test valid whiteout in reidrect subdirectory in a opaque directory
202 # covering lower target, should not remove
203 echo "+ Valid whiteout(4)"
205 mkdir $lowerdir/origin
206 touch $lowerdir/origin/foo
207 make_opaque_dir $upperdir/testdir
208 make_redirect_dir $upperdir/testdir/subdir "/origin"
209 make_whiteout $upperdir/origin $upperdir/testdir/subdir/foo
210 make_impure_dir $upperdir/testdir
212 _overlay_fsck_expect $FSCK_OK $lowerdir $upperdir $workdir -p
213 check_whiteout $upperdir/testdir/subdir/foo