From: Rainer Toebbicke Date: Tue, 20 Jun 2006 15:50:17 +0000 (+0000) Subject: viced-deadlock-20060620 X-Git-Tag: BP-openafs-windows-kdfs-ifs~1265 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=efd74baa950133de6ed92b7395be6d14ef63a58e;p=packages%2Fo%2Fopenafs.git viced-deadlock-20060620 FIXES 34073 * checks for client == oldClient * drops the H_LOCK prior to obtaining the WriteLock on oldClient in order to prevent a deadlock --- diff --git a/src/viced/host.c b/src/viced/host.c index 6f1c55912..0d5447b34 100644 --- a/src/viced/host.c +++ b/src/viced/host.c @@ -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",