diff mbox

[Utopic,SRU] SUNRPC: TCP/UDP always close the old socket before reconnecting

Message ID 1436989967-29601-1-git-send-email-chris.j.arges@canonical.com
State New
Headers show

Commit Message

Chris J Arges July 15, 2015, 7:52 p.m. UTC
From: Trond Myklebust <trond.myklebust@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@primarydata.com>
(backported from commit de84d89030fa4efa44c02c96c8b4a8176042c4ff)
Signed-off-by: Chris J Arges <chris.j.arges@canonical.com>

Conflicts:
	net/sunrpc/xprtsock.c
---
 net/sunrpc/xprtsock.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Comments

Tim Gardner July 15, 2015, 8 p.m. UTC | #1

Brad Figg July 15, 2015, 8:11 p.m. UTC | #2
Looks like a faithful backport.
Brad Figg July 15, 2015, 8:19 p.m. UTC | #3
Applied to the Utopic master-next branch
diff mbox

Patch

diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
index ab52cef..0c0bacf 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -2071,8 +2071,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))
@@ -2314,6 +2312,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",