Author: rmacklem
Date: Wed Jun 10 19:02:09 2009
New Revision: 193942
URL: http://svn.freebsd.org/changeset/base/193942

Log:
  For the case where another thread was doing a connect and that
  connect failed, the thread would be left stuck in msleep()
  indefinitely, since it would call msleep() again for the case
  where rc_client == NULL. Change the loop criteria and the if just
  after the loop, so that this case is handled correctly.
  
  Reviewed by:  dfr
  Approved by:  kib (mentor)

Modified:
  head/sys/rpc/clnt_rc.c

Modified: head/sys/rpc/clnt_rc.c
==============================================================================
--- head/sys/rpc/clnt_rc.c      Wed Jun 10 18:27:15 2009        (r193941)
+++ head/sys/rpc/clnt_rc.c      Wed Jun 10 19:02:09 2009        (r193942)
@@ -154,7 +154,7 @@ again:
                return (RPC_CANTSEND);
        }
        if (rc->rc_connecting) {
-               while (!rc->rc_closed && !rc->rc_client) {
+               while (!rc->rc_closed && !rc->rc_client && rc->rc_connecting) {
                        error = msleep(rc, &rc->rc_lock,
                            rc->rc_intr ? PCATCH : 0, "rpcrecon", 0);
                        if (error) {
@@ -166,7 +166,7 @@ again:
                 * If the other guy failed to connect, we might as
                 * well have another go.
                 */
-               if (!rc->rc_client && !rc->rc_connecting)
+               if (!rc->rc_client || rc->rc_closed)
                        goto again;
                mtx_unlock(&rc->rc_lock);
                return (RPC_SUCCESS);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to