Skip to content

Commit de84d89

Browse files
committed
SUNRPC: TCP/UDP always close the old socket before reconnecting
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>
1 parent 718ba5b commit de84d89

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

net/sunrpc/xprtsock.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2081,8 +2081,6 @@ static void xs_udp_setup_socket(struct work_struct *work)
20812081
struct socket *sock = transport->sock;
20822082
int status = -EIO;
20832083

2084-
/* Start by resetting any existing state */
2085-
xs_reset_transport(transport);
20862084
sock = xs_create_sock(xprt, transport,
20872085
xs_addr(xprt)->sa_family, SOCK_DGRAM,
20882086
IPPROTO_UDP, false);
@@ -2328,6 +2326,9 @@ static void xs_connect(struct rpc_xprt *xprt, struct rpc_task *task)
23282326

23292327
WARN_ON_ONCE(!xprt_lock_connect(xprt, task, transport));
23302328

2329+
/* Start by resetting any existing state */
2330+
xs_reset_transport(transport);
2331+
23312332
if (transport->sock != NULL && !RPC_IS_SOFTCONN(task)) {
23322333
dprintk("RPC: xs_connect delayed xprt %p for %lu "
23332334
"seconds\n",

0 commit comments

Comments
 (0)