4d168ac5b09ac4c42945a5345621006ab3a95389
[xfstests-dev.git] / tests / xfs / 530
1 #! /bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (c) 2021 Chandan Babu R.  All Rights Reserved.
4 #
5 # FS QA Test 530
6 #
7 # Verify that XFS does not cause bitmap/summary inode fork's extent count to
8 # overflow when growing an the realtime volume of the filesystem.
9 #
10 . ./common/preamble
11 _begin_fstest auto quick realtime growfs
12
13 # Override the default cleanup function.
14 _cleanup()
15 {
16         cd /
17         _scratch_unmount >> $seqres.full 2>&1
18         test -e "$rtdev" && losetup -d $rtdev >> $seqres.full 2>&1
19         rm -f $tmp.* $TEST_DIR/$seq.rtvol
20 }
21
22 # Import common functions.
23 . ./common/filter
24 . ./common/inject
25 . ./common/populate
26
27 # real QA test starts here
28
29 _supported_fs xfs
30 # Note that we don't _require_realtime because we synthesize a rt volume
31 # below.
32 _require_test
33 _require_xfs_debug
34 _require_test_program "punch-alternating"
35 _require_xfs_io_error_injection "reduce_max_iextents"
36 _require_xfs_io_error_injection "bmap_alloc_minlen_extent"
37 _require_scratch_nocheck
38
39 echo "* Test extending rt inodes"
40
41 _scratch_mkfs | _filter_mkfs >> $seqres.full 2> $tmp.mkfs
42 . $tmp.mkfs
43
44 echo "Create fake rt volume"
45 nr_bitmap_blks=25
46 nr_bits=$((nr_bitmap_blks * dbsize * 8))
47
48 # Realtime extent size has to be atleast 4k in size.
49 if (( $dbsize < 4096 )); then
50         rtextsz=4096
51 else
52         rtextsz=$dbsize
53 fi
54
55 rtdevsz=$((nr_bits * rtextsz))
56 truncate -s $rtdevsz $TEST_DIR/$seq.rtvol
57 rtdev=$(_create_loop_device $TEST_DIR/$seq.rtvol)
58
59 echo "Format and mount rt volume"
60
61 export USE_EXTERNAL=yes
62 export SCRATCH_RTDEV=$rtdev
63 _scratch_mkfs -d size=$((1024 * 1024 * 1024)) -b size=${dbsize} \
64               -r size=${rtextsz},extsize=${rtextsz} >> $seqres.full
65 _try_scratch_mount || _notrun "Couldn't mount fs with synthetic rt volume"
66
67 echo "Consume free space"
68 fillerdir=$SCRATCH_MNT/fillerdir
69 nr_free_blks=$(stat -f -c '%f' $SCRATCH_MNT)
70 nr_free_blks=$((nr_free_blks * 90 / 100))
71
72 _fill_fs $((dbsize * nr_free_blks)) $fillerdir $dbsize 0 >> $seqres.full 2>&1
73
74 echo "Create fragmented filesystem"
75 for dentry in $(ls -1 $fillerdir/); do
76         $here/src/punch-alternating $fillerdir/$dentry >> $seqres.full
77 done
78
79 echo "Inject reduce_max_iextents error tag"
80 _scratch_inject_error reduce_max_iextents 1
81
82 echo "Inject bmap_alloc_minlen_extent error tag"
83 _scratch_inject_error bmap_alloc_minlen_extent 1
84
85 echo "Grow realtime volume"
86 $XFS_GROWFS_PROG -r $SCRATCH_MNT >> $seqres.full 2>&1
87 if [[ $? == 0 ]]; then
88         echo "Growfs succeeded; should have failed."
89         exit 1
90 fi
91
92 _scratch_unmount >> $seqres.full
93
94 echo "Verify rbmino's and rsumino's extent count"
95 for rtino in rbmino rsumino; do
96         ino=$(_scratch_xfs_get_metadata_field $rtino "sb 0")
97         echo "$rtino = $ino" >> $seqres.full
98
99         nextents=$(_scratch_get_iext_count $ino data || \
100                         _fail "Unable to obtain inode fork's extent count")
101         if (( $nextents > 10 )); then
102                 echo "Extent count overflow check failed: nextents = $nextents"
103                 exit 1
104         fi
105 done
106
107 echo "Check filesystem"
108 _check_scratch_fs
109
110 losetup -d $rtdev
111 rm -f $TEST_DIR/$seq.rtvol
112
113 # success, all done
114 status=0
115 exit