On Wed, 2024-08-21 at 14:05 -0400, trondmy@xxxxxxxxxx wrote: > From: Trond Myklebust <trond.myklebust@xxxxxxxxxxxxxxx> > > Make sure that we clear the layout segments in cases where we see a > fatal error, and also in the case where the layout is invalid. > > Signed-off-by: Trond Myklebust <trond.myklebust@xxxxxxxxxxxxxxx> > --- > fs/nfs/nfs4proc.c | 9 ++++++--- > fs/nfs/pnfs.c | 5 ++--- > 2 files changed, 8 insertions(+), 6 deletions(-) > > diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c > index 8883016c551c..daba7d89a0cf 100644 > --- a/fs/nfs/nfs4proc.c > +++ b/fs/nfs/nfs4proc.c > @@ -9997,6 +9997,7 @@ static void nfs4_layoutreturn_done(struct > rpc_task *task, void *calldata) > fallthrough; > default: > task->tk_status = 0; > + lrp->res.lrs_present = 0; > fallthrough; > case 0: > break; > @@ -10010,9 +10011,11 @@ static void nfs4_layoutreturn_done(struct > rpc_task *task, void *calldata) > task->tk_status = 0; > break; > case -NFS4ERR_DELAY: > - if (nfs4_async_handle_error(task, server, NULL, > NULL) != -EAGAIN) > - break; > - goto out_restart; > + if (nfs4_async_handle_error(task, server, NULL, > NULL) == > + -EAGAIN) > + goto out_restart; > + lrp->res.lrs_present = 0; > + break; > } > return; > out_restart: > diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c > index aa698481bec8..0d16b383a452 100644 > --- a/fs/nfs/pnfs.c > +++ b/fs/nfs/pnfs.c > @@ -1284,10 +1284,9 @@ void pnfs_layoutreturn_free_lsegs(struct > pnfs_layout_hdr *lo, > LIST_HEAD(freeme); > > spin_lock(&inode->i_lock); > - if (!pnfs_layout_is_valid(lo) || > - !nfs4_stateid_match_other(&lo->plh_stateid, > arg_stateid)) > + if (!nfs4_stateid_match_other(&lo->plh_stateid, > arg_stateid)) > goto out_unlock; > - if (stateid) { > + if (stateid && pnfs_layout_is_valid(lo)) { > u32 seq = be32_to_cpu(arg_stateid->seqid); > > pnfs_mark_matching_lsegs_invalid(lo, &freeme, range, > seq); Reviewed-by: Jeff Layton <jlayton@xxxxxxxxxx>