diff options
Diffstat (limited to 'fs/nfsd/nfssvc.c')
-rw-r--r-- | fs/nfsd/nfssvc.c | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index 28dfad39f0c5..ee709fc8f58b 100644 --- a/fs/nfsd/nfssvc.c +++ b/fs/nfsd/nfssvc.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/module.h> | 11 | #include <linux/module.h> |
12 | #include <linux/fs_struct.h> | 12 | #include <linux/fs_struct.h> |
13 | #include <linux/swap.h> | 13 | #include <linux/swap.h> |
14 | #include <linux/nsproxy.h> | ||
14 | 15 | ||
15 | #include <linux/sunrpc/stats.h> | 16 | #include <linux/sunrpc/stats.h> |
16 | #include <linux/sunrpc/svcsock.h> | 17 | #include <linux/sunrpc/svcsock.h> |
@@ -220,7 +221,7 @@ static int nfsd_startup(unsigned short port, int nrservs) | |||
220 | ret = nfsd_init_socks(port); | 221 | ret = nfsd_init_socks(port); |
221 | if (ret) | 222 | if (ret) |
222 | goto out_racache; | 223 | goto out_racache; |
223 | ret = lockd_up(); | 224 | ret = lockd_up(&init_net); |
224 | if (ret) | 225 | if (ret) |
225 | goto out_racache; | 226 | goto out_racache; |
226 | ret = nfs4_state_start(); | 227 | ret = nfs4_state_start(); |
@@ -229,7 +230,7 @@ static int nfsd_startup(unsigned short port, int nrservs) | |||
229 | nfsd_up = true; | 230 | nfsd_up = true; |
230 | return 0; | 231 | return 0; |
231 | out_lockd: | 232 | out_lockd: |
232 | lockd_down(); | 233 | lockd_down(&init_net); |
233 | out_racache: | 234 | out_racache: |
234 | nfsd_racache_shutdown(); | 235 | nfsd_racache_shutdown(); |
235 | return ret; | 236 | return ret; |
@@ -246,7 +247,7 @@ static void nfsd_shutdown(void) | |||
246 | if (!nfsd_up) | 247 | if (!nfsd_up) |
247 | return; | 248 | return; |
248 | nfs4_state_shutdown(); | 249 | nfs4_state_shutdown(); |
249 | lockd_down(); | 250 | lockd_down(&init_net); |
250 | nfsd_racache_shutdown(); | 251 | nfsd_racache_shutdown(); |
251 | nfsd_up = false; | 252 | nfsd_up = false; |
252 | } | 253 | } |
@@ -261,7 +262,7 @@ static void nfsd_last_thread(struct svc_serv *serv, struct net *net) | |||
261 | 262 | ||
262 | printk(KERN_WARNING "nfsd: last server has exited, flushing export " | 263 | printk(KERN_WARNING "nfsd: last server has exited, flushing export " |
263 | "cache\n"); | 264 | "cache\n"); |
264 | nfsd_export_flush(); | 265 | nfsd_export_flush(net); |
265 | } | 266 | } |
266 | 267 | ||
267 | void nfsd_reset_versions(void) | 268 | void nfsd_reset_versions(void) |
@@ -330,6 +331,8 @@ static int nfsd_get_default_max_blksize(void) | |||
330 | 331 | ||
331 | int nfsd_create_serv(void) | 332 | int nfsd_create_serv(void) |
332 | { | 333 | { |
334 | int error; | ||
335 | |||
333 | WARN_ON(!mutex_is_locked(&nfsd_mutex)); | 336 | WARN_ON(!mutex_is_locked(&nfsd_mutex)); |
334 | if (nfsd_serv) { | 337 | if (nfsd_serv) { |
335 | svc_get(nfsd_serv); | 338 | svc_get(nfsd_serv); |
@@ -343,6 +346,12 @@ int nfsd_create_serv(void) | |||
343 | if (nfsd_serv == NULL) | 346 | if (nfsd_serv == NULL) |
344 | return -ENOMEM; | 347 | return -ENOMEM; |
345 | 348 | ||
349 | error = svc_bind(nfsd_serv, current->nsproxy->net_ns); | ||
350 | if (error < 0) { | ||
351 | svc_destroy(nfsd_serv); | ||
352 | return error; | ||
353 | } | ||
354 | |||
346 | set_max_drc(); | 355 | set_max_drc(); |
347 | do_gettimeofday(&nfssvc_boot); /* record boot time */ | 356 | do_gettimeofday(&nfssvc_boot); /* record boot time */ |
348 | return 0; | 357 | return 0; |
@@ -373,6 +382,7 @@ int nfsd_set_nrthreads(int n, int *nthreads) | |||
373 | int i = 0; | 382 | int i = 0; |
374 | int tot = 0; | 383 | int tot = 0; |
375 | int err = 0; | 384 | int err = 0; |
385 | struct net *net = &init_net; | ||
376 | 386 | ||
377 | WARN_ON(!mutex_is_locked(&nfsd_mutex)); | 387 | WARN_ON(!mutex_is_locked(&nfsd_mutex)); |
378 | 388 | ||
@@ -417,6 +427,9 @@ int nfsd_set_nrthreads(int n, int *nthreads) | |||
417 | if (err) | 427 | if (err) |
418 | break; | 428 | break; |
419 | } | 429 | } |
430 | |||
431 | if (nfsd_serv->sv_nrthreads == 1) | ||
432 | svc_shutdown_net(nfsd_serv, net); | ||
420 | svc_destroy(nfsd_serv); | 433 | svc_destroy(nfsd_serv); |
421 | 434 | ||
422 | return err; | 435 | return err; |
@@ -432,6 +445,7 @@ nfsd_svc(unsigned short port, int nrservs) | |||
432 | { | 445 | { |
433 | int error; | 446 | int error; |
434 | bool nfsd_up_before; | 447 | bool nfsd_up_before; |
448 | struct net *net = &init_net; | ||
435 | 449 | ||
436 | mutex_lock(&nfsd_mutex); | 450 | mutex_lock(&nfsd_mutex); |
437 | dprintk("nfsd: creating service\n"); | 451 | dprintk("nfsd: creating service\n"); |
@@ -464,6 +478,8 @@ out_shutdown: | |||
464 | if (error < 0 && !nfsd_up_before) | 478 | if (error < 0 && !nfsd_up_before) |
465 | nfsd_shutdown(); | 479 | nfsd_shutdown(); |
466 | out_destroy: | 480 | out_destroy: |
481 | if (nfsd_serv->sv_nrthreads == 1) | ||
482 | svc_shutdown_net(nfsd_serv, net); | ||
467 | svc_destroy(nfsd_serv); /* Release server */ | 483 | svc_destroy(nfsd_serv); /* Release server */ |
468 | out: | 484 | out: |
469 | mutex_unlock(&nfsd_mutex); | 485 | mutex_unlock(&nfsd_mutex); |
@@ -547,6 +563,9 @@ nfsd(void *vrqstp) | |||
547 | nfsdstats.th_cnt --; | 563 | nfsdstats.th_cnt --; |
548 | 564 | ||
549 | out: | 565 | out: |
566 | if (rqstp->rq_server->sv_nrthreads == 1) | ||
567 | svc_shutdown_net(rqstp->rq_server, &init_net); | ||
568 | |||
550 | /* Release the thread */ | 569 | /* Release the thread */ |
551 | svc_exit_thread(rqstp); | 570 | svc_exit_thread(rqstp); |
552 | 571 | ||
@@ -659,8 +678,12 @@ int nfsd_pool_stats_open(struct inode *inode, struct file *file) | |||
659 | int nfsd_pool_stats_release(struct inode *inode, struct file *file) | 678 | int nfsd_pool_stats_release(struct inode *inode, struct file *file) |
660 | { | 679 | { |
661 | int ret = seq_release(inode, file); | 680 | int ret = seq_release(inode, file); |
681 | struct net *net = &init_net; | ||
682 | |||
662 | mutex_lock(&nfsd_mutex); | 683 | mutex_lock(&nfsd_mutex); |
663 | /* this function really, really should have been called svc_put() */ | 684 | /* this function really, really should have been called svc_put() */ |
685 | if (nfsd_serv->sv_nrthreads == 1) | ||
686 | svc_shutdown_net(nfsd_serv, net); | ||
664 | svc_destroy(nfsd_serv); | 687 | svc_destroy(nfsd_serv); |
665 | mutex_unlock(&nfsd_mutex); | 688 | mutex_unlock(&nfsd_mutex); |
666 | return ret; | 689 | return ret; |