5f3fe097efd40108aa7557ea916fcef4ca849665
[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 . ./common/preamble
26 _begin_fstest auto quick mount
27
28 # Override the default cleanup function.
29 _cleanup()
30 {
31         cd /
32         rm -f $tmp.*
33         $UMOUNT_PROG $mnt2 2>/dev/null
34 }
35
36 # Import common functions.
37 . ./common/filter
38
39 # real QA test starts here
40 _supported_fs overlay
41 # Use non-default scratch underlying overlay dirs, we need to check
42 # them explicity after test.
43 _require_scratch_nocheck
44 _require_scratch_feature index
45
46 # Remove all files from previous tests
47 _scratch_mkfs
48
49 # Create multiple lowerdirs, upperdirs and workdirs
50 basedir=$OVL_BASE_SCRATCH_MNT
51 lowerdir=$basedir/lower
52 upperdir=$basedir/upper
53 workdir=$basedir/workdir
54 upperdir2=$basedir/upper.2
55 workdir2=$basedir/workdir.2
56 mnt2=$basedir/mnt.2
57
58 mkdir -p $lowerdir/lower $upperdir $workdir
59
60 # Try to mount an overlay with the same upperdir/lowerdir - expect ELOOP
61 echo Conflicting upperdir/lowerdir
62 _overlay_scratch_mount_dirs $upperdir $upperdir $workdir \
63         2>&1 | _filter_error_mount
64 $UMOUNT_PROG $SCRATCH_MNT 2>/dev/null
65
66 # Use new upper/work dirs for each test to avoid ESTALE errors
67 # on mismatch lowerdir/upperdir (see test overlay/037)
68 rm -rf $upperdir $workdir
69 mkdir $upperdir $workdir
70
71 # Try to mount an overlay with the same workdir/lowerdir - expect ELOOP
72 # because $workdir/work overlaps with lowerdir
73 echo Conflicting workdir/lowerdir
74 _overlay_scratch_mount_dirs $workdir $upperdir $workdir \
75         -oindex=off 2>&1 | _filter_error_mount
76 $UMOUNT_PROG $SCRATCH_MNT 2>/dev/null
77
78 rm -rf $upperdir $workdir
79 mkdir -p $upperdir/lower $workdir
80
81 # Try to mount an overlay with overlapping upperdir/lowerdir - expect ELOOP
82 # upperdir inside lowerdir is allowed, lowerdir inside upperdir is not allowed
83 echo Overlapping upperdir/lowerdir
84 _overlay_scratch_mount_dirs $upperdir/lower $upperdir $workdir \
85         2>&1 | _filter_error_mount
86 $UMOUNT_PROG $SCRATCH_MNT 2>/dev/null
87
88 rm -rf $upperdir $workdir
89 mkdir $upperdir $workdir
90
91 # Try to mount an overlay with the same lower layers - expect ELOOP
92 echo Conflicting lower layers
93 _overlay_scratch_mount_dirs $lowerdir:$lowerdir $upperdir $workdir \
94         2>&1 | _filter_error_mount
95 $UMOUNT_PROG $SCRATCH_MNT 2>/dev/null
96
97 rm -rf $upperdir $workdir
98 mkdir $upperdir $workdir
99
100 # Try to mount an overlay with overlapping lower layers - expect ELOOP
101 echo Overlapping lower layers below
102 _overlay_scratch_mount_dirs $lowerdir:$lowerdir/lower $upperdir $workdir \
103         2>&1 | _filter_error_mount
104 $UMOUNT_PROG $SCRATCH_MNT 2>/dev/null
105
106 rm -rf $upperdir $workdir
107 mkdir $upperdir $workdir
108
109 # Try to mount an overlay with overlapping lower layers - expect ELOOP
110 echo Overlapping lower layers above
111 _overlay_scratch_mount_dirs $lowerdir/lower:$lowerdir $upperdir $workdir \
112         2>&1 | _filter_error_mount
113 $UMOUNT_PROG $SCRATCH_MNT 2>/dev/null
114
115 rm -rf $upperdir $workdir
116 mkdir -p $upperdir/upper $workdir $mnt2
117
118 # Mount overlay with non overlapping lowerdir, upperdir, workdir -
119 # expect success
120 _overlay_mount_dirs $lowerdir $upperdir $workdir overlay $mnt2
121
122 rm -rf $upperdir2 $workdir2
123 mkdir -p $upperdir2 $workdir2 $mnt2
124
125 # Try to mount an overlay with layers overlapping with another overlayfs
126 # upperdir - expect EBUSY with index=on and success with index=off
127 echo "Overlapping with upperdir of another instance (index=on)"
128 _overlay_scratch_mount_dirs $upperdir/upper $upperdir2 $workdir2 \
129         -oindex=on 2>&1 | _filter_busy_mount
130 $UMOUNT_PROG $SCRATCH_MNT 2>/dev/null
131
132 rm -rf $upperdir2 $workdir2
133 mkdir -p $upperdir2 $workdir2
134
135 echo "Overlapping with upperdir of another instance (index=off)"
136 _overlay_scratch_mount_dirs $upperdir/upper $upperdir2 $workdir2 \
137         -oindex=off && $UMOUNT_PROG $SCRATCH_MNT
138
139 rm -rf $upperdir2 $workdir2
140 mkdir -p $upperdir2 $workdir2
141
142 # Try to mount an overlay with layers overlapping with another overlayfs
143 # workdir - expect EBUSY with index=on and success with index=off
144 echo "Overlapping with workdir of another instance (index=on)"
145 _overlay_scratch_mount_dirs $workdir/work $upperdir2 $workdir2 \
146         -oindex=on 2>&1 | _filter_busy_mount
147 $UMOUNT_PROG $SCRATCH_MNT 2>/dev/null
148
149 rm -rf $upperdir2 $workdir2
150 mkdir -p $upperdir2 $workdir2
151
152 echo "Overlapping with workdir of another instance (index=off)"
153 _overlay_scratch_mount_dirs $workdir/work $upperdir2 $workdir2 \
154         -oindex=off && $UMOUNT_PROG $SCRATCH_MNT
155
156 # Move upper layer root into lower layer after mount
157 echo Overlapping upperdir/lowerdir after mount
158 mv $upperdir $lowerdir/
159 # Lookup files in overlay mount with overlapping layers -
160 # expect ELOOP when upper layer root is found in lower layer
161 find $mnt2/upper 2>&1 | _filter_scratch
162
163 # success, all done
164 status=0
165 exit