]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
rx-cleanup-deadlock-and-refcnt-leak-20020121
authorNickolai Zeldovich <kolya@mit.edu>
Mon, 21 Jan 2002 18:05:26 +0000 (18:05 +0000)
committerDerrick Brashear <shadow@dementia.org>
Mon, 21 Jan 2002 18:05:26 +0000 (18:05 +0000)
The first part of the patch fixes a likely deadlock in the
case when we're destroying a client connection with active
calls.

The second part fixes a minor connection refcount leak in
my recent modification to protect against half-reachable
clients.

src/rx/rx.c

index 0e5df404658f14be463d8a03268120e23751372c..cbec10e76571fae25f2122bd757bf6fee7934555 100644 (file)
@@ -899,7 +899,7 @@ static void rxi_DestroyConnectionNoLock(conn)
                                   RX_CALL_REFCOUNT_DELAY);
                    if (call->state == RX_STATE_PRECALL ||
                        call->state == RX_STATE_ACTIVE) {
-                       rxi_SendDelayedAck(call->delayedAckEvent, call, 0);
+                       rxi_SendAck(call, 0, 0, 0, 0, RX_ACK_DELAY, 0);
                    } else {
                        rxi_AckAll((struct rxevent *)0, call, 0);
                    }
@@ -4285,12 +4285,15 @@ void rxi_ConnectionError(conn, error)
 {
     if (error) {
        register int i;
+       MUTEX_ENTER(&conn->conn_data_lock);
        if (conn->challengeEvent)
            rxevent_Cancel(conn->challengeEvent, (struct rx_call*)0, 0);
        if (conn->checkReachEvent) {
            rxevent_Cancel(conn->checkReachEvent, (struct rx_call*)0, 0);
            conn->checkReachEvent = 0;
+           conn->refCount--;
        }
+       MUTEX_EXIT(&conn->conn_data_lock);
        for (i=0; i<RX_MAXCALLS; i++) {
            struct rx_call *call = conn->call[i];
            if (call) {