diff options
Diffstat (limited to 'fs/nfs/callback.c')
| -rw-r--r-- | fs/nfs/callback.c | 36 | 
1 files changed, 11 insertions, 25 deletions
| diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c index 86d856de1389..054cc1255fac 100644 --- a/fs/nfs/callback.c +++ b/fs/nfs/callback.c @@ -93,7 +93,7 @@ nfs4_callback_svc(void *vrqstp)  		svc_process(rqstp);  	}  	svc_exit_thread(rqstp); -	module_put_and_exit(0); +	module_put_and_kthread_exit(0);  	return 0;  } @@ -137,7 +137,7 @@ nfs41_callback_svc(void *vrqstp)  		}  	}  	svc_exit_thread(rqstp); -	module_put_and_exit(0); +	module_put_and_kthread_exit(0);  	return 0;  } @@ -169,12 +169,12 @@ static int nfs_callback_start_svc(int minorversion, struct rpc_xprt *xprt,  	if (nrservs < NFS4_MIN_NR_CALLBACK_THREADS)  		nrservs = NFS4_MIN_NR_CALLBACK_THREADS; -	if (serv->sv_nrthreads-1 == nrservs) +	if (serv->sv_nrthreads == nrservs)  		return 0; -	ret = serv->sv_ops->svo_setup(serv, NULL, nrservs); +	ret = svc_set_num_threads(serv, NULL, nrservs);  	if (ret) { -		serv->sv_ops->svo_setup(serv, NULL, 0); +		svc_set_num_threads(serv, NULL, 0);  		return ret;  	}  	dprintk("nfs_callback_up: service started\n"); @@ -235,14 +235,12 @@ err_bind:  static const struct svc_serv_ops nfs40_cb_sv_ops = {  	.svo_function		= nfs4_callback_svc,  	.svo_enqueue_xprt	= svc_xprt_do_enqueue, -	.svo_setup		= svc_set_num_threads_sync,  	.svo_module		= THIS_MODULE,  };  #if defined(CONFIG_NFS_V4_1)  static const struct svc_serv_ops nfs41_cb_sv_ops = {  	.svo_function		= nfs41_callback_svc,  	.svo_enqueue_xprt	= svc_xprt_do_enqueue, -	.svo_setup		= svc_set_num_threads_sync,  	.svo_module		= THIS_MODULE,  }; @@ -266,14 +264,8 @@ static struct svc_serv *nfs_callback_create_svc(int minorversion)  	/*  	 * Check whether we're already up and running.  	 */ -	if (cb_info->serv) { -		/* -		 * Note: increase service usage, because later in case of error -		 * svc_destroy() will be called. -		 */ -		svc_get(cb_info->serv); -		return cb_info->serv; -	} +	if (cb_info->serv) +		return svc_get(cb_info->serv);  	switch (minorversion) {  	case 0: @@ -294,7 +286,7 @@ static struct svc_serv *nfs_callback_create_svc(int minorversion)  		printk(KERN_WARNING "nfs_callback_create_svc: no kthread, %d users??\n",  			cb_info->users); -	serv = svc_create_pooled(&nfs4_callback_program, NFS4_CALLBACK_BUFSIZE, sv_ops); +	serv = svc_create(&nfs4_callback_program, NFS4_CALLBACK_BUFSIZE, sv_ops);  	if (!serv) {  		printk(KERN_ERR "nfs_callback_create_svc: create service failed\n");  		return ERR_PTR(-ENOMEM); @@ -335,16 +327,10 @@ int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt)  		goto err_start;  	cb_info->users++; -	/* -	 * svc_create creates the svc_serv with sv_nrthreads == 1, and then -	 * svc_prepare_thread increments that. So we need to call svc_destroy -	 * on both success and failure so that the refcount is 1 when the -	 * thread exits. -	 */  err_net:  	if (!cb_info->users)  		cb_info->serv = NULL; -	svc_destroy(serv); +	svc_put(serv);  err_create:  	mutex_unlock(&nfs_callback_mutex);  	return ret; @@ -369,8 +355,8 @@ void nfs_callback_down(int minorversion, struct net *net)  	cb_info->users--;  	if (cb_info->users == 0) {  		svc_get(serv); -		serv->sv_ops->svo_setup(serv, NULL, 0); -		svc_destroy(serv); +		svc_set_num_threads(serv, NULL, 0); +		svc_put(serv);  		dprintk("nfs_callback_down: service destroyed\n");  		cb_info->serv = NULL;  	} |