diff mbox series

[v3,4/6] NFSv4: Further cleanups to shutdown loops

Message ID 668e25098cb97187d084d5fa2916ddd4d2a68e00.1742941932.git.trond.myklebust@hammerspace.com (mailing list archive)
State New
Headers show
Series Ensure that ENETUNREACH terminates state recovery | expand

Commit Message

Trond Myklebust March 25, 2025, 10:35 p.m. UTC
From: Trond Myklebust <trond.myklebust@hammerspace.com>

Replace the tests for the RPC client being shut down with tests for
whether the nfs_client is in an error state.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
---
 fs/nfs/nfs4proc.c  | 2 +-
 fs/nfs/nfs4state.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

Comments

Jeff Layton March 26, 2025, 12:17 a.m. UTC | #1
On Tue, 2025-03-25 at 18:35 -0400, trondmy@kernel.org wrote:
> From: Trond Myklebust <trond.myklebust@hammerspace.com>
> 
> Replace the tests for the RPC client being shut down with tests for
> whether the nfs_client is in an error state.
> 
> Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
> ---
>  fs/nfs/nfs4proc.c  | 2 +-
>  fs/nfs/nfs4state.c | 2 +-
>  2 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
> index 889511650ceb..50be54e0f578 100644
> --- a/fs/nfs/nfs4proc.c
> +++ b/fs/nfs/nfs4proc.c
> @@ -9580,7 +9580,7 @@ static void nfs41_sequence_call_done(struct rpc_task *task, void *data)
>  		return;
>  
>  	trace_nfs4_sequence(clp, task->tk_status);
> -	if (task->tk_status < 0 && !task->tk_client->cl_shutdown) {
> +	if (task->tk_status < 0 && clp->cl_cons_state >= 0) {
>  		dprintk("%s ERROR %d\n", __func__, task->tk_status);
>  		if (refcount_read(&clp->cl_count) == 1)
>  			return;
> diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
> index 542cdf71229f..f1f7eaa97973 100644
> --- a/fs/nfs/nfs4state.c
> +++ b/fs/nfs/nfs4state.c
> @@ -1198,7 +1198,7 @@ void nfs4_schedule_state_manager(struct nfs_client *clp)
>  	struct rpc_clnt *clnt = clp->cl_rpcclient;
>  	bool swapon = false;
>  
> -	if (clnt->cl_shutdown)
> +	if (clp->cl_cons_state < 0)
>  		return;
>  
>  	set_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state);

This should probably also have:

    Fixes: 6ad477a69ad8 ("NFSv4: Clean up some shutdown loops")

...but otherwise this looks good to me.

Reviewed-by: Jeff Layton <jlayton@kernel.org>
Jeff Layton March 26, 2025, 10:13 a.m. UTC | #2
On Tue, 2025-03-25 at 18:35 -0400, trondmy@kernel.org wrote:
> From: Trond Myklebust <trond.myklebust@hammerspace.com>
> 
> Replace the tests for the RPC client being shut down with tests for
> whether the nfs_client is in an error state.
> 
> Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
> ---
>  fs/nfs/nfs4proc.c  | 2 +-
>  fs/nfs/nfs4state.c | 2 +-
>  2 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
> index 889511650ceb..50be54e0f578 100644
> --- a/fs/nfs/nfs4proc.c
> +++ b/fs/nfs/nfs4proc.c
> @@ -9580,7 +9580,7 @@ static void nfs41_sequence_call_done(struct rpc_task *task, void *data)
>  		return;
>  
>  	trace_nfs4_sequence(clp, task->tk_status);
> -	if (task->tk_status < 0 && !task->tk_client->cl_shutdown) {
> +	if (task->tk_status < 0 && clp->cl_cons_state >= 0) {
>  		dprintk("%s ERROR %d\n", __func__, task->tk_status);
>  		if (refcount_read(&clp->cl_count) == 1)
>  			return;
> diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
> index 542cdf71229f..f1f7eaa97973 100644
> --- a/fs/nfs/nfs4state.c
> +++ b/fs/nfs/nfs4state.c
> @@ -1198,7 +1198,7 @@ void nfs4_schedule_state_manager(struct nfs_client *clp)
>  	struct rpc_clnt *clnt = clp->cl_rpcclient;
>  	bool swapon = false;
>  
> -	if (clnt->cl_shutdown)
> +	if (clp->cl_cons_state < 0)
>  		return;
>  
>  	set_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state);

One more thing:

Do we need cl_shutdown at all? If we can replace these checks here with
a check for cl_cons_state < 0, why not do the same in call_start()?
Benjamin Coddington March 26, 2025, 10:46 a.m. UTC | #3
On 26 Mar 2025, at 6:13, Jeff Layton wrote:

> On Tue, 2025-03-25 at 18:35 -0400, trondmy@kernel.org wrote:
>> From: Trond Myklebust <trond.myklebust@hammerspace.com>
>>
>> Replace the tests for the RPC client being shut down with tests for
>> whether the nfs_client is in an error state.
>>
>> Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
>> ---
>>  fs/nfs/nfs4proc.c  | 2 +-
>>  fs/nfs/nfs4state.c | 2 +-
>>  2 files changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
>> index 889511650ceb..50be54e0f578 100644
>> --- a/fs/nfs/nfs4proc.c
>> +++ b/fs/nfs/nfs4proc.c
>> @@ -9580,7 +9580,7 @@ static void nfs41_sequence_call_done(struct rpc_task *task, void *data)
>>  		return;
>>
>>  	trace_nfs4_sequence(clp, task->tk_status);
>> -	if (task->tk_status < 0 && !task->tk_client->cl_shutdown) {
>> +	if (task->tk_status < 0 && clp->cl_cons_state >= 0) {
>>  		dprintk("%s ERROR %d\n", __func__, task->tk_status);
>>  		if (refcount_read(&clp->cl_count) == 1)
>>  			return;
>> diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
>> index 542cdf71229f..f1f7eaa97973 100644
>> --- a/fs/nfs/nfs4state.c
>> +++ b/fs/nfs/nfs4state.c
>> @@ -1198,7 +1198,7 @@ void nfs4_schedule_state_manager(struct nfs_client *clp)
>>  	struct rpc_clnt *clnt = clp->cl_rpcclient;
>>  	bool swapon = false;
>>
>> -	if (clnt->cl_shutdown)
>> +	if (clp->cl_cons_state < 0)
>>  		return;
>>
>>  	set_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state);
>
> One more thing:
>
> Do we need cl_shutdown at all? If we can replace these checks here with
> a check for cl_cons_state < 0, why not do the same in call_start()?
> -- 
> Jeff Layton <jlayton@kernel.org>

Agree - I don't see why not.

Reviewed-by: Benjamin Coddington <bcodding@redhat.com>

Ben
Trond Myklebust March 26, 2025, 6:11 p.m. UTC | #4
On Wed, 2025-03-26 at 06:13 -0400, Jeff Layton wrote:
> On Tue, 2025-03-25 at 18:35 -0400, trondmy@kernel.org wrote:
> > From: Trond Myklebust <trond.myklebust@hammerspace.com>
> > 
> > Replace the tests for the RPC client being shut down with tests for
> > whether the nfs_client is in an error state.
> > 
> > Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
> > ---
> >  fs/nfs/nfs4proc.c  | 2 +-
> >  fs/nfs/nfs4state.c | 2 +-
> >  2 files changed, 2 insertions(+), 2 deletions(-)
> > 
> > diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
> > index 889511650ceb..50be54e0f578 100644
> > --- a/fs/nfs/nfs4proc.c
> > +++ b/fs/nfs/nfs4proc.c
> > @@ -9580,7 +9580,7 @@ static void nfs41_sequence_call_done(struct
> > rpc_task *task, void *data)
> >  		return;
> >  
> >  	trace_nfs4_sequence(clp, task->tk_status);
> > -	if (task->tk_status < 0 && !task->tk_client->cl_shutdown)
> > {
> > +	if (task->tk_status < 0 && clp->cl_cons_state >= 0) {
> >  		dprintk("%s ERROR %d\n", __func__, task-
> > >tk_status);
> >  		if (refcount_read(&clp->cl_count) == 1)
> >  			return;
> > diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
> > index 542cdf71229f..f1f7eaa97973 100644
> > --- a/fs/nfs/nfs4state.c
> > +++ b/fs/nfs/nfs4state.c
> > @@ -1198,7 +1198,7 @@ void nfs4_schedule_state_manager(struct
> > nfs_client *clp)
> >  	struct rpc_clnt *clnt = clp->cl_rpcclient;
> >  	bool swapon = false;
> >  
> > -	if (clnt->cl_shutdown)
> > +	if (clp->cl_cons_state < 0)
> >  		return;
> >  
> >  	set_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state);
> 
> One more thing:
> 
> Do we need cl_shutdown at all? If we can replace these checks here
> with
> a check for cl_cons_state < 0, why not do the same in call_start()?

The struct nfs_client is a NFS level object. It can't be moved to the
RPC layer.
Jeff Layton March 26, 2025, 6:21 p.m. UTC | #5
On Wed, 2025-03-26 at 18:11 +0000, Trond Myklebust wrote:
> On Wed, 2025-03-26 at 06:13 -0400, Jeff Layton wrote:
> > On Tue, 2025-03-25 at 18:35 -0400, trondmy@kernel.org wrote:
> > > From: Trond Myklebust <trond.myklebust@hammerspace.com>
> > > 
> > > Replace the tests for the RPC client being shut down with tests for
> > > whether the nfs_client is in an error state.
> > > 
> > > Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
> > > ---
> > >  fs/nfs/nfs4proc.c  | 2 +-
> > >  fs/nfs/nfs4state.c | 2 +-
> > >  2 files changed, 2 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
> > > index 889511650ceb..50be54e0f578 100644
> > > --- a/fs/nfs/nfs4proc.c
> > > +++ b/fs/nfs/nfs4proc.c
> > > @@ -9580,7 +9580,7 @@ static void nfs41_sequence_call_done(struct
> > > rpc_task *task, void *data)
> > >  		return;
> > >  
> > >  	trace_nfs4_sequence(clp, task->tk_status);
> > > -	if (task->tk_status < 0 && !task->tk_client->cl_shutdown)
> > > {
> > > +	if (task->tk_status < 0 && clp->cl_cons_state >= 0) {
> > >  		dprintk("%s ERROR %d\n", __func__, task-
> > > > tk_status);
> > >  		if (refcount_read(&clp->cl_count) == 1)
> > >  			return;
> > > diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
> > > index 542cdf71229f..f1f7eaa97973 100644
> > > --- a/fs/nfs/nfs4state.c
> > > +++ b/fs/nfs/nfs4state.c
> > > @@ -1198,7 +1198,7 @@ void nfs4_schedule_state_manager(struct
> > > nfs_client *clp)
> > >  	struct rpc_clnt *clnt = clp->cl_rpcclient;
> > >  	bool swapon = false;
> > >  
> > > -	if (clnt->cl_shutdown)
> > > +	if (clp->cl_cons_state < 0)
> > >  		return;
> > >  
> > >  	set_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state);
> > 
> > One more thing:
> > 
> > Do we need cl_shutdown at all? If we can replace these checks here
> > with
> > a check for cl_cons_state < 0, why not do the same in call_start()?
> 
> The struct nfs_client is a NFS level object. It can't be moved to the
> RPC layer.
> 

But...cl_shutdown is an rpc_clnt field.
Trond Myklebust March 26, 2025, 6:24 p.m. UTC | #6
On Wed, 2025-03-26 at 14:21 -0400, Jeff Layton wrote:
> On Wed, 2025-03-26 at 18:11 +0000, Trond Myklebust wrote:
> > On Wed, 2025-03-26 at 06:13 -0400, Jeff Layton wrote:
> > > On Tue, 2025-03-25 at 18:35 -0400, trondmy@kernel.org wrote:
> > > > From: Trond Myklebust <trond.myklebust@hammerspace.com>
> > > > 
> > > > Replace the tests for the RPC client being shut down with tests
> > > > for
> > > > whether the nfs_client is in an error state.
> > > > 
> > > > Signed-off-by: Trond Myklebust
> > > > <trond.myklebust@hammerspace.com>
> > > > ---
> > > >  fs/nfs/nfs4proc.c  | 2 +-
> > > >  fs/nfs/nfs4state.c | 2 +-
> > > >  2 files changed, 2 insertions(+), 2 deletions(-)
> > > > 
> > > > diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
> > > > index 889511650ceb..50be54e0f578 100644
> > > > --- a/fs/nfs/nfs4proc.c
> > > > +++ b/fs/nfs/nfs4proc.c
> > > > @@ -9580,7 +9580,7 @@ static void
> > > > nfs41_sequence_call_done(struct
> > > > rpc_task *task, void *data)
> > > >  		return;
> > > >  
> > > >  	trace_nfs4_sequence(clp, task->tk_status);
> > > > -	if (task->tk_status < 0 && !task->tk_client-
> > > > >cl_shutdown)
> > > > {
> > > > +	if (task->tk_status < 0 && clp->cl_cons_state >= 0) {
> > > >  		dprintk("%s ERROR %d\n", __func__, task-
> > > > > tk_status);
> > > >  		if (refcount_read(&clp->cl_count) == 1)
> > > >  			return;
> > > > diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
> > > > index 542cdf71229f..f1f7eaa97973 100644
> > > > --- a/fs/nfs/nfs4state.c
> > > > +++ b/fs/nfs/nfs4state.c
> > > > @@ -1198,7 +1198,7 @@ void nfs4_schedule_state_manager(struct
> > > > nfs_client *clp)
> > > >  	struct rpc_clnt *clnt = clp->cl_rpcclient;
> > > >  	bool swapon = false;
> > > >  
> > > > -	if (clnt->cl_shutdown)
> > > > +	if (clp->cl_cons_state < 0)
> > > >  		return;
> > > >  
> > > >  	set_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state);
> > > 
> > > One more thing:
> > > 
> > > Do we need cl_shutdown at all? If we can replace these checks
> > > here
> > > with
> > > a check for cl_cons_state < 0, why not do the same in
> > > call_start()?
> > 
> > The struct nfs_client is a NFS level object. It can't be moved to
> > the
> > RPC layer.
> > 
> 
> But...cl_shutdown is an rpc_clnt field.

Right, but cl_cons_state is a field in struct nfs_client, hence that
check cannot be moved into call_start()
Jeff Layton March 27, 2025, 12:35 a.m. UTC | #7
On Wed, 2025-03-26 at 18:24 +0000, Trond Myklebust wrote:
> On Wed, 2025-03-26 at 14:21 -0400, Jeff Layton wrote:
> > On Wed, 2025-03-26 at 18:11 +0000, Trond Myklebust wrote:
> > > On Wed, 2025-03-26 at 06:13 -0400, Jeff Layton wrote:
> > > > On Tue, 2025-03-25 at 18:35 -0400, trondmy@kernel.org wrote:
> > > > > From: Trond Myklebust <trond.myklebust@hammerspace.com>
> > > > > 
> > > > > Replace the tests for the RPC client being shut down with tests
> > > > > for
> > > > > whether the nfs_client is in an error state.
> > > > > 
> > > > > Signed-off-by: Trond Myklebust
> > > > > <trond.myklebust@hammerspace.com>
> > > > > ---
> > > > >  fs/nfs/nfs4proc.c  | 2 +-
> > > > >  fs/nfs/nfs4state.c | 2 +-
> > > > >  2 files changed, 2 insertions(+), 2 deletions(-)
> > > > > 
> > > > > diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
> > > > > index 889511650ceb..50be54e0f578 100644
> > > > > --- a/fs/nfs/nfs4proc.c
> > > > > +++ b/fs/nfs/nfs4proc.c
> > > > > @@ -9580,7 +9580,7 @@ static void
> > > > > nfs41_sequence_call_done(struct
> > > > > rpc_task *task, void *data)
> > > > >  		return;
> > > > >  
> > > > >  	trace_nfs4_sequence(clp, task->tk_status);
> > > > > -	if (task->tk_status < 0 && !task->tk_client-
> > > > > > cl_shutdown)
> > > > > {
> > > > > +	if (task->tk_status < 0 && clp->cl_cons_state >= 0) {
> > > > >  		dprintk("%s ERROR %d\n", __func__, task-
> > > > > > tk_status);
> > > > >  		if (refcount_read(&clp->cl_count) == 1)
> > > > >  			return;
> > > > > diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
> > > > > index 542cdf71229f..f1f7eaa97973 100644
> > > > > --- a/fs/nfs/nfs4state.c
> > > > > +++ b/fs/nfs/nfs4state.c
> > > > > @@ -1198,7 +1198,7 @@ void nfs4_schedule_state_manager(struct
> > > > > nfs_client *clp)
> > > > >  	struct rpc_clnt *clnt = clp->cl_rpcclient;
> > > > >  	bool swapon = false;
> > > > >  
> > > > > -	if (clnt->cl_shutdown)
> > > > > +	if (clp->cl_cons_state < 0)
> > > > >  		return;
> > > > >  
> > > > >  	set_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state);
> > > > 
> > > > One more thing:
> > > > 
> > > > Do we need cl_shutdown at all? If we can replace these checks
> > > > here
> > > > with
> > > > a check for cl_cons_state < 0, why not do the same in
> > > > call_start()?
> > > 
> > > The struct nfs_client is a NFS level object. It can't be moved to
> > > the
> > > RPC layer.
> > > 
> > 
> > But...cl_shutdown is an rpc_clnt field.
> 
> Right, but cl_cons_state is a field in struct nfs_client, hence that
> check cannot be moved into call_start()

Doh! Good point. Nevermind!
diff mbox series

Patch

diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 889511650ceb..50be54e0f578 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -9580,7 +9580,7 @@  static void nfs41_sequence_call_done(struct rpc_task *task, void *data)
 		return;
 
 	trace_nfs4_sequence(clp, task->tk_status);
-	if (task->tk_status < 0 && !task->tk_client->cl_shutdown) {
+	if (task->tk_status < 0 && clp->cl_cons_state >= 0) {
 		dprintk("%s ERROR %d\n", __func__, task->tk_status);
 		if (refcount_read(&clp->cl_count) == 1)
 			return;
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
index 542cdf71229f..f1f7eaa97973 100644
--- a/fs/nfs/nfs4state.c
+++ b/fs/nfs/nfs4state.c
@@ -1198,7 +1198,7 @@  void nfs4_schedule_state_manager(struct nfs_client *clp)
 	struct rpc_clnt *clnt = clp->cl_rpcclient;
 	bool swapon = false;
 
-	if (clnt->cl_shutdown)
+	if (clp->cl_cons_state < 0)
 		return;
 
 	set_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state);