diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/nfs/callback.c | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c index 5d5f9d10cfd..64e87ec045a 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 | |||
292 | err_socks: | 295 | err_socks: |
293 | svc_rpcb_cleanup(serv, net); | 296 | svc_rpcb_cleanup(serv, net); |
294 | err_bind: | 297 | err_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 | ||
367 | out: | 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 | */ |
374 | err_net: | ||
374 | svc_destroy(serv); | 375 | svc_destroy(serv); |
375 | err_create: | 376 | err_create: |
376 | mutex_unlock(&nfs_callback_mutex); | 377 | mutex_unlock(&nfs_callback_mutex); |
@@ -378,11 +379,8 @@ err_create: | |||
378 | 379 | ||
379 | err_start: | 380 | err_start: |
380 | svc_shutdown_net(serv, net); | 381 | svc_shutdown_net(serv, net); |
381 | err_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 | /* |