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