From: "Darrick J. Wong" <djwong@kernel.org>
To: Lukas Herbolt <lukas@herbolt.com>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH] xfs: add FALLOC_FL_WRITE_ZEROES to XFS code base
Date: Tue, 21 Oct 2025 08:55:15 -0700 [thread overview]
Message-ID: <20251021155515.GL6215@frogsfrogsfrogs> (raw)
In-Reply-To: <20251021141744.1375627-3-lukas@herbolt.com>
On Tue, Oct 21, 2025 at 04:17:44PM +0200, Lukas Herbolt wrote:
> Add support for FALLOC_FL_WRITE_ZEROES if the underlying device enable
> the unmap write zeroes operation.
>
> Signed-off-by: Lukas Herbolt <lukas@herbolt.com>
> ---
> fs/xfs/xfs_bmap_util.c | 6 +++---
> fs/xfs/xfs_bmap_util.h | 4 ++--
> fs/xfs/xfs_file.c | 25 ++++++++++++++++++-------
> 3 files changed, 23 insertions(+), 12 deletions(-)
>
> diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c
> index 06ca11731e430..fd43c9db79a8d 100644
> --- a/fs/xfs/xfs_bmap_util.c
> +++ b/fs/xfs/xfs_bmap_util.c
> @@ -645,6 +645,7 @@ xfs_free_eofblocks(
> int
> xfs_alloc_file_space(
> struct xfs_inode *ip,
> + uint32_t flags, /* XFS_BMAPI_... */
> xfs_off_t offset,
> xfs_off_t len)
> {
> @@ -747,9 +748,8 @@ xfs_alloc_file_space(
> * startoffset_fsb so that one of the following allocations
> * will eventually reach the requested range.
> */
> - error = xfs_bmapi_write(tp, ip, startoffset_fsb,
> - allocatesize_fsb, XFS_BMAPI_PREALLOC, 0, imapp,
> - &nimaps);
> error = xfs_bmapi_write(tp, ip, startoffset_fsb, 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..67770830eb245 100644
> --- a/fs/xfs/xfs_bmap_util.h
> +++ b/fs/xfs/xfs_bmap_util.h
> @@ -55,8 +55,8 @@ int xfs_bmap_last_extent(struct xfs_trans *tp, struct xfs_inode *ip,
> int *is_empty);
>
> /* preallocation and hole punch interface */
> -int xfs_alloc_file_space(struct xfs_inode *ip, xfs_off_t offset,
> - xfs_off_t len);
> +int xfs_alloc_file_space(struct xfs_inode *ip, uint32_t flags,
> + xfs_off_t offset, xfs_off_t len);
> 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..b7e8cda62bb73 100644
> --- a/fs/xfs/xfs_file.c
> +++ b/fs/xfs/xfs_file.c
> @@ -1255,29 +1255,37 @@ xfs_falloc_insert_range(
> static int
> xfs_falloc_zero_range(
> struct file *file,
> - int mode,
> + int mode,
> loff_t offset,
> loff_t len,
> 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 (!bdev_write_zeroes_unmap_sectors(xfs_inode_buftarg(ip)->bt_bdev))
> + return -EOPNOTSUPP;
> + xfs_alloc_file_space(ip, XFS_BMAPI_ZERO, offset, len);
Don't we need to check the return value of xfs_alloc_file_space?
--D
> + } else {
> + error = xfs_alloc_file_space(ip, XFS_BMAPI_PREALLOC,
> + offset, len);
> + }
> if (error)
> return error;
> return xfs_falloc_setsize(file, new_size);
> @@ -1302,7 +1310,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), XFS_BMAPI_PREALLOC,
> + offset, len);
> if (error)
> return error;
> return xfs_falloc_setsize(file, new_size);
> @@ -1330,7 +1339,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), XFS_BMAPI_PREALLOC,
> + offset, len);
> if (error)
> return error;
> return xfs_falloc_setsize(file, new_size);
> @@ -1340,7 +1350,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 +1393,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-21 15:55 UTC|newest]
Thread overview: 29+ 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 [this message]
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
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
-- strict thread matches above, loose matches on Subject: below --
2026-02-12 13:12 [PATCH] xfs: add FALLOC_FL_WRITE_ZEROES to XFS code base Lukas Herbolt
2026-02-12 13:15 ` Lukas Herbolt
2026-02-25 8:37 Lukas Herbolt
2026-02-25 8:41 ` Lukas Herbolt
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=20251021155515.GL6215@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=linux-xfs@vger.kernel.org \
--cc=lukas@herbolt.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.