lockd: double unregister of inetaddr notifiers
commit dc3033e16c59a2c4e62b31341258a5786cbcee56 upstream. lockd_up() can call lockd_unregister_notifiers twice: inside lockd_start_svc() when it calls lockd_svc_exit_thread() and then in error path of lockd_up() Patch forces lockd_start_svc() to unregister notifiers in all error cases and removes extra unregister in error path of lockd_up(). Fixes: cb7d224f82e4 "lockd: unregister notifier blocks if the service ..." Signed-off-by: Vasily Averin <vvs@virtuozzo.com> Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: J. Bruce Fields <bfields@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
828064b878
commit
3df3127710
@ -365,6 +365,7 @@ static int lockd_start_svc(struct svc_serv *serv)
|
||||
printk(KERN_WARNING
|
||||
"lockd_up: svc_rqst allocation failed, error=%d\n",
|
||||
error);
|
||||
lockd_unregister_notifiers();
|
||||
goto out_rqst;
|
||||
}
|
||||
|
||||
@ -455,13 +456,16 @@ int lockd_up(struct net *net)
|
||||
}
|
||||
|
||||
error = lockd_up_net(serv, net);
|
||||
if (error < 0)
|
||||
goto err_net;
|
||||
if (error < 0) {
|
||||
lockd_unregister_notifiers();
|
||||
goto err_put;
|
||||
}
|
||||
|
||||
error = lockd_start_svc(serv);
|
||||
if (error < 0)
|
||||
goto err_start;
|
||||
|
||||
if (error < 0) {
|
||||
lockd_down_net(serv, net);
|
||||
goto err_put;
|
||||
}
|
||||
nlmsvc_users++;
|
||||
/*
|
||||
* Note: svc_serv structures have an initial use count of 1,
|
||||
@ -472,12 +476,6 @@ err_put:
|
||||
err_create:
|
||||
mutex_unlock(&nlmsvc_mutex);
|
||||
return error;
|
||||
|
||||
err_start:
|
||||
lockd_down_net(serv, net);
|
||||
err_net:
|
||||
lockd_unregister_notifiers();
|
||||
goto err_put;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(lockd_up);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user