xfs/{263,106}: erase max warnings printout
[xfstests-dev.git] / tests / overlay / 046
1 #! /bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (c) 2018 Huawei.  All Rights Reserved.
4 #
5 # FS QA Test No. 046
6 #
7 # Test fsck.overlay how to deal with redirect xattr in overlayfs.
8 #
9 seq=`basename $0`
10 seqres=$RESULT_DIR/$seq
11 echo "QA output created by $seq"
12
13 here=`pwd`
14 tmp=/tmp/$$
15 status=1        # failure is the default!
16 trap "_cleanup; exit \$status" 0 1 2 3 15
17
18 _cleanup()
19 {
20         cd /
21         rm -f $tmp.*
22 }
23
24 # get standard environment, filters and checks
25 . ./common/rc
26 . ./common/filter
27 . ./common/attr
28
29 # remove previous $seqres.full before test
30 rm -f $seqres.full
31
32 # real QA test starts here
33 _supported_fs overlay
34 _supported_os Linux
35 _require_scratch_nocheck
36 _require_attrs
37 _require_command "$FSCK_OVERLAY_PROG" fsck.overlay
38
39 # remove all files from previous tests
40 _scratch_mkfs
41
42 OVL_XATTR_OPAQUE_VAL=y
43 OVL_XATTR_IMPURE_VAL=y
44
45 # Create impure directories
46 make_impure_dir()
47 {
48         for dir in $*; do
49                 mkdir -p $dir
50                 $SETFATTR_PROG -n $OVL_XATTR_IMPURE -v $OVL_XATTR_IMPURE_VAL $dir
51         done
52 }
53
54 # Create a redirect directory
55 make_redirect_dir()
56 {
57         local target=$1
58         local value=$2
59
60         mkdir -p $target
61         $SETFATTR_PROG -n $OVL_XATTR_REDIRECT -v $value $target
62 }
63
64 # Check redirect xattr
65 check_redirect()
66 {
67         local target=$1
68         local expect=$2
69
70         value=$(_getfattr --absolute-names --only-values -n \
71                 $OVL_XATTR_REDIRECT $target)
72
73         [[ "$value" == "$expect" ]] || echo "Redirect xattr incorrect"
74 }
75
76 check_no_redirect()
77 {
78         local target=$1
79
80         value=$(_getfattr --absolute-names -d -m \
81                 $OVL_XATTR_REDIRECT $target)
82
83         [[ -z "$value" ]] || echo "Redirect xattr not empty"
84 }
85
86 # Check opaque xattr
87 check_opaque()
88 {
89         local target=$1
90
91         value=$(_getfattr --absolute-names --only-values -n \
92                 $OVL_XATTR_OPAQUE $target)
93
94         [[ "$value" == "$OVL_XATTR_OPAQUE_VAL" ]] || \
95                 echo "Opaque xattr incorrect"
96 }
97
98 # Create a whiteout
99 make_whiteout()
100 {
101         for arg in $*; do
102                 mknod $arg c 0 0
103         done
104 }
105
106 # Check whiteout
107 check_whiteout()
108 {
109         for arg in $*; do
110                 local ttype=`stat -c "%F:%t,%T" $arg`
111
112                 [[ "$ttype" == "character special file:0,0" ]] || \
113                         echo "Valid whiteout removed incorrectly"
114         done
115 }
116
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
122
123 make_test_dirs()
124 {
125         rm -rf $lowerdir $lowerdir2 $upperdir $workdir
126         mkdir -p $lowerdir $lowerdir2 $upperdir $workdir
127 }
128
129 # Test invalid redirect xattr point to a nonexistent origin, should remove
130 echo "+ Invalid redirect"
131 make_test_dirs
132 make_redirect_dir $upperdir/testdir "invalid"
133
134 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
135 check_no_redirect $upperdir/testdir
136
137 # Test invalid redirect xattr point to a file origin, should remove
138 echo "+ Invalid redirect(2)"
139 make_test_dirs
140 touch $lowerdir/origin
141 make_redirect_dir $upperdir/testdir "origin"
142
143 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
144 check_no_redirect $upperdir/testdir
145
146 # Test valid redirect xattr point to a directory origin in the same directory,
147 # should not remove
148 echo "+ Valid redirect"
149 make_test_dirs
150 mkdir $lowerdir/origin
151 make_whiteout $upperdir/origin
152 make_redirect_dir $upperdir/testdir "origin"
153 make_impure_dir $upperdir
154
155 _overlay_fsck_expect $FSCK_OK $lowerdir $upperdir $workdir -p
156 check_redirect $upperdir/testdir "origin"
157
158 # Test valid redirect xattr point to a directory origin in different directories
159 # should not remove
160 echo "+ Valid redirect(2)"
161 make_test_dirs
162 mkdir $lowerdir/origin
163 make_whiteout $upperdir/origin
164 make_redirect_dir $upperdir/testdir1/testdir2 "/origin"
165 make_impure_dir $upperdir/testdir1
166
167 _overlay_fsck_expect $FSCK_OK $lowerdir $upperdir $workdir -p
168 check_redirect $upperdir/testdir1/testdir2 "/origin"
169
170 # Test valid redirect xattr but missing whiteout to cover lower target,
171 # should fix whiteout
172 echo "+ Missing whiteout"
173 make_test_dirs
174 mkdir $lowerdir/origin
175 make_redirect_dir $upperdir/testdir "origin"
176
177 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
178 check_redirect $upperdir/testdir "origin"
179 check_whiteout $upperdir/origin
180
181 # Test valid redirect xattrs exchanged by rename, should not remove
182 echo "+ Valid redirect(3)"
183 make_test_dirs
184 mkdir $lowerdir/{testdir1,testdir2}
185 make_redirect_dir $upperdir/testdir1 "testdir2"
186 make_redirect_dir $upperdir/testdir2 "testdir1"
187 make_impure_dir $upperdir
188
189 _overlay_fsck_expect $FSCK_OK $lowerdir $upperdir $workdir -p
190 check_redirect $upperdir/testdir1 "testdir2"
191 check_redirect $upperdir/testdir2 "testdir1"
192
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)"
196 make_test_dirs
197 mkdir $lowerdir/testdir
198 make_redirect_dir $upperdir/testdir "invalid"
199
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
204
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"
208 make_test_dirs
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"
213
214 _overlay_fsck_expect $FSCK_UNCORRECTED "$lowerdir:$lowerdir2" $upperdir $workdir -p
215
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
222
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)"
226 make_test_dirs
227 mkdir $lowerdir/origin $upperdir/origin
228 make_redirect_dir $upperdir/testdir "origin"
229
230 _overlay_fsck_expect $FSCK_UNCORRECTED $lowerdir $upperdir $workdir -p
231
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
235
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)"
239 make_test_dirs
240 mkdir $lowerdir/{origin,testdir} $upperdir/origin
241 make_redirect_dir $upperdir/testdir "invalid"
242
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
248
249 # success, all done
250 status=0
251 exit