aboutsummaryrefslogtreecommitdiffstats
path: root/fs/lockd
diff options
context:
space:
mode:
authorStanislav Kinsbursky <skinsbursky@parallels.com>2012-01-31 06:08:05 -0500
committerTrond Myklebust <Trond.Myklebust@netapp.com>2012-02-15 00:19:47 -0500
commitbb2224df5ffe4f864f5b696199b17db1ce77bc0a (patch)
tree1aa476668966b94ea5f5e399ea15f3aede936f47 /fs/lockd
parenta9c5d73a8d8cb37601f8c39b35b9b4128e1a5254 (diff)
Lockd: per-net up and down routines introduced
This patch introduces per-net Lockd initialization and destruction routines. The logic is the same as in global Lockd up and down routines. Probably the solution is not the best one. But at least it looks clear. So per-net "up" routine are called only in case of lockd is running already. If per-net resources are not allocated yet, then service is being registered with local portmapper and lockd sockets created. Per-net "down" routine is called on every lockd_down() call in case of global users counter is not zero. Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/lockd')
-rw-r--r--fs/lockd/svc.c47
1 files changed, 45 insertions, 2 deletions
diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c
index 73c9ebf0930..90dec426bfd 100644
--- a/fs/lockd/svc.c
+++ b/fs/lockd/svc.c
@@ -251,6 +251,45 @@ out_err:
251 return err; 251 return err;
252} 252}
253 253
254static int lockd_up_net(struct net *net)
255{
256 struct lockd_net *ln = net_generic(net, lockd_net_id);
257 struct svc_serv *serv = nlmsvc_rqst->rq_server;
258 int error;
259
260 if (ln->nlmsvc_users)
261 return 0;
262
263 error = svc_rpcb_setup(serv, net);
264 if (error)
265 goto err_rpcb;
266
267 error = make_socks(serv, net);
268 if (error < 0)
269 goto err_socks;
270 return 0;
271
272err_socks:
273 svc_rpcb_cleanup(serv, net);
274err_rpcb:
275 return error;
276}
277
278static void lockd_down_net(struct net *net)
279{
280 struct lockd_net *ln = net_generic(net, lockd_net_id);
281 struct svc_serv *serv = nlmsvc_rqst->rq_server;
282
283 if (ln->nlmsvc_users) {
284 if (--ln->nlmsvc_users == 0)
285 svc_shutdown_net(serv, net);
286 } else {
287 printk(KERN_ERR "lockd_down_net: no users! task=%p, net=%p\n",
288 nlmsvc_task, net);
289 BUG();
290 }
291}
292
254/* 293/*
255 * Bring up the lockd process if it's not already up. 294 * Bring up the lockd process if it's not already up.
256 */ 295 */
@@ -264,8 +303,10 @@ int lockd_up(void)
264 /* 303 /*
265 * Check whether we're already up and running. 304 * Check whether we're already up and running.
266 */ 305 */
267 if (nlmsvc_rqst) 306 if (nlmsvc_rqst) {
307 error = lockd_up_net(net);
268 goto out; 308 goto out;
309 }
269 310
270 /* 311 /*
271 * Sanity check: if there's no pid, 312 * Sanity check: if there's no pid,
@@ -339,8 +380,10 @@ lockd_down(void)
339{ 380{
340 mutex_lock(&nlmsvc_mutex); 381 mutex_lock(&nlmsvc_mutex);
341 if (nlmsvc_users) { 382 if (nlmsvc_users) {
342 if (--nlmsvc_users) 383 if (--nlmsvc_users) {
384 lockd_down_net(current->nsproxy->net_ns);
343 goto out; 385 goto out;
386 }
344 } else { 387 } else {
345 printk(KERN_ERR "lockd_down: no users! task=%p\n", 388 printk(KERN_ERR "lockd_down: no users! task=%p\n",
346 nlmsvc_task); 389 nlmsvc_task);