diff options
Diffstat (limited to 'fs/nfsd/nfsctl.c')
| -rw-r--r-- | fs/nfsd/nfsctl.c | 41 | 
1 files changed, 19 insertions, 22 deletions
| diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c index af8531c3854a..b9f27fbcd768 100644 --- a/fs/nfsd/nfsctl.c +++ b/fs/nfsd/nfsctl.c @@ -742,13 +742,12 @@ static ssize_t __write_ports_addfd(char *buf, struct net *net, const struct cred  		return err;  	err = svc_addsock(nn->nfsd_serv, fd, buf, SIMPLE_TRANSACTION_LIMIT, cred); -	if (err < 0) { -		nfsd_destroy(net); -		return err; -	} -	/* Decrease the count, but don't shut down the service */ -	nn->nfsd_serv->sv_nrthreads--; +	if (err >= 0 && +	    !nn->nfsd_serv->sv_nrthreads && !xchg(&nn->keep_active, 1)) +		svc_get(nn->nfsd_serv); + +	nfsd_put(net);  	return err;  } @@ -783,8 +782,10 @@ static ssize_t __write_ports_addxprt(char *buf, struct net *net, const struct cr  	if (err < 0 && err != -EAFNOSUPPORT)  		goto out_close; -	/* Decrease the count, but don't shut down the service */ -	nn->nfsd_serv->sv_nrthreads--; +	if (!nn->nfsd_serv->sv_nrthreads && !xchg(&nn->keep_active, 1)) +		svc_get(nn->nfsd_serv); + +	nfsd_put(net);  	return 0;  out_close:  	xprt = svc_find_xprt(nn->nfsd_serv, transport, net, PF_INET, port); @@ -793,10 +794,7 @@ out_close:  		svc_xprt_put(xprt);  	}  out_err: -	if (!list_empty(&nn->nfsd_serv->sv_permsocks)) -		nn->nfsd_serv->sv_nrthreads--; -	 else -		nfsd_destroy(net); +	nfsd_put(net);  	return err;  } @@ -1485,9 +1483,8 @@ static __net_init int nfsd_init_net(struct net *net)  	nn->clientid_counter = nn->clientid_base + 1;  	nn->s2s_cp_cl_id = nn->clientid_counter++; -	atomic_set(&nn->ntf_refcnt, 0); -	init_waitqueue_head(&nn->ntf_wq); -	seqlock_init(&nn->boot_lock); +	get_random_bytes(&nn->siphash_key, sizeof(nn->siphash_key)); +	seqlock_init(&nn->writeverf_lock);  	return 0; @@ -1521,12 +1518,9 @@ static int __init init_nfsd(void)  	int retval;  	printk(KERN_INFO "Installing knfsd (copyright (C) 1996 [email protected]).\n"); -	retval = register_cld_notifier(); -	if (retval) -		return retval;  	retval = nfsd4_init_slabs();  	if (retval) -		goto out_unregister_notifier; +		return retval;  	retval = nfsd4_init_pnfs();  	if (retval)  		goto out_free_slabs; @@ -1545,9 +1539,14 @@ static int __init init_nfsd(void)  		goto out_free_exports;  	retval = register_pernet_subsys(&nfsd_net_ops);  	if (retval < 0) +		goto out_free_filesystem; +	retval = register_cld_notifier(); +	if (retval)  		goto out_free_all;  	return 0;  out_free_all: +	unregister_pernet_subsys(&nfsd_net_ops); +out_free_filesystem:  	unregister_filesystem(&nfsd_fs_type);  out_free_exports:  	remove_proc_entry("fs/nfs/exports", NULL); @@ -1561,13 +1560,12 @@ out_free_pnfs:  	nfsd4_exit_pnfs();  out_free_slabs:  	nfsd4_free_slabs(); -out_unregister_notifier: -	unregister_cld_notifier();  	return retval;  }  static void __exit exit_nfsd(void)  { +	unregister_cld_notifier();  	unregister_pernet_subsys(&nfsd_net_ops);  	nfsd_drc_slab_free();  	remove_proc_entry("fs/nfs/exports", NULL); @@ -1577,7 +1575,6 @@ static void __exit exit_nfsd(void)  	nfsd4_free_slabs();  	nfsd4_exit_pnfs();  	unregister_filesystem(&nfsd_fs_type); -	unregister_cld_notifier();  }  MODULE_AUTHOR("Olaf Kirch <[email protected]>"); |