Commit 2840fe86 authored by NeilBrown's avatar NeilBrown Committed by Chuck Lever

lockd: introduce nlmsvc_serv

lockd has two globals - nlmsvc_task and nlmsvc_rqst - but mostly it
wants the 'struct svc_serv', and when it doesn't want it exactly it can
get to what it wants from the serv.

This patch is a first step to removing nlmsvc_task and nlmsvc_rqst.  It
introduces nlmsvc_serv to store the 'struct svc_serv*'.  This is set as
soon as the serv is created, and cleared only when it is destroyed.
Signed-off-by: default avatarNeilBrown <neilb@suse.de>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent d057cfec
...@@ -54,6 +54,7 @@ EXPORT_SYMBOL_GPL(nlmsvc_ops); ...@@ -54,6 +54,7 @@ EXPORT_SYMBOL_GPL(nlmsvc_ops);
static DEFINE_MUTEX(nlmsvc_mutex); static DEFINE_MUTEX(nlmsvc_mutex);
static unsigned int nlmsvc_users; static unsigned int nlmsvc_users;
static struct svc_serv *nlmsvc_serv;
static struct task_struct *nlmsvc_task; static struct task_struct *nlmsvc_task;
static struct svc_rqst *nlmsvc_rqst; static struct svc_rqst *nlmsvc_rqst;
unsigned long nlmsvc_timeout; unsigned long nlmsvc_timeout;
...@@ -306,13 +307,12 @@ static int lockd_inetaddr_event(struct notifier_block *this, ...@@ -306,13 +307,12 @@ static int lockd_inetaddr_event(struct notifier_block *this,
!atomic_inc_not_zero(&nlm_ntf_refcnt)) !atomic_inc_not_zero(&nlm_ntf_refcnt))
goto out; goto out;
if (nlmsvc_rqst) { if (nlmsvc_serv) {
dprintk("lockd_inetaddr_event: removed %pI4\n", dprintk("lockd_inetaddr_event: removed %pI4\n",
&ifa->ifa_local); &ifa->ifa_local);
sin.sin_family = AF_INET; sin.sin_family = AF_INET;
sin.sin_addr.s_addr = ifa->ifa_local; sin.sin_addr.s_addr = ifa->ifa_local;
svc_age_temp_xprts_now(nlmsvc_rqst->rq_server, svc_age_temp_xprts_now(nlmsvc_serv, (struct sockaddr *)&sin);
(struct sockaddr *)&sin);
} }
atomic_dec(&nlm_ntf_refcnt); atomic_dec(&nlm_ntf_refcnt);
wake_up(&nlm_ntf_wq); wake_up(&nlm_ntf_wq);
...@@ -336,14 +336,13 @@ static int lockd_inet6addr_event(struct notifier_block *this, ...@@ -336,14 +336,13 @@ static int lockd_inet6addr_event(struct notifier_block *this,
!atomic_inc_not_zero(&nlm_ntf_refcnt)) !atomic_inc_not_zero(&nlm_ntf_refcnt))
goto out; goto out;
if (nlmsvc_rqst) { if (nlmsvc_serv) {
dprintk("lockd_inet6addr_event: removed %pI6\n", &ifa->addr); dprintk("lockd_inet6addr_event: removed %pI6\n", &ifa->addr);
sin6.sin6_family = AF_INET6; sin6.sin6_family = AF_INET6;
sin6.sin6_addr = ifa->addr; sin6.sin6_addr = ifa->addr;
if (ipv6_addr_type(&sin6.sin6_addr) & IPV6_ADDR_LINKLOCAL) if (ipv6_addr_type(&sin6.sin6_addr) & IPV6_ADDR_LINKLOCAL)
sin6.sin6_scope_id = ifa->idev->dev->ifindex; sin6.sin6_scope_id = ifa->idev->dev->ifindex;
svc_age_temp_xprts_now(nlmsvc_rqst->rq_server, svc_age_temp_xprts_now(nlmsvc_serv, (struct sockaddr *)&sin6);
(struct sockaddr *)&sin6);
} }
atomic_dec(&nlm_ntf_refcnt); atomic_dec(&nlm_ntf_refcnt);
wake_up(&nlm_ntf_wq); wake_up(&nlm_ntf_wq);
...@@ -423,15 +422,17 @@ static const struct svc_serv_ops lockd_sv_ops = { ...@@ -423,15 +422,17 @@ static const struct svc_serv_ops lockd_sv_ops = {
.svo_enqueue_xprt = svc_xprt_do_enqueue, .svo_enqueue_xprt = svc_xprt_do_enqueue,
}; };
static struct svc_serv *lockd_create_svc(void) static int lockd_create_svc(void)
{ {
struct svc_serv *serv; struct svc_serv *serv;
/* /*
* Check whether we're already up and running. * Check whether we're already up and running.
*/ */
if (nlmsvc_rqst) if (nlmsvc_serv) {
return svc_get(nlmsvc_rqst->rq_server); svc_get(nlmsvc_serv);
return 0;
}
/* /*
* Sanity check: if there's no pid, * Sanity check: if there's no pid,
...@@ -448,14 +449,15 @@ static struct svc_serv *lockd_create_svc(void) ...@@ -448,14 +449,15 @@ static struct svc_serv *lockd_create_svc(void)
serv = svc_create(&nlmsvc_program, LOCKD_BUFSIZE, &lockd_sv_ops); serv = svc_create(&nlmsvc_program, LOCKD_BUFSIZE, &lockd_sv_ops);
if (!serv) { if (!serv) {
printk(KERN_WARNING "lockd_up: create service failed\n"); printk(KERN_WARNING "lockd_up: create service failed\n");
return ERR_PTR(-ENOMEM); return -ENOMEM;
} }
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)
register_inet6addr_notifier(&lockd_inet6addr_notifier); register_inet6addr_notifier(&lockd_inet6addr_notifier);
#endif #endif
dprintk("lockd_up: service created\n"); dprintk("lockd_up: service created\n");
return serv; return 0;
} }
/* /*
...@@ -468,11 +470,10 @@ int lockd_up(struct net *net, const struct cred *cred) ...@@ -468,11 +470,10 @@ int lockd_up(struct net *net, const struct cred *cred)
mutex_lock(&nlmsvc_mutex); mutex_lock(&nlmsvc_mutex);
serv = lockd_create_svc(); error = lockd_create_svc();
if (IS_ERR(serv)) { if (error)
error = PTR_ERR(serv);
goto err_create; goto err_create;
} serv = nlmsvc_serv;
error = lockd_up_net(serv, net, cred); error = lockd_up_net(serv, net, cred);
if (error < 0) { if (error < 0) {
...@@ -487,6 +488,8 @@ int lockd_up(struct net *net, const struct cred *cred) ...@@ -487,6 +488,8 @@ int lockd_up(struct net *net, const struct cred *cred)
} }
nlmsvc_users++; nlmsvc_users++;
err_put: err_put:
if (nlmsvc_users == 0)
nlmsvc_serv = NULL;
svc_put(serv); svc_put(serv);
err_create: err_create:
mutex_unlock(&nlmsvc_mutex); mutex_unlock(&nlmsvc_mutex);
...@@ -501,7 +504,7 @@ void ...@@ -501,7 +504,7 @@ void
lockd_down(struct net *net) lockd_down(struct net *net)
{ {
mutex_lock(&nlmsvc_mutex); mutex_lock(&nlmsvc_mutex);
lockd_down_net(nlmsvc_rqst->rq_server, net); lockd_down_net(nlmsvc_serv, net);
if (nlmsvc_users) { if (nlmsvc_users) {
if (--nlmsvc_users) if (--nlmsvc_users)
goto out; goto out;
...@@ -519,6 +522,7 @@ lockd_down(struct net *net) ...@@ -519,6 +522,7 @@ lockd_down(struct net *net)
dprintk("lockd_down: service stopped\n"); dprintk("lockd_down: service stopped\n");
lockd_svc_exit_thread(); lockd_svc_exit_thread();
dprintk("lockd_down: service destroyed\n"); dprintk("lockd_down: service destroyed\n");
nlmsvc_serv = NULL;
nlmsvc_task = NULL; nlmsvc_task = NULL;
nlmsvc_rqst = NULL; nlmsvc_rqst = NULL;
out: out:
......
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