Skip to contentSkip to conversation

sunrpc: cancel delayed connect working after connceting success

RFC PATCH New Mi Jinlong 1 participant 1 message Aug 24, 2010

Subsystems (3)
lore
Share & tools
lore

Mi Jinlong

author
#0 lore raw

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.

---
 net/sunrpc/xprtsock.c |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)
net/sunrpc/xprtsock.c +4 -0
index 49a62f0..823f1db 100644
@@ -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