mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
9f07f7a016
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>
84 lines
1.8 KiB
Bash
Executable File
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
|