From: Andreas Gruenbacher Date: Fri, 6 Sep 2019 16:53:04 +0000 (+0200) Subject: generic: test mmap write vs. hole punching X-Git-Tag: v2022.05.01~1049 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=332232b37f4da8e3ecd07f80574d3203c6541cfd;p=xfstests-dev.git 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 Reviewed-by: Eryu Guan Signed-off-by: Eryu Guan --- diff --git a/tests/generic/567 b/tests/generic/567 new file mode 100755 index 00000000..0f01ebad --- /dev/null +++ b/tests/generic/567 @@ -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 diff --git a/tests/generic/567.out b/tests/generic/567.out new file mode 100644 index 00000000..8ca73fa9 --- /dev/null +++ b/tests/generic/567.out @@ -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 diff --git a/tests/generic/group b/tests/generic/group index d26c080f..7cf4f6c4 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -569,3 +569,4 @@ 564 auto quick copy_range 565 auto quick copy_range 566 auto quick quota metadata +567 auto quick rw punch