]> git.baikalelectronics.ru Git - kernel.git/commitdiff
lockd: move lockd_start_svc() call into lockd_create_svc()
authorNeilBrown <neilb@suse.de>
Mon, 29 Nov 2021 04:51:25 +0000 (15:51 +1100)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 13 Dec 2021 18:42:55 +0000 (13:42 -0500)
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: NeilBrown <neilb@suse.de>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/lockd/svc.c

index 20cebb191350f7396bc687f7f2fd7d10e79a56d5..91e7c839841ec5b8e73b9f2971b47770403264c9 100644 (file)
@@ -359,9 +359,6 @@ static int lockd_start_svc(struct svc_serv *serv)
 {
        int error;
 
-       if (nlmsvc_rqst)
-               return 0;
-
        /*
         * Create the kernel thread and wait for it to start.
         */
@@ -406,6 +403,7 @@ static const struct svc_serv_ops lockd_sv_ops = {
 static int lockd_create_svc(void)
 {
        struct svc_serv *serv;
+       int error;
 
        /*
         * Check whether we're already up and running.
@@ -432,6 +430,13 @@ static int lockd_create_svc(void)
                printk(KERN_WARNING "lockd_up: create service failed\n");
                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;
        register_inetaddr_notifier(&lockd_inetaddr_notifier);
 #if IS_ENABLED(CONFIG_IPV6)
@@ -446,7 +451,6 @@ static int lockd_create_svc(void)
  */
 int lockd_up(struct net *net, const struct cred *cred)
 {
-       struct svc_serv *serv;
        int error;
 
        mutex_lock(&nlmsvc_mutex);
@@ -454,25 +458,19 @@ int lockd_up(struct net *net, const struct cred *cred)
        error = lockd_create_svc();
        if (error)
                goto err_create;
-       serv = nlmsvc_serv;
 
-       error = lockd_up_net(serv, net, cred);
+       error = lockd_up_net(nlmsvc_serv, net, cred);
        if (error < 0) {
                goto err_put;
        }
 
-       error = lockd_start_svc(serv);
-       if (error < 0) {
-               lockd_down_net(serv, net);
-               goto err_put;
-       }
        nlmsvc_users++;
 err_put:
        if (nlmsvc_users == 0) {
                lockd_unregister_notifiers();
+               kthread_stop(nlmsvc_task);
                nlmsvc_serv = NULL;
        }
-       svc_put(serv);
 err_create:
        mutex_unlock(&nlmsvc_mutex);
        return error;