From: "Darrick J. Wong" <djwong@kernel.org>
To: Lukas Herbolt <lukas@herbolt.com>
Cc: yi.zhang@huaweicloud.com, linux-xfs@vger.kernel.org
Subject: Re: [PATCH v3] xfs: add FALLOC_FL_WRITE_ZEROES to XFS code base
Date: Wed, 29 Oct 2025 11:22:55 -0700 [thread overview]
Message-ID: <20251029182255.GK3356773@frogsfrogsfrogs> (raw)
In-Reply-To: <20251029175313.3644646-2-lukas@herbolt.com>
On Wed, Oct 29, 2025 at 06:53:14PM +0100, Lukas Herbolt wrote:
> Add support for FALLOC_FL_WRITE_ZEROES if the underlying device enable
> the unmap write zeroes operation.
>
> v3 changes:
> - fix formating
> - fix check on the return value of xfs_alloc_file_space
> - add check if inode COW and return -EOPNOTSUPP
>
> Signed-off-by: Lukas Herbolt <lukas@herbolt.com>
> ---
> fs/xfs/xfs_bmap_util.c | 6 +++---
> fs/xfs/xfs_bmap_util.h | 2 +-
> fs/xfs/xfs_file.c | 24 ++++++++++++++++++------
> 3 files changed, 22 insertions(+), 10 deletions(-)
>
> diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c
> index 06ca11731e430..ddbcf4b0cea17 100644
> --- a/fs/xfs/xfs_bmap_util.c
> +++ b/fs/xfs/xfs_bmap_util.c
> @@ -646,7 +646,8 @@ int
> xfs_alloc_file_space(
> struct xfs_inode *ip,
> xfs_off_t offset,
> - xfs_off_t len)
> + xfs_off_t len,
> + uint32_t flags) /* XFS_BMAPI_... */
Call the parameter bmapi_flags.
> {
> xfs_mount_t *mp = ip->i_mount;
> xfs_off_t count;
> @@ -748,8 +749,7 @@ xfs_alloc_file_space(
> * will eventually reach the requested range.
> */
> error = xfs_bmapi_write(tp, ip, startoffset_fsb,
> - allocatesize_fsb, XFS_BMAPI_PREALLOC, 0, imapp,
> - &nimaps);
> + allocatesize_fsb, flags, 0, imapp, &nimaps);
> if (error) {
> if (error != -ENOSR)
> goto error;
> diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h
> index c477b33616304..1fd4844d4ec64 100644
> --- a/fs/xfs/xfs_bmap_util.h
> +++ b/fs/xfs/xfs_bmap_util.h
> @@ -56,7 +56,7 @@ int xfs_bmap_last_extent(struct xfs_trans *tp, struct xfs_inode *ip,
>
> /* preallocation and hole punch interface */
> int xfs_alloc_file_space(struct xfs_inode *ip, xfs_off_t offset,
> - xfs_off_t len);
> + xfs_off_t len, uint32_t flags);
> int xfs_free_file_space(struct xfs_inode *ip, xfs_off_t offset,
> xfs_off_t len, struct xfs_zone_alloc_ctx *ac);
> int xfs_collapse_file_space(struct xfs_inode *, xfs_off_t offset,
> diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
> index f96fbf5c54c99..38de47ffb8d39 100644
> --- a/fs/xfs/xfs_file.c
> +++ b/fs/xfs/xfs_file.c
> @@ -1261,23 +1261,32 @@ xfs_falloc_zero_range(
> struct xfs_zone_alloc_ctx *ac)
> {
> struct inode *inode = file_inode(file);
> + struct xfs_inode *ip = XFS_I(inode);
> unsigned int blksize = i_blocksize(inode);
> loff_t new_size = 0;
> int error;
>
> - trace_xfs_zero_file_space(XFS_I(inode));
> + trace_xfs_zero_file_space(ip);
>
> error = xfs_falloc_newsize(file, mode, offset, len, &new_size);
> if (error)
> return error;
>
> - error = xfs_free_file_space(XFS_I(inode), offset, len, ac);
> + error = xfs_free_file_space(ip, offset, len, ac);
> if (error)
> return error;
>
> len = round_up(offset + len, blksize) - round_down(offset, blksize);
> offset = round_down(offset, blksize);
> - error = xfs_alloc_file_space(XFS_I(inode), offset, len);
> + if (mode & FALLOC_FL_WRITE_ZEROES) {
> + if (xfs_is_cow_inode(ip) || !bdev_write_zeroes_unmap_sectors(
xfs_is_cow_inode() only tells us if the inode is capable of doing out of
place writes. Why would a regular reflinked inode be ineligible for
WRITE_ZEROES? The whole point of that fallocate mode is to avoid ioend
overhead during fsync, so I could see why you wouldn't want to allow
this for files that always do writes out of place. But not for files
that happen to have been reflinked in the past but otherwise support
pure overwrites.
I don't understand why this bdev_write_zeroes_unmap_sectors check is
here and not in xfs_alloc_file_space. Shouldn't other callers of
xfs_alloc_file_space be restricted from passing in XFS_BMAPI_ZERO if the
block device doesn't support unmap_sectors?
> + xfs_inode_buftarg(ip)->bt_bdev))
> + return -EOPNOTSUPP;
> + error = xfs_alloc_file_space(ip, offset, len, XFS_BMAPI_ZERO);
> + } else {
> + error = xfs_alloc_file_space(ip, offset, len,
> + XFS_BMAPI_PREALLOC);
> + }
> if (error)
> return error;
> return xfs_falloc_setsize(file, new_size);
> @@ -1302,7 +1311,8 @@ xfs_falloc_unshare_range(
> if (error)
> return error;
>
> - error = xfs_alloc_file_space(XFS_I(inode), offset, len);
> + error = xfs_alloc_file_space(XFS_I(inode), offset, len,
Whitespace damage ^^^^^
--D
> + XFS_BMAPI_PREALLOC);
> if (error)
> return error;
> return xfs_falloc_setsize(file, new_size);
> @@ -1330,7 +1340,8 @@ xfs_falloc_allocate_range(
> if (error)
> return error;
>
> - error = xfs_alloc_file_space(XFS_I(inode), offset, len);
> + error = xfs_alloc_file_space(XFS_I(inode), offset, len,
> + XFS_BMAPI_PREALLOC);
> if (error)
> return error;
> return xfs_falloc_setsize(file, new_size);
> @@ -1340,7 +1351,7 @@ xfs_falloc_allocate_range(
> (FALLOC_FL_ALLOCATE_RANGE | FALLOC_FL_KEEP_SIZE | \
> FALLOC_FL_PUNCH_HOLE | FALLOC_FL_COLLAPSE_RANGE | \
> FALLOC_FL_ZERO_RANGE | FALLOC_FL_INSERT_RANGE | \
> - FALLOC_FL_UNSHARE_RANGE)
> + FALLOC_FL_UNSHARE_RANGE | FALLOC_FL_WRITE_ZEROES)
>
> STATIC long
> __xfs_file_fallocate(
> @@ -1383,6 +1394,7 @@ __xfs_file_fallocate(
> case FALLOC_FL_INSERT_RANGE:
> error = xfs_falloc_insert_range(file, offset, len);
> break;
> + case FALLOC_FL_WRITE_ZEROES:
> case FALLOC_FL_ZERO_RANGE:
> error = xfs_falloc_zero_range(file, mode, offset, len, ac);
> break;
> --
> 2.51.0
>
>
next prev parent reply other threads:[~2025-10-29 18:22 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-21 14:17 [PATCH 0/2] Add FL_WRITE_ZEROES to XFS, fix krealloc on xfs_uuid_table Lukas Herbolt
2025-10-21 14:17 ` [PATCH] xfs: add FALLOC_FL_WRITE_ZEROES to XFS code base Lukas Herbolt
2025-10-21 15:55 ` Darrick J. Wong
2025-10-22 5:00 ` Christoph Hellwig
2025-10-22 7:13 ` Zhang Yi
2025-10-22 7:15 ` Christoph Hellwig
2025-10-22 7:27 ` Zhang Yi
2025-10-29 17:53 ` [PATCH v3] " Lukas Herbolt
2025-10-29 18:22 ` Darrick J. Wong [this message]
2025-10-30 7:27 ` Christoph Hellwig
2025-11-12 21:02 ` [PATCH v4] " Lukas Herbolt
2025-11-13 6:59 ` Christoph Hellwig
2025-11-14 8:55 ` [PATCH v5] " Lukas Herbolt
2025-11-14 8:57 ` Christoph Hellwig
2025-11-14 16:44 ` Darrick J. Wong
2025-11-14 16:45 ` Christoph Hellwig
2025-11-18 9:05 ` lukas
2025-12-15 11:48 ` [PATCH v6] " Lukas Herbolt
2025-12-15 14:28 ` Christoph Hellwig
2025-10-30 7:29 ` [PATCH v3] " Christoph Hellwig
2025-10-21 14:17 ` [PATCH 2/2] xfs: Remove WARN_ONCE if xfs_uuid_table grows over 2x PAGE_SIZE Lukas Herbolt
2025-10-21 15:56 ` Darrick J. Wong
2025-10-21 22:02 ` Dave Chinner
2025-10-26 17:49 ` lukas
2025-10-22 4:53 ` Christoph Hellwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251029182255.GK3356773@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=linux-xfs@vger.kernel.org \
--cc=lukas@herbolt.com \
--cc=yi.zhang@huaweicloud.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.