From: Jeffrey Altman Date: Mon, 23 Jan 2006 21:13:19 +0000 (+0000) Subject: check-host-optimize-20060123 X-Git-Tag: openafs-devel-1_5_0~80 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=ff40c87da3ce4c6a7a58c08eaa223e8760dc8f73;p=packages%2Fo%2Fopenafs.git check-host-optimize-20060123 There should never be a case where h_Enumerate calls CheckHost with a host whose callback_rxcon that is NULL. However, due to a bug it ended up being the case that it happened. An examination of the CheckHost code showed that the check for the HOSTDELETED flag should take place before a reference to callback_rxcon is obtained. If HOSTDELETED were set, the code would simply release the reference immediately. However, the process of obtaining and releasing the reference required dropping and obtaining locks that would be a performance hit. --- diff --git a/src/viced/host.c b/src/viced/host.c index fad570a49..142f90075 100644 --- a/src/viced/host.c +++ b/src/viced/host.c @@ -2218,9 +2218,9 @@ CheckHost(register struct host *host, int held) } if (host->LastCall < checktime) { h_Lock_r(host); - cb_conn = host->callback_rxcon; - rx_GetConnection(cb_conn); if (!(host->hostFlags & HOSTDELETED)) { + cb_conn = host->callback_rxcon; + rx_GetConnection(cb_conn); if (host->LastCall < clientdeletetime) { host->hostFlags |= HOSTDELETED; if (!(host->hostFlags & VENUSDOWN)) { @@ -2285,11 +2285,11 @@ CheckHost(register struct host *host, int held) } } } + H_UNLOCK; + rx_PutConnection(cb_conn); + cb_conn=NULL; + H_LOCK; } - H_UNLOCK; - rx_PutConnection(cb_conn); - cb_conn=NULL; - H_LOCK; h_Unlock_r(host); } H_UNLOCK;