common: Check the file system consistency on SCRATCH_DEV
[xfstests-dev.git] / tests / btrfs / 050
1 #! /bin/bash
2 # FS QA Test No. btrfs/050
3 #
4 # Regression for btrfs send when an inode only has extended references
5 # associated to it (no regular references present). This used to cause
6 # incorrect access to a b+tree leaf, where an extended reference item
7 # was accessed as if it were a regular reference item, causing unexpected
8 # and unpredictable behaviour such as producing a random/weird path string
9 # or a crash.
10 #
11 # This issue is fixed by the following linux kernel btrfs patch:
12 #
13 #   Btrfs: send, fix incorrect ref access when using extrefs
14 #
15 #-----------------------------------------------------------------------
16 # Copyright (c) 2014 Filipe Manana.  All Rights Reserved.
17 #
18 # This program is free software; you can redistribute it and/or
19 # modify it under the terms of the GNU General Public License as
20 # published by the Free Software Foundation.
21 #
22 # This program is distributed in the hope that it would be useful,
23 # but WITHOUT ANY WARRANTY; without even the implied warranty of
24 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25 # GNU General Public License for more details.
26 #
27 # You should have received a copy of the GNU General Public License
28 # along with this program; if not, write the Free Software Foundation,
29 # Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
30 #-----------------------------------------------------------------------
31 #
32
33 seq=`basename $0`
34 seqres=$RESULT_DIR/$seq
35 echo "QA output created by $seq"
36
37 tmp=/tmp/$$
38 status=1        # failure is the default!
39 trap "_cleanup; exit \$status" 0 1 2 3 15
40
41 _cleanup()
42 {
43     rm -fr $send_files_dir
44     rm -fr $tmp
45 }
46
47 # get standard environment, filters and checks
48 . ./common/rc
49 . ./common/filter
50
51 # real QA test starts here
52 _supported_fs btrfs
53 _supported_os Linux
54 _require_scratch
55 _require_fssum
56 _need_to_be_root
57
58 send_files_dir=$TEST_DIR/btrfs-test-$seq
59
60 rm -f $seqres.full
61 rm -fr $send_files_dir
62 mkdir $send_files_dir
63
64 _scratch_mkfs "-O extref" >/dev/null 2>&1
65 _scratch_mount
66
67 # 2550 hard links is enough to cause creation of extended references
68 # even if the leaf/node size is 64Kb (largest possible).
69 NUM_LINKS=2550
70 TEST_PATH=$SCRATCH_MNT/home/john/files/series/qwerty
71
72 mkdir -p $TEST_PATH
73 touch $TEST_PATH/foobar
74
75 # Create a bunch of hard links for the file, such that at least one
76 # inode extended reference item is created.
77 for i in `seq 1 $NUM_LINKS`; do
78         ln $TEST_PATH/foobar $TEST_PATH/foobar_link_`printf "%04d" $i`
79 done
80
81 # The only link we'll have alive at the end.
82 ln $TEST_PATH/foobar $TEST_PATH/final_foobar_name
83
84 # Now delete all previous hard links (except the last one). This will
85 # remove the regular inode reference item from the b+tree, and will
86 # leave only an inode extended reference item, which is the condition
87 # necessary to trigger the bug.
88 rm -f $TEST_PATH/foobar
89 for i in `seq 1 $NUM_LINKS`; do
90         rm -f $TEST_PATH/foobar_link_`printf "%04d" $i`
91 done
92
93 _run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1
94 run_check $FSSUM_PROG -A -f -w $send_files_dir/1.fssum $SCRATCH_MNT/mysnap1
95 _run_btrfs_util_prog send $SCRATCH_MNT/mysnap1 -f $send_files_dir/1.snap
96
97 _scratch_unmount
98 _check_scratch_fs
99
100 _scratch_mkfs >/dev/null 2>&1
101 _scratch_mount
102
103 _run_btrfs_util_prog receive $SCRATCH_MNT -f $send_files_dir/1.snap
104 run_check $FSSUM_PROG -r $send_files_dir/1.fssum $SCRATCH_MNT/mysnap1
105
106 status=0
107 exit