mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-28 21:33:52 +00:00
Lockd: shutdown NLM hosts in network namespace context
Lockd now managed in network namespace context. And this patch introduces network namespace related NLM hosts shutdown in case of releasing per-net Lockd resources. Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
0e1cb5c0aa
commit
3b64739fb9
3 changed files with 23 additions and 8 deletions
|
@ -565,12 +565,8 @@ void nlm_host_rebooted(const struct nlm_reboot *info)
|
||||||
nsm_release(nsm);
|
nsm_release(nsm);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Shut down the hosts module.
|
|
||||||
* Note that this routine is called only at server shutdown time.
|
|
||||||
*/
|
|
||||||
void
|
void
|
||||||
nlm_shutdown_hosts(void)
|
nlm_shutdown_hosts_net(struct net *net)
|
||||||
{
|
{
|
||||||
struct hlist_head *chain;
|
struct hlist_head *chain;
|
||||||
struct hlist_node *pos;
|
struct hlist_node *pos;
|
||||||
|
@ -582,6 +578,8 @@ nlm_shutdown_hosts(void)
|
||||||
/* First, make all hosts eligible for gc */
|
/* First, make all hosts eligible for gc */
|
||||||
dprintk("lockd: nuking all hosts...\n");
|
dprintk("lockd: nuking all hosts...\n");
|
||||||
for_each_host(host, pos, chain, nlm_server_hosts) {
|
for_each_host(host, pos, chain, nlm_server_hosts) {
|
||||||
|
if (net && host->net != net)
|
||||||
|
continue;
|
||||||
host->h_expires = jiffies - 1;
|
host->h_expires = jiffies - 1;
|
||||||
if (host->h_rpcclnt) {
|
if (host->h_rpcclnt) {
|
||||||
rpc_shutdown_client(host->h_rpcclnt);
|
rpc_shutdown_client(host->h_rpcclnt);
|
||||||
|
@ -592,15 +590,29 @@ nlm_shutdown_hosts(void)
|
||||||
/* Then, perform a garbage collection pass */
|
/* Then, perform a garbage collection pass */
|
||||||
nlm_gc_hosts();
|
nlm_gc_hosts();
|
||||||
mutex_unlock(&nlm_host_mutex);
|
mutex_unlock(&nlm_host_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Shut down the hosts module.
|
||||||
|
* Note that this routine is called only at server shutdown time.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
nlm_shutdown_hosts(void)
|
||||||
|
{
|
||||||
|
struct hlist_head *chain;
|
||||||
|
struct hlist_node *pos;
|
||||||
|
struct nlm_host *host;
|
||||||
|
|
||||||
|
nlm_shutdown_hosts_net(NULL);
|
||||||
|
|
||||||
/* complain if any hosts are left */
|
/* complain if any hosts are left */
|
||||||
if (nrhosts != 0) {
|
if (nrhosts != 0) {
|
||||||
printk(KERN_WARNING "lockd: couldn't shutdown host module!\n");
|
printk(KERN_WARNING "lockd: couldn't shutdown host module!\n");
|
||||||
dprintk("lockd: %lu hosts left:\n", nrhosts);
|
dprintk("lockd: %lu hosts left:\n", nrhosts);
|
||||||
for_each_host(host, pos, chain, nlm_server_hosts) {
|
for_each_host(host, pos, chain, nlm_server_hosts) {
|
||||||
dprintk(" %s (cnt %d use %d exp %ld)\n",
|
dprintk(" %s (cnt %d use %d exp %ld net %p)\n",
|
||||||
host->h_name, atomic_read(&host->h_count),
|
host->h_name, atomic_read(&host->h_count),
|
||||||
host->h_inuse, host->h_expires);
|
host->h_inuse, host->h_expires, host->net);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -281,8 +281,10 @@ static void lockd_down_net(struct net *net)
|
||||||
struct svc_serv *serv = nlmsvc_rqst->rq_server;
|
struct svc_serv *serv = nlmsvc_rqst->rq_server;
|
||||||
|
|
||||||
if (ln->nlmsvc_users) {
|
if (ln->nlmsvc_users) {
|
||||||
if (--ln->nlmsvc_users == 0)
|
if (--ln->nlmsvc_users == 0) {
|
||||||
|
nlm_shutdown_hosts_net(net);
|
||||||
svc_shutdown_net(serv, net);
|
svc_shutdown_net(serv, net);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
printk(KERN_ERR "lockd_down_net: no users! task=%p, net=%p\n",
|
printk(KERN_ERR "lockd_down_net: no users! task=%p, net=%p\n",
|
||||||
nlmsvc_task, net);
|
nlmsvc_task, net);
|
||||||
|
|
|
@ -234,6 +234,7 @@ struct rpc_clnt * nlm_bind_host(struct nlm_host *);
|
||||||
void nlm_rebind_host(struct nlm_host *);
|
void nlm_rebind_host(struct nlm_host *);
|
||||||
struct nlm_host * nlm_get_host(struct nlm_host *);
|
struct nlm_host * nlm_get_host(struct nlm_host *);
|
||||||
void nlm_shutdown_hosts(void);
|
void nlm_shutdown_hosts(void);
|
||||||
|
void nlm_shutdown_hosts_net(struct net *net);
|
||||||
void nlm_host_rebooted(const struct nlm_reboot *);
|
void nlm_host_rebooted(const struct nlm_reboot *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue