@@ -4,43 +4,51 @@
#
# 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.
+# Test mapped writes against punch-hole and zero-range 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.)
#
. ./common/preamble
-_begin_fstest auto quick rw punch
+_begin_fstest auto quick rw punch zero
# Import common functions.
. ./common/filter
_require_scratch
_require_xfs_io_command "fpunch"
+_require_xfs_io_command "fzero"
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 $testfile
-_scratch_cycle_mount
-echo "==== Post-Remount =="
-_hexdump $testfile
+# Punch a hole and zero out straddling two pages to check that the mapped
+# write after the hole-punching and range-zeroing are correctly handled.
+_straddling_test()
+{
+ local test_cmd=$1
+
+ $XFS_IO_PROG -t -f \
+ -c "pwrite -S 0x58 0 12288" \
+ -c "mmap -rw 0 12288" \
+ -c "mwrite -S 0x5a 2048 8192" \
+ -c "$test_cmd 2048 8192" \
+ -c "mwrite -S 0x59 2048 8192" \
+ -c "close" \
+ $testfile | _filter_xfs_io
+
+ echo "==== Pre-Remount ==="
+ _hexdump $testfile
+ _scratch_cycle_mount
+ echo "==== Post-Remount =="
+ _hexdump $testfile
+}
+
+_straddling_test "fpunch"
+_straddling_test "fzero"
status=0
exit
@@ -17,3 +17,21 @@ XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
002800 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 >XXXXXXXXXXXXXXXX<
*
003000
+wrote 12288/12288 bytes at offset 0
+XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+==== Pre-Remount ===
+000000 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 >XXXXXXXXXXXXXXXX<
+*
+000800 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 >YYYYYYYYYYYYYYYY<
+*
+002800 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 >XXXXXXXXXXXXXXXX<
+*
+003000
+==== Post-Remount ==
+000000 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 >XXXXXXXXXXXXXXXX<
+*
+000800 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 >YYYYYYYYYYYYYYYY<
+*
+002800 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 >XXXXXXXXXXXXXXXX<
+*
+003000