Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 8 Nov 2009 19:02:13 +0000 (UTC)
From:      Rick Macklem <rmacklem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r199053 - head/sys/rpc
Message-ID:  <200911081902.nA8J2D9k094894@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rmacklem
Date: Sun Nov  8 19:02:13 2009
New Revision: 199053
URL: http://svn.freebsd.org/changeset/base/199053

Log:
  Add a check for the connection being shut down to the krpc
  client just before queuing a request for the connection. The
  code already had a check for the connection being shut down
  while the request was queued, but not one for the shut down
  having been initiated by the server before the request was
  in the queue. This appears to fix the problem of slow reconnects
  against an NFS server that drops inactive connections reported
  by Olaf Seibert, but does not fix the case
  where the FreeBSD client generates RST segments at about the
  same time as ACKs. This is still a problem that is being
  investigated. This patch does not cause a regression for this
  case.
  
  Tested by:	Olaf Seibert, Daniel Braniss
  Reviewed by:	dfr
  MFC after:	5 days

Modified:
  head/sys/rpc/clnt_vc.c

Modified: head/sys/rpc/clnt_vc.c
==============================================================================
--- head/sys/rpc/clnt_vc.c	Sun Nov  8 17:59:55 2009	(r199052)
+++ head/sys/rpc/clnt_vc.c	Sun Nov  8 19:02:13 2009	(r199053)
@@ -413,6 +413,22 @@ call_again:
 
 	cr->cr_xid = xid;
 	mtx_lock(&ct->ct_lock);
+	/*
+	 * Check to see if the other end has already started to close down
+	 * the connection. The upcall will have set ct_error.re_status
+	 * to RPC_CANTRECV if this is the case.
+	 * If the other end starts to close down the connection after this
+	 * point, it will be detected later when cr_error is checked,
+	 * since the request is in the ct_pending queue.
+	 */
+	if (ct->ct_error.re_status == RPC_CANTRECV) {
+		if (errp != &ct->ct_error) {
+			errp->re_errno = ct->ct_error.re_errno;
+			errp->re_status = RPC_CANTRECV;
+		}
+		stat = RPC_CANTRECV;
+		goto out;
+	}
 	TAILQ_INSERT_TAIL(&ct->ct_pending, cr, cr_link);
 	mtx_unlock(&ct->ct_lock);
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200911081902.nA8J2D9k094894>