Files
apfstests/tests/xfs/537
T
Chandan Babu R 200ee9e93b xfs: Check for extent overflow when swapping extents
This test verifies that XFS does not cause inode fork's extent count to
overflow when swapping forks across two files.

Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
2021-03-21 21:51:59 +08:00

106 lines
2.7 KiB
Bash
Executable File

#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2021 Chandan Babu R. All Rights Reserved.
#
# FS QA Test 537
#
# Verify that XFS does not cause inode fork's extent count to overflow when
# swapping forks between files
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
. ./common/inject
# remove previous $seqres.full before test
rm -f $seqres.full
# real QA test starts here
_supported_fs xfs
_require_scratch
_require_xfs_debug
_require_xfs_scratch_rmapbt
_require_xfs_io_command "fcollapse"
_require_xfs_io_command "swapext"
_require_xfs_io_error_injection "reduce_max_iextents"
echo "* Swap extent forks"
echo "Format and mount fs"
_scratch_mkfs >> $seqres.full
_scratch_mount >> $seqres.full
bsize=$(_get_block_size $SCRATCH_MNT)
srcfile=${SCRATCH_MNT}/srcfile
donorfile=${SCRATCH_MNT}/donorfile
echo "Create \$donorfile having an extent of length 67 blocks"
$XFS_IO_PROG -f -s -c "pwrite -b $((17 * bsize)) 0 $((17 * bsize))" $donorfile \
>> $seqres.full
# After the for loop the donor file will have the following extent layout
# | 0-4 | 5 | 6 | 7 | 8 | 9 | 10 |
echo "Fragment \$donorfile"
for i in $(seq 5 10); do
start_offset=$((i * bsize))
$XFS_IO_PROG -f -c "fcollapse $start_offset $bsize" $donorfile >> $seqres.full
done
echo "Create \$srcfile having an extent of length 18 blocks"
$XFS_IO_PROG -f -s -c "pwrite -b $((18 * bsize)) 0 $((18 * bsize))" $srcfile \
>> $seqres.full
echo "Fragment \$srcfile"
# After the for loop the src file will have the following extent layout
# | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7-10 |
for i in $(seq 1 7); do
start_offset=$((i * bsize))
$XFS_IO_PROG -f -c "fcollapse $start_offset $bsize" $srcfile >> $seqres.full
done
echo "Collect \$donorfile's extent count"
donor_nr_exts=$(_xfs_get_fsxattr nextents $donorfile)
echo "Collect \$srcfile's extent count"
src_nr_exts=$(_xfs_get_fsxattr nextents $srcfile)
echo "Inject reduce_max_iextents error tag"
_scratch_inject_error reduce_max_iextents 1
echo "Swap \$srcfile's and \$donorfile's extent forks"
$XFS_IO_PROG -f -c "swapext $donorfile" $srcfile >> $seqres.full 2>&1
echo "Check for \$donorfile's extent count overflow"
nextents=$(_xfs_get_fsxattr nextents $donorfile)
if (( $nextents == $src_nr_exts )); then
echo "\$donorfile: Extent count overflow check failed"
fi
echo "Check for \$srcfile's extent count overflow"
nextents=$(_xfs_get_fsxattr nextents $srcfile)
if (( $nextents == $donor_nr_exts )); then
echo "\$srcfile: Extent count overflow check failed"
fi
# success, all done
status=0
exit