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>
83 lines
2.7 KiB
Bash
Executable File
83 lines
2.7 KiB
Bash
Executable File
#! /bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
# Copyright (c) 2017 Red Hat, Inc. All Rights Reserved.
|
|
#
|
|
# FS QA Test No. 196
|
|
#
|
|
# This test stresses indirect block reservation for delayed allocation extents.
|
|
# XFS reserves extra blocks for deferred allocation of delalloc extents. These
|
|
# reserved blocks can be divided among more extents than anticipated if the
|
|
# original extent for which the blocks were reserved is split into multiple
|
|
# delalloc extents. If this scenario repeats, eventually some extents are left
|
|
# without any indirect block reservation whatsoever. This leads to assert
|
|
# failures and possibly other problems in XFS.
|
|
#
|
|
. ./common/preamble
|
|
_begin_fstest auto quick rw
|
|
|
|
# Import common functions.
|
|
. ./common/punch
|
|
. ./common/inject
|
|
|
|
# real QA test starts here
|
|
|
|
# Modify as appropriate.
|
|
_supported_fs generic
|
|
_require_scratch
|
|
_require_xfs_io_error_injection "drop_writes"
|
|
|
|
_scratch_mkfs >/dev/null 2>&1
|
|
_scratch_mount
|
|
|
|
sdev=$(_short_dev $SCRATCH_DEV)
|
|
file=$SCRATCH_MNT/file.$seq
|
|
bytes=$((64 * 1024))
|
|
|
|
# create sequential delayed allocation
|
|
$XFS_IO_PROG -f -c "pwrite 0 $bytes" $file >> $seqres.full 2>&1
|
|
$XFS_IO_PROG -c "bmap -elpv" $file | grep -q delalloc || \
|
|
_notrun "Unable to create delayed allocations"
|
|
|
|
# Enable write drops. All buffered writes are dropped from this point on.
|
|
_scratch_inject_error "drop_writes" 1
|
|
|
|
# Write every other 4k range to split the larger delalloc extent into many more
|
|
# smaller extents. Use pwrite because with write failures enabled, all
|
|
# preexisting delalloc blocks in the range of the I/O are tossed without
|
|
# discretion. This allows manipulation of the delalloc extent without conversion
|
|
# to real blocks (and thus releasing the indirect reservation).
|
|
endoff=$((bytes - 4096))
|
|
for i in $(seq 0 8192 $endoff); do
|
|
$XFS_IO_PROG -c "pwrite $i 4k" $file >> $seqres.full 2>&1
|
|
done
|
|
|
|
# now pwrite the opposite set to remove remaining delalloc extents
|
|
for i in $(seq 4096 8192 $endoff); do
|
|
$XFS_IO_PROG -c "pwrite $i 4k" $file >> $seqres.full 2>&1
|
|
done
|
|
|
|
_scratch_inject_error "drop_writes" 0
|
|
|
|
_scratch_cycle_mount
|
|
$XFS_IO_PROG -c 'bmap -vp' $file | _filter_bmap
|
|
|
|
# Now test a buffered write workload with larger extents. Write a 100m extent,
|
|
# split it at the 3/4 mark, then write another 100m extent that is contiguous
|
|
# with the 1/4 portion of the split extent. Repeat several times. This pattern
|
|
# is known to prematurely exhaust indirect reservations and cause warnings and
|
|
# assert failures.
|
|
rm -f $file
|
|
for offset in $(seq 0 100 500); do
|
|
$XFS_IO_PROG -fc "pwrite ${offset}m 100m" $file >> $seqres.full 2>&1
|
|
|
|
punchoffset=$((offset + 75))
|
|
_scratch_inject_error "drop_writes"
|
|
$XFS_IO_PROG -c "pwrite ${punchoffset}m 4k" $file >> $seqres.full 2>&1
|
|
_scratch_inject_error "drop_writes" 0
|
|
done
|
|
|
|
echo "Silence is golden."
|
|
|
|
status=0
|
|
exit
|