All of lore.kernel.org
 help / color / mirror / Atom feed
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.