public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] ltp: add support for FALLOC_FL_WRITE_ZEROES to fsx and fsstress
@ 2026-03-12 19:53 Pankaj Raghav
  2026-03-13 23:52 ` Darrick J. Wong
  0 siblings, 1 reply; 3+ messages in thread
From: Pankaj Raghav @ 2026-03-12 19:53 UTC (permalink / raw)
  To: zlang; +Cc: fstests, lukas, dgc, pankaj.raghav, linux-xfs, djwong,
	Pankaj Raghav

Add FALLOC_FL_WRITE_ZEROES support to both fsx and fsstress.
FALLOC_FL_WRITE_ZEROES flag was added in the kernel as a part of Zhang
Yi's series [1].

FALLOC_FL_KEEP_SIZE is not supported when FALLOC_FL_WRITE_ZEROES is
used.

[1] https://lore.kernel.org/linux-fsdevel/20250619111806.3546162-1-yi.zhang@huaweicloud.com/

Signed-off-by: Pankaj Raghav <p.raghav@samsung.com>
---
 ltp/fsstress.c | 15 ++++++++-
 ltp/fsx.c      | 85 ++++++++++++++++++++++++++++++++++++++++++++++++--
 src/global.h   |  8 +++++
 3 files changed, 105 insertions(+), 3 deletions(-)

diff --git a/ltp/fsstress.c b/ltp/fsstress.c
index 9d0ed32f..fe340aea 100644
--- a/ltp/fsstress.c
+++ b/ltp/fsstress.c
@@ -124,6 +124,7 @@ typedef enum {
 	OP_MWRITE,
 	OP_PUNCH,
 	OP_ZERO,
+	OP_WRITE_ZEROES,
 	OP_COLLAPSE,
 	OP_INSERT,
 	OP_READ,
@@ -257,6 +258,7 @@ void	mread_f(opnum_t, long);
 void	mwrite_f(opnum_t, long);
 void	punch_f(opnum_t, long);
 void	zero_f(opnum_t, long);
+void	write_zeroes_f(opnum_t, long);
 void	collapse_f(opnum_t, long);
 void	insert_f(opnum_t, long);
 void	unshare_f(opnum_t, long);
@@ -326,6 +328,7 @@ struct opdesc	ops[OP_LAST]	= {
 	[OP_MWRITE]	   = {"mwrite",	       mwrite_f,	2, 1 },
 	[OP_PUNCH]	   = {"punch",	       punch_f,		1, 1 },
 	[OP_ZERO]	   = {"zero",	       zero_f,		1, 1 },
+	[OP_WRITE_ZEROES]  = {"write_zeroes",  write_zeroes_f,	1, 1 },
 	[OP_COLLAPSE]	   = {"collapse",      collapse_f,	1, 1 },
 	[OP_INSERT]	   = {"insert",	       insert_f,	1, 1 },
 	[OP_READ]	   = {"read",	       read_f,		1, 0 },
@@ -3827,6 +3830,7 @@ struct print_flags falloc_flags [] = {
 	{ FALLOC_FL_ZERO_RANGE, "ZERO_RANGE"},
 	{ FALLOC_FL_INSERT_RANGE, "INSERT_RANGE"},
 	{ FALLOC_FL_UNSHARE_RANGE, "UNSHARE_RANGE"},
+	{ FALLOC_FL_WRITE_ZEROES, "WRITE_ZEROES"},
 	{ -1, NULL}
 };
 
@@ -3886,7 +3890,8 @@ do_fallocate(opnum_t opno, long r, int mode)
 		off = roundup_64(off, stb.st_blksize);
 		len = roundup_64(len, stb.st_blksize);
 	}
-	mode |= FALLOC_FL_KEEP_SIZE & random();
+	if (!(mode & FALLOC_FL_WRITE_ZEROES))
+		mode |= FALLOC_FL_KEEP_SIZE & random();
 	e = fallocate(fd, mode, (loff_t)off, (loff_t)len) < 0 ? errno : 0;
 	if (v)
 		printf("%d/%lld: fallocate(%s) %s%s [%lld,%lld] %d\n",
@@ -4513,6 +4518,14 @@ zero_f(opnum_t opno, long r)
 #endif
 }
 
+void
+write_zeroes_f(opnum_t opno, long r)
+{
+#ifdef HAVE_LINUX_FALLOC_H
+	do_fallocate(opno, r, FALLOC_FL_WRITE_ZEROES);
+#endif
+}
+
 void
 collapse_f(opnum_t opno, long r)
 {
diff --git a/ltp/fsx.c b/ltp/fsx.c
index 32b9d599..63cdd58e 100644
--- a/ltp/fsx.c
+++ b/ltp/fsx.c
@@ -125,6 +125,7 @@ enum {
 	OP_FALLOCATE,
 	OP_PUNCH_HOLE,
 	OP_ZERO_RANGE,
+	OP_WRITE_ZEROES,
 	OP_COLLAPSE_RANGE,
 	OP_INSERT_RANGE,
 	OP_CLONE_RANGE,
@@ -189,6 +190,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;         /* -Y 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 */
@@ -306,6 +308,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",
@@ -486,6 +489,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,
@@ -1413,6 +1423,59 @@ 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 wzero\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)
@@ -2409,6 +2472,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);
@@ -2512,6 +2581,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);
@@ -2611,7 +2684,7 @@ void
 usage(void)
 {
 	fprintf(stdout, "usage: %s",
-		"fsx [-adfhknqxyzBEFHIJKLORWXZ0]\n\
+		"fsx [-adfhknqxyzBEFHIJKLORWXZ0Y]\n\
 	   [-b opnum] [-c Prob] [-g filldata] [-i logdev] [-j logid]\n\
 	   [-l flen] [-m start:end] [-o oplen] [-p progressinterval]\n\
 	   [-r readbdy] [-s style] [-t truncbdy] [-w writebdy]\n\
@@ -2663,6 +2736,9 @@ usage(void)
 #ifdef FALLOC_FL_ZERO_RANGE
 "	-z: Do not use zero range calls\n"
 #endif
+#ifdef FALLOC_FL_WRITE_ZEROES
+"	-Y: Do not use write zeroes calls\n"
+#endif
 #ifdef FALLOC_FL_COLLAPSE_RANGE
 "	-C: Do not use collapse range calls\n"
 #endif
@@ -3160,7 +3236,7 @@ main(int argc, char **argv)
 	setvbuf(stdout, (char *)0, _IOLBF, 0); /* line buffered stdout */
 
 	while ((ch = getopt_long(argc, argv,
-				 "0ab:c:de:fg:hi:j:kl:m:no:p:qr:s:t:uw:xyABD:EFJKHzCILN:TOP:RS:UWXZ",
+				 "0ab:c:de:fg:hi:j:kl:m:no:p:qr:s:t:uw:xyABD:EFJKHzCILN:TOP:RS:UWXZY",
 				 longopts, NULL)) != EOF)
 		switch (ch) {
 		case 'a':
@@ -3307,6 +3383,9 @@ main(int argc, char **argv)
 		case 'z':
 			zero_range_calls = 0;
 			break;
+		case 'Y':
+			write_zeroes_calls = 0;
+			break;
 		case 'C':
 			collapse_range_calls = 0;
 			break;
@@ -3568,6 +3647,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)
diff --git a/src/global.h b/src/global.h
index fbc0a0b5..e07b3703 100644
--- a/src/global.h
+++ b/src/global.h
@@ -179,6 +179,14 @@
 #define FALLOC_FL_INSERT_RANGE		0x20
 #endif
 
+#ifndef FALLOC_FL_UNSHARE_RANGE
+#define FALLOC_FL_UNSHARE_RANGE		0x40
+#endif
+
+#ifndef FALLOC_FL_WRITE_ZEROES
+#define FALLOC_FL_WRITE_ZEROES		0x80
+#endif
+
 #endif /* HAVE_LINUX_FALLOC_H */
 
 #ifdef HAVE_SYS_MMAN_H

base-commit: 3ded3e13c008326d197d11ac975049ed1f8ec922
-- 
2.51.2


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] ltp: add support for FALLOC_FL_WRITE_ZEROES to fsx and fsstress
  2026-03-12 19:53 [PATCH] ltp: add support for FALLOC_FL_WRITE_ZEROES to fsx and fsstress Pankaj Raghav
@ 2026-03-13 23:52 ` Darrick J. Wong
  2026-03-15  8:35   ` Pankaj Raghav
  0 siblings, 1 reply; 3+ messages in thread
From: Darrick J. Wong @ 2026-03-13 23:52 UTC (permalink / raw)
  To: Pankaj Raghav; +Cc: zlang, fstests, lukas, dgc, pankaj.raghav, linux-xfs

On Thu, Mar 12, 2026 at 08:53:08PM +0100, Pankaj Raghav wrote:
> Add FALLOC_FL_WRITE_ZEROES support to both fsx and fsstress.
> FALLOC_FL_WRITE_ZEROES flag was added in the kernel as a part of Zhang
> Yi's series [1].
> 
> FALLOC_FL_KEEP_SIZE is not supported when FALLOC_FL_WRITE_ZEROES is
> used.
> 
> [1] https://lore.kernel.org/linux-fsdevel/20250619111806.3546162-1-yi.zhang@huaweicloud.com/
> 
> Signed-off-by: Pankaj Raghav <p.raghav@samsung.com>

Looks like a clone of the ZERO_RANGE code so I think this is ready for
wider testing...
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>

--D

> ---
>  ltp/fsstress.c | 15 ++++++++-
>  ltp/fsx.c      | 85 ++++++++++++++++++++++++++++++++++++++++++++++++--
>  src/global.h   |  8 +++++
>  3 files changed, 105 insertions(+), 3 deletions(-)
> 
> diff --git a/ltp/fsstress.c b/ltp/fsstress.c
> index 9d0ed32f..fe340aea 100644
> --- a/ltp/fsstress.c
> +++ b/ltp/fsstress.c
> @@ -124,6 +124,7 @@ typedef enum {
>  	OP_MWRITE,
>  	OP_PUNCH,
>  	OP_ZERO,
> +	OP_WRITE_ZEROES,
>  	OP_COLLAPSE,
>  	OP_INSERT,
>  	OP_READ,
> @@ -257,6 +258,7 @@ void	mread_f(opnum_t, long);
>  void	mwrite_f(opnum_t, long);
>  void	punch_f(opnum_t, long);
>  void	zero_f(opnum_t, long);
> +void	write_zeroes_f(opnum_t, long);
>  void	collapse_f(opnum_t, long);
>  void	insert_f(opnum_t, long);
>  void	unshare_f(opnum_t, long);
> @@ -326,6 +328,7 @@ struct opdesc	ops[OP_LAST]	= {
>  	[OP_MWRITE]	   = {"mwrite",	       mwrite_f,	2, 1 },
>  	[OP_PUNCH]	   = {"punch",	       punch_f,		1, 1 },
>  	[OP_ZERO]	   = {"zero",	       zero_f,		1, 1 },
> +	[OP_WRITE_ZEROES]  = {"write_zeroes",  write_zeroes_f,	1, 1 },
>  	[OP_COLLAPSE]	   = {"collapse",      collapse_f,	1, 1 },
>  	[OP_INSERT]	   = {"insert",	       insert_f,	1, 1 },
>  	[OP_READ]	   = {"read",	       read_f,		1, 0 },
> @@ -3827,6 +3830,7 @@ struct print_flags falloc_flags [] = {
>  	{ FALLOC_FL_ZERO_RANGE, "ZERO_RANGE"},
>  	{ FALLOC_FL_INSERT_RANGE, "INSERT_RANGE"},
>  	{ FALLOC_FL_UNSHARE_RANGE, "UNSHARE_RANGE"},
> +	{ FALLOC_FL_WRITE_ZEROES, "WRITE_ZEROES"},
>  	{ -1, NULL}
>  };
>  
> @@ -3886,7 +3890,8 @@ do_fallocate(opnum_t opno, long r, int mode)
>  		off = roundup_64(off, stb.st_blksize);
>  		len = roundup_64(len, stb.st_blksize);
>  	}
> -	mode |= FALLOC_FL_KEEP_SIZE & random();
> +	if (!(mode & FALLOC_FL_WRITE_ZEROES))
> +		mode |= FALLOC_FL_KEEP_SIZE & random();
>  	e = fallocate(fd, mode, (loff_t)off, (loff_t)len) < 0 ? errno : 0;
>  	if (v)
>  		printf("%d/%lld: fallocate(%s) %s%s [%lld,%lld] %d\n",
> @@ -4513,6 +4518,14 @@ zero_f(opnum_t opno, long r)
>  #endif
>  }
>  
> +void
> +write_zeroes_f(opnum_t opno, long r)
> +{
> +#ifdef HAVE_LINUX_FALLOC_H
> +	do_fallocate(opno, r, FALLOC_FL_WRITE_ZEROES);
> +#endif
> +}
> +
>  void
>  collapse_f(opnum_t opno, long r)
>  {
> diff --git a/ltp/fsx.c b/ltp/fsx.c
> index 32b9d599..63cdd58e 100644
> --- a/ltp/fsx.c
> +++ b/ltp/fsx.c
> @@ -125,6 +125,7 @@ enum {
>  	OP_FALLOCATE,
>  	OP_PUNCH_HOLE,
>  	OP_ZERO_RANGE,
> +	OP_WRITE_ZEROES,
>  	OP_COLLAPSE_RANGE,
>  	OP_INSERT_RANGE,
>  	OP_CLONE_RANGE,
> @@ -189,6 +190,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;         /* -Y 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 */
> @@ -306,6 +308,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",
> @@ -486,6 +489,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,
> @@ -1413,6 +1423,59 @@ 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 wzero\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)
> @@ -2409,6 +2472,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);
> @@ -2512,6 +2581,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);
> @@ -2611,7 +2684,7 @@ void
>  usage(void)
>  {
>  	fprintf(stdout, "usage: %s",
> -		"fsx [-adfhknqxyzBEFHIJKLORWXZ0]\n\
> +		"fsx [-adfhknqxyzBEFHIJKLORWXZ0Y]\n\
>  	   [-b opnum] [-c Prob] [-g filldata] [-i logdev] [-j logid]\n\
>  	   [-l flen] [-m start:end] [-o oplen] [-p progressinterval]\n\
>  	   [-r readbdy] [-s style] [-t truncbdy] [-w writebdy]\n\
> @@ -2663,6 +2736,9 @@ usage(void)
>  #ifdef FALLOC_FL_ZERO_RANGE
>  "	-z: Do not use zero range calls\n"
>  #endif
> +#ifdef FALLOC_FL_WRITE_ZEROES
> +"	-Y: Do not use write zeroes calls\n"
> +#endif
>  #ifdef FALLOC_FL_COLLAPSE_RANGE
>  "	-C: Do not use collapse range calls\n"
>  #endif
> @@ -3160,7 +3236,7 @@ main(int argc, char **argv)
>  	setvbuf(stdout, (char *)0, _IOLBF, 0); /* line buffered stdout */
>  
>  	while ((ch = getopt_long(argc, argv,
> -				 "0ab:c:de:fg:hi:j:kl:m:no:p:qr:s:t:uw:xyABD:EFJKHzCILN:TOP:RS:UWXZ",
> +				 "0ab:c:de:fg:hi:j:kl:m:no:p:qr:s:t:uw:xyABD:EFJKHzCILN:TOP:RS:UWXZY",
>  				 longopts, NULL)) != EOF)
>  		switch (ch) {
>  		case 'a':
> @@ -3307,6 +3383,9 @@ main(int argc, char **argv)
>  		case 'z':
>  			zero_range_calls = 0;
>  			break;
> +		case 'Y':
> +			write_zeroes_calls = 0;
> +			break;
>  		case 'C':
>  			collapse_range_calls = 0;
>  			break;
> @@ -3568,6 +3647,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)
> diff --git a/src/global.h b/src/global.h
> index fbc0a0b5..e07b3703 100644
> --- a/src/global.h
> +++ b/src/global.h
> @@ -179,6 +179,14 @@
>  #define FALLOC_FL_INSERT_RANGE		0x20
>  #endif
>  
> +#ifndef FALLOC_FL_UNSHARE_RANGE
> +#define FALLOC_FL_UNSHARE_RANGE		0x40
> +#endif
> +
> +#ifndef FALLOC_FL_WRITE_ZEROES
> +#define FALLOC_FL_WRITE_ZEROES		0x80
> +#endif
> +
>  #endif /* HAVE_LINUX_FALLOC_H */
>  
>  #ifdef HAVE_SYS_MMAN_H
> 
> base-commit: 3ded3e13c008326d197d11ac975049ed1f8ec922
> -- 
> 2.51.2
> 
> 

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] ltp: add support for FALLOC_FL_WRITE_ZEROES to fsx and fsstress
  2026-03-13 23:52 ` Darrick J. Wong
