sunrpc: cancel delayed connect working after connceting success
Subsystems (3)
RFC PATCH 1/1 sunrpc: cancel delayed connect working after connceting success
The SUNRPC's TCP connecting is asynchronous, but the tcp_connect() only send a SYN but don't waiting for the ACK reply.
The below will cause a delayed connect working exist after connecting success.
CLIENT SERVER
1. The first connecting
|-xs_connect()
|-kernel_connect(O_NONBLOCK)
|-tcp_connet() -------- SYN ---------> xs_connect() return with EINPROGRESS and the ACK have not reply.
2. a reconnecting of 1
|-xs_connect()
queue_delayed_work(rpciod_workqueue,
&transport->connect_worker,
xprt->reestablish_timeout);
<---------------ACK SYN-------------- After the reconnecting have put the connect working to connect_worker, the ACK-SYN for the first connecting reply.
At this instance, a delayed connect working will be exist at connect_worker after connecting success, we should cancel the working.
Signed-off-by Mi Jinlong <[email protected]>
--- net/sunrpc/xprtsock.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-)
net/sunrpc/xprtsock.c +4 -0
@@ -1324,6 +1324,10 @@ static void xs_tcp_state_change(struct sock *sk) transport->tcp_flags =TCP_RCV_COPY_FRAGHDR |TCP_RCV_COPY_XID ; +if (xprt_connecting (xprt) && +cancel_delayed_work (&transport->connect_worker)) +xprt_clear_connecting (xprt); +xprt_wake_pending_tasks (xprt, -EAGAIN ); }spin_unlock_bh (&xprt->transport_lock);
-- 1.7.0