generic: test for creating duplicate filenames in encrypted dir
[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 _require_scratch_nocheck
35 _require_attrs trusted
36 _require_command "$FSCK_OVERLAY_PROG" fsck.overlay
37
38 # remove all files from previous tests
39 _scratch_mkfs
40
41 OVL_XATTR_OPAQUE_VAL=y
42 OVL_XATTR_IMPURE_VAL=y
43
44 # Create impure directories
45 make_impure_dir()
46 {
47         for dir in $*; do
48                 mkdir -p $dir
49                 $SETFATTR_PROG -n $OVL_XATTR_IMPURE -v $OVL_XATTR_IMPURE_VAL $dir
50         done
51 }
52
53 # Create a redirect directory
54 make_redirect_dir()
55 {
56         local target=$1
57         local value=$2
58
59         mkdir -p $target
60         $SETFATTR_PROG -n $OVL_XATTR_REDIRECT -v $value $target
61 }
62
63 # Check redirect xattr
64 check_redirect()
65 {
66         local target=$1
67         local expect=$2
68
69         value=$(_getfattr --absolute-names --only-values -n \
70                 $OVL_XATTR_REDIRECT $target)
71
72         [[ "$value" == "$expect" ]] || echo "Redirect xattr incorrect"
73 }
74
75 check_no_redirect()
76 {
77         local target=$1
78
79         value=$(_getfattr --absolute-names -d -m \
80                 $OVL_XATTR_REDIRECT $target)
81
82         [[ -z "$value" ]] || echo "Redirect xattr not empty"
83 }
84
85 # Check opaque xattr
86 check_opaque()
87 {
88         local target=$1
89
90         value=$(_getfattr --absolute-names --only-values -n \
91                 $OVL_XATTR_OPAQUE $target)
92
93         [[ "$value" == "$OVL_XATTR_OPAQUE_VAL" ]] || \
94                 echo "Opaque xattr incorrect"
95 }
96
97 # Create a whiteout
98 make_whiteout()
99 {
100         for arg in $*; do
101                 mknod $arg c 0 0
102         done
103 }
104
105 # Check whiteout
106 check_whiteout()
107 {
108         for arg in $*; do
109                 local ttype=`stat -c "%F:%t,%T" $arg`
110
111                 [[ "$ttype" == "character special file:0,0" ]] || \
112                         echo "Valid whiteout removed incorrectly"
113         done
114 }
115
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
121
122 make_test_dirs()
123 {
124         rm -rf $lowerdir $lowerdir2 $upperdir $workdir
125         mkdir -p $lowerdir $lowerdir2 $upperdir $workdir
126 }
127
128 # Test invalid redirect xattr point to a nonexistent origin, should remove
129 echo "+ Invalid redirect"
130 make_test_dirs
131 make_redirect_dir $upperdir/testdir "invalid"
132
133 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
134 check_no_redirect $upperdir/testdir
135
136 # Test invalid redirect xattr point to a file origin, should remove
137 echo "+ Invalid redirect(2)"
138 make_test_dirs
139 touch $lowerdir/origin
140 make_redirect_dir $upperdir/testdir "origin"
141
142 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
143 check_no_redirect $upperdir/testdir
144
145 # Test valid redirect xattr point to a directory origin in the same directory,
146 # should not remove
147 echo "+ Valid redirect"
148 make_test_dirs
149 mkdir $lowerdir/origin
150 make_whiteout $upperdir/origin
151 make_redirect_dir $upperdir/testdir "origin"
152 make_impure_dir $upperdir
153
154 _overlay_fsck_expect $FSCK_OK $lowerdir $upperdir $workdir -p
155 check_redirect $upperdir/testdir "origin"
156
157 # Test valid redirect xattr point to a directory origin in different directories
158 # should not remove
159 echo "+ Valid redirect(2)"
160 make_test_dirs
161 mkdir $lowerdir/origin
162 make_whiteout $upperdir/origin
163 make_redirect_dir $upperdir/testdir1/testdir2 "/origin"
164 make_impure_dir $upperdir/testdir1
165
166 _overlay_fsck_expect $FSCK_OK $lowerdir $upperdir $workdir -p
167 check_redirect $upperdir/testdir1/testdir2 "/origin"
168
169 # Test valid redirect xattr but missing whiteout to cover lower target,
170 # should fix whiteout
171 echo "+ Missing whiteout"
172 make_test_dirs
173 mkdir $lowerdir/origin
174 make_redirect_dir $upperdir/testdir "origin"
175
176 _overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
177 check_redirect $upperdir/testdir "origin"
178 check_whiteout $upperdir/origin
179
180 # Test valid redirect xattrs exchanged by rename, should not remove
181 echo "+ Valid redirect(3)"
182 make_test_dirs
183 mkdir $lowerdir/{testdir1,testdir2}
184 make_redirect_dir $upperdir/testdir1 "testdir2"
185 make_redirect_dir $upperdir/testdir2 "testdir1"
186 make_impure_dir $upperdir
187
188 _overlay_fsck_expect $FSCK_OK $lowerdir $upperdir $workdir -p
189 check_redirect $upperdir/testdir1 "testdir2"
190 check_redirect $upperdir/testdir2 "testdir1"
191
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)"
195 make_test_dirs
196 mkdir $lowerdir/testdir
197 make_redirect_dir $upperdir/testdir "invalid"
198
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
203
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"
207 make_test_dirs
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"
212
213 _overlay_fsck_expect $FSCK_UNCORRECTED "$lowerdir:$lowerdir2" $upperdir $workdir -p
214
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
221
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)"
225 make_test_dirs
226 mkdir $lowerdir/origin $upperdir/origin
227 make_redirect_dir $upperdir/testdir "origin"
228
229 _overlay_fsck_expect $FSCK_UNCORRECTED $lowerdir $upperdir $workdir -p
230
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
234
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)"
238 make_test_dirs
239 mkdir $lowerdir/{origin,testdir} $upperdir/origin
240 make_redirect_dir $upperdir/testdir "invalid"
241
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
247
248 # success, all done
249 status=0
250 exit