diff options
Diffstat (limited to 'fs/nfsd/nfsctl.c')
| -rw-r--r-- | fs/nfsd/nfsctl.c | 27 | 
1 files changed, 12 insertions, 15 deletions
| diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c index 51a49e0cfe37..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; |