blob: 74a7ac30ddf6baac4618ded578c1ba08bf6a8199 (
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
|
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2021 Chandan Babu R. All Rights Reserved.
#
# FS QA Test 532
#
# Verify that XFS does not cause inode fork's extent count to overflow when
# adding/removing xattrs.
. ./common/preamble
_begin_fstest auto quick attr
# Import common functions.
. ./common/filter
. ./common/attr
. ./common/inject
. ./common/populate
# real QA test starts here
_supported_fs xfs
_require_scratch
_require_attrs
_require_xfs_debug
_require_test_program "punch-alternating"
_require_xfs_io_error_injection "reduce_max_iextents"
_require_xfs_io_error_injection "bmap_alloc_minlen_extent"
echo "Format and mount fs"
_scratch_mkfs_sized $((1024 * 1024 * 1024)) >> $seqres.full
_scratch_mount >> $seqres.full
# Disable realtime inherit flag (if any) on root directory so that space on data
# device gets fragmented rather than realtime device.
_xfs_force_bdev data $SCRATCH_MNT
bsize=$(_get_block_size $SCRATCH_MNT)
attr_len=255
testfile=$SCRATCH_MNT/testfile
echo "Consume free space"
fillerdir=$SCRATCH_MNT/fillerdir
nr_free_blks=$(stat -f -c '%f' $SCRATCH_MNT)
nr_free_blks=$((nr_free_blks * 90 / 100))
_fill_fs $((bsize * nr_free_blks)) $fillerdir $bsize 0 >> $seqres.full 2>&1
echo "Create fragmented filesystem"
for dentry in $(ls -1 $fillerdir/); do
$here/src/punch-alternating $fillerdir/$dentry >> $seqres.full
done
echo "Inject bmap_alloc_minlen_extent error tag"
_scratch_inject_error bmap_alloc_minlen_extent 1
echo "* Set xattrs"
echo "Create \$testfile"
touch $testfile
echo "Inject reduce_max_iextents error tag"
_scratch_inject_error reduce_max_iextents 1
echo "Create xattrs"
nr_attrs=$((bsize * 20 / attr_len))
for i in $(seq 1 $nr_attrs); do
attr="$(printf "trusted.%0247d" $i)"
$SETFATTR_PROG -n "$attr" $testfile >> $seqres.full 2>&1
[[ $? != 0 ]] && break
done
echo "Verify \$testfile's naextent count"
naextents=$(_xfs_get_fsxattr naextents $testfile)
if (( $naextents > 10 )); then
echo "Extent count overflow check failed: naextents = $naextents"
exit 1
fi
echo "Disable reduce_max_iextents error tag"
_scratch_inject_error reduce_max_iextents 0
echo "Remove \$testfile"
rm $testfile
echo "* Remove xattrs"
echo "Create \$testfile"
touch $testfile
echo "Create initial xattr extents"
naextents=0
last=""
start=1
nr_attrs=$((bsize / attr_len))
while (( $naextents < 4 )); do
end=$((start + nr_attrs - 1))
for i in $(seq $start $end); do
attr="$(printf "trusted.%0247d" $i)"
$SETFATTR_PROG -n $attr $testfile
done
start=$((end + 1))
naextents=$(_xfs_get_fsxattr naextents $testfile)
done
echo "Inject reduce_max_iextents error tag"
_scratch_inject_error reduce_max_iextents 1
echo "Remove xattr to trigger -EFBIG"
attr="$(printf "trusted.%0247d" 1)"
$SETFATTR_PROG -x "$attr" $testfile >> $seqres.full 2>&1
if [[ $? == 0 ]]; then
echo "Xattr removal succeeded; Should have failed "
exit 1
fi
echo "Disable reduce_max_iextents error tag"
_scratch_inject_error reduce_max_iextents 0
rm $testfile
# success, all done
status=0
exit
|