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.zh...@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.zh...@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" <djw...@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 > >> > >> > >