* [PATCH 0/2] pnfs/blocklayout: report LAYOUTCOMMIT failures
@ 2026-10-16 11:36 Benjamin Coddington
2026-10-16 11:36 ` [PATCH 1/2] pnfs/blocklayout: don't mark extents committed after a failed LAYOUTCOMMIT Benjamin Coddington
2026-10-16 11:36 ` [PATCH 2/2] pnfs/blocklayout: report data lost to " Benjamin Coddington
0 siblings, 2 replies; 6+ messages in thread
From: Benjamin Coddington @ 2026-10-16 11:36 UTC (permalink / raw)
To: Trond Myklebust, Anna Schumaker; +Cc: linux-nfs, Daejun Park, Christoph Hellwig
From: Benjamin Coddington <bcodding@hammerspace.com>
Data a block or SCSI layout client writes into unwritten extents becomes
file data only when a LAYOUTCOMMIT succeeds. A server that has revoked
the layout answers NFS4ERR_BADLAYOUT, nfs4_layoutcommit_done() ignores
it, and fsync() and close() return 0 for data that reads back as
zeroes. nfsd reaches this through its recall failure path today, and
the layout recall series [1] makes it more likely.
Patch 1 keeps the extents uncommitted when the LAYOUTCOMMIT fails before
its result is decoded. Patch 2 records a writeback error when extents go
uncommitted and returns it from the block/SCSI ->sync. The files and
flexfiles layouts are unchanged.
NB: these are compile-tested only; I don't have a setup handy that can
revoke the layout..
[1] https://lore.kernel.org/linux-nfs/20261015-nfsd-layout-recall-v3-0-ba3269f8ca22@samsung.com/
Benjamin Coddington (2):
pnfs/blocklayout: don't mark extents committed after a failed
LAYOUTCOMMIT
pnfs/blocklayout: report data lost to a failed LAYOUTCOMMIT
fs/nfs/blocklayout/blocklayout.c | 3 ++-
fs/nfs/blocklayout/extent_tree.c | 14 +++++++++++---
fs/nfs/pnfs.c | 8 +++++++-
3 files changed, 20 insertions(+), 5 deletions(-)
base-commit: a90ee4305c4a5df72c11b31dacfdc76e00fcf78a
--
2.53.0
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH 1/2] pnfs/blocklayout: don't mark extents committed after a failed LAYOUTCOMMIT 2026-10-16 11:36 [PATCH 0/2] pnfs/blocklayout: report LAYOUTCOMMIT failures Benjamin Coddington @ 2026-10-16 11:36 ` Benjamin Coddington 2026-10-16 12:54 ` Christoph Hellwig 2026-10-16 11:36 ` [PATCH 2/2] pnfs/blocklayout: report data lost to " Benjamin Coddington 1 sibling, 1 reply; 6+ messages in thread From: Benjamin Coddington @ 2026-10-16 11:36 UTC (permalink / raw) To: Trond Myklebust, Anna Schumaker; +Cc: linux-nfs, Daejun Park, Christoph Hellwig From: Benjamin Coddington <bcodding@hammerspace.com> bl_cleanup_layoutcommit() decides whether the server converted the extents from res.status, which only decode_layoutcommit() sets. When the compound fails before the LAYOUTCOMMIT op is decoded, as with a soft timeout or an error on PUTFH, res.status is still zero and ext_tree_mark_committed() turns the extents into PNFS_BLOCK_READWRITE_DATA, although the server may not have converted them. Fall back to the task status when res.status is zero. Fixes: b2be7811dd94 ("pnfsblock: cleanup_layoutcommit") Signed-off-by: Benjamin Coddington <bcodding@hammerspace.com> --- fs/nfs/blocklayout/blocklayout.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/nfs/blocklayout/blocklayout.c b/fs/nfs/blocklayout/blocklayout.c index d54a141a89b3..aafcb8e30057 100644 --- a/fs/nfs/blocklayout/blocklayout.c +++ b/fs/nfs/blocklayout/blocklayout.c @@ -794,7 +794,8 @@ bl_prepare_layoutcommit(struct nfs4_layoutcommit_args *arg) static void bl_cleanup_layoutcommit(struct nfs4_layoutcommit_data *lcdata) { - ext_tree_mark_committed(&lcdata->args, lcdata->res.status); + ext_tree_mark_committed(&lcdata->args, + lcdata->res.status ?: lcdata->task.tk_status); } static int -- 2.53.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] pnfs/blocklayout: don't mark extents committed after a failed LAYOUTCOMMIT 2026-10-16 11:36 ` [PATCH 1/2] pnfs/blocklayout: don't mark extents committed after a failed LAYOUTCOMMIT Benjamin Coddington @ 2026-10-16 12:54 ` Christoph Hellwig 0 siblings, 0 replies; 6+ messages in thread From: Christoph Hellwig @ 2026-10-16 12:54 UTC (permalink / raw) To: Benjamin Coddington Cc: Trond Myklebust, Anna Schumaker, linux-nfs, Daejun Park, Christoph Hellwig Looks good: Reviewed-by: Christoph Hellwig <hch@lst.de> ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 2/2] pnfs/blocklayout: report data lost to a failed LAYOUTCOMMIT 2026-10-16 11:36 [PATCH 0/2] pnfs/blocklayout: report LAYOUTCOMMIT failures Benjamin Coddington 2026-10-16 11:36 ` [PATCH 1/2] pnfs/blocklayout: don't mark extents committed after a failed LAYOUTCOMMIT Benjamin Coddington @ 2026-10-16 11:36 ` Benjamin Coddington 2026-10-16 12:56 ` Christoph Hellwig 1 sibling, 1 reply; 6+ messages in thread From: Benjamin Coddington @ 2026-10-16 11:36 UTC (permalink / raw) To: Trond Myklebust, Anna Schumaker; +Cc: linux-nfs, Daejun Park, Christoph Hellwig From: Benjamin Coddington <bcodding@hammerspace.com> Data written through a block or SCSI layout into PNFS_BLOCK_INVALID_DATA extents stays unwritten on the server until a LAYOUTCOMMIT converts those extents. When the LAYOUTCOMMIT fails, ext_tree_mark_committed() tags the extents written again so that a later LAYOUTCOMMIT can cover them, and reports nothing. nfs4_layoutcommit_done() also zeroes the task status for NFS4ERR_BADLAYOUT, NFS4ERR_BADIOMODE, NFS4ERR_DELEG_REVOKED and NFS4ERR_GRACE, so a synchronous LAYOUTCOMMIT returns 0 for those. A server that has revoked the layout answers NFS4ERR_BADLAYOUT; once the client drops that layout its extent tree goes with it, and fsync() and close() have returned 0 for data that reads back as zeroes. When ext_tree_mark_committed() puts extents back, record -EIO in the mapping's writeback error and the superblock's, and have pnfs_generic_sync(), which only the block and SCSI layouts use, return an error recorded during its LAYOUTCOMMIT. The files and flexfiles layouts, whose LAYOUTCOMMIT does not decide what a read of the file returns, are unchanged. Fixes: b2be7811dd94 ("pnfsblock: cleanup_layoutcommit") Signed-off-by: Benjamin Coddington <bcodding@hammerspace.com> --- fs/nfs/blocklayout/extent_tree.c | 14 +++++++++++--- fs/nfs/pnfs.c | 8 +++++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/fs/nfs/blocklayout/extent_tree.c b/fs/nfs/blocklayout/extent_tree.c index 7393118c42a2..e408dba57401 100644 --- a/fs/nfs/blocklayout/extent_tree.c +++ b/fs/nfs/blocklayout/extent_tree.c @@ -696,6 +696,7 @@ ext_tree_mark_committed(struct nfs4_layoutcommit_args *arg, int status) struct pnfs_block_layout *bl = BLK_LO2EXT(NFS_I(arg->inode)->layout); struct rb_root *root = &bl->bl_ext_rw; struct pnfs_block_extent *be; + bool uncommitted = false; dprintk("%s status %d\n", __func__, status); @@ -709,11 +710,13 @@ ext_tree_mark_committed(struct nfs4_layoutcommit_args *arg, int status) if (status) { /* - * Mark as written and try again. - * - * XXX: some real error handling here wouldn't hurt.. + * The server may not have converted these blocks, so + * what we wrote to them may not be part of the file. + * Keep them for a later LAYOUTCOMMIT, but tell fsync + * and close. */ be->be_tag = EXTENT_WRITTEN; + uncommitted = true; } else { be->be_state = PNFS_BLOCK_READWRITE_DATA; be->be_tag = 0; @@ -723,4 +726,9 @@ ext_tree_mark_committed(struct nfs4_layoutcommit_args *arg, int status) be = ext_try_to_merge_right(root, be); } spin_unlock(&bl->bl_ext_lock); + + if (uncommitted) { + filemap_set_wb_err(arg->inode->i_mapping, -EIO); + errseq_set(&arg->inode->i_sb->s_wb_err, -EIO); + } } diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index 4f9c0f639014..b21ccba9fbab 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c @@ -3444,7 +3444,13 @@ EXPORT_SYMBOL_GPL(pnfs_layoutcommit_inode); int pnfs_generic_sync(struct inode *inode, bool datasync) { - return pnfs_layoutcommit_inode(inode, true); + errseq_t since = filemap_sample_wb_err(inode->i_mapping); + int ret; + + ret = pnfs_layoutcommit_inode(inode, true); + if (ret) + return ret; + return filemap_check_wb_err(inode->i_mapping, since); } EXPORT_SYMBOL_GPL(pnfs_generic_sync); -- 2.53.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 2/2] pnfs/blocklayout: report data lost to a failed LAYOUTCOMMIT 2026-10-16 11:36 ` [PATCH 2/2] pnfs/blocklayout: report data lost to " Benjamin Coddington @ 2026-10-16 12:56 ` Christoph Hellwig 2026-10-16 13:29 ` Benjamin Coddington 0 siblings, 1 reply; 6+ messages in thread From: Christoph Hellwig @ 2026-10-16 12:56 UTC (permalink / raw) To: Benjamin Coddington Cc: Trond Myklebust, Anna Schumaker, linux-nfs, Daejun Park, Christoph Hellwig On Fri, Oct 16, 2026 at 07:36:39AM -0400, Benjamin Coddington wrote: > From: Benjamin Coddington <bcodding@hammerspace.com> > > Data written through a block or SCSI layout into PNFS_BLOCK_INVALID_DATA > extents stays unwritten on the server until a LAYOUTCOMMIT converts > those extents. When the LAYOUTCOMMIT fails, ext_tree_mark_committed() > tags the extents written again so that a later LAYOUTCOMMIT can cover > them, and reports nothing. nfs4_layoutcommit_done() also zeroes the > task status for NFS4ERR_BADLAYOUT, NFS4ERR_BADIOMODE, > NFS4ERR_DELEG_REVOKED and NFS4ERR_GRACE, so a synchronous LAYOUTCOMMIT > returns 0 for those. A server that has revoked the layout answers > NFS4ERR_BADLAYOUT; once the client drops that layout its extent tree > goes with it, and fsync() and close() have returned 0 for data that > reads back as zeroes. > > When ext_tree_mark_committed() puts extents back, record -EIO in the > mapping's writeback error and the superblock's, and have > pnfs_generic_sync(), which only the block and SCSI layouts use, return > an error recorded during its LAYOUTCOMMIT. The files and flexfiles > layouts, whose LAYOUTCOMMIT does not decide what a read of the file > returns, are unchanged. Looks good: Reviewed-by: Christoph Hellwig <hch@lst.de> Should pnfs_generic_sync move into the blocklayout code as that is the only user and it thus isn't exactly overly generic? ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 2/2] pnfs/blocklayout: report data lost to a failed LAYOUTCOMMIT 2026-10-16 12:56 ` Christoph Hellwig @ 2026-10-16 13:29 ` Benjamin Coddington 0 siblings, 0 replies; 6+ messages in thread From: Benjamin Coddington @ 2026-10-16 13:29 UTC (permalink / raw) To: Christoph Hellwig Cc: Benjamin Coddington, Trond Myklebust, Anna Schumaker, linux-nfs, Daejun Park On 16 Oct 2026, at 8:56, Christoph Hellwig wrote: > On Fri, Oct 16, 2026 at 07:36:39AM -0400, Benjamin Coddington wrote: >> From: Benjamin Coddington <bcodding@hammerspace.com> >> >> Data written through a block or SCSI layout into PNFS_BLOCK_INVALID_DATA >> extents stays unwritten on the server until a LAYOUTCOMMIT converts >> those extents. When the LAYOUTCOMMIT fails, ext_tree_mark_committed() >> tags the extents written again so that a later LAYOUTCOMMIT can cover >> them, and reports nothing. nfs4_layoutcommit_done() also zeroes the >> task status for NFS4ERR_BADLAYOUT, NFS4ERR_BADIOMODE, >> NFS4ERR_DELEG_REVOKED and NFS4ERR_GRACE, so a synchronous LAYOUTCOMMIT >> returns 0 for those. A server that has revoked the layout answers >> NFS4ERR_BADLAYOUT; once the client drops that layout its extent tree >> goes with it, and fsync() and close() have returned 0 for data that >> reads back as zeroes. >> >> When ext_tree_mark_committed() puts extents back, record -EIO in the >> mapping's writeback error and the superblock's, and have >> pnfs_generic_sync(), which only the block and SCSI layouts use, return >> an error recorded during its LAYOUTCOMMIT. The files and flexfiles >> layouts, whose LAYOUTCOMMIT does not decide what a read of the file >> returns, are unchanged. > > Looks good: > > Reviewed-by: Christoph Hellwig <hch@lst.de> > > Should pnfs_generic_sync move into the blocklayout code as that is > the only user and it thus isn't exactly overly generic? Yep, that can be done - I can do it on a v2 here. Sashiko also found that I messed up the error handling - this doesn't consume the error on the mapping, and I probably should switch this around to something like: errseq_t since = READ_ONCE(inode->i_mapping->wb_err); ... return filemap_check_wb_err(inode->i_mapping, since); That change will probably drop your R-b, unless you say otherwise. Ben ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-10-16 13:29 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-10-16 11:36 [PATCH 0/2] pnfs/blocklayout: report LAYOUTCOMMIT failures Benjamin Coddington 2026-10-16 11:36 ` [PATCH 1/2] pnfs/blocklayout: don't mark extents committed after a failed LAYOUTCOMMIT Benjamin Coddington 2026-10-16 12:54 ` Christoph Hellwig 2026-10-16 11:36 ` [PATCH 2/2] pnfs/blocklayout: report data lost to " Benjamin Coddington 2026-10-16 12:56 ` Christoph Hellwig 2026-10-16 13:29 ` Benjamin Coddington
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox