Re: [PATCH] lockd: hold a reference to nlmsvc_serv while stopping thread.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 2023-10-10 at 10:35 +1100, NeilBrown wrote:
> We are required to hold a reference to the svc_serv struct while
> stopping the last thread, as doing that could otherwise drop the last
> reference itself and the svc_serv would be freed while still in use.
> 
> lockd doesn't do this.  After startup, the only reference is held by the
> running thread.
> 
> So change locked to hold a reference on nlmsvc_serv while-ever the
> service is active, and only drop it after the last thread has been
> stopped.
> 
> Note: it doesn't really make sense for threads to hold references to the
> svc_serv any more.  The fact threads are included in serv->sv_nrthreads
> is sufficient.  Maybe a future patch could address this.
> 
> Reported-by: Jeff Layton <jlayton@xxxxxxxxxx>
> Fixes: 68cc388c3238 ("SUNRPC: change how svc threads are asked to exit.")
> Signed-off-by: NeilBrown <neilb@xxxxxxx>
> ---
> 
> Thanks for the report Jeff !!!
> 
>  fs/lockd/svc.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c
> index b441c706c2b8..7a5c90a00522 100644
> --- a/fs/lockd/svc.c
> +++ b/fs/lockd/svc.c
> @@ -345,10 +345,10 @@ static int lockd_get(void)
>  
>  	serv->sv_maxconn = nlm_max_connections;
>  	error = svc_set_num_threads(serv, NULL, 1);
> -	/* The thread now holds the only reference */
> -	svc_put(serv);
> -	if (error < 0)
> +	if (error < 0) {
> +		svc_put(serv);
>  		return error;
> +	}
>  
>  	nlmsvc_serv = serv;
>  	register_inetaddr_notifier(&lockd_inetaddr_notifier);
> @@ -374,6 +374,7 @@ static void lockd_put(void)
>  
>  	svc_set_num_threads(nlmsvc_serv, NULL, 0);
>  	timer_delete_sync(&nlmsvc_retry);
> +	svc_put(nlmsvc_serv);
>  	nlmsvc_serv = NULL;
>  	dprintk("lockd_down: service destroyed\n");
>  }

Thanks Neil! You can add:

Reviewed-by: Jeff Layton <jlayton@xxxxxxxxxx>
Tested-by: Jeff Layton <jlayton@xxxxxxxxxx>




[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux