summaryrefslogtreecommitdiff
path: root/tests/btrfs/030
blob: 9dcbb55020a4810e65bcf0784e711bff636d3080 (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
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2014 Filipe Manana.  All Rights Reserved.
#
# FS QA Test No. btrfs/030
#
# Regression test for btrfs' incremental send feature:
#
# 1) Create several nested directories;
# 2) Create a read only snapshot;
# 3) Change the parentship of some of the deepest directories in a reverse
#    way, so that parents become children and children become parents;
# 4) Create another read only snapshot and use it for an incremental send
#    relative to the first snapshot.
#
# At step 4 btrfs' send entered an infinite loop, increasing the memory it
# used while building path strings until a krealloc was unable to allocate
# more memory, which caused a warning dump in dmesg.
#
. ./common/preamble
_begin_fstest auto quick send

tmp=`mktemp -d`

# Override the default cleanup function.
_cleanup()
{
    rm -fr $tmp
}

. ./common/filter

_supported_fs btrfs
_require_scratch
_require_fssum

_scratch_mkfs >/dev/null 2>&1
_scratch_mount

mkdir -p $SCRATCH_MNT/a/b/c
echo "hello" > $SCRATCH_MNT/a/b/c/file.txt
mkdir $SCRATCH_MNT/a/b/c/d
mkdir $SCRATCH_MNT/a/b/c2
mkdir $SCRATCH_MNT/a/b/www
echo "hey" > $SCRATCH_MNT/a/b/foobar.txt
mkdir -p $SCRATCH_MNT/a/b/c3/x/y

mkdir -p $SCRATCH_MNT/a/b/foo1/foo2
echo "hey" > $SCRATCH_MNT/a/b/foo1/foo2/f.txt
mkdir $SCRATCH_MNT/a/b/foo3

mkdir -p $SCRATCH_MNT/a/b/bar1/bar2/bar3/bar4
echo "ola" > $SCRATCH_MNT/a/b/bar1/bar2/bar3/bar4/hello.txt

# Directory tree looks like:
#
# .                                      (ino 256)
# |-- a/                                 (ino 257)
#     |-- b/                             (ino 258)
#         |-- c/                         (ino 259)
#         |   |-- file.txt               (ino 260)
#         |   |-- d/                     (ino 261)
#         |
#         |-- c2/                        (ino 262)
#         |-- www/                       (ino 263)
#         |-- foobar.txt                 (ino 264)
#         |
#         |-- c3/                        (ino 265)
#         |   |-- x/                     (ino 266)
#         |       |-- y/                 (ino 267)
#         |
#         |-- foo1/                      (ino 268)
#         |    |---foo2/                 (ino 269)
#         |         |---f.txt            (ino 270)
#         |
#         |-- foo3/                      (ino 271)
#         |
#         |-- bar1/                      (ino 272)
#              |-- bar2/                 (ino 273)
#                  |-- bar3/             (ino 274)
#                      |-- bar4          (ino 275)
#                           |--hello.txt (ino 276)

_btrfs subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1

echo " world" >> $SCRATCH_MNT/a/b/c/file.txt
mv $SCRATCH_MNT/a/b/c/d $SCRATCH_MNT/a/b/c2/d2
mv $SCRATCH_MNT/a/b/c $SCRATCH_MNT/a/b/c2/d2/cc
mv $SCRATCH_MNT/a/b/c3/x/y $SCRATCH_MNT/a/b/c2/y2
mv $SCRATCH_MNT/a/b/c3/x $SCRATCH_MNT/a/b/c2/y2/x2
mv $SCRATCH_MNT/a/b/c3 $SCRATCH_MNT/a/b/c2/y2/x2/Z
mv $SCRATCH_MNT/a/b/www $SCRATCH_MNT/a/b/c2/y2/x2/WWW
mv $SCRATCH_MNT/a/b/foobar.txt $SCRATCH_MNT/a/b/c2/y2/x2/qwerty.txt
ln $SCRATCH_MNT/a/b/c2/d2/cc/file.txt $SCRATCH_MNT/a/b/c2/y2/x2/Z/file_link.txt
mv $SCRATCH_MNT/a/b/c2/d2/cc/file.txt $SCRATCH_MNT/a/b/c2/y2/x2

mv $SCRATCH_MNT/a/b/foo3 $SCRATCH_MNT/a/b/foo1/foo33
mv $SCRATCH_MNT/a/b/foo1/foo2 $SCRATCH_MNT/a/b/foo1/foo33/foo22
mv $SCRATCH_MNT/a/b/foo1/foo33/foo22/f.txt \
    $SCRATCH_MNT/a/b/foo1/foo33/foo22/fff.txt

echo " hello" >> $SCRATCH_MNT/a/b/bar1/bar2/bar3/bar4/hello.txt
mv $SCRATCH_MNT/a/b/bar1/bar2/bar3/bar4/hello.txt \
    $SCRATCH_MNT/a/b/bar1/bar2/bar3/bar4/hello2.txt
mv $SCRATCH_MNT/a/b/bar1/bar2/bar3/bar4 $SCRATCH_MNT/a/b/k44
mv $SCRATCH_MNT/a/b/bar1/bar2/bar3 $SCRATCH_MNT/a/b/k44
mv $SCRATCH_MNT/a/b/bar1/bar2 $SCRATCH_MNT/a/b/k44/bar3
mv $SCRATCH_MNT/a/b/bar1 $SCRATCH_MNT/a/b/k44/bar3/bar2/k11

# Directory tree now looks like:
#
# .                                         (ino 256)
# |-- a/                                    (ino 257)
#     |-- b/                                (ino 258)
#         |-- c2/                           (ino 262)
#         |   |-- d2/                       (ino 261)
#         |   |   |-- cc/                   (ino 259)
#         |   |
#         |   |-- y2/                       (ino 267)
#         |       |-- x2/                   (ino 266)
#         |           |-- file.txt          (ino 260)
#         |           |-- qwerty.txt        (ino 264)
#         |           |-- WWW/              (ino 263)
#         |           |-- Z/                (ino 265)
#         |               |-- file_link.txt
#         |
#         |-- foo1/                         (ino 268)
#         |    |---foo33/                   (ino 271)
#         |          |---foo22/             (ino 269)
#         |                |---fff.txt      (ino 270)
#         |
#         |-- k44/                          (ino 275)
#              |-- hello2.txt               (ino 276)
#              |-- bar3/                    (ino 274)
#                   |-- bar2/               (ino 273)
#                        |-- k11/           (ino 272)

_btrfs subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap2

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

_btrfs send -f $tmp/1.snap $SCRATCH_MNT/mysnap1
_btrfs send -f $tmp/2.snap -p $SCRATCH_MNT/mysnap1 \
    $SCRATCH_MNT/mysnap2

_scratch_unmount
_check_btrfs_filesystem $SCRATCH_DEV
_scratch_mkfs >/dev/null 2>&1
_scratch_mount

_btrfs receive -f $tmp/1.snap $SCRATCH_MNT
run_check $FSSUM_PROG -r $tmp/1.fssum $SCRATCH_MNT/mysnap1 2>> $seqres.full

_btrfs receive -f $tmp/2.snap $SCRATCH_MNT
run_check $FSSUM_PROG -r $tmp/2.fssum $SCRATCH_MNT/mysnap2 2>> $seqres.full

_scratch_unmount
_check_btrfs_filesystem $SCRATCH_DEV

status=0
exit