[Trusty][SRU][PATCH] SUNRPC: TCP/UDP always close the old socket before reconnecting
Chris J Arges
chris.j.arges at canonical.com
Wed Jul 15 19:52:54 UTC 2015
From: Trond Myklebust <trond.myklebust at primarydata.com>
BugLink: http://bugs.launchpad.net/bugs/1403152
It is not safe to call xs_reset_transport() from inside xs_udp_setup_socket()
or xs_tcp_setup_socket(), since they do not own the correct locks. Instead,
do it in xs_connect().
Signed-off-by: Trond Myklebust <trond.myklebust at primarydata.com>
(backported from commit de84d89030fa4efa44c02c96c8b4a8176042c4ff)
Signed-off-by: Chris J Arges <chris.j.arges at canonical.com>
Conflicts:
net/sunrpc/xprtsock.c
---
net/sunrpc/xprtsock.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
index cad4a95..7d2f0ce 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -2048,8 +2048,6 @@ static void xs_udp_setup_socket(struct work_struct *work)
current->flags |= PF_FSTRANS;
- /* Start by resetting any existing state */
- xs_reset_transport(transport);
sock = xs_create_sock(xprt, transport,
xs_addr(xprt)->sa_family, SOCK_DGRAM, IPPROTO_UDP);
if (IS_ERR(sock))
@@ -2288,6 +2286,9 @@ static void xs_connect(struct rpc_xprt *xprt, struct rpc_task *task)
{
struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
+ /* Start by resetting any existing state */
+ xs_reset_transport(transport);
+
if (transport->sock != NULL && !RPC_IS_SOFTCONN(task)) {
dprintk("RPC: xs_connect delayed xprt %p for %lu "
"seconds\n",
--
1.9.1
More information about the kernel-team
mailing list