[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20250318072615.3505873-6-yi.zhang@huaweicloud.com>
Date: Tue, 18 Mar 2025 15:26:15 +0800
From: Zhang Yi <yi.zhang@...weicloud.com>
To: linux-fsdevel@...r.kernel.org,
linux-ext4@...r.kernel.org,
linux-block@...r.kernel.org,
dm-devel@...ts.linux.dev,
linux-nvme@...ts.infradead.org,
linux-scsi@...r.kernel.org
Cc: linux-xfs@...r.kernel.org,
linux-kernel@...r.kernel.org,
hch@....de,
tytso@....edu,
djwong@...nel.org,
john.g.garry@...cle.com,
bmarzins@...hat.com,
chaitanyak@...dia.com,
shinichiro.kawasaki@....com,
yi.zhang@...wei.com,
yi.zhang@...weicloud.com,
chengzhihao1@...wei.com,
yukuai3@...wei.com,
yangerkun@...wei.com
Subject: [PATCH xfstests 5/5] fsx: add fallocate write zeroes support
From: Zhang Yi <yi.zhang@...wei.com>
Add fsx to suppoet fallocate FALLOC_FL_WRITE_ZEROES command by
introducing OP_WRITE_ZEROES operation.
Signed-off-by: Zhang Yi <yi.zhang@...wei.com>
---
ltp/fsx.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 80 insertions(+)
diff --git a/ltp/fsx.c b/ltp/fsx.c
index 41933354..0c5dc93f 100644
--- a/ltp/fsx.c
+++ b/ltp/fsx.c
@@ -111,6 +111,7 @@ enum {
OP_FALLOCATE,
OP_PUNCH_HOLE,
OP_ZERO_RANGE,
+ OP_WRITE_ZEROES,
OP_COLLAPSE_RANGE,
OP_INSERT_RANGE,
OP_CLONE_RANGE,
@@ -175,6 +176,7 @@ int keep_size_calls = 1; /* -K flag disables */
int unshare_range_calls = 1; /* -u flag disables */
int punch_hole_calls = 1; /* -H flag disables */
int zero_range_calls = 1; /* -z flag disables */
+int write_zeroes_calls = 1; /* -M flag disables */
int collapse_range_calls = 1; /* -C flag disables */
int insert_range_calls = 1; /* -I flag disables */
int mapped_reads = 1; /* -R flag disables it */
@@ -273,6 +275,7 @@ static const char *op_names[] = {
[OP_FALLOCATE] = "fallocate",
[OP_PUNCH_HOLE] = "punch_hole",
[OP_ZERO_RANGE] = "zero_range",
+ [OP_WRITE_ZEROES] = "write_zeroes",
[OP_COLLAPSE_RANGE] = "collapse_range",
[OP_INSERT_RANGE] = "insert_range",
[OP_CLONE_RANGE] = "clone_range",
@@ -450,6 +453,13 @@ logdump(void)
if (overlap)
prt("\t******ZZZZ");
break;
+ case OP_WRITE_ZEROES:
+ prt("WZERO 0x%x thru 0x%x\t(0x%x bytes)",
+ lp->args[0], lp->args[0] + lp->args[1] - 1,
+ lp->args[1]);
+ if (overlap)
+ prt("\t******ZZZZ");
+ break;
case OP_COLLAPSE_RANGE:
prt("COLLAPSE 0x%x thru 0x%x\t(0x%x bytes)",
lp->args[0], lp->args[0] + lp->args[1] - 1,
@@ -1352,6 +1362,58 @@ do_zero_range(unsigned offset, unsigned length, int keep_size)
}
#endif
+#ifdef FALLOC_FL_WRITE_ZEROES
+void
+do_write_zeroes(unsigned offset, unsigned length)
+{
+ unsigned end_offset;
+ int mode = FALLOC_FL_WRITE_ZEROES;
+
+ if (length == 0) {
+ if (!quiet && testcalls > simulatedopcount)
+ prt("skipping zero length write zeroes\n");
+ log4(OP_WRITE_ZEROES, offset, length, FL_SKIPPED);
+ return;
+ }
+
+ end_offset = offset + length;
+ if (end_offset > biggest) {
+ biggest = end_offset;
+ if (!quiet && testcalls > simulatedopcount)
+ prt("write_zeroes to largest ever: 0x%x\n", end_offset);
+ }
+
+ log4(OP_WRITE_ZEROES, offset, length, FL_NONE);
+
+ if (end_offset > file_size)
+ update_file_size(offset, length);
+
+ if (testcalls <= simulatedopcount)
+ return;
+
+ if ((progressinterval && testcalls % progressinterval == 0) ||
+ (debug && (monitorstart == -1 || monitorend == -1 ||
+ end_offset <= monitorend))) {
+ prt("%lld write zeroes\tfrom 0x%x to 0x%x, (0x%x bytes)\n", testcalls,
+ offset, offset+length, length);
+ }
+ if (fallocate(fd, mode, (loff_t)offset, (loff_t)length) == -1) {
+ prt("write zeroes: 0x%x to 0x%x\n", offset, offset + length);
+ prterr("do_write_zeroes: fallocate");
+ report_failure(161);
+ }
+
+ memset(good_buf + offset, '\0', length);
+}
+
+#else
+void
+do_write_zeroes(unsigned offset, unsigned length)
+{
+ return;
+}
+#endif
+
#ifdef FALLOC_FL_COLLAPSE_RANGE
void
do_collapse_range(unsigned offset, unsigned length)
@@ -2296,6 +2358,12 @@ have_op:
goto out;
}
break;
+ case OP_WRITE_ZEROES:
+ if (!write_zeroes_calls) {
+ log4(OP_WRITE_ZEROES, offset, size, FL_SKIPPED);
+ goto out;
+ }
+ break;
case OP_COLLAPSE_RANGE:
if (!collapse_range_calls) {
log4(OP_COLLAPSE_RANGE, offset, size, FL_SKIPPED);
@@ -2372,6 +2440,10 @@ have_op:
TRIM_OFF_LEN(offset, size, maxfilelen);
do_zero_range(offset, size, keep_size);
break;
+ case OP_WRITE_ZEROES:
+ TRIM_OFF_LEN(offset, size, maxfilelen);
+ do_write_zeroes(offset, size);
+ break;
case OP_COLLAPSE_RANGE:
TRIM_OFF_LEN(offset, size, file_size - 1);
offset = rounddown_64(offset, block_size);
@@ -2519,6 +2591,9 @@ usage(void)
#ifdef FALLOC_FL_ZERO_RANGE
" -z: Do not use zero range calls\n"
#endif
+#ifdef FALLOC_FL_WRITE_ZEROES
+" -z: Do not use write zeroes calls\n"
+#endif
#ifdef FALLOC_FL_COLLAPSE_RANGE
" -C: Do not use collapse range calls\n"
#endif
@@ -3019,6 +3094,9 @@ main(int argc, char **argv)
case 'z':
zero_range_calls = 0;
break;
+ case 'M':
+ write_zeroes_calls = 0;
+ break;
case 'C':
collapse_range_calls = 0;
break;
@@ -3281,6 +3359,8 @@ main(int argc, char **argv)
punch_hole_calls = test_fallocate(FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE);
if (zero_range_calls)
zero_range_calls = test_fallocate(FALLOC_FL_ZERO_RANGE);
+ if (write_zeroes_calls)
+ write_zeroes_calls = test_fallocate(FALLOC_FL_WRITE_ZEROES);
if (collapse_range_calls)
collapse_range_calls = test_fallocate(FALLOC_FL_COLLAPSE_RANGE);
if (insert_range_calls)
--
2.46.1
Powered by blists - more mailing lists