diff options
Diffstat (limited to 'net/sunrpc/xprt.c')
| -rw-r--r-- | net/sunrpc/xprt.c | 6 | 
1 files changed, 6 insertions, 0 deletions
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index ab5dd621ae0c..2e98f4a243e5 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c @@ -614,6 +614,7 @@ static void xprt_autoclose(struct work_struct *work)  	clear_bit(XPRT_CLOSE_WAIT, &xprt->state);  	xprt->ops->close(xprt);  	xprt_release_write(xprt, NULL); +	wake_up_bit(&xprt->state, XPRT_LOCKED);  }  /** @@ -723,6 +724,7 @@ void xprt_unlock_connect(struct rpc_xprt *xprt, void *cookie)  	xprt->ops->release_xprt(xprt, NULL);  out:  	spin_unlock_bh(&xprt->transport_lock); +	wake_up_bit(&xprt->state, XPRT_LOCKED);  }  /** @@ -1394,6 +1396,10 @@ out:  static void xprt_destroy(struct rpc_xprt *xprt)  {  	dprintk("RPC:       destroying transport %p\n", xprt); + +	/* Exclude transport connect/disconnect handlers */ +	wait_on_bit_lock(&xprt->state, XPRT_LOCKED, TASK_UNINTERRUPTIBLE); +  	del_timer_sync(&xprt->timer);  	rpc_xprt_debugfs_unregister(xprt);  | 
