Re: [PATCH] lockd: unregister notifier blocks if the service fails to come up completely

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

 



On Thu, 30 Jun 2016, J. Bruce Fields wrote:

> On Thu, Jun 30, 2016 at 10:39:32AM -0400, Scott Mayhew wrote:
> > If the lockd service fails to start up then we need to be sure that the
> > notifier blocks are not registered, otherwise a subsequent start of the
> > service could cause the same notifier to be registered twice, leading to
> > soft lockups.
> 
> Good catch, thanks!
> 
> I think the following (untested) should do the same job slightly more
> concisely?

Yes, that works too.  Thanks.

-Scott
> 
> --b.
> 
> commit d2f017465698
> Author: Scott Mayhew <smayhew@xxxxxxxxxx>
> Date:   Thu Jun 30 10:39:32 2016 -0400
> 
>     lockd: unregister notifier blocks if the service fails to come up completely
>     
>     If the lockd service fails to start up then we need to be sure that the
>     notifier blocks are not registered, otherwise a subsequent start of the
>     service could cause the same notifier to be registered twice, leading to
>     soft lockups.
>     
>     Signed-off-by: Scott Mayhew <smayhew@xxxxxxxxxx>
>     Cc: stable@xxxxxxxxxxxxxxx
>     Fixes: 0751ddf77b6a "lockd: Register callbacks on the inetaddr_chain..."
>     Signed-off-by: J. Bruce Fields <bfields@xxxxxxxxxx>
> 
> diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c
> index 154a107cd376..fc4084ef4736 100644
> --- a/fs/lockd/svc.c
> +++ b/fs/lockd/svc.c
> @@ -335,12 +335,17 @@ static struct notifier_block lockd_inet6addr_notifier = {
>  };
>  #endif
>  
> -static void lockd_svc_exit_thread(void)
> +static void lockd_unregister_notifiers(void)
>  {
>  	unregister_inetaddr_notifier(&lockd_inetaddr_notifier);
>  #if IS_ENABLED(CONFIG_IPV6)
>  	unregister_inet6addr_notifier(&lockd_inet6addr_notifier);
>  #endif
> +}
> +
> +static void lockd_svc_exit_thread(void)
> +{
> +	lockd_unregister_notifiers();
>  	svc_exit_thread(nlmsvc_rqst);
>  }
>  
> @@ -462,7 +467,7 @@ int lockd_up(struct net *net)
>  	 * Note: svc_serv structures have an initial use count of 1,
>  	 * so we exit through here on both success and failure.
>  	 */
> -err_net:
> +err_put:
>  	svc_destroy(serv);
>  err_create:
>  	mutex_unlock(&nlmsvc_mutex);
> @@ -470,7 +475,9 @@ err_create:
>  
>  err_start:
>  	lockd_down_net(serv, net);
> -	goto err_net;
> +err_net:
> +	lockd_unregister_notifiers();
> +	goto err_put;
>  }
>  EXPORT_SYMBOL_GPL(lockd_up);
>  

--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[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