summaryrefslogtreecommitdiff
path: root/tests/btrfs/178
blob: fda287dd9dcc4f719fd3ab7317dcd5c309d44293 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2017 SUSE Linux Products GmbH. All Rights Reserved.
#
# FS QA Test No. btrfs/178
#
# Test an incremental send operation in a scenario where the relationship of
# ancestor-descendant between multiple directories is inversed, and where
# multiple directories that were previously ancestors of another directory now
# become descendents of multiple directories that used to be their ancestors in
# the parent snapshot. This used to trigger an infinite loop in the kernel code.
#
. ./common/preamble
_begin_fstest auto quick send

# Override the default cleanup function.
_cleanup()
{
	cd /
	rm -fr $send_files_dir
	rm -f $tmp.*
}

. ./common/filter

_supported_fs btrfs
_require_test
_require_scratch
_require_fssum

send_files_dir=$TEST_DIR/btrfs-test-$seq

rm -fr $send_files_dir
mkdir $send_files_dir

_scratch_mkfs >>$seqres.full 2>&1
_scratch_mount

# The name of each directory corresponds to its inode number, to make it easier
# to debug since btrfs' send processes inodes in ascending order according to
# their number.
mkdir $SCRATCH_MNT/257
mkdir $SCRATCH_MNT/258
mv $SCRATCH_MNT/257 $SCRATCH_MNT/258/257
mkdir $SCRATCH_MNT/259
mkdir $SCRATCH_MNT/260
mkdir $SCRATCH_MNT/261
mkdir $SCRATCH_MNT/262
mkdir $SCRATCH_MNT/263
mkdir $SCRATCH_MNT/264
mv $SCRATCH_MNT/258 $SCRATCH_MNT/264/258
mkdir $SCRATCH_MNT/265
mkdir $SCRATCH_MNT/266
mv $SCRATCH_MNT/259 $SCRATCH_MNT/266/259
mv $SCRATCH_MNT/260 $SCRATCH_MNT/266/260
mv $SCRATCH_MNT/264 $SCRATCH_MNT/266/264
mv $SCRATCH_MNT/265 $SCRATCH_MNT/266/265
mkdir $SCRATCH_MNT/266/260/267
mkdir $SCRATCH_MNT/266/268
mkdir $SCRATCH_MNT/266/269
mv $SCRATCH_MNT/262 $SCRATCH_MNT/266/269/262
mkdir $SCRATCH_MNT/266/270
mkdir $SCRATCH_MNT/271
mv $SCRATCH_MNT/266 $SCRATCH_MNT/271/266
mkdir $SCRATCH_MNT/271/266/272
mv $SCRATCH_MNT/263 $SCRATCH_MNT/271/266/272/263
mkdir $SCRATCH_MNT/273
mkdir $SCRATCH_MNT/271/266/274
mv $SCRATCH_MNT/273 $SCRATCH_MNT/271/266/274/273
mkdir $SCRATCH_MNT/271/266/272/275
mv $SCRATCH_MNT/271 $SCRATCH_MNT/261/271

# Filesystem looks like:
#
# .
# |--- 261/
#       |--- 271/
#             |--- 266/
#                   |--- 259/
#                   |--- 260/
#                   |     |--- 267
#                   |
#                   |--- 264/
#                   |     |--- 258/
#                   |           |--- 257/
#                   |
#                   |--- 265/
#                   |--- 268/
#                   |--- 269/
#                   |     |--- 262/
#                   |
#                   |--- 270/
#                   |--- 272/
#                   |     |--- 263/
#                   |     |--- 275/
#                   |
#                   |--- 274/
#                         |--- 273/
#
$BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT \
	$SCRATCH_MNT/mysnap1 > /dev/null

$BTRFS_UTIL_PROG send -f $send_files_dir/1.snap \
	$SCRATCH_MNT/mysnap1 2>&1 1>/dev/null | _filter_scratch

mv $SCRATCH_MNT/261/271/266/272/275 $SCRATCH_MNT/275
mv $SCRATCH_MNT/261/271/266/274 $SCRATCH_MNT/275/274
mv $SCRATCH_MNT/261/271/266/269/262 $SCRATCH_MNT/275/274/273/262
mv $SCRATCH_MNT/261/271/266/269 $SCRATCH_MNT/275/274/273/262/269
mv $SCRATCH_MNT/261/271/266/264/258/257 $SCRATCH_MNT/261/271/266/272
mv $SCRATCH_MNT/261/271/266/264/258 $SCRATCH_MNT/275/274/273/262/269/258
mv $SCRATCH_MNT/261/271 $SCRATCH_MNT/275/274/273/262/269/258/271
mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/268 \
	$SCRATCH_MNT/275/274/273/262/269/258/271/268
mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/260/267 \
	$SCRATCH_MNT/275/274/273/262/269/258/271/268/267
mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/270 \
	$SCRATCH_MNT/275/274/273/262/269/258/271/268/267/270
mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/265 \
	$SCRATCH_MNT/275/274/273/262/269/258/271/266/259/265
mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/259 \
	$SCRATCH_MNT/275/274/273/262/269/258/271/268/267/270/259
mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/272/263 \
	$SCRATCH_MNT/275/274/273/262/269/258/271/266/264/263
mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/272 \
	$SCRATCH_MNT/275/274/273/262/269/258/271/268/267/270/272
mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/260 \
	$SCRATCH_MNT/275/274/273/262/269/258/271/268/267/270/272/257/260
mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/264 \
	$SCRATCH_MNT/275/274/273/262/269/258/271/268/267/270/272/257/264
mv $SCRATCH_MNT/261 \
	$SCRATCH_MNT/275/274/273/262/269/258/271/268/267/270/272/257/264/263/261
mv $SCRATCH_MNT/275/274/273/262/269/258/271/266 \
	$SCRATCH_MNT/275/274/273/262/269/258/271/268/267/270/272/257/264/263/261/266

# Filesystem now looks like:
#
# .
# |-- 275/
#      |-- 274/
#           |-- 273/
#                |-- 262/
#                     |-- 269/
#                          |-- 258/
#                               |-- 271/
#                                    |-- 268/
#                                         |-- 267/
#                                              |-- 270/
#                                                   |-- 259/
#                                                   |    |-- 265/
#                                                   |
#                                                   |-- 272/
#                                                        |-- 257/
#                                                             |-- 260/
#                                                             |-- 264/
#                                                                  |-- 263/
#                                                                       |-- 261/
#                                                                            |-- 266/
#
$BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT \
		 $SCRATCH_MNT/mysnap2 > /dev/null
$BTRFS_UTIL_PROG send -p $SCRATCH_MNT/mysnap1 -f $send_files_dir/2.snap \
		 $SCRATCH_MNT/mysnap2 2>&1 1>/dev/null | _filter_scratch

$FSSUM_PROG -A -f -w $send_files_dir/1.fssum $SCRATCH_MNT/mysnap1
$FSSUM_PROG -A -f -w $send_files_dir/2.fssum \
	-x $SCRATCH_MNT/mysnap2/mysnap1 $SCRATCH_MNT/mysnap2

# Now recreate the filesystem by receiving both send streams and verify we get
# the same content that the original filesystem had.
_scratch_unmount
_scratch_mkfs >>$seqres.full 2>&1
_scratch_mount

$BTRFS_UTIL_PROG receive -f $send_files_dir/1.snap $SCRATCH_MNT > /dev/null
$BTRFS_UTIL_PROG receive -f $send_files_dir/2.snap $SCRATCH_MNT > /dev/null
$FSSUM_PROG -r $send_files_dir/1.fssum $SCRATCH_MNT/mysnap1
$FSSUM_PROG -r $send_files_dir/2.fssum $SCRATCH_MNT/mysnap2

status=0
exit