| From 79234c3db6842a3de03817211d891e0c2878f756 Mon Sep 17 00:00:00 2001 |
| From: Trond Myklebust <trond.myklebust@primarydata.com> |
| Date: Fri, 18 Sep 2015 15:53:24 -0400 |
| Subject: SUNRPC: Lock the transport layer on shutdown |
| |
| From: Trond Myklebust <trond.myklebust@primarydata.com> |
| |
| commit 79234c3db6842a3de03817211d891e0c2878f756 upstream. |
| |
| Avoid all races with the connect/disconnect handlers by taking the |
| transport lock. |
| |
| Reported-by:"Suzuki K. Poulose" <suzuki.poulose@arm.com> |
| Acked-by: Jeff Layton <jlayton@poochiereds.net> |
| Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| net/sunrpc/xprt.c | 6 ++++++ |
| 1 file changed, 6 insertions(+) |
| |
| --- a/net/sunrpc/xprt.c |
| +++ b/net/sunrpc/xprt.c |
| @@ -611,6 +611,7 @@ static void xprt_autoclose(struct work_s |
| xprt->ops->close(xprt); |
| clear_bit(XPRT_CLOSE_WAIT, &xprt->state); |
| xprt_release_write(xprt, NULL); |
| + wake_up_bit(&xprt->state, XPRT_LOCKED); |
| } |
| |
| /** |
| @@ -720,6 +721,7 @@ void xprt_unlock_connect(struct rpc_xprt |
| xprt->ops->release_xprt(xprt, NULL); |
| out: |
| spin_unlock_bh(&xprt->transport_lock); |
| + wake_up_bit(&xprt->state, XPRT_LOCKED); |
| } |
| |
| /** |
| @@ -1389,6 +1391,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); |