xfs: test rtalloc alignment and math errors

Add a couple of regression tests for "xfs: make sure the rt allocator
doesn't run off the end" and "xfs: ensure that fpunch, fcollapse, and
finsert operations are aligned to rt extent size".

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Chandan Babu R <chandanrlinux@gmail.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
This commit is contained in:
Darrick J. Wong
2021-03-22 21:20:06 -07:00
committed by Eryu Guan
parent 1fc1737959
commit 4acd3ddd8e
5 changed files with 183 additions and 0 deletions
Executable
+102
View File
@@ -0,0 +1,102 @@
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (c) 2021 Oracle. All Rights Reserved.
#
# FS QA Test No. 146
#
# This is a regression test for commit 2a6ca4baed62 ("xfs: make sure the rt
# allocator doesn't run off the end") which fixes an overflow error in the
# _near realtime allocator. If the rt bitmap ends exactly at the end of a
# block and the number of rt extents is large enough to allow an allocation
# request larger than the maximum extent size, it's possible that during a
# large allocation request, the allocator will fail to constrain maxlen on the
# second run through the loop, and the rt bitmap range check will run right off
# the end of the rtbitmap file. When this happens, xfs triggers a verifier
# error and returns EFSCORRUPTED.
seq=`basename $0`
seqres=$RESULT_DIR/$seq
echo "QA output created by $seq"
here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default!
trap "_cleanup; exit \$status" 0 1 2 3 15
_cleanup()
{
cd /
rm -f $tmp.*
}
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
# real QA test starts here
_supported_fs xfs
_require_scratch
_require_realtime
_require_test_program "punch-alternating"
rm -f $seqres.full
# Format filesystem to get the block size
_scratch_mkfs > $seqres.full
_scratch_mount >> $seqres.full
blksz=$(_get_block_size $SCRATCH_MNT)
rextsize=$($XFS_INFO_PROG $SCRATCH_MNT | grep realtime.*extsz | sed -e 's/^.*extsz=\([0-9]*\).*$/\1/g')
rextblks=$((rextsize / blksz))
echo "blksz $blksz rextsize $rextsize rextblks $rextblks" >> $seqres.full
_scratch_unmount
# Format filesystem with a realtime volume whose size fits the following:
# 1. Longer than (XFS MAXEXTLEN * blocksize) bytes so that a large fallocate
# request can create a maximally sized data fork extent mapping and then
# ask the allocator for even more blocks.
# 2. Exactly a multiple of (NBBY * blksz * rextsize) bytes.
rtsize1=$((2097151 * blksz))
rtsize2=$((8 * blksz * rextsize))
rtsize=$(( $(blockdev --getsz $SCRATCH_RTDEV) * 512 ))
echo "rtsize1 $rtsize1 rtsize2 $rtsize2 rtsize $rtsize" >> $seqres.full
test $rtsize -gt $rtsize1 || \
_notrun "scratch rt device too small, need $rtsize1 bytes"
test $rtsize -gt $rtsize2 || \
_notrun "scratch rt device too small, need $rtsize2 bytes"
rtsize=$((rtsize - (rtsize % rtsize2)))
echo "rt size will be $rtsize" >> $seqres.full
_scratch_mkfs -r size=$rtsize >> $seqres.full
_scratch_mount >> $seqres.full
# Make sure the root directory has rtinherit set so our test file will too
$XFS_IO_PROG -c 'chattr +t' $SCRATCH_MNT
# Allocate some stuff at the start, to force the first falloc of the ouch file
# to happen somewhere in the middle of the rt volume
$XFS_IO_PROG -f -c 'falloc 0 64m' "$SCRATCH_MNT/b"
$here/src/punch-alternating -i $((rextblks * 2)) -s $((rextblks)) "$SCRATCH_MNT/b"
avail="$(df -P "$SCRATCH_MNT" | awk 'END {print $4}')"1
toobig="$((avail * 2))"
# falloc the ouch file in the middle of the rt extent to exercise the near
# allocator in the last step.
$XFS_IO_PROG -f -c 'falloc 0 1g' "$SCRATCH_MNT/ouch"
# Try to get the near allocator to overflow on an allocation that matches
# exactly one of the rtsummary size levels. This should return ENOSPC and
# not EFSCORRUPTED.
$XFS_IO_PROG -f -c "falloc 0 ${toobig}k" "$SCRATCH_MNT/ouch"
# success, all done
status=0
exit
+2
View File
@@ -0,0 +1,2 @@
QA output created by 146
fallocate: No space left on device
Executable
+68
View File
@@ -0,0 +1,68 @@
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (c) 2021 Oracle. All Rights Reserved.
#
# FS QA Test No. 147
#
# Make sure we validate realtime extent size alignment for fallocate modes.
# This is a regression test for fe341eb151ec ("xfs: ensure that fpunch,
# fcollapse, and finsert operations are aligned to rt extent size")
seq=`basename $0`
seqres=$RESULT_DIR/$seq
echo "QA output created by $seq"
here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default!
trap "_cleanup; exit \$status" 0 1 2 3 15
_cleanup()
{
cd /
rm -f $tmp.*
}
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
# real QA test starts here
_supported_fs xfs
_require_scratch
_require_realtime
_require_xfs_io_command "fcollapse"
_require_xfs_io_command "finsert"
_require_xfs_io_command "funshare"
_require_xfs_io_command "fzero"
_require_xfs_io_command "falloc"
rm -f $seqres.full
# Format filesystem with a 256k realtime extent size
_scratch_mkfs -r extsize=256k > $seqres.full
_scratch_mount >> $seqres.full
blksz=$(_get_block_size $SCRATCH_MNT)
rextsize=$($XFS_INFO_PROG $SCRATCH_MNT | grep realtime.*extsz | sed -e 's/^.*extsz=\([0-9]*\).*$/\1/g')
rextblks=$((rextsize / blksz))
echo "blksz $blksz rextsize $rextsize rextblks $rextblks" >> $seqres.full
# Make sure the root directory has rtinherit set so our test file will too
$XFS_IO_PROG -c 'chattr +t' $SCRATCH_MNT
sz=$((rextsize * 100))
range="$((blksz * 3)) $blksz"
for verb in fpunch finsert fcollapse fzero funshare falloc; do
echo "test $verb"
$XFS_IO_PROG -f -c "falloc 0 $sz" "$SCRATCH_MNT/b"
$XFS_IO_PROG -f -c "$verb $range" "$SCRATCH_MNT/b"
rm -f "$SCRATCH_MNT/b"
_scratch_cycle_mount
done
# success, all done
status=0
exit
+9
View File
@@ -0,0 +1,9 @@
QA output created by 147
test fpunch
test finsert
fallocate: Invalid argument
test fcollapse
fallocate: Invalid argument
test fzero
test funshare
test falloc
+2
View File
@@ -143,6 +143,8 @@
143 auto quick realtime mount
144 auto quick quota
145 auto quick quota
146 auto quick rw realtime
147 auto quick rw realtime collapse insert unshare zero prealloc
148 auto quick fuzzers
149 auto quick growfs
164 rw pattern auto prealloc quick