Message ID | 2ed0d30380a95b8731f0afe433560d0545e65553.1743954240.git.trond.myklebust@hammerspace.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Two more places that need to handle ENETDOWN/ENETUNREACH | expand |
On Sun, 2025-04-06 at 17:45 +0200, trondmy@kernel.org wrote: > From: Trond Myklebust <trond.myklebust@hammerspace.com> > > Ensure that the NFSv4 error handling code recognises the > RPC_TASK_NETUNREACH_FATAL flag, and handles the ENETDOWN and ENETUNREACH > errors accordingly. > > Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> > --- > fs/nfs/nfs4proc.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c > index da97f87ecaa9..01417e3099e3 100644 > --- a/fs/nfs/nfs4proc.c > +++ b/fs/nfs/nfs4proc.c > @@ -671,6 +671,15 @@ nfs4_async_handle_exception(struct rpc_task *task, struct nfs_server *server, > struct nfs_client *clp = server->nfs_client; > int ret; > > + if ((task->tk_rpc_status == -ENETDOWN || > + task->tk_rpc_status == -ENETUNREACH) && > + task->tk_flags & RPC_TASK_NETUNREACH_FATAL) { We're sprinkling the above conditional in quite a few places now. It would be nice to turn the above if statement into a helper function. Something like this maybe? static inline bool netunreach_fatal(struct rpc_task *task) { return (task->tk_rpc_status == -ENETDOWN || task->tk_rpc_status == -ENETUNREACH) && (task->tk_flags & RPC_TASK_NETUNREACH_FATAL); } > + exception->delay = 0; > + exception->recovering = 0; > + exception->retry = 0; > + return -EIO; > + } > + > ret = nfs4_do_handle_exception(server, errorcode, exception); > if (exception->delay) { > int ret2 = nfs4_exception_should_retrans(server, exception); Patch looks good though. Reviewed-by: Jeff Layton <jlayton@kernel.org>
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index da97f87ecaa9..01417e3099e3 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -671,6 +671,15 @@ nfs4_async_handle_exception(struct rpc_task *task, struct nfs_server *server, struct nfs_client *clp = server->nfs_client; int ret; + if ((task->tk_rpc_status == -ENETDOWN || + task->tk_rpc_status == -ENETUNREACH) && + task->tk_flags & RPC_TASK_NETUNREACH_FATAL) { + exception->delay = 0; + exception->recovering = 0; + exception->retry = 0; + return -EIO; + } + ret = nfs4_do_handle_exception(server, errorcode, exception); if (exception->delay) { int ret2 = nfs4_exception_should_retrans(server, exception);