@ 2026-03-15  8:35   ` Pankaj Raghav
  0 siblings, 0 replies; 3+ messages in thread
From: Pankaj Raghav @ 2026-03-15  8:35 UTC (permalink / raw)
  To: Darrick J. Wong, Pankaj Raghav; +Cc: zlang, fstests, lukas, dgc, linux-xfs



On 3/14/2026 12:52 AM, Darrick J. Wong wrote:
> On Thu, Mar 12, 2026 at 08:53:08PM +0100, Pankaj Raghav wrote:
>> Add FALLOC_FL_WRITE_ZEROES support to both fsx and fsstress.
>> FALLOC_FL_WRITE_ZEROES flag was added in the kernel as a part of Zhang
>> Yi's series [1].
>>
>> FALLOC_FL_KEEP_SIZE is not supported when FALLOC_FL_WRITE_ZEROES is
>> used.
>>
>> [1] https://lore.kernel.org/linux-fsdevel/20250619111806.3546162-1-yi.zhang@huaweicloud.com/
>>
>> Signed-off-by: Pankaj Raghav <p.raghav@samsung.com>
> 
> Looks like a clone of the ZERO_RANGE code so I think this is ready for
> wider testing...

Yeah. Except the FALLOC_FL_KEEP_SIZE part, it is exactly like ZERO_RANGE.

> Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
> 
> --D
> 

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-03-15  8:35 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-12 19:53 [PATCH] ltp: add support for FALLOC_FL_WRITE_ZEROES to fsx and fsstress Pankaj Raghav
2026-03-13 23:52 ` Darrick J. Wong
2026-03-15  8:35   ` Pankaj Raghav

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox