generic: test for non-zero used blocks while writing into a file
[xfstests-dev.git] / tests / overlay / 065
1 #! /bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (C) 2019 CTERA Networks. All Rights Reserved.
4 #
5 # FS QA Test 065
6 #
7 # Test mount error cases with overlapping layers
8 #
9 # - Same upperdir/lowerdir
10 # - Overlapping upperdir/lowerdir
11 # - Overlapping lowerdir layers
12 # - Overlapping lowerdir with other mount upperdir/workdir
13 #
14 # Overlapping layers on mount or lookup results in ELOOP.
15 # Overlapping lowerdir with other mount upperdir/workdir
16 # result in EBUSY (only if index=on is used).
17 #
18 # This is a regression test for kernel commit:
19 #
20 #    146d62e5a586 "ovl: detect overlapping layers"
21 #
22 # and its followup fix commit:
23 #    0be0bfd2de9d "ovl: fix regression caused by overlapping layers detection"
24 #
25 seq=`basename $0`
26 seqres=$RESULT_DIR/$seq
27 echo "QA output created by $seq"
28
29 here=`pwd`
30 tmp=/tmp/$$
31 status=1        # failure is the default!
32 trap "_cleanup; exit \$status" 0 1 2 3 15
33
34 _cleanup()
35 {
36         cd /
37         rm -f $tmp.*
38         $UMOUNT_PROG $mnt2 2>/dev/null
39 }
40
41 # get standard environment, filters and checks
42 . ./common/rc
43 . ./common/filter
44
45 # remove previous $seqres.full before test
46 rm -f $seqres.full
47
48 # real QA test starts here
49 _supported_fs overlay
50 # Use non-default scratch underlying overlay dirs, we need to check
51 # them explicity after test.
52 _require_scratch_nocheck
53 _require_scratch_feature index
54
55 # Remove all files from previous tests
56 _scratch_mkfs
57
58 # Create multiple lowerdirs, upperdirs and workdirs
59 basedir=$OVL_BASE_SCRATCH_MNT
60 lowerdir=$basedir/lower
61 upperdir=$basedir/upper
62 workdir=$basedir/workdir
63 upperdir2=$basedir/upper.2
64 workdir2=$basedir/workdir.2
65 mnt2=$basedir/mnt.2
66
67 mkdir -p $lowerdir/lower $upperdir $workdir
68
69 # Try to mount an overlay with the same upperdir/lowerdir - expect ELOOP
70 echo Conflicting upperdir/lowerdir
71 _overlay_scratch_mount_dirs $upperdir $upperdir $workdir \
72         2>&1 | _filter_error_mount
73 $UMOUNT_PROG $SCRATCH_MNT 2>/dev/null
74
75 # Use new upper/work dirs for each test to avoid ESTALE errors
76 # on mismatch lowerdir/upperdir (see test overlay/037)
77 rm -rf $upperdir $workdir
78 mkdir $upperdir $workdir
79
80 # Try to mount an overlay with the same workdir/lowerdir - expect ELOOP
81 # because $workdir/work overlaps with lowerdir
82 echo Conflicting workdir/lowerdir
83 _overlay_scratch_mount_dirs $workdir $upperdir $workdir \
84         -oindex=off 2>&1 | _filter_error_mount
85 $UMOUNT_PROG $SCRATCH_MNT 2>/dev/null
86
87 rm -rf $upperdir $workdir
88 mkdir $upperdir $workdir
89
90 # Try to mount an overlay with overlapping upperdir/lowerdir - expect ELOOP
91 echo Overlapping upperdir/lowerdir
92 _overlay_scratch_mount_dirs $basedir $upperdir $workdir \
93         2>&1 | _filter_error_mount
94 $UMOUNT_PROG $SCRATCH_MNT 2>/dev/null
95
96 rm -rf $upperdir $workdir
97 mkdir $upperdir $workdir
98
99 # Try to mount an overlay with the same lower layers - expect ELOOP
100 echo Conflicting lower layers
101 _overlay_scratch_mount_dirs $lowerdir:$lowerdir $upperdir $workdir \
102         2>&1 | _filter_error_mount
103 $UMOUNT_PROG $SCRATCH_MNT 2>/dev/null
104
105 rm -rf $upperdir $workdir
106 mkdir $upperdir $workdir
107
108 # Try to mount an overlay with overlapping lower layers - expect ELOOP
109 echo Overlapping lower layers below
110 _overlay_scratch_mount_dirs $lowerdir:$lowerdir/lower $upperdir $workdir \
111         2>&1 | _filter_error_mount
112 $UMOUNT_PROG $SCRATCH_MNT 2>/dev/null
113
114 rm -rf $upperdir $workdir
115 mkdir $upperdir $workdir
116
117 # Try to mount an overlay with overlapping lower layers - expect ELOOP
118 echo Overlapping lower layers above
119 _overlay_scratch_mount_dirs $lowerdir/lower:$lowerdir $upperdir $workdir \
120         2>&1 | _filter_error_mount
121 $UMOUNT_PROG $SCRATCH_MNT 2>/dev/null
122
123 rm -rf $upperdir $workdir
124 mkdir -p $upperdir/upper $workdir $mnt2
125
126 # Mount overlay with non overlapping lowerdir, upperdir, workdir -
127 # expect success
128 _overlay_mount_dirs $lowerdir $upperdir $workdir overlay $mnt2
129
130 rm -rf $upperdir2 $workdir2
131 mkdir -p $upperdir2 $workdir2 $mnt2
132
133 # Try to mount an overlay with layers overlapping with another overlayfs
134 # upperdir - expect EBUSY with index=on and success with index=off
135 echo "Overlapping with upperdir of another instance (index=on)"
136 _overlay_scratch_mount_dirs $upperdir/upper $upperdir2 $workdir2 \
137         -oindex=on 2>&1 | _filter_busy_mount
138 $UMOUNT_PROG $SCRATCH_MNT 2>/dev/null
139
140 rm -rf $upperdir2 $workdir2
141 mkdir -p $upperdir2 $workdir2
142
143 echo "Overlapping with upperdir of another instance (index=off)"
144 _overlay_scratch_mount_dirs $upperdir/upper $upperdir2 $workdir2 \
145         -oindex=off && $UMOUNT_PROG $SCRATCH_MNT
146
147 rm -rf $upperdir2 $workdir2
148 mkdir -p $upperdir2 $workdir2
149
150 # Try to mount an overlay with layers overlapping with another overlayfs
151 # workdir - expect EBUSY with index=on and success with index=off
152 echo "Overlapping with workdir of another instance (index=on)"
153 _overlay_scratch_mount_dirs $workdir/work $upperdir2 $workdir2 \
154         -oindex=on 2>&1 | _filter_busy_mount
155 $UMOUNT_PROG $SCRATCH_MNT 2>/dev/null
156
157 rm -rf $upperdir2 $workdir2
158 mkdir -p $upperdir2 $workdir2
159
160 echo "Overlapping with workdir of another instance (index=off)"
161 _overlay_scratch_mount_dirs $workdir/work $upperdir2 $workdir2 \
162         -oindex=off && $UMOUNT_PROG $SCRATCH_MNT
163
164 # Move upper layer root into lower layer after mount
165 echo Overlapping upperdir/lowerdir after mount
166 mv $upperdir $lowerdir/
167 # Lookup files in overlay mount with overlapping layers -
168 # expect ELOOP when upper layer root is found in lower layer
169 find $mnt2/upper 2>&1 | _filter_scratch
170
171 # success, all done
172 status=0
173 exit