mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
5b2232dde5
This test depends on the pwrite creating delalloc blocks, which doesn't happen if the scratch fs is mounted in dax mode (or has an extent size hint applied). Therefore, check for delalloc blocks and _notrun if we didn't get any. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Eryu Guan <guaneryu@gmail.com>
98 lines
3.0 KiB
Bash
Executable File
98 lines
3.0 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.
|
|
#
|
|
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/punch
|
|
. ./common/inject
|
|
|
|
# real QA test starts here
|
|
rm -f $seqres.full
|
|
|
|
# Modify as appropriate.
|
|
_supported_fs generic
|
|
_supported_os Linux
|
|
_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
|