Files
apfstests/tests/xfs/146
T
Darrick J. Wong 7e98d41a6e fstests: move test group info to test files
Refactor every test in the entire test suite to use the new boilerplate
functions.  This also migrates all the test group information into the
test files.  This patch has been autogenerated via the command:

./tools/convert-group btrfs ceph cifs ext4 f2fs generic nfs ocfs2 overlay perf shared udf xfs

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
Reviewed-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
2021-06-27 22:50:02 +08:00

88 lines
3.1 KiB
Bash
Executable File

#! /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.
. ./common/preamble
_begin_fstest auto quick rw realtime
# Import common functions.
. ./common/filter
# real QA test starts here
_supported_fs xfs
_require_scratch
_require_realtime
_require_test_program "punch-alternating"
# 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_force_bdev realtime $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