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 28dfad39f0c..ee709fc8f58 100644 --- a/fs/nfsd/nfssvc.c +++ b/fs/nfsd/nfssvc.c @@ -11,6 +11,7 @@  #include <linux/module.h>  #include <linux/fs_struct.h>  #include <linux/swap.h> +#include <linux/nsproxy.h>  #include <linux/sunrpc/stats.h>  #include <linux/sunrpc/svcsock.h> @@ -220,7 +221,7 @@ static int nfsd_startup(unsigned short port, int nrservs)  	ret = nfsd_init_socks(port);  	if (ret)  		goto out_racache; -	ret = lockd_up(); +	ret = lockd_up(&init_net);  	if (ret)  		goto out_racache;  	ret = nfs4_state_start(); @@ -229,7 +230,7 @@ static int nfsd_startup(unsigned short port, int nrservs)  	nfsd_up = true;  	return 0;  out_lockd: -	lockd_down(); +	lockd_down(&init_net);  out_racache:  	nfsd_racache_shutdown();  	return ret; @@ -246,7 +247,7 @@ static void nfsd_shutdown(void)  	if (!nfsd_up)  		return;  	nfs4_state_shutdown(); -	lockd_down(); +	lockd_down(&init_net);  	nfsd_racache_shutdown();  	nfsd_up = false;  } @@ -261,7 +262,7 @@ static void nfsd_last_thread(struct svc_serv *serv, struct net *net)  	printk(KERN_WARNING "nfsd: last server has exited, flushing export "  			    "cache\n"); -	nfsd_export_flush(); +	nfsd_export_flush(net);  }  void nfsd_reset_versions(void) @@ -330,6 +331,8 @@ static int nfsd_get_default_max_blksize(void)  int nfsd_create_serv(void)  { +	int error; +  	WARN_ON(!mutex_is_locked(&nfsd_mutex));  	if (nfsd_serv) {  		svc_get(nfsd_serv); @@ -343,6 +346,12 @@ int nfsd_create_serv(void)  	if (nfsd_serv == NULL)  		return -ENOMEM; +	error = svc_bind(nfsd_serv, current->nsproxy->net_ns); +	if (error < 0) { +		svc_destroy(nfsd_serv); +		return error; +	} +  	set_max_drc();  	do_gettimeofday(&nfssvc_boot);		/* record boot time */  	return 0; @@ -373,6 +382,7 @@ int nfsd_set_nrthreads(int n, int *nthreads)  	int i = 0;  	int tot = 0;  	int err = 0; +	struct net *net = &init_net;  	WARN_ON(!mutex_is_locked(&nfsd_mutex)); @@ -417,6 +427,9 @@ int nfsd_set_nrthreads(int n, int *nthreads)  		if (err)  			break;  	} + +	if (nfsd_serv->sv_nrthreads == 1) +		svc_shutdown_net(nfsd_serv, net);  	svc_destroy(nfsd_serv);  	return err; @@ -432,6 +445,7 @@ nfsd_svc(unsigned short port, int nrservs)  {  	int	error;  	bool	nfsd_up_before; +	struct net *net = &init_net;  	mutex_lock(&nfsd_mutex);  	dprintk("nfsd: creating service\n"); @@ -464,6 +478,8 @@ out_shutdown:  	if (error < 0 && !nfsd_up_before)  		nfsd_shutdown();  out_destroy: +	if (nfsd_serv->sv_nrthreads == 1) +		svc_shutdown_net(nfsd_serv, net);  	svc_destroy(nfsd_serv);		/* Release server */  out:  	mutex_unlock(&nfsd_mutex); @@ -547,6 +563,9 @@ nfsd(void *vrqstp)  	nfsdstats.th_cnt --;  out: +	if (rqstp->rq_server->sv_nrthreads == 1) +		svc_shutdown_net(rqstp->rq_server, &init_net); +  	/* Release the thread */  	svc_exit_thread(rqstp); @@ -659,8 +678,12 @@ int nfsd_pool_stats_open(struct inode *inode, struct file *file)  int nfsd_pool_stats_release(struct inode *inode, struct file *file)  {  	int ret = seq_release(inode, file); +	struct net *net = &init_net; +  	mutex_lock(&nfsd_mutex);  	/* this function really, really should have been called svc_put() */ +	if (nfsd_serv->sv_nrthreads == 1) +		svc_shutdown_net(nfsd_serv, net);  	svc_destroy(nfsd_serv);  	mutex_unlock(&nfsd_mutex);  	return ret;  |