io/prealloc.c | 36 ++++++++++++++++++++++++++++++++++++ man/man8/xfs_io.8 | 6 ++++++ 2 files changed, 42 insertions(+)
From: Zhang Yi <yi.zhang@huawei.com>
The Linux kernel (since version 6.17) supports FALLOC_FL_WRITE_ZEROES in
fallocate(2). Add support for FALLOC_FL_WRITE_ZEROES support to the
fallocate utility by introducing a new 'fwzero' command in the xfs_io
tool.
Link: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=278c7d9b5e0c
Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
---
v1->v2:
- Minor description modification to align with the kernel.
io/prealloc.c | 36 ++++++++++++++++++++++++++++++++++++
man/man8/xfs_io.8 | 6 ++++++
2 files changed, 42 insertions(+)
diff --git a/io/prealloc.c b/io/prealloc.c
index 8e968c9f..9a64bf53 100644
--- a/io/prealloc.c
+++ b/io/prealloc.c
@@ -30,6 +30,10 @@
#define FALLOC_FL_UNSHARE_RANGE 0x40
#endif
+#ifndef FALLOC_FL_WRITE_ZEROES
+#define FALLOC_FL_WRITE_ZEROES 0x80
+#endif
+
static cmdinfo_t allocsp_cmd;
static cmdinfo_t freesp_cmd;
static cmdinfo_t resvsp_cmd;
@@ -41,6 +45,7 @@ static cmdinfo_t fcollapse_cmd;
static cmdinfo_t finsert_cmd;
static cmdinfo_t fzero_cmd;
static cmdinfo_t funshare_cmd;
+static cmdinfo_t fwzero_cmd;
static int
offset_length(
@@ -377,6 +382,27 @@ funshare_f(
return 0;
}
+static int
+fwzero_f(
+ int argc,
+ char **argv)
+{
+ xfs_flock64_t segment;
+ int mode = FALLOC_FL_WRITE_ZEROES;
+
+ if (!offset_length(argv[1], argv[2], &segment)) {
+ exitcode = 1;
+ return 0;
+ }
+
+ if (fallocate(file->fd, mode, segment.l_start, segment.l_len)) {
+ perror("fallocate");
+ exitcode = 1;
+ return 0;
+ }
+ return 0;
+}
+
void
prealloc_init(void)
{
@@ -489,4 +515,14 @@ prealloc_init(void)
funshare_cmd.oneline =
_("unshares shared blocks within the range");
add_command(&funshare_cmd);
+
+ fwzero_cmd.name = "fwzero";
+ fwzero_cmd.cfunc = fwzero_f;
+ fwzero_cmd.argmin = 2;
+ fwzero_cmd.argmax = 2;
+ fwzero_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK;
+ fwzero_cmd.args = _("off len");
+ fwzero_cmd.oneline =
+ _("zeroes space and eliminates holes by allocating and submitting write zeroes");
+ add_command(&fwzero_cmd);
}
diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8
index b0dcfdb7..0a673322 100644
--- a/man/man8/xfs_io.8
+++ b/man/man8/xfs_io.8
@@ -550,6 +550,12 @@ With the
.B -k
option, use the FALLOC_FL_KEEP_SIZE flag as well.
.TP
+.BI fwzero " offset length"
+Call fallocate with FALLOC_FL_WRITE_ZEROES flag as described in the
+.BR fallocate (2)
+manual page to allocate and zero blocks within the range by submitting write
+zeroes.
+.TP
.BI zero " offset length"
Call xfsctl with
.B XFS_IOC_ZERO_RANGE
--
2.39.2
On Wed, Aug 13, 2025 at 10:42:50AM +0800, Zhang Yi wrote: > From: Zhang Yi <yi.zhang@huawei.com> > > The Linux kernel (since version 6.17) supports FALLOC_FL_WRITE_ZEROES in > fallocate(2). Add support for FALLOC_FL_WRITE_ZEROES support to the > fallocate utility by introducing a new 'fwzero' command in the xfs_io > tool. > > Link: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=278c7d9b5e0c > Signed-off-by: Zhang Yi <yi.zhang@huawei.com> > --- > v1->v2: > - Minor description modification to align with the kernel. > > io/prealloc.c | 36 ++++++++++++++++++++++++++++++++++++ > man/man8/xfs_io.8 | 6 ++++++ > 2 files changed, 42 insertions(+) > > diff --git a/io/prealloc.c b/io/prealloc.c > index 8e968c9f..9a64bf53 100644 > --- a/io/prealloc.c > +++ b/io/prealloc.c > @@ -30,6 +30,10 @@ > #define FALLOC_FL_UNSHARE_RANGE 0x40 > #endif > > +#ifndef FALLOC_FL_WRITE_ZEROES > +#define FALLOC_FL_WRITE_ZEROES 0x80 > +#endif > + > static cmdinfo_t allocsp_cmd; > static cmdinfo_t freesp_cmd; > static cmdinfo_t resvsp_cmd; > @@ -41,6 +45,7 @@ static cmdinfo_t fcollapse_cmd; > static cmdinfo_t finsert_cmd; > static cmdinfo_t fzero_cmd; > static cmdinfo_t funshare_cmd; > +static cmdinfo_t fwzero_cmd; > > static int > offset_length( > @@ -377,6 +382,27 @@ funshare_f( > return 0; > } > > +static int > +fwzero_f( > + int argc, > + char **argv) > +{ > + xfs_flock64_t segment; > + int mode = FALLOC_FL_WRITE_ZEROES; Shouldn't this take a -k to add FALLOC_FL_KEEP_SIZE like fzero? (The code otherwise looks fine to me) --D > + > + if (!offset_length(argv[1], argv[2], &segment)) { > + exitcode = 1; > + return 0; > + } > + > + if (fallocate(file->fd, mode, segment.l_start, segment.l_len)) { > + perror("fallocate"); > + exitcode = 1; > + return 0; > + } > + return 0; > +} > + > void > prealloc_init(void) > { > @@ -489,4 +515,14 @@ prealloc_init(void) > funshare_cmd.oneline = > _("unshares shared blocks within the range"); > add_command(&funshare_cmd); > + > + fwzero_cmd.name = "fwzero"; > + fwzero_cmd.cfunc = fwzero_f; > + fwzero_cmd.argmin = 2; > + fwzero_cmd.argmax = 2; > + fwzero_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK; > + fwzero_cmd.args = _("off len"); > + fwzero_cmd.oneline = > + _("zeroes space and eliminates holes by allocating and submitting write zeroes"); > + add_command(&fwzero_cmd); > } > diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 > index b0dcfdb7..0a673322 100644 > --- a/man/man8/xfs_io.8 > +++ b/man/man8/xfs_io.8 > @@ -550,6 +550,12 @@ With the > .B -k > option, use the FALLOC_FL_KEEP_SIZE flag as well. > .TP > +.BI fwzero " offset length" > +Call fallocate with FALLOC_FL_WRITE_ZEROES flag as described in the > +.BR fallocate (2) > +manual page to allocate and zero blocks within the range by submitting write > +zeroes. > +.TP > .BI zero " offset length" > Call xfsctl with > .B XFS_IOC_ZERO_RANGE > -- > 2.39.2 > >
On 2025/8/15 0:54, Darrick J. Wong wrote: > On Wed, Aug 13, 2025 at 10:42:50AM +0800, Zhang Yi wrote: >> From: Zhang Yi <yi.zhang@huawei.com> >> >> The Linux kernel (since version 6.17) supports FALLOC_FL_WRITE_ZEROES in >> fallocate(2). Add support for FALLOC_FL_WRITE_ZEROES support to the >> fallocate utility by introducing a new 'fwzero' command in the xfs_io >> tool. >> >> Link: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=278c7d9b5e0c >> Signed-off-by: Zhang Yi <yi.zhang@huawei.com> >> --- >> v1->v2: >> - Minor description modification to align with the kernel. >> >> io/prealloc.c | 36 ++++++++++++++++++++++++++++++++++++ >> man/man8/xfs_io.8 | 6 ++++++ >> 2 files changed, 42 insertions(+) >> >> diff --git a/io/prealloc.c b/io/prealloc.c >> index 8e968c9f..9a64bf53 100644 >> --- a/io/prealloc.c >> +++ b/io/prealloc.c >> @@ -30,6 +30,10 @@ >> #define FALLOC_FL_UNSHARE_RANGE 0x40 >> #endif >> >> +#ifndef FALLOC_FL_WRITE_ZEROES >> +#define FALLOC_FL_WRITE_ZEROES 0x80 >> +#endif >> + >> static cmdinfo_t allocsp_cmd; >> static cmdinfo_t freesp_cmd; >> static cmdinfo_t resvsp_cmd; >> @@ -41,6 +45,7 @@ static cmdinfo_t fcollapse_cmd; >> static cmdinfo_t finsert_cmd; >> static cmdinfo_t fzero_cmd; >> static cmdinfo_t funshare_cmd; >> +static cmdinfo_t fwzero_cmd; >> >> static int >> offset_length( >> @@ -377,6 +382,27 @@ funshare_f( >> return 0; >> } >> >> +static int >> +fwzero_f( >> + int argc, >> + char **argv) >> +{ >> + xfs_flock64_t segment; >> + int mode = FALLOC_FL_WRITE_ZEROES; > > Shouldn't this take a -k to add FALLOC_FL_KEEP_SIZE like fzero? > Since allocating blocks with written extents beyond the inode size is not permitted, the FALLOC_FL_WRITE_ZEROES flag cannot be used together with the FALLOC_FL_KEEP_SIZE. Thanks, Yi. > (The code otherwise looks fine to me) > > --D > >> + >> + if (!offset_length(argv[1], argv[2], &segment)) { >> + exitcode = 1; >> + return 0; >> + } >> + >> + if (fallocate(file->fd, mode, segment.l_start, segment.l_len)) { >> + perror("fallocate"); >> + exitcode = 1; >> + return 0; >> + } >> + return 0; >> +} >> + >> void >> prealloc_init(void) >> { >> @@ -489,4 +515,14 @@ prealloc_init(void) >> funshare_cmd.oneline = >> _("unshares shared blocks within the range"); >> add_command(&funshare_cmd); >> + >> + fwzero_cmd.name = "fwzero"; >> + fwzero_cmd.cfunc = fwzero_f; >> + fwzero_cmd.argmin = 2; >> + fwzero_cmd.argmax = 2; >> + fwzero_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK; >> + fwzero_cmd.args = _("off len"); >> + fwzero_cmd.oneline = >> + _("zeroes space and eliminates holes by allocating and submitting write zeroes"); >> + add_command(&fwzero_cmd); >> } >> diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 >> index b0dcfdb7..0a673322 100644 >> --- a/man/man8/xfs_io.8 >> +++ b/man/man8/xfs_io.8 >> @@ -550,6 +550,12 @@ With the >> .B -k >> option, use the FALLOC_FL_KEEP_SIZE flag as well. >> .TP >> +.BI fwzero " offset length" >> +Call fallocate with FALLOC_FL_WRITE_ZEROES flag as described in the >> +.BR fallocate (2) >> +manual page to allocate and zero blocks within the range by submitting write >> +zeroes. >> +.TP >> .BI zero " offset length" >> Call xfsctl with >> .B XFS_IOC_ZERO_RANGE >> -- >> 2.39.2 >> >>
On Fri, Aug 15, 2025 at 05:59:01PM +0800, Zhang Yi wrote: > On 2025/8/15 0:54, Darrick J. Wong wrote: > > On Wed, Aug 13, 2025 at 10:42:50AM +0800, Zhang Yi wrote: > >> From: Zhang Yi <yi.zhang@huawei.com> > >> > >> The Linux kernel (since version 6.17) supports FALLOC_FL_WRITE_ZEROES in > >> fallocate(2). Add support for FALLOC_FL_WRITE_ZEROES support to the > >> fallocate utility by introducing a new 'fwzero' command in the xfs_io > >> tool. > >> > >> Link: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=278c7d9b5e0c > >> Signed-off-by: Zhang Yi <yi.zhang@huawei.com> > >> --- > >> v1->v2: > >> - Minor description modification to align with the kernel. > >> > >> io/prealloc.c | 36 ++++++++++++++++++++++++++++++++++++ > >> man/man8/xfs_io.8 | 6 ++++++ > >> 2 files changed, 42 insertions(+) > >> > >> diff --git a/io/prealloc.c b/io/prealloc.c > >> index 8e968c9f..9a64bf53 100644 > >> --- a/io/prealloc.c > >> +++ b/io/prealloc.c > >> @@ -30,6 +30,10 @@ > >> #define FALLOC_FL_UNSHARE_RANGE 0x40 > >> #endif > >> > >> +#ifndef FALLOC_FL_WRITE_ZEROES > >> +#define FALLOC_FL_WRITE_ZEROES 0x80 > >> +#endif > >> + > >> static cmdinfo_t allocsp_cmd; > >> static cmdinfo_t freesp_cmd; > >> static cmdinfo_t resvsp_cmd; > >> @@ -41,6 +45,7 @@ static cmdinfo_t fcollapse_cmd; > >> static cmdinfo_t finsert_cmd; > >> static cmdinfo_t fzero_cmd; > >> static cmdinfo_t funshare_cmd; > >> +static cmdinfo_t fwzero_cmd; > >> > >> static int > >> offset_length( > >> @@ -377,6 +382,27 @@ funshare_f( > >> return 0; > >> } > >> > >> +static int > >> +fwzero_f( > >> + int argc, > >> + char **argv) > >> +{ > >> + xfs_flock64_t segment; > >> + int mode = FALLOC_FL_WRITE_ZEROES; > > > > Shouldn't this take a -k to add FALLOC_FL_KEEP_SIZE like fzero? > > > > Since allocating blocks with written extents beyond the inode size > is not permitted, the FALLOC_FL_WRITE_ZEROES flag cannot be used > together with the FALLOC_FL_KEEP_SIZE. Heh, apparently I didn't read the manpage well enough. Reviewed-by: "Darrick J. Wong" <djwong@kernel.org> --D > Thanks, > Yi. > > > (The code otherwise looks fine to me) > > > > --D > > > >> + > >> + if (!offset_length(argv[1], argv[2], &segment)) { > >> + exitcode = 1; > >> + return 0; > >> + } > >> + > >> + if (fallocate(file->fd, mode, segment.l_start, segment.l_len)) { > >> + perror("fallocate"); > >> + exitcode = 1; > >> + return 0; > >> + } > >> + return 0; > >> +} > >> + > >> void > >> prealloc_init(void) > >> { > >> @@ -489,4 +515,14 @@ prealloc_init(void) > >> funshare_cmd.oneline = > >> _("unshares shared blocks within the range"); > >> add_command(&funshare_cmd); > >> + > >> + fwzero_cmd.name = "fwzero"; > >> + fwzero_cmd.cfunc = fwzero_f; > >> + fwzero_cmd.argmin = 2; > >> + fwzero_cmd.argmax = 2; > >> + fwzero_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK; > >> + fwzero_cmd.args = _("off len"); > >> + fwzero_cmd.oneline = > >> + _("zeroes space and eliminates holes by allocating and submitting write zeroes"); > >> + add_command(&fwzero_cmd); > >> } > >> diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 > >> index b0dcfdb7..0a673322 100644 > >> --- a/man/man8/xfs_io.8 > >> +++ b/man/man8/xfs_io.8 > >> @@ -550,6 +550,12 @@ With the > >> .B -k > >> option, use the FALLOC_FL_KEEP_SIZE flag as well. > >> .TP > >> +.BI fwzero " offset length" > >> +Call fallocate with FALLOC_FL_WRITE_ZEROES flag as described in the > >> +.BR fallocate (2) > >> +manual page to allocate and zero blocks within the range by submitting write > >> +zeroes. > >> +.TP > >> .BI zero " offset length" > >> Call xfsctl with > >> .B XFS_IOC_ZERO_RANGE > >> -- > >> 2.39.2 > >> > >> > >
© 2016 - 2025 Red Hat, Inc.