lockd: simplify management of network status notifiers
[sfrench/cifs-2.6.git] / fs / lockd / svc.c
index 83874878f41d8d3dcf57619bc706ca1da2e923bc..20cebb191350f7396bc687f7f2fd7d10e79a56d5 100644 (file)
@@ -59,9 +59,6 @@ static struct task_struct     *nlmsvc_task;
 static struct svc_rqst         *nlmsvc_rqst;
 unsigned long                  nlmsvc_timeout;
 
-static atomic_t nlm_ntf_refcnt = ATOMIC_INIT(0);
-static DECLARE_WAIT_QUEUE_HEAD(nlm_ntf_wq);
-
 unsigned int lockd_net_id;
 
 /*
@@ -303,8 +300,7 @@ static int lockd_inetaddr_event(struct notifier_block *this,
        struct in_ifaddr *ifa = (struct in_ifaddr *)ptr;
        struct sockaddr_in sin;
 
-       if ((event != NETDEV_DOWN) ||
-           !atomic_inc_not_zero(&nlm_ntf_refcnt))
+       if (event != NETDEV_DOWN)
                goto out;
 
        if (nlmsvc_serv) {
@@ -314,8 +310,6 @@ static int lockd_inetaddr_event(struct notifier_block *this,
                sin.sin_addr.s_addr = ifa->ifa_local;
                svc_age_temp_xprts_now(nlmsvc_serv, (struct sockaddr *)&sin);
        }
-       atomic_dec(&nlm_ntf_refcnt);
-       wake_up(&nlm_ntf_wq);
 
 out:
        return NOTIFY_DONE;
@@ -332,8 +326,7 @@ static int lockd_inet6addr_event(struct notifier_block *this,
        struct inet6_ifaddr *ifa = (struct inet6_ifaddr *)ptr;
        struct sockaddr_in6 sin6;
 
-       if ((event != NETDEV_DOWN) ||
-           !atomic_inc_not_zero(&nlm_ntf_refcnt))
+       if (event != NETDEV_DOWN)
                goto out;
 
        if (nlmsvc_serv) {
@@ -344,8 +337,6 @@ static int lockd_inet6addr_event(struct notifier_block *this,
                        sin6.sin6_scope_id = ifa->idev->dev->ifindex;
                svc_age_temp_xprts_now(nlmsvc_serv, (struct sockaddr *)&sin6);
        }
-       atomic_dec(&nlm_ntf_refcnt);
-       wake_up(&nlm_ntf_wq);
 
 out:
        return NOTIFY_DONE;
@@ -362,14 +353,6 @@ static void lockd_unregister_notifiers(void)
 #if IS_ENABLED(CONFIG_IPV6)
        unregister_inet6addr_notifier(&lockd_inet6addr_notifier);
 #endif
-       wait_event(nlm_ntf_wq, atomic_read(&nlm_ntf_refcnt) == 0);
-}
-
-static void lockd_svc_exit_thread(void)
-{
-       atomic_dec(&nlm_ntf_refcnt);
-       lockd_unregister_notifiers();
-       svc_exit_thread(nlmsvc_rqst);
 }
 
 static int lockd_start_svc(struct svc_serv *serv)
@@ -388,11 +371,9 @@ 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;
        }
 
-       atomic_inc(&nlm_ntf_refcnt);
        svc_sock_update_bufs(serv);
        serv->sv_maxconn = nlm_max_connections;
 
@@ -410,7 +391,7 @@ static int lockd_start_svc(struct svc_serv *serv)
        return 0;
 
 out_task:
-       lockd_svc_exit_thread();
+       svc_exit_thread(nlmsvc_rqst);
        nlmsvc_task = NULL;
 out_rqst:
        nlmsvc_rqst = NULL;
@@ -477,7 +458,6 @@ int lockd_up(struct net *net, const struct cred *cred)
 
        error = lockd_up_net(serv, net, cred);
        if (error < 0) {
-               lockd_unregister_notifiers();
                goto err_put;
        }
 
@@ -488,8 +468,10 @@ int lockd_up(struct net *net, const struct cred *cred)
        }
        nlmsvc_users++;
 err_put:
-       if (nlmsvc_users == 0)
+       if (nlmsvc_users == 0) {
+               lockd_unregister_notifiers();
                nlmsvc_serv = NULL;
+       }
        svc_put(serv);
 err_create:
        mutex_unlock(&nlmsvc_mutex);
@@ -518,13 +500,14 @@ lockd_down(struct net *net)
                printk(KERN_ERR "lockd_down: no lockd running.\n");
                BUG();
        }
+       lockd_unregister_notifiers();
        kthread_stop(nlmsvc_task);
        dprintk("lockd_down: service stopped\n");
-       lockd_svc_exit_thread();
+       svc_exit_thread(nlmsvc_rqst);
+       nlmsvc_rqst = NULL;
        dprintk("lockd_down: service destroyed\n");
        nlmsvc_serv = NULL;
        nlmsvc_task = NULL;
-       nlmsvc_rqst = NULL;
 out:
        mutex_unlock(&nlmsvc_mutex);
 }