From: Jeffrey Altman Date: Sun, 4 Jun 2006 07:12:52 +0000 (+0000) Subject: STABLE14-viced-swap-old-cbcon-diff-20060603 X-Git-Tag: openafs-stable-1_4_2-beta1~12 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=eaff719ec41d4d7bc1722ef50125bd38730a2283;p=packages%2Fo%2Fopenafs.git STABLE14-viced-swap-old-cbcon-diff-20060603 FIXES 32985 swap cbconn when other side changes IPs (cherry picked from commit b30dcf9738d7fa87f8da4afa1f024376130b80a9) --- diff --git a/src/viced/host.c b/src/viced/host.c index a6f69a36f..eec6a1415 100644 --- a/src/viced/host.c +++ b/src/viced/host.c @@ -1359,6 +1359,8 @@ h_GetHost_r(struct rx_connection *tcon) * the list of interfaces for the existing host and * delete the host structure we just allocated. */ if (oldHost->host != haddr || oldHost->port != hport) { + struct rx_connection *rxconn; + ViceLog(25, ("CB: new addr %s:%d for old host %s:%d\n", afs_inet_ntoa_r(haddr, hoststr), @@ -1394,6 +1396,30 @@ h_GetHost_r(struct rx_connection *tcon) addInterfaceAddr_r(oldHost, haddr, hport); oldHost->host = haddr; oldHost->port = hport; + rxconn = oldHost->callback_rxcon; + oldHost->callback_rxcon = host->callback_rxcon; + host->callback_rxcon = NULL; + + if (rxconn) { + struct client *client; + /* + * If rx_DestroyConnection calls h_FreeConnection we will + * deadlock on the host_glock_mutex. Work around the problem + * by unhooking the client from the connection before + * destroying the connection. + */ + client = rx_GetSpecific(rxconn, rxcon_client_key); + if (client) { + if (client->tcon != rxconn) + ViceLog(0,("CB: client %x tcon %x didn't match rxconn %x\n", client, client->tcon, rxconn)); + else { + rx_PutConnection(client->tcon); + client->tcon = NULL; + } + } + rx_SetSpecific(rxconn, rxcon_client_key, (void *)0); + rx_DestroyConnection(rxconn); + } } host->hostFlags |= HOSTDELETED; h_Unlock_r(host);