Files
apfstests/tests/xfs/231
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

111 lines
3.1 KiB
Bash
Executable File

#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved.
#
# FS QA Test No. 231
#
# Test recovery of unused CoW reservations:
# - Create two reflinked files. Set extsz hint on second file.
# - Dirty a single byte on a number of CoW reservations in the second file.
# - Fsync to flush out the dirty pages.
# - Wait for the reclaim to run.
# - Write more and see how bad fragmentation is.
#
. ./common/preamble
_begin_fstest auto quick clone
# Override the default cleanup function.
_cleanup()
{
cd /
test -n "$old_cowgc_interval" && \
_xfs_set_cowgc_interval $old_cowgc_interval
rm -rf $tmp.*
}
# Import common functions.
. ./common/filter
. ./common/reflink
# real QA test starts here
_supported_fs xfs
_require_scratch_reflink
_require_cp_reflink
_require_xfs_io_command "cowextsize"
_require_xfs_io_command "falloc"
_require_xfs_io_command "fiemap"
old_cowgc_interval=$(_xfs_get_cowgc_interval)
echo "Format and mount"
_scratch_mkfs > $seqres.full 2>&1
_scratch_mount >> $seqres.full 2>&1
testdir=$SCRATCH_MNT/test-$seq
mkdir $testdir
blksz=65536
nr=64
filesize=$((blksz * nr))
bufnr=2
bufsize=$((blksz * bufnr))
_require_fs_space $SCRATCH_MNT $((filesize / 1024 * 3 * 5 / 4))
real_blksz=$(_get_block_size $testdir)
internal_blks=$((filesize / real_blksz))
echo "Create the original files"
$XFS_IO_PROG -c "cowextsize $bufsize" $testdir
$XFS_IO_PROG -f -c "pwrite -S 0x61 -b $bufsize 0 $filesize" $testdir/file1 >> $seqres.full
$XFS_IO_PROG -f -c "pwrite -S 0x61 -b $bufsize 0 $filesize" $testdir/file2.chk >> $seqres.full
_cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full
_scratch_cycle_mount
echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
md5sum $testdir/file2 | _filter_scratch
md5sum $testdir/file2.chk | _filter_scratch
echo "CoW and leave leftovers"
_xfs_set_cowgc_interval 2
seq 2 2 $((nr - 1)) | while read f; do
$XFS_IO_PROG -f -c "pwrite -S 0x63 $((blksz * f - 1)) 1" $testdir/file2 >> $seqres.full
$XFS_IO_PROG -f -c "pwrite -S 0x63 $((blksz * f - 1)) 1" $testdir/file2.chk >> $seqres.full
done
sync
echo "Wait for CoW expiration"
sleep 3
echo "Allocate free space"
for i in $(seq 1 32); do
$XFS_IO_PROG -f -c "falloc 0 1" $testdir/junk.$i >> $seqres.full
done
$XFS_IO_PROG -f -c "falloc 0 $filesize" $testdir/junk >> $seqres.full
echo "CoW and leave leftovers"
_xfs_set_cowgc_interval $old_cowgc_interval
seq 2 2 $((nr - 1)) | while read f; do
$XFS_IO_PROG -f -c "pwrite -S 0x63 $((blksz * f)) 1" $testdir/file2 >> $seqres.full
$XFS_IO_PROG -f -c "pwrite -S 0x63 $((blksz * f)) 1" $testdir/file2.chk >> $seqres.full
done
sync
echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
md5sum $testdir/file2 | _filter_scratch
md5sum $testdir/file2.chk | _filter_scratch
echo "Check extent counts"
old_extents=$(_count_extents $testdir/file1)
new_extents=$(_count_extents $testdir/file2)
echo "old extents: $old_extents" >> $seqres.full
echo "new extents: $new_extents" >> $seqres.full
echo "maximum extents: $internal_blks" >> $seqres.full
test $new_extents -le $((3 * nr / bufnr)) || echo "file2 more fragmented than expected"
# success, all done
status=0
exit