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
35 _require_scratch_nocheck
37 _require_command "$FSCK_OVERLAY_PROG" fsck.overlay
39 OVL_XATTR_OPAQUE_VAL=y
40 OVL_XATTR_IMPURE_VAL=y
42 # remove all files from previous tests
49 local ttype=`stat -c "%F:%t,%T" $arg`
51 [[ "$ttype" == "character special file:0,0" ]] || \
52 echo "Valid whiteout removed incorrectly"
64 # Create an opaque directory
70 $SETFATTR_PROG -n $OVL_XATTR_OPAQUE -v $OVL_XATTR_OPAQUE_VAL $target
73 # Create impure directories
78 $SETFATTR_PROG -n $OVL_XATTR_IMPURE -v $OVL_XATTR_IMPURE_VAL $dir
82 # Create a redirect directory
89 $SETFATTR_PROG -n $OVL_XATTR_REDIRECT -v $value $target
92 # Create test directories
93 lowerdir=$OVL_BASE_SCRATCH_MNT/lower
94 lowerdir2=$OVL_BASE_SCRATCH_MNT/lower2
95 upperdir=$OVL_BASE_SCRATCH_MNT/upper
96 workdir=$OVL_BASE_SCRATCH_MNT/workdir
100 rm -rf $lowerdir $lowerdir2 $upperdir $workdir
101 mkdir -p $lowerdir $lowerdir2 $upperdir $workdir
104 # Test orphan whiteout in lower and upper layer, should remove
105 echo "+ Orphan whiteout"
107 make_whiteout $lowerdir/foo $upperdir/{foo,bar}
109 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
113 # Test valid whiteout covering lower target, should not remove
114 echo "+ Valid whiteout"
116 touch $lowerdir2/{foo,bar}
117 make_whiteout $upperdir/foo $lowerdir/bar
119 _overlay_fsck_expect $FSCK_OK "$lowerdir:$lowerdir2" $upperdir $workdir -p
120 check_whiteout $upperdir/foo $lowerdir/bar
122 # Test orphan whiteout in opaque directory, should remove
123 echo "+ Orphan whiteout(2)"
125 mkdir $lowerdir/testdir
126 touch $lowerdir/testdir/foo
127 make_opaque_dir $upperdir/testdir
128 make_whiteout $upperdir/testdir/foo
130 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
133 # Test orphan whiteout whose parent path is not an merged directory,
135 echo "+ Orphan whiteout(3)"
137 mkdir $lowerdir2/{testdir1,testdir2,testdir3}
138 touch $lowerdir2/{testdir1/foo,testdir2/foo,testdir3/foo}
139 mkdir $upperdir/{testdir1,testdir2,testdir3,testdir4}
140 touch $lowerdir/testdir1
141 make_whiteout $lowerdir/testdir2
142 make_opaque_dir $lowerdir/testdir3
143 make_whiteout $upperdir/{testdir1/foo,/testdir2/foo,testdir3/foo,testdir4/foo}
145 _overlay_fsck_expect $FSCK_NONDESTRUCT "$lowerdir:$lowerdir2" $upperdir $workdir -p
146 ls $upperdir/testdir1
147 ls $upperdir/testdir2
148 ls $upperdir/testdir3
149 ls $upperdir/testdir4
151 # Test orphan whiteout in redirect directory, should remove
152 echo "+ Orphan whiteout(4)"
154 mkdir $lowerdir/{testdir,origin}
155 touch $lowerdir/testdir/foo
156 make_redirect_dir $upperdir/testdir "origin"
157 make_whiteout $upperdir/testdir/foo
159 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
162 # Test valid whiteout in redirect directory cover file in lower
163 # redirect origin directory, should not remove
164 echo "+ Valid whiteout(2)"
166 mkdir $lowerdir/origin
167 touch $lowerdir/origin/foo
168 make_impure_dir $upperdir
169 make_redirect_dir $upperdir/testdir "origin"
170 make_whiteout $upperdir/origin $upperdir/testdir/foo
172 _overlay_fsck_expect $FSCK_OK $lowerdir $upperdir $workdir -p
173 check_whiteout $upperdir/testdir/foo
175 # Test valid whiteout covering lower target whose parent directory
176 # merge with a redirect directory in the middle layer, should not remove.
177 echo "+ Valid whiteout(3)"
179 mkdir -p $lowerdir2/origin/subdir
180 touch $lowerdir2/origin/subdir/foo
181 make_redirect_dir $lowerdir/testdir "origin"
182 mkdir -p $upperdir/testdir/subdir
183 make_whiteout $lowerdir/origin $upperdir/testdir/subdir/foo
184 make_impure_dir $upperdir/testdir $upperdir
186 _overlay_fsck_expect $FSCK_OK "$lowerdir:$lowerdir2" $upperdir $workdir -p
187 check_whiteout $upperdir/testdir/subdir/foo
189 # Test invalid whiteout in opaque subdirectory in a redirect directory,
191 echo "+ Orphan whiteout(5)"
193 mkdir -p $lowerdir/origin/subdir
194 touch $lowerdir/origin/subdir/foo
195 make_redirect_dir $upperdir/testdir "origin"
196 make_opaque_dir $upperdir/testdir/subdir
197 make_whiteout $upperdir/testdir/subdir/foo
199 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
200 ls $upperdir/testdir/subdir
202 # Test valid whiteout in reidrect subdirectory in a opaque directory
203 # covering lower target, should not remove
204 echo "+ Valid whiteout(4)"
206 mkdir $lowerdir/origin
207 touch $lowerdir/origin/foo
208 make_opaque_dir $upperdir/testdir
209 make_redirect_dir $upperdir/testdir/subdir "/origin"
210 make_whiteout $upperdir/origin $upperdir/testdir/subdir/foo
211 make_impure_dir $upperdir/testdir
213 _overlay_fsck_expect $FSCK_OK $lowerdir $upperdir $workdir -p
214 check_whiteout $upperdir/testdir/subdir/foo