Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit de84d890 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

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: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
parent 718ba5b8
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -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",