From: Chuck Lever <cel@citi.umich.edu>

Make the socket transport kick the event queue to start socket connects
immediately.  This should improve responsiveness of applications that are
sensitive to slow mount operations (like automounters).

We are now also careful to cancel the connect worker before destroying the
xprt.  This eliminates a race where xprt_destroy can finish before the
connect worker is even allowed to run.

Test-plan:

Destructive testing (unplugging the network temporarily).  Connectathon
with UDP and TCP.  Hard-code impossibly small connect timeout.

Signed-off-by: Chuck Lever <cel@netapp.com>
Cc: Trond Myklebust <trond.myklebust@fys.uio.no>
Cc: Zwane Mwaikambo <zwane@arm.linux.org.uk>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 net/sunrpc/xprt.c |    9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletion(-)

diff -puN net/sunrpc/xprt.c~rpc-kick-off-socket-connect-operations-faster net/sunrpc/xprt.c
--- 25/net/sunrpc/xprt.c~rpc-kick-off-socket-connect-operations-faster	2005-05-02 19:07:29.000000000 -0700
+++ 25-akpm/net/sunrpc/xprt.c	2005-05-02 19:07:29.000000000 -0700
@@ -569,8 +569,11 @@ void xprt_connect(struct rpc_task *task)
 		if (xprt->sock != NULL)
 			schedule_delayed_work(&xprt->sock_connect,
 					RPC_REESTABLISH_TIMEOUT);
-		else
+		else {
 			schedule_work(&xprt->sock_connect);
+			if (!RPC_IS_ASYNC(task))
+				flush_scheduled_work();
+		}
 	}
 	return;
  out_write:
@@ -1667,6 +1670,10 @@ xprt_shutdown(struct rpc_xprt *xprt)
 	rpc_wake_up(&xprt->backlog);
 	wake_up(&xprt->cong_wait);
 	del_timer_sync(&xprt->timer);
+
+	/* synchronously wait for connect worker to finish */
+	cancel_delayed_work(&xprt->sock_connect);
+	flush_scheduled_work();
 }
 
 /*
_