SUNRPC: TCP/UDP always close the old socket before reconnecting
authorTrond Myklebust <trond.myklebust@primarydata.com>
Sun, 8 Feb 2015 21:49:48 +0000 (16:49 -0500)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Mon, 9 Feb 2015 02:47:30 +0000 (21:47 -0500)
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>
net/sunrpc/xprtsock.c

index e57d8ed2c4d8793bac3aaeaf03a1875f1217b24e..e53a5ca03daf46323f12a2a4312314f90825d34f 100644 (file)
@@ -2081,8 +2081,6 @@ static void xs_udp_setup_socket(struct work_struct *work)
        struct socket *sock = transport->sock;
        int status = -EIO;
 
-       /* 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, false);
@@ -2328,6 +2326,9 @@ static void xs_connect(struct rpc_xprt *xprt, struct rpc_task *task)
 
        WARN_ON_ONCE(!xprt_lock_connect(xprt, task, transport));
 
+       /* 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",