diff for duplicates of <1442595095.11370.13.camel@primarydata.com> diff --git a/a/1.txt b/N1/1.txt index 4360ac2..4320361 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -121,3 +121,80 @@ So how about the following patch? It should apply cleanly on top of the first one (which is still needed, btw). 8<-------------------------------------------------------------------- +>From 6261682c433cf57e6bff4ab57d615460dc15e75c Mon Sep 17 00:00:00 2001 +From: Trond Myklebust <trond.myklebust@primarydata.com> +Date: Fri, 18 Sep 2015 09:52:07 -0400 +Subject: [PATCH 1/2] SUNRPC: xs_sock_mark_closed() should not trigger socket + autoclose + +Trggering a socket autoclose from inside xs_tcp_state_change() is +potentially racy when it happens during the transport destroy phase, +because it restarts the xprt->task_cleanup work. + +The same is true of autoclose triggered from inside xs_tcp_data_ready(). + +Under all conditions, it should be quite sufficient just to mark +the socket as disconnected. It will then be closed by the +transport shutdown or reconnect code. + +Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com> +--- + net/sunrpc/xprtsock.c | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c +index c35038511686..bb4fff4d4e5e 100644 +--- a/net/sunrpc/xprtsock.c ++++ b/net/sunrpc/xprtsock.c +@@ -777,7 +777,6 @@ static void xs_sock_mark_closed(struct rpc_xprt *xprt) + xs_sock_reset_connection_flags(xprt); + /* Mark transport as closed and wake up all pending tasks */ + xprt_disconnect_done(xprt); +- xprt_force_disconnect(xprt); + } + + /** +@@ -1068,7 +1067,7 @@ static inline void xs_tcp_read_fraghdr(struct rpc_xprt *xprt, struct xdr_skb_rea + /* Sanity check of the record length */ + if (unlikely(transport->tcp_reclen < 8)) { + dprintk("RPC: invalid TCP record fragment length\n"); +- xs_tcp_force_close(xprt); ++ xprt_disconnect_done(xprt); + return; + } + dprintk("RPC: reading TCP record fragment of length %d\n", +@@ -1149,7 +1148,7 @@ static inline void xs_tcp_read_calldir(struct sock_xprt *transport, + break; + default: + dprintk("RPC: invalid request message type\n"); +- xs_tcp_force_close(&transport->xprt); ++ xprt_disconnect_done(&transport->xprt); + } + xs_tcp_check_fraghdr(transport); + } +@@ -1283,7 +1282,7 @@ static int xs_tcp_read_callback(struct rpc_xprt *xprt, + if (req == NULL) { + spin_unlock(&xprt->transport_lock); + printk(KERN_WARNING "Callback slot table overflowed\n"); +- xprt_force_disconnect(xprt); ++ xprt_disconnect_done(xprt); + return -1; + } + +@@ -1484,8 +1483,7 @@ static void xs_tcp_state_change(struct sock *sk) + case TCP_CLOSE_WAIT: + /* The server initiated a shutdown of the socket */ + xprt->connect_cookie++; +- clear_bit(XPRT_CONNECTED, &xprt->state); +- xs_tcp_force_close(xprt); ++ xprt_disconnect_done(xprt); + case TCP_CLOSING: + /* + * If the server closed down the connection, make sure that +-- +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 497c91f..2391627 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -137,6 +137,83 @@ "So how about the following patch? It should apply cleanly on top of the\n" "first one (which is still needed, btw).\n" "\n" - 8<-------------------------------------------------------------------- + "8<--------------------------------------------------------------------\n" + ">From 6261682c433cf57e6bff4ab57d615460dc15e75c Mon Sep 17 00:00:00 2001\n" + "From: Trond Myklebust <trond.myklebust@primarydata.com>\n" + "Date: Fri, 18 Sep 2015 09:52:07 -0400\n" + "Subject: [PATCH 1/2] SUNRPC: xs_sock_mark_closed() should not trigger socket\n" + " autoclose\n" + "\n" + "Trggering a socket autoclose from inside xs_tcp_state_change() is\n" + "potentially racy when it happens during the transport destroy phase,\n" + "because it restarts the xprt->task_cleanup work.\n" + "\n" + "The same is true of autoclose triggered from inside xs_tcp_data_ready().\n" + "\n" + "Under all conditions, it should be quite sufficient just to mark\n" + "the socket as disconnected. It will then be closed by the\n" + "transport shutdown or reconnect code.\n" + "\n" + "Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>\n" + "---\n" + " net/sunrpc/xprtsock.c | 10 ++++------\n" + " 1 file changed, 4 insertions(+), 6 deletions(-)\n" + "\n" + "diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c\n" + "index c35038511686..bb4fff4d4e5e 100644\n" + "--- a/net/sunrpc/xprtsock.c\n" + "+++ b/net/sunrpc/xprtsock.c\n" + "@@ -777,7 +777,6 @@ static void xs_sock_mark_closed(struct rpc_xprt *xprt)\n" + " \txs_sock_reset_connection_flags(xprt);\n" + " \t/* Mark transport as closed and wake up all pending tasks */\n" + " \txprt_disconnect_done(xprt);\n" + "-\txprt_force_disconnect(xprt);\n" + " }\n" + " \n" + " /**\n" + "@@ -1068,7 +1067,7 @@ static inline void xs_tcp_read_fraghdr(struct rpc_xprt *xprt, struct xdr_skb_rea\n" + " \t/* Sanity check of the record length */\n" + " \tif (unlikely(transport->tcp_reclen < 8)) {\n" + " \t\tdprintk(\"RPC: invalid TCP record fragment length\\n\");\n" + "-\t\txs_tcp_force_close(xprt);\n" + "+\t\txprt_disconnect_done(xprt);\n" + " \t\treturn;\n" + " \t}\n" + " \tdprintk(\"RPC: reading TCP record fragment of length %d\\n\",\n" + "@@ -1149,7 +1148,7 @@ static inline void xs_tcp_read_calldir(struct sock_xprt *transport,\n" + " \t\tbreak;\n" + " \tdefault:\n" + " \t\tdprintk(\"RPC: invalid request message type\\n\");\n" + "-\t\txs_tcp_force_close(&transport->xprt);\n" + "+\t\txprt_disconnect_done(&transport->xprt);\n" + " \t}\n" + " \txs_tcp_check_fraghdr(transport);\n" + " }\n" + "@@ -1283,7 +1282,7 @@ static int xs_tcp_read_callback(struct rpc_xprt *xprt,\n" + " \tif (req == NULL) {\n" + " \t\tspin_unlock(&xprt->transport_lock);\n" + " \t\tprintk(KERN_WARNING \"Callback slot table overflowed\\n\");\n" + "-\t\txprt_force_disconnect(xprt);\n" + "+\t\txprt_disconnect_done(xprt);\n" + " \t\treturn -1;\n" + " \t}\n" + " \n" + "@@ -1484,8 +1483,7 @@ static void xs_tcp_state_change(struct sock *sk)\n" + " \tcase TCP_CLOSE_WAIT:\n" + " \t\t/* The server initiated a shutdown of the socket */\n" + " \t\txprt->connect_cookie++;\n" + "-\t\tclear_bit(XPRT_CONNECTED, &xprt->state);\n" + "-\t\txs_tcp_force_close(xprt);\n" + "+\t\txprt_disconnect_done(xprt);\n" + " \tcase TCP_CLOSING:\n" + " \t\t/*\n" + " \t\t * If the server closed down the connection, make sure that\n" + "-- \n" + "2.4.3\n" + "\n" + "-- \n" + "Trond Myklebust\n" + "Linux NFS client maintainer, PrimaryData\n" + trond.myklebust@primarydata.com -17fc90751c0c5354a1b198998419d746c3cbf44ad4b10f6594e44de8954cbc4c +ca314abc34f55747108a25f18fa62aa0e6cf0ca2e31a595dd38c18fe66348b0c
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.