aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/nfs/callback.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c
index 5d5f9d10cfd0..64e87ec045aa 100644
--- a/fs/nfs/callback.c
+++ b/fs/nfs/callback.c
@@ -229,6 +229,9 @@ static int nfs_callback_start_svc(int minorversion, struct rpc_xprt *xprt,
229 229
230 nfs_callback_bc_serv(minorversion, xprt, serv); 230 nfs_callback_bc_serv(minorversion, xprt, serv);
231 231
232 if (cb_info->task)
233 return 0;
234
232 minorversion_setup = nfs_minorversion_callback_svc_setup(minorversion, 235 minorversion_setup = nfs_minorversion_callback_svc_setup(minorversion,
233 serv, &rqstp, &callback_svc); 236 serv, &rqstp, &callback_svc);
234 if (!minorversion_setup) { 237 if (!minorversion_setup) {
@@ -292,6 +295,8 @@ static int nfs_callback_up_net(int minorversion, struct svc_serv *serv, struct n
292err_socks: 295err_socks:
293 svc_rpcb_cleanup(serv, net); 296 svc_rpcb_cleanup(serv, net);
294err_bind: 297err_bind:
298 dprintk("NFS: Couldn't create callback socket: err = %d; "
299 "net = %p\n", ret, net);
295 return ret; 300 return ret;
296} 301}
297 302
@@ -340,7 +345,7 @@ int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt)
340{ 345{
341 struct svc_serv *serv; 346 struct svc_serv *serv;
342 struct nfs_callback_data *cb_info = &nfs_callback_info[minorversion]; 347 struct nfs_callback_data *cb_info = &nfs_callback_info[minorversion];
343 int ret = 0; 348 int ret;
344 struct net *net = xprt->xprt_net; 349 struct net *net = xprt->xprt_net;
345 350
346 mutex_lock(&nfs_callback_mutex); 351 mutex_lock(&nfs_callback_mutex);
@@ -351,11 +356,6 @@ int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt)
351 goto err_create; 356 goto err_create;
352 } 357 }
353 358
354 if (cb_info->users++ || cb_info->task != NULL) {
355 nfs_callback_bc_serv(minorversion, xprt, serv);
356 goto out;
357 }
358
359 ret = nfs_callback_up_net(minorversion, serv, net); 359 ret = nfs_callback_up_net(minorversion, serv, net);
360 if (ret < 0) 360 if (ret < 0)
361 goto err_net; 361 goto err_net;
@@ -364,13 +364,14 @@ int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt)
364 if (ret < 0) 364 if (ret < 0)
365 goto err_start; 365 goto err_start;
366 366
367out: 367 cb_info->users++;
368 /* 368 /*
369 * svc_create creates the svc_serv with sv_nrthreads == 1, and then 369 * svc_create creates the svc_serv with sv_nrthreads == 1, and then
370 * svc_prepare_thread increments that. So we need to call svc_destroy 370 * svc_prepare_thread increments that. So we need to call svc_destroy
371 * on both success and failure so that the refcount is 1 when the 371 * on both success and failure so that the refcount is 1 when the
372 * thread exits. 372 * thread exits.
373 */ 373 */
374err_net:
374 svc_destroy(serv); 375 svc_destroy(serv);
375err_create: 376err_create:
376 mutex_unlock(&nfs_callback_mutex); 377 mutex_unlock(&nfs_callback_mutex);
@@ -378,11 +379,8 @@ err_create:
378 379
379err_start: 380err_start:
380 svc_shutdown_net(serv, net); 381 svc_shutdown_net(serv, net);
381err_net: 382 dprintk("NFS: Couldn't create server thread; err = %d\n", ret);
382 dprintk("NFS: Couldn't create callback socket or server thread; " 383 goto err_net;
383 "err = %d\n", ret);
384 cb_info->users--;
385 goto out;
386} 384}
387 385
388/* 386/*