All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <1442499509.2865.16.camel@primarydata.com>

diff --git a/a/1.txt b/N1/1.txt
index 071ba66..23151f2 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -9,25 +9,25 @@ On Thu, 2015-09-17 at 14:57 +0100, Russell King - ARM Linux wrote:
 > > kernel_connect(),
 > > but it stops the multiple connection attempts:
 > > 
-> >   1   0.000000 armada388 -> n2100 TCP 1009→nfs [SYN] Seq=3794066539
+> >   1   0.000000 armada388 -> n2100 TCP 1009?nfs [SYN] Seq=3794066539
 > > Win=28560 Len=0 MSS=1440 SACK_PERM=1 TSval=15712 TSecr=870317691
 > > WS=128
-> >   2   0.000414 n2100 -> armada388 TCP nfs→1009 [SYN, ACK]
+> >   2   0.000414 n2100 -> armada388 TCP nfs?1009 [SYN, ACK]
 > > Seq=1884476522 Ack=3794066540 Win=28560 Len=0 MSS=1440 SACK_PERM=1
 > > TSval=870318939 TSecr=15712 WS=64
-> >   3   0.000787 armada388 -> n2100 TCP 1009→nfs [ACK] Seq=3794066540
+> >   3   0.000787 armada388 -> n2100 TCP 1009?nfs [ACK] Seq=3794066540
 > > Ack=1884476523 Win=28672 Len=0 TSval=15712 TSecr=870318939
 > >   4   0.001304 armada388 -> n2100 NFS V3 ACCESS Call, FH:
 > > 0x905379cc, [Check: RD LU MD XT DL]
-> >   5   0.001566 n2100 -> armada388 TCP nfs→1009 [ACK] Seq=1884476523
+> >   5   0.001566 n2100 -> armada388 TCP nfs?1009 [ACK] Seq=1884476523
 > > Ack=3794066660 Win=28608 Len=0 TSval=870318939 TSecr=15712
 > >   6   0.001640 armada388 -> n2100 NFS V3 ACCESS Call, FH:
 > > 0x905379cc, [Check: RD LU MD XT DL]
-> >   7   0.001866 n2100 -> armada388 TCP nfs→1009 [ACK] Seq=1884476523
+> >   7   0.001866 n2100 -> armada388 TCP nfs?1009 [ACK] Seq=1884476523
 > > Ack=3794066780 Win=28608 Len=0 TSval=870318939 TSecr=15712
 > >   8   0.003070 n2100 -> armada388 NFS V3 ACCESS Reply (Call In 4),
 > > [Allowed: RD LU MD XT DL]
-> >   9   0.003415 armada388 -> n2100 TCP 1009→nfs [ACK] Seq=3794066780
+> >   9   0.003415 armada388 -> n2100 TCP 1009?nfs [ACK] Seq=3794066780
 > > Ack=1884476647 Win=28672 Len=0 TSval=15712 TSecr=870318939
 > >  10   0.003592 armada388 -> n2100 NFS V3 ACCESS Call, FH:
 > > 0xe15fc9c9, [Check: RD LU MD XT DL]
@@ -67,3 +67,114 @@ more than once (which could otherwise still happen in the TCP_CLOSE
 case).
 
 8<-------------------------------------------------------------------
