2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (C) 2017 SUSE Linux Products GmbH. All Rights Reserved.
5 # FS QA Test No. btrfs/178
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.
14 seqres=$RESULT_DIR/$seq
15 echo "QA output created by $seq"
18 status=1 # failure is the default!
19 trap "_cleanup; exit \$status" 0 1 2 3 15
24 rm -fr $send_files_dir
28 # get standard environment, filters and checks
32 # real QA test starts here
39 send_files_dir=$TEST_DIR/btrfs-test-$seq
42 rm -fr $send_files_dir
45 _scratch_mkfs >>$seqres.full 2>&1
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
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
82 # Filesystem looks like:
109 $BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT \
110 $SCRATCH_MNT/mysnap1 > /dev/null
112 $BTRFS_UTIL_PROG send -f $send_files_dir/1.snap \
113 $SCRATCH_MNT/mysnap1 2>&1 1>/dev/null | _filter_scratch
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
145 # Filesystem now looks like:
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
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
178 # Now recreate the filesystem by receiving both send streams and verify we get
179 # the same content that the original filesystem had.
181 _scratch_mkfs >>$seqres.full 2>&1
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