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) | |||
614 | clear_bit(XPRT_CLOSE_WAIT, &xprt->state); | 614 | clear_bit(XPRT_CLOSE_WAIT, &xprt->state); |
615 | xprt->ops->close(xprt); | 615 | xprt->ops->close(xprt); |
616 | xprt_release_write(xprt, NULL); | 616 | xprt_release_write(xprt, NULL); |
617 | wake_up_bit(&xprt->state, XPRT_LOCKED); | ||
617 | } | 618 | } |
618 | 619 | ||
619 | /** | 620 | /** |
@@ -723,6 +724,7 @@ void xprt_unlock_connect(struct rpc_xprt *xprt, void *cookie) | |||
723 | xprt->ops->release_xprt(xprt, NULL); | 724 | xprt->ops->release_xprt(xprt, NULL); |
724 | out: | 725 | out: |
725 | spin_unlock_bh(&xprt->transport_lock); | 726 | spin_unlock_bh(&xprt->transport_lock); |
727 | wake_up_bit(&xprt->state, XPRT_LOCKED); | ||
726 | } | 728 | } |
727 | 729 | ||
728 | /** | 730 | /** |
@@ -1394,6 +1396,10 @@ out: | |||
1394 | static void xprt_destroy(struct rpc_xprt *xprt) | 1396 | static void xprt_destroy(struct rpc_xprt *xprt) |
1395 | { | 1397 | { |
1396 | dprintk("RPC: destroying transport %p\n", xprt); | 1398 | dprintk("RPC: destroying transport %p\n", xprt); |
1399 | |||
1400 | /* Exclude transport connect/disconnect handlers */ | ||
1401 | wait_on_bit_lock(&xprt->state, XPRT_LOCKED, TASK_UNINTERRUPTIBLE); | ||
1402 | |||
1397 | del_timer_sync(&xprt->timer); | 1403 | del_timer_sync(&xprt->timer); |
1398 | 1404 | ||
1399 | rpc_xprt_debugfs_unregister(xprt); | 1405 | rpc_xprt_debugfs_unregister(xprt); |