+>From 4dbfdebbc09982a9248866f8256549456e2b2efd Mon Sep 17 00:00:00 2001
+From: Trond Myklebust <trond.myklebust@primarydata.com>
+Date: Wed, 16 Sep 2015 23:43:17 -0400
+Subject: [PATCH] SUNRPC: Ensure that we wait for connections to complete
+ before retrying
+
+Commit 718ba5b87343, moved the responsibility for unlocking the socket to
+xs_tcp_setup_socket, meaning that the socket will be unlocked before we
+know that it has finished trying to connect. The following patch is based on
+an initial patch by Russell King to ensure that we delay clearing the
+XPRT_SOCK_CONNECTING flag until we either know that we failed to initiate
+a connection attempt, or the connection attempt itself failed.
+
+Fixes: 718ba5b87343 ("SUNRPC: Add helpers to prevent socket create from racing")
+Reported-by: Russell King <linux@arm.linux.org.uk>
+Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
+---
+ include/linux/sunrpc/xprtsock.h |  3 +++
+ net/sunrpc/xprtsock.c           | 11 ++++++++---
+ 2 files changed, 11 insertions(+), 3 deletions(-)
+
+diff --git a/include/linux/sunrpc/xprtsock.h b/include/linux/sunrpc/xprtsock.h
+index 7591788e9fbf..357e44c1a46b 100644
+--- a/include/linux/sunrpc/xprtsock.h
++++ b/include/linux/sunrpc/xprtsock.h
+@@ -42,6 +42,7 @@ struct sock_xprt {
+ 	/*
+ 	 * Connection of transports
+ 	 */
++	unsigned long		sock_state;
+ 	struct delayed_work	connect_worker;
+ 	struct sockaddr_storage	srcaddr;
+ 	unsigned short		srcport;
+@@ -76,6 +77,8 @@ struct sock_xprt {
+  */
+ #define TCP_RPC_REPLY		(1UL << 6)
+ 
++#define XPRT_SOCK_CONNECTING	1U
++
+ #endif /* __KERNEL__ */
+ 
+ #endif /* _LINUX_SUNRPC_XPRTSOCK_H */
+diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
+index 7be90bc1a7c2..5bac27983e2a 100644
+--- a/net/sunrpc/xprtsock.c
++++ b/net/sunrpc/xprtsock.c
+@@ -1435,6 +1435,7 @@ out:
+ static void xs_tcp_state_change(struct sock *sk)
+ {
+ 	struct rpc_xprt *xprt;
++	struct sock_xprt *transport;
+ 
+ 	read_lock_bh(&sk->sk_callback_lock);
+ 	if (!(xprt = xprt_from_sock(sk)))
+@@ -1446,13 +1447,12 @@ static void xs_tcp_state_change(struct sock *sk)
+ 			sock_flag(sk, SOCK_ZAPPED),
+ 			sk->sk_shutdown);
+ 
++	transport = container_of(xprt, struct sock_xprt, xprt);
+ 	trace_rpc_socket_state_change(xprt, sk->sk_socket);
+ 	switch (sk->sk_state) {
+ 	case TCP_ESTABLISHED:
+ 		spin_lock(&xprt->transport_lock);
+ 		if (!xprt_test_and_set_connected(xprt)) {
+-			struct sock_xprt *transport = container_of(xprt,
+-					struct sock_xprt, xprt);
+ 
+ 			/* Reset TCP record info */
+ 			transport->tcp_offset = 0;
+@@ -1461,6 +1461,8 @@ static void xs_tcp_state_change(struct sock *sk)
+ 			transport->tcp_flags =
+ 				TCP_RCV_COPY_FRAGHDR | TCP_RCV_COPY_XID;
+ 			xprt->connect_cookie++;
++			clear_bit(XPRT_SOCK_CONNECTING, &transport->sock_state);
++			xprt_clear_connecting(xprt);
+ 
+ 			xprt_wake_pending_tasks(xprt, -EAGAIN);
+ 		}
+@@ -1496,6 +1498,9 @@ static void xs_tcp_state_change(struct sock *sk)
+ 		smp_mb__after_atomic();
+ 		break;
+ 	case TCP_CLOSE:
++		if (test_and_clear_bit(XPRT_SOCK_CONNECTING,
++					&transport->sock_state))
++			xprt_clear_connecting(xprt);
+ 		xs_sock_mark_closed(xprt);
+ 	}
+  out:
+@@ -2179,6 +2184,7 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
+ 	/* Tell the socket layer to start connecting... */
+ 	xprt->stat.connect_count++;
+ 	xprt->stat.connect_start = jiffies;
++	set_bit(XPRT_SOCK_CONNECTING, &transport->sock_state);
+ 	ret = kernel_connect(sock, xs_addr(xprt), xprt->addrlen, O_NONBLOCK);
+ 	switch (ret) {
+ 	case 0:
+@@ -2240,7 +2246,6 @@ static void xs_tcp_setup_socket(struct work_struct *work)
+ 	case -EINPROGRESS:
+ 	case -EALREADY:
+ 		xprt_unlock_connect(xprt, transport);
+-		xprt_clear_connecting(xprt);
+ 		return;
+ 	case -EINVAL:
+ 		/* Happens, for instance, if the user specified a link
+-- 
+2.4.3
+
+-- 
+Trond Myklebust
+Linux NFS client maintainer, PrimaryData
+trond.myklebust at primarydata.com
diff --git a/a/content_digest b/N1/content_digest
index 2b84482..33b25d5 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -6,15 +6,10 @@
  "ref\020150911162416.GV21084@n2100.arm.linux.org.uk\0"
  "ref\020150911164937.GW21084@n2100.arm.linux.org.uk\0"
  "ref\020150917135705.GQ21084@n2100.arm.linux.org.uk\0"
- "From\0Trond Myklebust <trond.myklebust@primarydata.com>\0"
- "Subject\0Re: NFS/TCP/IPv6 acting strangely in 4.2\0"
+ "From\0trond.myklebust@primarydata.com (Trond Myklebust)\0"
+ "Subject\0NFS/TCP/IPv6 acting strangely in 4.2\0"
  "Date\0Thu, 17 Sep 2015 10:18:29 -0400\0"
- "To\0Russell King - ARM Linux <linux@arm.linux.org.uk>"
- " AnnaSchumaker <anna.schumaker@netapp.com>\0"
- "Cc\0netdev@vger.kernel.org"
-  linux-nfs@vger.kernel.org
-  linux-arm-kernel@lists.infradead.org
- " Eric Dumazet <eric.dumazet@gmail.com>\0"
+ "To\0linux-arm-kernel@lists.infradead.org\0"
  "\00:1\0"
  "b\0"
  "Hi Russell,\n"
@@ -28,25 +23,25 @@
  "> > kernel_connect(),\n"
  "> > but it stops the multiple connection attempts:\n"
  "> > \n"
- "> >   1   0.000000 armada388 -> n2100 TCP 1009\342\206\222nfs [SYN] Seq=3794066539\n"
+ "> >   1   0.000000 armada388 -> n2100 TCP 1009?nfs [SYN] Seq=3794066539\n"
  "> > Win=28560 Len=0 MSS=1440 SACK_PERM=1 TSval=15712 TSecr=870317691\n"
  "> > WS=128\n"
- "> >   2   0.000414 n2100 -> armada388 TCP nfs\342\206\2221009 [SYN, ACK]\n"
+ "> >   2   0.000414 n2100 -> armada388 TCP nfs?1009 [SYN, ACK]\n"
  "> > Seq=1884476522 Ack=3794066540 Win=28560 Len=0 MSS=1440 SACK_PERM=1\n"
  "> > TSval=870318939 TSecr=15712 WS=64\n"
- "> >   3   0.000787 armada388 -> n2100 TCP 1009\342\206\222nfs [ACK] Seq=3794066540\n"
+ "> >   3   0.000787 armada388 -> n2100 TCP 1009?nfs [ACK] Seq=3794066540\n"
  "> > Ack=1884476523 Win=28672 Len=0 TSval=15712 TSecr=870318939\n"
  "> >   4   0.001304 armada388 -> n2100 NFS V3 ACCESS Call, FH:\n"
  "> > 0x905379cc, [Check: RD LU MD XT DL]\n"
- "> >   5   0.001566 n2100 -> armada388 TCP nfs\342\206\2221009 [ACK] Seq=1884476523\n"
+ "> >   5   0.001566 n2100 -> armada388 TCP nfs?1009 [ACK] Seq=1884476523\n"
  "> > Ack=3794066660 Win=28608 Len=0 TSval=870318939 TSecr=15712\n"
  "> >   6   0.001640 armada388 -> n2100 NFS V3 ACCESS Call, FH:\n"
  "> > 0x905379cc, [Check: RD LU MD XT DL]\n"
- "> >   7   0.001866 n2100 -> armada388 TCP nfs\342\206\2221009 [ACK] Seq=1884476523\n"
+ "> >   7   0.001866 n2100 -> armada388 TCP nfs?1009 [ACK] Seq=1884476523\n"
  "> > Ack=3794066780 Win=28608 Len=0 TSval=870318939 TSecr=15712\n"
  "> >   8   0.003070 n2100 -> armada388 NFS V3 ACCESS Reply (Call In 4),\n"
  "> > [Allowed: RD LU MD XT DL]\n"
- "> >   9   0.003415 armada388 -> n2100 TCP 1009\342\206\222nfs [ACK] Seq=3794066780\n"
+ "> >   9   0.003415 armada388 -> n2100 TCP 1009?nfs [ACK] Seq=3794066780\n"
  "> > Ack=1884476647 Win=28672 Len=0 TSval=15712 TSecr=870318939\n"
  "> >  10   0.003592 armada388 -> n2100 NFS V3 ACCESS Call, FH:\n"
  "> > 0xe15fc9c9, [Check: RD LU MD XT DL]\n"
@@ -85,6 +80,117 @@
  "more than once (which could otherwise still happen in the TCP_CLOSE\n"
  "case).\n"
  "\n"
- 8<-------------------------------------------------------------------
+ "8<-------------------------------------------------------------------\n"
+ ">From 4dbfdebbc09982a9248866f8256549456e2b2efd Mon Sep 17 00:00:00 2001\n"
+ "From: Trond Myklebust <trond.myklebust@primarydata.com>\n"
+ "Date: Wed, 16 Sep 2015 23:43:17 -0400\n"
+ "Subject: [PATCH] SUNRPC: Ensure that we wait for connections to complete\n"
+ " before retrying\n"
+ "\n"
+ "Commit 718ba5b87343, moved the responsibility for unlocking the socket to\n"
+ "xs_tcp_setup_socket, meaning that the socket will be unlocked before we\n"
+ "know that it has finished trying to connect. The following patch is based on\n"
+ "an initial patch by Russell King to ensure that we delay clearing the\n"
+ "XPRT_SOCK_CONNECTING flag until we either know that we failed to initiate\n"
+ "a connection attempt, or the connection attempt itself failed.\n"
+ "\n"
+ "Fixes: 718ba5b87343 (\"SUNRPC: Add helpers to prevent socket create from racing\")\n"
+ "Reported-by: Russell King <linux@arm.linux.org.uk>\n"
+ "Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>\n"
+ "---\n"
+ " include/linux/sunrpc/xprtsock.h |  3 +++\n"
+ " net/sunrpc/xprtsock.c           | 11 ++++++++---\n"
+ " 2 files changed, 11 insertions(+), 3 deletions(-)\n"
+ "\n"
+ "diff --git a/include/linux/sunrpc/xprtsock.h b/include/linux/sunrpc/xprtsock.h\n"
+ "index 7591788e9fbf..357e44c1a46b 100644\n"
+ "--- a/include/linux/sunrpc/xprtsock.h\n"
+ "+++ b/include/linux/sunrpc/xprtsock.h\n"
+ "@@ -42,6 +42,7 @@ struct sock_xprt {\n"
+ " \t/*\n"
+ " \t * Connection of transports\n"
+ " \t */\n"
+ "+\tunsigned long\t\tsock_state;\n"
+ " \tstruct delayed_work\tconnect_worker;\n"
+ " \tstruct sockaddr_storage\tsrcaddr;\n"
+ " \tunsigned short\t\tsrcport;\n"
+ "@@ -76,6 +77,8 @@ struct sock_xprt {\n"
+ "  */\n"
+ " #define TCP_RPC_REPLY\t\t(1UL << 6)\n"
+ " \n"
+ "+#define XPRT_SOCK_CONNECTING\t1U\n"
+ "+\n"
+ " #endif /* __KERNEL__ */\n"
+ " \n"
+ " #endif /* _LINUX_SUNRPC_XPRTSOCK_H */\n"
+ "diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c\n"
+ "index 7be90bc1a7c2..5bac27983e2a 100644\n"
+ "--- a/net/sunrpc/xprtsock.c\n"
+ "+++ b/net/sunrpc/xprtsock.c\n"
+ "@@ -1435,6 +1435,7 @@ out:\n"
+ " static void xs_tcp_state_change(struct sock *sk)\n"
+ " {\n"
+ " \tstruct rpc_xprt *xprt;\n"
+ "+\tstruct sock_xprt *transport;\n"
+ " \n"
+ " \tread_lock_bh(&sk->sk_callback_lock);\n"
+ " \tif (!(xprt = xprt_from_sock(sk)))\n"
+ "@@ -1446,13 +1447,12 @@ static void xs_tcp_state_change(struct sock *sk)\n"
+ " \t\t\tsock_flag(sk, SOCK_ZAPPED),\n"
+ " \t\t\tsk->sk_shutdown);\n"
+ " \n"
+ "+\ttransport = container_of(xprt, struct sock_xprt, xprt);\n"
+ " \ttrace_rpc_socket_state_change(xprt, sk->sk_socket);\n"
+ " \tswitch (sk->sk_state) {\n"
+ " \tcase TCP_ESTABLISHED:\n"
+ " \t\tspin_lock(&xprt->transport_lock);\n"
+ " \t\tif (!xprt_test_and_set_connected(xprt)) {\n"
+ "-\t\t\tstruct sock_xprt *transport = container_of(xprt,\n"
+ "-\t\t\t\t\tstruct sock_xprt, xprt);\n"
+ " \n"
+ " \t\t\t/* Reset TCP record info */\n"
+ " \t\t\ttransport->tcp_offset = 0;\n"
+ "@@ -1461,6 +1461,8 @@ static void xs_tcp_state_change(struct sock *sk)\n"
+ " \t\t\ttransport->tcp_flags =\n"
+ " \t\t\t\tTCP_RCV_COPY_FRAGHDR | TCP_RCV_COPY_XID;\n"
+ " \t\t\txprt->connect_cookie++;\n"
+ "+\t\t\tclear_bit(XPRT_SOCK_CONNECTING, &transport->sock_state);\n"
+ "+\t\t\txprt_clear_connecting(xprt);\n"
+ " \n"
+ " \t\t\txprt_wake_pending_tasks(xprt, -EAGAIN);\n"
+ " \t\t}\n"
+ "@@ -1496,6 +1498,9 @@ static void xs_tcp_state_change(struct sock *sk)\n"
+ " \t\tsmp_mb__after_atomic();\n"
+ " \t\tbreak;\n"
+ " \tcase TCP_CLOSE:\n"
+ "+\t\tif (test_and_clear_bit(XPRT_SOCK_CONNECTING,\n"
+ "+\t\t\t\t\t&transport->sock_state))\n"
+ "+\t\t\txprt_clear_connecting(xprt);\n"
+ " \t\txs_sock_mark_closed(xprt);\n"
+ " \t}\n"
+ "  out:\n"
+ "@@ -2179,6 +2184,7 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)\n"
+ " \t/* Tell the socket layer to start connecting... */\n"
+ " \txprt->stat.connect_count++;\n"
+ " \txprt->stat.connect_start = jiffies;\n"
+ "+\tset_bit(XPRT_SOCK_CONNECTING, &transport->sock_state);\n"
+ " \tret = kernel_connect(sock, xs_addr(xprt), xprt->addrlen, O_NONBLOCK);\n"
+ " \tswitch (ret) {\n"
+ " \tcase 0:\n"
+ "@@ -2240,7 +2246,6 @@ static void xs_tcp_setup_socket(struct work_struct *work)\n"
+ " \tcase -EINPROGRESS:\n"
+ " \tcase -EALREADY:\n"
+ " \t\txprt_unlock_connect(xprt, transport);\n"
+ "-\t\txprt_clear_connecting(xprt);\n"
+ " \t\treturn;\n"
+ " \tcase -EINVAL:\n"
+ " \t\t/* Happens, for instance, if the user specified a link\n"
+ "-- \n"
+ "2.4.3\n"
+ "\n"
+ "-- \n"
+ "Trond Myklebust\n"
+ "Linux NFS client maintainer, PrimaryData\n"
+ trond.myklebust at primarydata.com
 
-19cd03fe4ed8c49a2c4f2eabb141ca7fc155452e23f3921e3f71e8660c4c3fe3
+7aec60f901f378a4c96350c3dcb4d254934c1b1bf8548de6067243e0f0c90570

diff --git a/a/1.txt b/N2/1.txt
index 071ba66..061a083 100644
--- a/a/1.txt
+++ b/N2/1.txt
@@ -67,3 +67,121 @@ more than once (which could otherwise still happen in the TCP_CLOSE
 case).
 
 8<-------------------------------------------------------------------
+From 4dbfdebbc09982a9248866f8256549456e2b2efd Mon Sep 17 00:00:00 2001
+From: Trond Myklebust <trond.myklebust-7I+n7zu2hftEKMMhf/gKZA@public.gmane.org>
+Date: Wed, 16 Sep 2015 23:43:17 -0400
+Subject: [PATCH] SUNRPC: Ensure that we wait for connections to complete
+ before retrying
+
+Commit 718ba5b87343, moved the responsibility for unlocking the socket to
+xs_tcp_setup_socket, meaning that the socket will be unlocked before we
+know that it has finished trying to connect. The following patch is based on
+an initial patch by Russell King to ensure that we delay clearing the
+XPRT_SOCK_CONNECTING flag until we either know that we failed to initiate
+a connection attempt, or the connection attempt itself failed.
+
+Fixes: 718ba5b87343 ("SUNRPC: Add helpers to prevent socket create from racing")
+Reported-by: Russell King <linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org>
+Signed-off-by: Trond Myklebust <trond.myklebust-7I+n7zu2hftEKMMhf/gKZA@public.gmane.org>
+---
+ include/linux/sunrpc/xprtsock.h |  3 +++
+ net/sunrpc/xprtsock.c           | 11 ++++++++---
+ 2 files changed, 11 insertions(+), 3 deletions(-)
+
+diff --git a/include/linux/sunrpc/xprtsock.h b/include/linux/sunrpc/xprtsock.h
+index 7591788e9fbf..357e44c1a46b 100644
+--- a/include/linux/sunrpc/xprtsock.h
++++ b/include/linux/sunrpc/xprtsock.h
+@@ -42,6 +42,7 @@ struct sock_xprt {
+ 	/*
+ 	 * Connection of transports
+ 	 */
++	unsigned long		sock_state;
+ 	struct delayed_work	connect_worker;
+ 	struct sockaddr_storage	srcaddr;
+ 	unsigned short		srcport;
+@@ -76,6 +77,8 @@ struct sock_xprt {
+  */
+ #define TCP_RPC_REPLY		(1UL << 6)
+ 
++#define XPRT_SOCK_CONNECTING	1U
++
+ #endif /* __KERNEL__ */
+ 
+ #endif /* _LINUX_SUNRPC_XPRTSOCK_H */
+diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
+index 7be90bc1a7c2..5bac27983e2a 100644
+--- a/net/sunrpc/xprtsock.c
++++ b/net/sunrpc/xprtsock.c
+@@ -1435,6 +1435,7 @@ out:
+ static void xs_tcp_state_change(struct sock *sk)
+ {
+ 	struct rpc_xprt *xprt;
++	struct sock_xprt *transport;
+ 
+ 	read_lock_bh(&sk->sk_callback_lock);
+ 	if (!(xprt = xprt_from_sock(sk)))
+@@ -1446,13 +1447,12 @@ static void xs_tcp_state_change(struct sock *sk)
+ 			sock_flag(sk, SOCK_ZAPPED),
+ 			sk->sk_shutdown);
+ 
++	transport = container_of(xprt, struct sock_xprt, xprt);
+ 	trace_rpc_socket_state_change(xprt, sk->sk_socket);
+ 	switch (sk->sk_state) {
+ 	case TCP_ESTABLISHED:
+ 		spin_lock(&xprt->transport_lock);
+ 		if (!xprt_test_and_set_connected(xprt)) {
+-			struct sock_xprt *transport = container_of(xprt,
+-					struct sock_xprt, xprt);
+ 
+ 			/* Reset TCP record info */
+ 			transport->tcp_offset = 0;
+@@ -1461,6 +1461,8 @@ static void xs_tcp_state_change(struct sock *sk)
+ 			transport->tcp_flags =
+ 				TCP_RCV_COPY_FRAGHDR | TCP_RCV_COPY_XID;
+ 			xprt->connect_cookie++;
++			clear_bit(XPRT_SOCK_CONNECTING, &transport->sock_state);
++			xprt_clear_connecting(xprt);
+ 
+ 			xprt_wake_pending_tasks(xprt, -EAGAIN);
+ 		}
+@@ -1496,6 +1498,9 @@ static void xs_tcp_state_change(struct sock *sk)
+ 		smp_mb__after_atomic();
+ 		break;
+ 	case TCP_CLOSE:
++		if (test_and_clear_bit(XPRT_SOCK_CONNECTING,
++					&transport->sock_state))
++			xprt_clear_connecting(xprt);
+ 		xs_sock_mark_closed(xprt);
+ 	}
+  out:
+@@ -2179,6 +2184,7 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
+ 	/* Tell the socket layer to start connecting... */
+ 	xprt->stat.connect_count++;
+ 	xprt->stat.connect_start = jiffies;
++	set_bit(XPRT_SOCK_CONNECTING, &transport->sock_state);
+ 	ret = kernel_connect(sock, xs_addr(xprt), xprt->addrlen, O_NONBLOCK);
+ 	switch (ret) {
+ 	case 0:
+@@ -2240,7 +2246,6 @@ static void xs_tcp_setup_socket(struct work_struct *work)
+ 	case -EINPROGRESS:
+ 	case -EALREADY:
+ 		xprt_unlock_connect(xprt, transport);
+-		xprt_clear_connecting(xprt);
+ 		return;
+ 	case -EINVAL:
+ 		/* Happens, for instance, if the user specified a link
+-- 
+2.4.3
+
+-- 
+Trond Myklebust
+Linux NFS client maintainer, PrimaryData
+trond.myklebust-7I+n7zu2hftEKMMhf/gKZA@public.gmane.org
+
+
+
+--
+To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
+the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
+More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff --git a/a/content_digest b/N2/content_digest
index 2b84482..cc9f0e5 100644
--- a/a/content_digest
+++ b/N2/content_digest
@@ -6,15 +6,16 @@
  "ref\020150911162416.GV21084@n2100.arm.linux.org.uk\0"
  "ref\020150911164937.GW21084@n2100.arm.linux.org.uk\0"
  "ref\020150917135705.GQ21084@n2100.arm.linux.org.uk\0"
- "From\0Trond Myklebust <trond.myklebust@primarydata.com>\0"
+ "ref\020150917135705.GQ21084-l+eeeJia6m9vn6HldHNs0ANdhmdF6hFW@public.gmane.org\0"
+ "From\0Trond Myklebust <trond.myklebust-7I+n7zu2hftEKMMhf/gKZA@public.gmane.org>\0"
  "Subject\0Re: NFS/TCP/IPv6 acting strangely in 4.2\0"
  "Date\0Thu, 17 Sep 2015 10:18:29 -0400\0"
- "To\0Russell King - ARM Linux <linux@arm.linux.org.uk>"
- " AnnaSchumaker <anna.schumaker@netapp.com>\0"
- "Cc\0netdev@vger.kernel.org"
-  linux-nfs@vger.kernel.org
-  linux-arm-kernel@lists.infradead.org
- " Eric Dumazet <eric.dumazet@gmail.com>\0"
+ "To\0Russell King - ARM Linux <linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org>"
+ " AnnaSchumaker <anna.schumaker-HgOvQuBEEgTQT0dZR+AlfA@public.gmane.org>\0"
+ "Cc\0netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
+  linux-nfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
+  linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
+ " Eric Dumazet <eric.dumazet-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>\0"
  "\00:1\0"
  "b\0"
  "Hi Russell,\n"
@@ -85,6 +86,124 @@
  "more than once (which could otherwise still happen in the TCP_CLOSE\n"
  "case).\n"
  "\n"
- 8<-------------------------------------------------------------------
+ "8<-------------------------------------------------------------------\n"
+ "From 4dbfdebbc09982a9248866f8256549456e2b2efd Mon Sep 17 00:00:00 2001\n"
+ "From: Trond Myklebust <trond.myklebust-7I+n7zu2hftEKMMhf/gKZA@public.gmane.org>\n"
+ "Date: Wed, 16 Sep 2015 23:43:17 -0400\n"
+ "Subject: [PATCH] SUNRPC: Ensure that we wait for connections to complete\n"
+ " before retrying\n"
+ "\n"
+ "Commit 718ba5b87343, moved the responsibility for unlocking the socket to\n"
+ "xs_tcp_setup_socket, meaning that the socket will be unlocked before we\n"
+ "know that it has finished trying to connect. The following patch is based on\n"
+ "an initial patch by Russell King to ensure that we delay clearing the\n"
+ "XPRT_SOCK_CONNECTING flag until we either know that we failed to initiate\n"
+ "a connection attempt, or the connection attempt itself failed.\n"
+ "\n"
+ "Fixes: 718ba5b87343 (\"SUNRPC: Add helpers to prevent socket create from racing\")\n"
+ "Reported-by: Russell King <linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org>\n"
+ "Signed-off-by: Trond Myklebust <trond.myklebust-7I+n7zu2hftEKMMhf/gKZA@public.gmane.org>\n"
+ "---\n"
+ " include/linux/sunrpc/xprtsock.h |  3 +++\n"
+ " net/sunrpc/xprtsock.c           | 11 ++++++++---\n"
+ " 2 files changed, 11 insertions(+), 3 deletions(-)\n"
+ "\n"
+ "diff --git a/include/linux/sunrpc/xprtsock.h b/include/linux/sunrpc/xprtsock.h\n"
+ "index 7591788e9fbf..357e44c1a46b 100644\n"
+ "--- a/include/linux/sunrpc/xprtsock.h\n"
+ "+++ b/include/linux/sunrpc/xprtsock.h\n"
+ "@@ -42,6 +42,7 @@ struct sock_xprt {\n"
+ " \t/*\n"
+ " \t * Connection of transports\n"
+ " \t */\n"
+ "+\tunsigned long\t\tsock_state;\n"
+ " \tstruct delayed_work\tconnect_worker;\n"
+ " \tstruct sockaddr_storage\tsrcaddr;\n"
+ " \tunsigned short\t\tsrcport;\n"
+ "@@ -76,6 +77,8 @@ struct sock_xprt {\n"
+ "  */\n"
+ " #define TCP_RPC_REPLY\t\t(1UL << 6)\n"
+ " \n"
+ "+#define XPRT_SOCK_CONNECTING\t1U\n"
+ "+\n"
+ " #endif /* __KERNEL__ */\n"
+ " \n"
+ " #endif /* _LINUX_SUNRPC_XPRTSOCK_H */\n"
+ "diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c\n"
+ "index 7be90bc1a7c2..5bac27983e2a 100644\n"
+ "--- a/net/sunrpc/xprtsock.c\n"
+ "+++ b/net/sunrpc/xprtsock.c\n"
+ "@@ -1435,6 +1435,7 @@ out:\n"
+ " static void xs_tcp_state_change(struct sock *sk)\n"
+ " {\n"
+ " \tstruct rpc_xprt *xprt;\n"
+ "+\tstruct sock_xprt *transport;\n"
+ " \n"
+ " \tread_lock_bh(&sk->sk_callback_lock);\n"
+ " \tif (!(xprt = xprt_from_sock(sk)))\n"
+ "@@ -1446,13 +1447,12 @@ static void xs_tcp_state_change(struct sock *sk)\n"
+ " \t\t\tsock_flag(sk, SOCK_ZAPPED),\n"
+ " \t\t\tsk->sk_shutdown);\n"
+ " \n"
+ "+\ttransport = container_of(xprt, struct sock_xprt, xprt);\n"
+ " \ttrace_rpc_socket_state_change(xprt, sk->sk_socket);\n"
+ " \tswitch (sk->sk_state) {\n"
+ " \tcase TCP_ESTABLISHED:\n"
+ " \t\tspin_lock(&xprt->transport_lock);\n"
+ " \t\tif (!xprt_test_and_set_connected(xprt)) {\n"
+ "-\t\t\tstruct sock_xprt *transport = container_of(xprt,\n"
+ "-\t\t\t\t\tstruct sock_xprt, xprt);\n"
+ " \n"
+ " \t\t\t/* Reset TCP record info */\n"
+ " \t\t\ttransport->tcp_offset = 0;\n"
+ "@@ -1461,6 +1461,8 @@ static void xs_tcp_state_change(struct sock *sk)\n"
+ " \t\t\ttransport->tcp_flags =\n"
+ " \t\t\t\tTCP_RCV_COPY_FRAGHDR | TCP_RCV_COPY_XID;\n"
+ " \t\t\txprt->connect_cookie++;\n"
+ "+\t\t\tclear_bit(XPRT_SOCK_CONNECTING, &transport->sock_state);\n"
+ "+\t\t\txprt_clear_connecting(xprt);\n"
+ " \n"
+ " \t\t\txprt_wake_pending_tasks(xprt, -EAGAIN);\n"
+ " \t\t}\n"
+ "@@ -1496,6 +1498,9 @@ static void xs_tcp_state_change(struct sock *sk)\n"
+ " \t\tsmp_mb__after_atomic();\n"
+ " \t\tbreak;\n"
+ " \tcase TCP_CLOSE:\n"
+ "+\t\tif (test_and_clear_bit(XPRT_SOCK_CONNECTING,\n"
+ "+\t\t\t\t\t&transport->sock_state))\n"
+ "+\t\t\txprt_clear_connecting(xprt);\n"
+ " \t\txs_sock_mark_closed(xprt);\n"
+ " \t}\n"
+ "  out:\n"
+ "@@ -2179,6 +2184,7 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)\n"
+ " \t/* Tell the socket layer to start connecting... */\n"
+ " \txprt->stat.connect_count++;\n"
+ " \txprt->stat.connect_start = jiffies;\n"
+ "+\tset_bit(XPRT_SOCK_CONNECTING, &transport->sock_state);\n"
+ " \tret = kernel_connect(sock, xs_addr(xprt), xprt->addrlen, O_NONBLOCK);\n"
+ " \tswitch (ret) {\n"
+ " \tcase 0:\n"
+ "@@ -2240,7 +2246,6 @@ static void xs_tcp_setup_socket(struct work_struct *work)\n"
+ " \tcase -EINPROGRESS:\n"
+ " \tcase -EALREADY:\n"
+ " \t\txprt_unlock_connect(xprt, transport);\n"
+ "-\t\txprt_clear_connecting(xprt);\n"
+ " \t\treturn;\n"
+ " \tcase -EINVAL:\n"
+ " \t\t/* Happens, for instance, if the user specified a link\n"
+ "-- \n"
+ "2.4.3\n"
+ "\n"
+ "-- \n"
+ "Trond Myklebust\n"
+ "Linux NFS client maintainer, PrimaryData\n"
+ "trond.myklebust-7I+n7zu2hftEKMMhf/gKZA@public.gmane.org\n"
+ "\n"
+ "\n"
+ "\n"
+ "--\n"
+ "To unsubscribe from this list: send the line \"unsubscribe linux-nfs\" in\n"
+ "the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org\n"
+ More majordomo info at  http://vger.kernel.org/majordomo-info.html
 
-19cd03fe4ed8c49a2c4f2eabb141ca7fc155452e23f3921e3f71e8660c4c3fe3
+ce51449a3bd83a66f64cad353758bb5b15c1778ea0fdc607eaacf817f8db6230

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.