* [PATCH v9] xfs: add FALLOC_FL_WRITE_ZEROES to XFS code base
@ 2026-02-23 9:11 Lukas Herbolt
2026-02-23 13:12 ` Christoph Hellwig
2026-02-23 16:19 ` Darrick J. Wong
0 siblings, 2 replies; 4+ messages in thread
From: Lukas Herbolt @ 2026-02-23 9:11 UTC (permalink / raw)
To: linux-xfs, djwong; +Cc: cem, hch, Lukas Herbolt
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 | 5 +++--
fs/xfs/xfs_bmap_util.h | 2 +-
fs/xfs/xfs_file.c | 39 ++++++++++++++++++++++++++-------------
3 files changed, 30 insertions(+), 16 deletions(-)
diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c
index 2208a720ec3f..0c1b1fa82f8b 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 bmapi_flags)
{
xfs_mount_t *mp = ip->i_mount;
xfs_off_t count;
@@ -748,7 +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,
+ allocatesize_fsb, bmapi_flags, 0, imapp,
&nimaps);
if (error) {
if (error != -ENOSR)
diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h
index c477b3361630..2895cc97a572 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 bmapi_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 7874cf745af3..83c45ada3cc8 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -1293,6 +1293,7 @@ xfs_falloc_zero_range(
unsigned int blksize = i_blocksize(inode);
loff_t new_size = 0;
int error;
+ uint32_t bmapi_flags;
trace_xfs_zero_file_space(ip);
@@ -1300,18 +1301,27 @@ xfs_falloc_zero_range(
if (error)
return error;
- if (xfs_falloc_force_zero(ip, ac)) {
- error = xfs_zero_range(ip, offset, len, ac, NULL);
- } else {
- 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(ip, offset, len);
+ if (mode & FALLOC_FL_WRITE_ZEROES) {
+ if (xfs_is_always_cow_inode(ip) ||
+ !bdev_write_zeroes_unmap_sectors(
+ xfs_inode_buftarg(ip)->bt_bdev))
+ return -EOPNOTSUPP;
+ bmapi_flags = XFS_BMAPI_ZERO;
+ } else {
+ if (xfs_falloc_force_zero(ip, ac)) {
+ error = xfs_zero_range(ip, offset, len, ac, NULL);
+ goto set_filesize;
+ }
+ bmapi_flags = XFS_BMAPI_PREALLOC;
}
+
+ len = round_up(offset + len, blksize) - round_down(offset, blksize);
+ offset = round_down(offset, blksize);
+
+ error = xfs_alloc_file_space(ip, offset, len, bmapi_flags);
+
+set_filesize:
if (error)
return error;
return xfs_falloc_setsize(file, new_size);
@@ -1336,7 +1346,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,
+ XFS_BMAPI_PREALLOC);
if (error)
return error;
return xfs_falloc_setsize(file, new_size);
@@ -1364,7 +1375,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);
@@ -1374,7 +1386,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(
@@ -1417,6 +1429,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.53.0
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [PATCH v9] xfs: add FALLOC_FL_WRITE_ZEROES to XFS code base
2026-02-23 9:11 [PATCH v9] xfs: add FALLOC_FL_WRITE_ZEROES to XFS code base Lukas Herbolt
@ 2026-02-23 13:12 ` Christoph Hellwig
2026-02-23 16:19 ` Darrick J. Wong
1 sibling, 0 replies; 4+ messages in thread
From: Christoph Hellwig @ 2026-02-23 13:12 UTC (permalink / raw)
To: Lukas Herbolt; +Cc: linux-xfs, djwong, cem, hch
On Mon, Feb 23, 2026 at 10:11:07AM +0100, 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>
Looks good:
Reviewed-by: Christoph Hellwig <hch@lst.de>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v9] xfs: add FALLOC_FL_WRITE_ZEROES to XFS code base
2026-02-23 9:11 [PATCH v9] xfs: add FALLOC_FL_WRITE_ZEROES to XFS code base Lukas Herbolt
2026-02-23 13:12 ` Christoph Hellwig
@ 2026-02-23 16:19 ` Darrick J. Wong
2026-02-24 8:54 ` Lukas Herbolt
1 sibling, 1 reply; 4+ messages in thread
From: Darrick J. Wong @ 2026-02-23 16:19 UTC (permalink / raw)
To: Lukas Herbolt; +Cc: linux-xfs, cem, hch
On Mon, Feb 23, 2026 at 10:11:07AM +0100, 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 | 5 +++--
> fs/xfs/xfs_bmap_util.h | 2 +-
> fs/xfs/xfs_file.c | 39 ++++++++++++++++++++++++++-------------
> 3 files changed, 30 insertions(+), 16 deletions(-)
>
> diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c
> index 2208a720ec3f..0c1b1fa82f8b 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 bmapi_flags)
> {
> xfs_mount_t *mp = ip->i_mount;
> xfs_off_t count;
> @@ -748,7 +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,
> + allocatesize_fsb, bmapi_flags, 0, imapp,
> &nimaps);
> if (error) {
> if (error != -ENOSR)
> diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h
> index c477b3361630..2895cc97a572 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 bmapi_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 7874cf745af3..83c45ada3cc8 100644
> --- a/fs/xfs/xfs_file.c
> +++ b/fs/xfs/xfs_file.c
> @@ -1293,6 +1293,7 @@ xfs_falloc_zero_range(
> unsigned int blksize = i_blocksize(inode);
> loff_t new_size = 0;
> int error;
> + uint32_t bmapi_flags;
>
> trace_xfs_zero_file_space(ip);
>
> @@ -1300,18 +1301,27 @@ xfs_falloc_zero_range(
> if (error)
> return error;
>
> - if (xfs_falloc_force_zero(ip, ac)) {
> - error = xfs_zero_range(ip, offset, len, ac, NULL);
> - } else {
> - error = xfs_free_file_space(ip, offset, len, ac);
Where did this call to xfs_free_file_space go? This looks like a
behavior change in the classic zero-range behavior.
--D
> - if (error)
> - return error;
>
> - len = round_up(offset + len, blksize) -
> - round_down(offset, blksize);
> - offset = round_down(offset, blksize);
> - error = xfs_alloc_file_space(ip, offset, len);
> + if (mode & FALLOC_FL_WRITE_ZEROES) {
> + if (xfs_is_always_cow_inode(ip) ||
> + !bdev_write_zeroes_unmap_sectors(
> + xfs_inode_buftarg(ip)->bt_bdev))
> + return -EOPNOTSUPP;
> + bmapi_flags = XFS_BMAPI_ZERO;
> + } else {
> + if (xfs_falloc_force_zero(ip, ac)) {
> + error = xfs_zero_range(ip, offset, len, ac, NULL);
> + goto set_filesize;
> + }
> + bmapi_flags = XFS_BMAPI_PREALLOC;
> }
> +
> + len = round_up(offset + len, blksize) - round_down(offset, blksize);
> + offset = round_down(offset, blksize);
> +
> + error = xfs_alloc_file_space(ip, offset, len, bmapi_flags);
> +
> +set_filesize:
> if (error)
> return error;
> return xfs_falloc_setsize(file, new_size);
> @@ -1336,7 +1346,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,
> + XFS_BMAPI_PREALLOC);
> if (error)
> return error;
> return xfs_falloc_setsize(file, new_size);
> @@ -1364,7 +1375,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);
> @@ -1374,7 +1386,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(
> @@ -1417,6 +1429,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.53.0
>
>
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH v9] xfs: add FALLOC_FL_WRITE_ZEROES to XFS code base
2026-02-23 16:19 ` Darrick J. Wong
@ 2026-02-24 8:54 ` Lukas Herbolt
0 siblings, 0 replies; 4+ messages in thread
From: Lukas Herbolt @ 2026-02-24 8:54 UTC (permalink / raw)
To: Darrick J. Wong; +Cc: linux-xfs, cem, hch
On 2026-02-23 17:19, Darrick J. Wong wrote:
> On Mon, Feb 23, 2026 at 10:11:07AM +0100, 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 | 5 +++--
>> fs/xfs/xfs_bmap_util.h | 2 +-
>> fs/xfs/xfs_file.c | 39 ++++++++++++++++++++++++++-------------
>> 3 files changed, 30 insertions(+), 16 deletions(-)
>>
>> diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c
>> index 2208a720ec3f..0c1b1fa82f8b 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 bmapi_flags)
>> {
>> xfs_mount_t *mp = ip->i_mount;
>> xfs_off_t count;
>> @@ -748,7 +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,
>> + allocatesize_fsb, bmapi_flags, 0, imapp,
>> &nimaps);
>> if (error) {
>> if (error != -ENOSR)
>> diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h
>> index c477b3361630..2895cc97a572 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 bmapi_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 7874cf745af3..83c45ada3cc8 100644
>> --- a/fs/xfs/xfs_file.c
>> +++ b/fs/xfs/xfs_file.c
>> @@ -1293,6 +1293,7 @@ xfs_falloc_zero_range(
>> unsigned int blksize = i_blocksize(inode);
>> loff_t new_size = 0;
>> int error;
>> + uint32_t bmapi_flags;
>>
>> trace_xfs_zero_file_space(ip);
>>
>> @@ -1300,18 +1301,27 @@ xfs_falloc_zero_range(
>> if (error)
>> return error;
>>
>> - if (xfs_falloc_force_zero(ip, ac)) {
>> - error = xfs_zero_range(ip, offset, len, ac, NULL);
>> - } else {
>> - error = xfs_free_file_space(ip, offset, len, ac);
>
> Where did this call to xfs_free_file_space go? This looks like a
> behavior change in the classic zero-range behavior.
>
> --D
>
Seems I missed the else branch when doing the rebase.
--
-lhe
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-02-24 8:55 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-23 9:11 [PATCH v9] xfs: add FALLOC_FL_WRITE_ZEROES to XFS code base Lukas Herbolt
2026-02-23 13:12 ` Christoph Hellwig
2026-02-23 16:19 ` Darrick J. Wong
2026-02-24 8:54 ` Lukas Herbolt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox