Message ID | 219bcbc91166e476ef996901ae8f3ddb2278d166.1724263426.git.trond.myklebust@hammerspace.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [1/3] NFSv4: Add missing rescheduling points in nfs_client_return_marked_delegations | expand |
On Wed, 2024-08-21 at 14:05 -0400, trondmy@kernel.org wrote: > From: Trond Myklebust <trond.myklebust@hammerspace.com> > > 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@hammerspace.com> > --- > 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@kernel.org>
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);