viced-swap-old-cbcon-diff-20060603

FIXES 32985

swap cbconn when other side changes IPs
This commit is contained in:
Jeffrey Altman 2006-06-04 07:11:53 +00:00 committed by Derrick Brashear
parent f4f09d1c03
commit b30dcf9738

View File

@ -1384,6 +1384,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),
@ -1419,6 +1421,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);