diff for duplicates of <1442613607.11370.18.camel@primarydata.com> diff --git a/a/1.txt b/N1/1.txt index 399fb69..386ea44 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -136,3 +136,54 @@ automatically any time the server initiates a close, while still preventing it during shutdown. 8<------------------------------------------------------------------- +>From 3e1c9d8092e2fa4509d84a00fcf21e7e0c581fe2 Mon Sep 17 00:00:00 2001 +From: Trond Myklebust <trond.myklebust@primarydata.com> +Date: Fri, 18 Sep 2015 15:53:24 -0400 +Subject: [PATCH] SUNRPC: Lock the transport layer on shutdown + +Avoid all races with the connect/disconnect handlers by taking the +transport lock. + +Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com> +--- + net/sunrpc/xprt.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +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); +-- +2.4.3 + +-- +Trond Myklebust +Linux NFS client maintainer, PrimaryData +trond.myklebust@primarydata.com diff --git a/a/content_digest b/N1/content_digest index 2f10cc0..7e72d44 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -153,6 +153,57 @@ "automatically any time the server initiates a close, while still\n" "preventing it during shutdown.\n" "\n" - 8<------------------------------------------------------------------- + "8<-------------------------------------------------------------------\n" + ">From 3e1c9d8092e2fa4509d84a00fcf21e7e0c581fe2 Mon Sep 17 00:00:00 2001\n" + "From: Trond Myklebust <trond.myklebust@primarydata.com>\n" + "Date: Fri, 18 Sep 2015 15:53:24 -0400\n" + "Subject: [PATCH] SUNRPC: Lock the transport layer on shutdown\n" + "\n" + "Avoid all races with the connect/disconnect handlers by taking the\n" + "transport lock.\n" + "\n" + "Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>\n" + "---\n" + " net/sunrpc/xprt.c | 6 ++++++\n" + " 1 file changed, 6 insertions(+)\n" + "\n" + "diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c\n" + "index ab5dd621ae0c..2e98f4a243e5 100644\n" + "--- a/net/sunrpc/xprt.c\n" + "+++ b/net/sunrpc/xprt.c\n" + "@@ -614,6 +614,7 @@ static void xprt_autoclose(struct work_struct *work)\n" + " \tclear_bit(XPRT_CLOSE_WAIT, &xprt->state);\n" + " \txprt->ops->close(xprt);\n" + " \txprt_release_write(xprt, NULL);\n" + "+\twake_up_bit(&xprt->state, XPRT_LOCKED);\n" + " }\n" + " \n" + " /**\n" + "@@ -723,6 +724,7 @@ void xprt_unlock_connect(struct rpc_xprt *xprt, void *cookie)\n" + " \txprt->ops->release_xprt(xprt, NULL);\n" + " out:\n" + " \tspin_unlock_bh(&xprt->transport_lock);\n" + "+\twake_up_bit(&xprt->state, XPRT_LOCKED);\n" + " }\n" + " \n" + " /**\n" + "@@ -1394,6 +1396,10 @@ out:\n" + " static void xprt_destroy(struct rpc_xprt *xprt)\n" + " {\n" + " \tdprintk(\"RPC: destroying transport %p\\n\", xprt);\n" + "+\n" + "+\t/* Exclude transport connect/disconnect handlers */\n" + "+\twait_on_bit_lock(&xprt->state, XPRT_LOCKED, TASK_UNINTERRUPTIBLE);\n" + "+\n" + " \tdel_timer_sync(&xprt->timer);\n" + " \n" + " \trpc_xprt_debugfs_unregister(xprt);\n" + "-- \n" + "2.4.3\n" + "\n" + "-- \n" + "Trond Myklebust\n" + "Linux NFS client maintainer, PrimaryData\n" + trond.myklebust@primarydata.com -9404b220b2a5f2552f1e8175f604634b63a1d7b82a4fd532ec7a2515caeff296 +8dc1efaf851a48bdd68e4ab5d425f6dbdcad90cd5d20ceb60da7d5adb7216eb8
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.