Commit b73a2972 authored by NeilBrown's avatar NeilBrown Committed by Chuck Lever

lockd: move lockd_start_svc() call into lockd_create_svc()

lockd_start_svc() only needs to be called once, just after the svc is
created.  If the start fails, the svc is discarded too.

It thus makes sense to call lockd_start_svc() from lockd_create_svc().
This allows us to remove the test against nlmsvc_rqst at the start of
lockd_start_svc() - it must always be NULL.

lockd_up() only held an extra reference on the svc until a thread was
created - then it dropped it.  The thread - and thus the extra reference
- will remain until kthread_stop() is called.
Now that the thread is created in lockd_create_svc(), the extra
reference can be dropped there.  So the 'serv' variable is no longer
needed in lockd_up().
Signed-off-by: default avatarNeilBrown <neilb@suse.de>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent 5a8a7ff5
...@@ -359,9 +359,6 @@ static int lockd_start_svc(struct svc_serv *serv) ...@@ -359,9 +359,6 @@ static int lockd_start_svc(struct svc_serv *serv)
{ {
int error; int error;
if (nlmsvc_rqst)
return 0;
/* /*
* Create the kernel thread and wait for it to start. * Create the kernel thread and wait for it to start.
*/ */
...@@ -406,6 +403,7 @@ static const struct svc_serv_ops lockd_sv_ops = { ...@@ -406,6 +403,7 @@ static const struct svc_serv_ops lockd_sv_ops = {
static int lockd_create_svc(void) static int lockd_create_svc(void)
{ {
struct svc_serv *serv; struct svc_serv *serv;
int error;
/* /*
* Check whether we're already up and running. * Check whether we're already up and running.
...@@ -432,6 +430,13 @@ static int lockd_create_svc(void) ...@@ -432,6 +430,13 @@ static int lockd_create_svc(void)
printk(KERN_WARNING "lockd_up: create service failed\n"); printk(KERN_WARNING "lockd_up: create service failed\n");
return -ENOMEM; return -ENOMEM;
} }
error = lockd_start_svc(serv);
/* The thread now holds the only reference */
svc_put(serv);
if (error < 0)
return error;
nlmsvc_serv = serv; nlmsvc_serv = serv;
register_inetaddr_notifier(&lockd_inetaddr_notifier); register_inetaddr_notifier(&lockd_inetaddr_notifier);
#if IS_ENABLED(CONFIG_IPV6) #if IS_ENABLED(CONFIG_IPV6)
...@@ -446,7 +451,6 @@ static int lockd_create_svc(void) ...@@ -446,7 +451,6 @@ static int lockd_create_svc(void)
*/ */
int lockd_up(struct net *net, const struct cred *cred) int lockd_up(struct net *net, const struct cred *cred)
{ {
struct svc_serv *serv;
int error; int error;
mutex_lock(&nlmsvc_mutex); mutex_lock(&nlmsvc_mutex);
...@@ -454,25 +458,19 @@ int lockd_up(struct net *net, const struct cred *cred) ...@@ -454,25 +458,19 @@ int lockd_up(struct net *net, const struct cred *cred)
error = lockd_create_svc(); error = lockd_create_svc();
if (error) if (error)
goto err_create; goto err_create;
serv = nlmsvc_serv;
error = lockd_up_net(serv, net, cred); error = lockd_up_net(nlmsvc_serv, net, cred);
if (error < 0) { if (error < 0) {
goto err_put; goto err_put;
} }
error = lockd_start_svc(serv);
if (error < 0) {
lockd_down_net(serv, net);
goto err_put;
}
nlmsvc_users++; nlmsvc_users++;
err_put: err_put:
if (nlmsvc_users == 0) { if (nlmsvc_users == 0) {
lockd_unregister_notifiers(); lockd_unregister_notifiers();
kthread_stop(nlmsvc_task);
nlmsvc_serv = NULL; nlmsvc_serv = NULL;
} }
svc_put(serv);
err_create: err_create:
mutex_unlock(&nlmsvc_mutex); mutex_unlock(&nlmsvc_mutex);
return error; return error;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment