[PATCH xfstests 3/5] generic/766: test fallocate write zeroes on block device

From: Zhang Yi
Date: Tue Mar 18 2025 - 03:36:17 EST


From: Zhang Yi <yi.zhang@xxxxxxxxxx>

Test the fallocate FALLOC_FL_WRITE_ZEROES command on a block device,
including unsupported flags.

Signed-off-by: Zhang Yi <yi.zhang@xxxxxxxxxx>
---
tests/generic/766 | 80 +++++++++++++++++++++++++++++++++++++++++++
tests/generic/766.out | 23 +++++++++++++
2 files changed, 103 insertions(+)
create mode 100755 tests/generic/766
create mode 100644 tests/generic/766.out

diff --git a/tests/generic/766 b/tests/generic/766
new file mode 100755
index 00000000..6f31c250
--- /dev/null
+++ b/tests/generic/766
@@ -0,0 +1,80 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2025 Huawei. All Rights Reserved.
+#
+# FS QA Test No. 766
+#
+# Test fallocate(WRITE_ZEROES) on a block device, which should be able to
+# WRITE SAME (or equivalent) the range.
+#
+. ./common/preamble
+_begin_fstest blockdev rw zero
+
+_register_cleanup "_cleanup" BUS
+
+# Import common functions.
+. ./common/filter
+. ./common/scsi_debug
+
+# Modify as appropriate.
+_require_scsi_debug
+_require_xfs_io_command "fwzero"
+
+## 1. Test supported flags
+echo "Create with unmap writesame and format"
+dev=$(_get_scsi_debug_dev 512 512 0 4 "lbpws=1 lbpws10=1")
+_pwrite_byte 0x62 0 4m $dev >> $seqres.full
+$XFS_IO_PROG -c "fsync" $dev
+
+echo "Write zeroes"
+$XFS_IO_PROG -c "fwzero 512k 1m" $dev
+
+echo "Check contents"
+md5sum $dev | sed -e "s|$dev|SCSI_DEBUG_DEV|g"
+
+echo "Destroy device"
+_put_scsi_debug_dev
+
+echo "Create w/o unmap writesame and format"
+dev=$(_get_scsi_debug_dev 512 512 0 4 "lbpws=0 lbpws10=0 lbpu=0 write_same_length=0 unmap_max_blocks=0")
+_pwrite_byte 0x62 0 4m $dev >> $seqres.full
+$XFS_IO_PROG -c "fsync" $dev
+
+echo "Write zeroes, write fallback"
+$XFS_IO_PROG -c "fwzero 512k 1m" $dev
+
+echo "Check contents"
+md5sum $dev | sed -e "s|$dev|SCSI_DEBUG_DEV|g"
+
+echo "Destroy device"
+_put_scsi_debug_dev
+
+## 2. Test unsupported flags.
+echo "Create and format"
+dev=$(_get_scsi_debug_dev 4096 4096 0 4 "lbpws=1 lbpws10=1")
+_pwrite_byte 0x62 0 4m $dev >> $seqres.full
+$XFS_IO_PROG -c "fsync" $dev
+
+echo "Unaligned write zeroes"
+$XFS_IO_PROG -c "fwzero 512 512" $dev
+
+echo "Write zeroes past MAX_LFS_FILESIZE"
+# zod = MAX_LFS_FILESIZE
+zod=$(_get_max_lfs_filesize)
+$XFS_IO_PROG -c "fwzero 512k $zod" $dev
+
+echo "Write zeroes to MAX_LFS_FILESIZE"
+$XFS_IO_PROG -c "fwzero 0 $zod" $dev
+
+echo "Write zeroes starts past EOD"
+$XFS_IO_PROG -c "fwzero 900m 1m" $dev
+
+echo "Check contents"
+md5sum $dev | sed -e "s|$dev|SCSI_DEBUG_DEV|g"
+
+echo "Destroy device"
+_put_scsi_debug_dev
+
+# success, all done
+status=0
+exit
diff --git a/tests/generic/766.out b/tests/generic/766.out
new file mode 100644
index 00000000..7da0ceca
--- /dev/null
+++ b/tests/generic/766.out
@@ -0,0 +1,23 @@
+QA output created by 766
+Create with unmap writesame and format
+Write zeroes
+Check contents
+caa26edd6c70ce862eb7ec6f10b138a8 SCSI_DEBUG_DEV
+Destroy device
+Create w/o unmap writesame and format
+Write zeroes, write fallback
+Check contents
+caa26edd6c70ce862eb7ec6f10b138a8 SCSI_DEBUG_DEV
+Destroy device
+Create and format
+Unaligned write zeroes
+fallocate: Invalid argument
+Write zeroes past MAX_LFS_FILESIZE
+fallocate: File too large
+Write zeroes to MAX_LFS_FILESIZE
+fallocate: Invalid argument
+Write zeroes starts past EOD
+fallocate: Invalid argument
+Check contents
+b83f9394092e15bdcda585cd8e776dc6 SCSI_DEBUG_DEV
+Destroy device
--
2.46.1