summaryrefslogtreecommitdiff
path: root/tests/xfs/532
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