Files
apfstests/tests/xfs/325
T
Darrick J. Wong 9f07f7a016 xfs: force unlink metadata updates to disk
In xfs/318 and xfs/325 we inject errors on extent freeing then delete
some files to see if we can make the filesystem go offline.  However,
with the advent of deferred inode inactivation, sync won't guarantee
that unlinked inodes removal is actually pushed to disk since the "inode
needs to be deallocated" state is persisted to disk.  Freeze achieves
this, however, so inject a freeze/thaw cycle to make sure we hit the
injected error.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eryu Guan <guaneryu@gmail.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
2018-11-04 23:23:58 +08:00

84 lines
1.8 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. 325
#
# Reflink a file with a few dozen extents, CoW a few blocks, and rm.
# Inject an error during extent freeing to test log recovery.
#
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 /
_scratch_unmount > /dev/null 2>&1
rm -rf $tmp.*
}
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
. ./common/reflink
. ./common/inject
# real QA test starts here
_supported_os Linux
_supported_fs xfs
_require_cp_reflink
_require_scratch_reflink
_require_error_injection
_require_xfs_io_error_injection "free_extent"
rm -f $seqres.full
blksz=65536
blks=30
echo "Format filesystem"
_scratch_mkfs >/dev/null 2>&1
_scratch_mount >> $seqres.full
echo "Create files"
_pwrite_byte 0x66 0 $((blksz * blks)) $SCRATCH_MNT/file1 >> $seqres.full
_cp_reflink $SCRATCH_MNT/file1 $SCRATCH_MNT/file2
sync
echo "Check files"
md5sum $SCRATCH_MNT/file1 | _filter_scratch
md5sum $SCRATCH_MNT/file2 | _filter_scratch
echo "CoW a few blocks"
$XFS_IO_PROG -c "pwrite -W -S 0x67 $((10 * blksz)) $((10 * blksz))" $SCRATCH_MNT/file2 >> $seqres.full
echo "Inject error"
_scratch_inject_error "free_extent"
rm $SCRATCH_MNT/file1
sync
$XFS_IO_PROG -x -c 'freeze' -c 'thaw' $SCRATCH_MNT >> $seqres.full 2>&1
echo "FS should be shut down, touch will fail"
touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch
echo "Remount to replay log"
_scratch_inject_logprint >> $seqres.full
echo "FS should be online, touch should succeed"
touch $SCRATCH_MNT/goodfs
echo "Check files again"
md5sum $SCRATCH_MNT/file2 | _filter_scratch
echo "Done"
# success, all done
status=0
exit