mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
7e98d41a6e
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>
88 lines
3.1 KiB
Bash
Executable File
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
|