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 _begin_fstest auto quick fsck
12 # Import common functions.
16 # real QA test starts here
18 _require_scratch_nocheck
19 _require_attrs trusted
20 _require_command "$FSCK_OVERLAY_PROG" fsck.overlay
22 OVL_XATTR_OPAQUE_VAL=y
23 OVL_XATTR_IMPURE_VAL=y
25 # remove all files from previous tests
32 local ttype=`stat -c "%F:%t,%T" $arg`
34 [[ "$ttype" == "character special file:0,0" ]] || \
35 echo "Valid whiteout removed incorrectly"
47 # Create an opaque directory
53 $SETFATTR_PROG -n $OVL_XATTR_OPAQUE -v $OVL_XATTR_OPAQUE_VAL $target
56 # Create impure directories
61 $SETFATTR_PROG -n $OVL_XATTR_IMPURE -v $OVL_XATTR_IMPURE_VAL $dir
65 # Create a redirect directory
72 $SETFATTR_PROG -n $OVL_XATTR_REDIRECT -v $value $target
75 # Create test directories
76 lowerdir=$OVL_BASE_SCRATCH_MNT/lower
77 lowerdir2=$OVL_BASE_SCRATCH_MNT/lower2
78 upperdir=$OVL_BASE_SCRATCH_MNT/upper
79 workdir=$OVL_BASE_SCRATCH_MNT/workdir
83 rm -rf $lowerdir $lowerdir2 $upperdir $workdir
84 mkdir -p $lowerdir $lowerdir2 $upperdir $workdir
87 # Test orphan whiteout in lower and upper layer, should remove
88 echo "+ Orphan whiteout"
90 make_whiteout $lowerdir/foo $upperdir/{foo,bar}
92 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
96 # Test valid whiteout covering lower target, should not remove
97 echo "+ Valid whiteout"
99 touch $lowerdir2/{foo,bar}
100 make_whiteout $upperdir/foo $lowerdir/bar
102 _overlay_fsck_expect $FSCK_OK "$lowerdir:$lowerdir2" $upperdir $workdir -p
103 check_whiteout $upperdir/foo $lowerdir/bar
105 # Test orphan whiteout in opaque directory, should remove
106 echo "+ Orphan whiteout(2)"
108 mkdir $lowerdir/testdir
109 touch $lowerdir/testdir/foo
110 make_opaque_dir $upperdir/testdir
111 make_whiteout $upperdir/testdir/foo
113 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
116 # Test orphan whiteout whose parent path is not an merged directory,
118 echo "+ Orphan whiteout(3)"
120 mkdir $lowerdir2/{testdir1,testdir2,testdir3}
121 touch $lowerdir2/{testdir1/foo,testdir2/foo,testdir3/foo}
122 mkdir $upperdir/{testdir1,testdir2,testdir3,testdir4}
123 touch $lowerdir/testdir1
124 make_whiteout $lowerdir/testdir2
125 make_opaque_dir $lowerdir/testdir3
126 make_whiteout $upperdir/{testdir1/foo,/testdir2/foo,testdir3/foo,testdir4/foo}
128 _overlay_fsck_expect $FSCK_NONDESTRUCT "$lowerdir:$lowerdir2" $upperdir $workdir -p
129 ls $upperdir/testdir1
130 ls $upperdir/testdir2
131 ls $upperdir/testdir3
132 ls $upperdir/testdir4
134 # Test orphan whiteout in redirect directory, should remove
135 echo "+ Orphan whiteout(4)"
137 mkdir $lowerdir/{testdir,origin}
138 touch $lowerdir/testdir/foo
139 make_redirect_dir $upperdir/testdir "origin"
140 make_whiteout $upperdir/testdir/foo
142 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
145 # Test valid whiteout in redirect directory cover file in lower
146 # redirect origin directory, should not remove
147 echo "+ Valid whiteout(2)"
149 mkdir $lowerdir/origin
150 touch $lowerdir/origin/foo
151 make_impure_dir $upperdir
152 make_redirect_dir $upperdir/testdir "origin"
153 make_whiteout $upperdir/origin $upperdir/testdir/foo
155 _overlay_fsck_expect $FSCK_OK $lowerdir $upperdir $workdir -p
156 check_whiteout $upperdir/testdir/foo
158 # Test valid whiteout covering lower target whose parent directory
159 # merge with a redirect directory in the middle layer, should not remove.
160 echo "+ Valid whiteout(3)"
162 mkdir -p $lowerdir2/origin/subdir
163 touch $lowerdir2/origin/subdir/foo
164 make_redirect_dir $lowerdir/testdir "origin"
165 mkdir -p $upperdir/testdir/subdir
166 make_whiteout $lowerdir/origin $upperdir/testdir/subdir/foo
167 make_impure_dir $upperdir/testdir $upperdir
169 _overlay_fsck_expect $FSCK_OK "$lowerdir:$lowerdir2" $upperdir $workdir -p
170 check_whiteout $upperdir/testdir/subdir/foo
172 # Test invalid whiteout in opaque subdirectory in a redirect directory,
174 echo "+ Orphan whiteout(5)"
176 mkdir -p $lowerdir/origin/subdir
177 touch $lowerdir/origin/subdir/foo
178 make_redirect_dir $upperdir/testdir "origin"
179 make_opaque_dir $upperdir/testdir/subdir
180 make_whiteout $upperdir/testdir/subdir/foo
182 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
183 ls $upperdir/testdir/subdir
185 # Test valid whiteout in reidrect subdirectory in a opaque directory
186 # covering lower target, should not remove
187 echo "+ Valid whiteout(4)"
189 mkdir $lowerdir/origin
190 touch $lowerdir/origin/foo
191 make_opaque_dir $upperdir/testdir
192 make_redirect_dir $upperdir/testdir/subdir "/origin"
193 make_whiteout $upperdir/origin $upperdir/testdir/subdir/foo
194 make_impure_dir $upperdir/testdir
196 _overlay_fsck_expect $FSCK_OK $lowerdir $upperdir $workdir -p
197 check_whiteout $upperdir/testdir/subdir/foo