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.