generic: test mmap write vs. hole punching

On file systems with a block size smaller than the page size, hole
punching can leave the pages at the beginning and the end of the
hole partially mapped to disk blocks.  Make sure writes to those
pages are handled correctly.

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Reviewed-by: Eryu Guan <guaneryu@gmail.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
This commit is contained in:
Andreas Gruenbacher
2019-09-06 18:53:04 +02:00
committed by Eryu Guan
parent 0837e90798
commit 332232b37f
3 changed files with 82 additions and 0 deletions
+62
View File
@@ -0,0 +1,62 @@
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2019 Red Hat, Inc. All Rights Reserved.
#
# FS QA Test No. generic/567
#
# Test mapped writes against punch-hole to ensure we get the data
# correctly written. This can expose data corruption bugs on filesystems
# where the block size is smaller than the page size.
#
# (generic/029 is a similar test but for truncate.)
#
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 -f $tmp.*
}
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
# real QA test starts here
_supported_fs generic
_supported_os Linux
_require_scratch
_require_xfs_io_command "fpunch"
testfile=$SCRATCH_MNT/testfile
_scratch_mkfs > /dev/null 2>&1
_scratch_mount
# Punch a hole straddling two pages to check that the mapped write after the
# hole-punching is correctly handled.
$XFS_IO_PROG -t -f \
-c "pwrite -S 0x58 0 12288" \
-c "mmap -rw 0 12288" \
-c "mwrite -S 0x5a 2048 8192" \
-c "fpunch 2048 8192" \
-c "mwrite -S 0x59 2048 8192" \
-c "close" \
$testfile | _filter_xfs_io
echo "==== Pre-Remount ==="
hexdump -C $testfile
_scratch_cycle_mount
echo "==== Post-Remount =="
hexdump -C $testfile
status=0
exit
+19
View File
@@ -0,0 +1,19 @@
QA output created by 567
wrote 12288/12288 bytes at offset 0
XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
==== Pre-Remount ===
00000000 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 |XXXXXXXXXXXXXXXX|
*
00000800 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 |YYYYYYYYYYYYYYYY|
*
00002800 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 |XXXXXXXXXXXXXXXX|
*
00003000
==== Post-Remount ==
00000000 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 |XXXXXXXXXXXXXXXX|
*
00000800 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 |YYYYYYYYYYYYYYYY|
*
00002800 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 |XXXXXXXXXXXXXXXX|
*
00003000
+1
View File
@@ -569,3 +569,4 @@
564 auto quick copy_range
565 auto quick copy_range
566 auto quick quota metadata
567 auto quick rw punch