btrfs/079: fix failure to umount scratch fs due to running filefrag process
[xfstests-dev.git] / tests / btrfs / 178
1 #! /bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (C) 2017 SUSE Linux Products GmbH. All Rights Reserved.
4 #
5 # FS QA Test No. btrfs/178
6 #
7 # Test an incremental send operation in a scenario where the relationship of
8 # ancestor-descendant between multiple directories is inversed, and where
9 # multiple directories that were previously ancestors of another directory now
10 # become descendents of multiple directories that used to be their ancestors in
11 # the parent snapshot. This used to trigger an infinite loop in the kernel code.
12 #
13 seq=`basename $0`
14 seqres=$RESULT_DIR/$seq
15 echo "QA output created by $seq"
16
17 tmp=/tmp/$$
18 status=1        # failure is the default!
19 trap "_cleanup; exit \$status" 0 1 2 3 15
20
21 _cleanup()
22 {
23         cd /
24         rm -fr $send_files_dir
25         rm -f $tmp.*
26 }
27
28 # get standard environment, filters and checks
29 . ./common/rc
30 . ./common/filter
31
32 # real QA test starts here
33 _supported_fs btrfs
34 _supported_os Linux
35 _require_test
36 _require_scratch
37 _require_fssum
38
39 send_files_dir=$TEST_DIR/btrfs-test-$seq
40
41 rm -f $seqres.full
42 rm -fr $send_files_dir
43 mkdir $send_files_dir
44
45 _scratch_mkfs >>$seqres.full 2>&1
46 _scratch_mount
47
48 # The name of each directory corresponds to its inode number, to make it easier
49 # to debug since btrfs' send processes inodes in ascending order according to
50 # their number.
51 mkdir $SCRATCH_MNT/257
52 mkdir $SCRATCH_MNT/258
53 mv $SCRATCH_MNT/257 $SCRATCH_MNT/258/257
54 mkdir $SCRATCH_MNT/259
55 mkdir $SCRATCH_MNT/260
56 mkdir $SCRATCH_MNT/261
57 mkdir $SCRATCH_MNT/262
58 mkdir $SCRATCH_MNT/263
59 mkdir $SCRATCH_MNT/264
60 mv $SCRATCH_MNT/258 $SCRATCH_MNT/264/258
61 mkdir $SCRATCH_MNT/265
62 mkdir $SCRATCH_MNT/266
63 mv $SCRATCH_MNT/259 $SCRATCH_MNT/266/259
64 mv $SCRATCH_MNT/260 $SCRATCH_MNT/266/260
65 mv $SCRATCH_MNT/264 $SCRATCH_MNT/266/264
66 mv $SCRATCH_MNT/265 $SCRATCH_MNT/266/265
67 mkdir $SCRATCH_MNT/266/260/267
68 mkdir $SCRATCH_MNT/266/268
69 mkdir $SCRATCH_MNT/266/269
70 mv $SCRATCH_MNT/262 $SCRATCH_MNT/266/269/262
71 mkdir $SCRATCH_MNT/266/270
72 mkdir $SCRATCH_MNT/271
73 mv $SCRATCH_MNT/266 $SCRATCH_MNT/271/266
74 mkdir $SCRATCH_MNT/271/266/272
75 mv $SCRATCH_MNT/263 $SCRATCH_MNT/271/266/272/263
76 mkdir $SCRATCH_MNT/273
77 mkdir $SCRATCH_MNT/271/266/274
78 mv $SCRATCH_MNT/273 $SCRATCH_MNT/271/266/274/273
79 mkdir $SCRATCH_MNT/271/266/272/275
80 mv $SCRATCH_MNT/271 $SCRATCH_MNT/261/271
81
82 # Filesystem looks like:
83 #
84 # .
85 # |--- 261/
86 #       |--- 271/
87 #             |--- 266/
88 #                   |--- 259/
89 #                   |--- 260/
90 #                   |     |--- 267
91 #                   |
92 #                   |--- 264/
93 #                   |     |--- 258/
94 #                   |           |--- 257/
95 #                   |
96 #                   |--- 265/
97 #                   |--- 268/
98 #                   |--- 269/
99 #                   |     |--- 262/
100 #                   |
101 #                   |--- 270/
102 #                   |--- 272/
103 #                   |     |--- 263/
104 #                   |     |--- 275/
105 #                   |
106 #                   |--- 274/
107 #                         |--- 273/
108 #
109 $BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT \
110         $SCRATCH_MNT/mysnap1 > /dev/null
111
112 $BTRFS_UTIL_PROG send -f $send_files_dir/1.snap \
113         $SCRATCH_MNT/mysnap1 2>&1 1>/dev/null | _filter_scratch
114
115 mv $SCRATCH_MNT/261/271/266/272/275 $SCRATCH_MNT/275
116 mv $SCRATCH_MNT/261/271/266/274 $SCRATCH_MNT/275/274
117 mv $SCRATCH_MNT/261/271/266/269/262 $SCRATCH_MNT/275/274/273/262
118 mv $SCRATCH_MNT/261/271/266/269 $SCRATCH_MNT/275/274/273/262/269
119 mv $SCRATCH_MNT/261/271/266/264/258/257 $SCRATCH_MNT/261/271/266/272
120 mv $SCRATCH_MNT/261/271/266/264/258 $SCRATCH_MNT/275/274/273/262/269/258
121 mv $SCRATCH_MNT/261/271 $SCRATCH_MNT/275/274/273/262/269/258/271
122 mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/268 \
123         $SCRATCH_MNT/275/274/273/262/269/258/271/268
124 mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/260/267 \
125         $SCRATCH_MNT/275/274/273/262/269/258/271/268/267
126 mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/270 \
127         $SCRATCH_MNT/275/274/273/262/269/258/271/268/267/270
128 mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/265 \
129         $SCRATCH_MNT/275/274/273/262/269/258/271/266/259/265
130 mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/259 \
131         $SCRATCH_MNT/275/274/273/262/269/258/271/268/267/270/259
132 mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/272/263 \
133         $SCRATCH_MNT/275/274/273/262/269/258/271/266/264/263
134 mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/272 \
135         $SCRATCH_MNT/275/274/273/262/269/258/271/268/267/270/272
136 mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/260 \
137         $SCRATCH_MNT/275/274/273/262/269/258/271/268/267/270/272/257/260
138 mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/264 \
139         $SCRATCH_MNT/275/274/273/262/269/258/271/268/267/270/272/257/264
140 mv $SCRATCH_MNT/261 \
141         $SCRATCH_MNT/275/274/273/262/269/258/271/268/267/270/272/257/264/263/261
142 mv $SCRATCH_MNT/275/274/273/262/269/258/271/266 \
143         $SCRATCH_MNT/275/274/273/262/269/258/271/268/267/270/272/257/264/263/261/266
144
145 # Filesystem now looks like:
146 #
147 # .
148 # |-- 275/
149 #      |-- 274/
150 #           |-- 273/
151 #                |-- 262/
152 #                     |-- 269/
153 #                          |-- 258/
154 #                               |-- 271/
155 #                                    |-- 268/
156 #                                         |-- 267/
157 #                                              |-- 270/
158 #                                                   |-- 259/
159 #                                                   |    |-- 265/
160 #                                                   |
161 #                                                   |-- 272/
162 #                                                        |-- 257/
163 #                                                             |-- 260/
164 #                                                             |-- 264/
165 #                                                                  |-- 263/
166 #                                                                       |-- 261/
167 #                                                                            |-- 266/
168 #
169 $BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT \
170                  $SCRATCH_MNT/mysnap2 > /dev/null
171 $BTRFS_UTIL_PROG send -p $SCRATCH_MNT/mysnap1 -f $send_files_dir/2.snap \
172                  $SCRATCH_MNT/mysnap2 2>&1 1>/dev/null | _filter_scratch
173
174 $FSSUM_PROG -A -f -w $send_files_dir/1.fssum $SCRATCH_MNT/mysnap1
175 $FSSUM_PROG -A -f -w $send_files_dir/2.fssum \
176         -x $SCRATCH_MNT/mysnap2/mysnap1 $SCRATCH_MNT/mysnap2
177
178 # Now recreate the filesystem by receiving both send streams and verify we get
179 # the same content that the original filesystem had.
180 _scratch_unmount
181 _scratch_mkfs >>$seqres.full 2>&1
182 _scratch_mount
183
184 $BTRFS_UTIL_PROG receive -f $send_files_dir/1.snap $SCRATCH_MNT > /dev/null
185 $BTRFS_UTIL_PROG receive -f $send_files_dir/2.snap $SCRATCH_MNT > /dev/null
186 $FSSUM_PROG -r $send_files_dir/1.fssum $SCRATCH_MNT/mysnap1
187 $FSSUM_PROG -r $send_files_dir/2.fssum $SCRATCH_MNT/mysnap2
188
189 status=0
190 exit