Files
apfstests/tests/generic/283
T
Darrick J. Wong beae6dead9 generic/{279, 28[1-3]}: hide SIGBUS reporting from golden output
These four tests check that mmap'd cow writes fail when the
filesystem goes down.  For regular filesystems the msync reports
EIO, but if quotas are enabled on xfs the write itself terminates
xfs_io with a SIGBUS.  We don't care how the write fails, so don't
let the SIGBUS report escape to the golden output.

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-07-14 18:02:50 +08:00

98 lines
2.2 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. 283
#
# Test mmap CoW behavior when the write temporarily fails but the userspace
# program writes again.
#
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 -rf $tmp.* $TEST_DIR/mwrite.out
_dmerror_cleanup
}
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
. ./common/reflink
. ./common/dmerror
# real QA test starts here
_supported_os Linux
_require_scratch_reflink
_require_cp_reflink
_require_dm_target error
rm -f $seqres.full
echo "Format and mount"
_scratch_mkfs > $seqres.full 2>&1
_dmerror_init
_dmerror_mount >> $seqres.full 2>&1
testdir=$SCRATCH_MNT/test-$seq
mkdir $testdir
blksz=65536
nr=640
bufnr=128
filesize=$((blksz * nr))
bufsize=$((blksz * bufnr))
_require_fs_space $SCRATCH_MNT $((filesize / 1024 * 3 * 5 / 4))
echo "Create the original files"
$XFS_IO_PROG -f -c "pwrite -S 0x61 -b $bufsize 0 $filesize" $testdir/file1 >> $seqres.full
_cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full
_dmerror_unmount
_dmerror_mount
echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
md5sum $testdir/file2 | _filter_scratch
echo "CoW and unmount"
sync
_dmerror_load_error_table
# Insulate ourselves against bash reporting the SIGBUS when we try to modify
# the metadata.
cat > $tmp.run << ENDL
ulimit -c 0
$XFS_IO_PROG -f -c "mmap -rw 0 $filesize" -c "mwrite -S 0x63 0 $filesize" \
-c "msync -s 0 $filesize" $testdir/file2 2>&1
ENDL
bash $tmp.run > $tmp.output 2>&1
cat $tmp.output >> $seqres.full
grep -q error $tmp.output || _fail "mwrite did not fail"
_dmerror_load_working_table
echo "Rewrite"
$XFS_IO_PROG -f -c "mmap -rw 0 $filesize" -c "mwrite -S 0x63 0 $filesize" -c "msync 0 $filesize" $testdir/file2 >> $seqres.full 2>&1
_dmerror_unmount
_dmerror_mount
echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
echo "Check for damage"
_dmerror_unmount
_dmerror_cleanup
_repair_scratch_fs >> $seqres.full
# success, all done
status=0
exit