]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
viced-deadlock-20060620
authorRainer Toebbicke <rtb@pclella.cern.ch>
Tue, 20 Jun 2006 15:50:17 +0000 (15:50 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Tue, 20 Jun 2006 15:50:17 +0000 (15:50 +0000)
FIXES 34073

* checks for client == oldClient

* drops the H_LOCK prior to obtaining the WriteLock on oldClient
  in order to prevent a deadlock

src/viced/host.c

index 6f1c5591203014b53c92261b7e4a9680c6182604..0d5447b34f7bd77429f3af00beef9d12a1126921 100644 (file)
@@ -1796,7 +1796,7 @@ h_FindClient_r(struct rx_connection *tcon)
      * the RPC from the other client structure's rock.
      */
     oldClient = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
-    if (oldClient && oldClient->sid == rxr_CidOf(tcon)
+    if (oldClient && oldClient != client && oldClient->sid == rxr_CidOf(tcon)
        && oldClient->VenusEpoch == rxr_GetEpoch(tcon)) {
        char hoststr[16];
        if (!oldClient->deleted) {
@@ -1819,8 +1819,10 @@ h_FindClient_r(struct rx_connection *tcon)
                FreeCE(client);
                created = 0;
            } 
-           ObtainWriteLock(&oldClient->lock);
            oldClient->refCount++;
+           H_UNLOCK;
+           ObtainWriteLock(&oldClient->lock);
+           H_LOCK;
            client = oldClient;
        } else {
            ViceLog(0, ("FindClient: deleted client %x(%x) already had conn %x (host %s:%d), stolen by client %x(%x)\n",