From d7d8de3041da75e8dbfef27a153660086370780c Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Tue, 19 Jun 2007 21:10:56 +0000 Subject: [PATCH] windows-revoke-callback-20070619 If the we can match up the host address from which the revoke was received with one of our cm_server_t objects, then we know which cell the revoke has been received from. With that information we can ensure that we only revoke the status of cm_scache_t objects belonging to that cell. --- src/WINNT/afsd/cm_callback.c | 16 ++++++++++++---- src/WINNT/afsd/cm_server.c | 15 +++++++++++++++ src/WINNT/afsd/cm_server.h | 2 ++ 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/WINNT/afsd/cm_callback.c b/src/WINNT/afsd/cm_callback.c index be93ebe25..1b694ec07 100644 --- a/src/WINNT/afsd/cm_callback.c +++ b/src/WINNT/afsd/cm_callback.c @@ -161,7 +161,7 @@ void cm_CallbackNotifyChange(cm_scache_t *scp) * * The callp parameter is currently unused. */ -void cm_RevokeCallback(struct rx_call *callp, AFSFid *fidp) +void cm_RevokeCallback(struct rx_call *callp, cm_cell_t * cellp, AFSFid *fidp) { cm_fid_t tfid; cm_scache_t *scp; @@ -195,6 +195,7 @@ void cm_RevokeCallback(struct rx_call *callp, AFSFid *fidp) if (scp->fid.volume == tfid.volume && scp->fid.vnode == tfid.vnode && scp->fid.unique == tfid.unique && + (cellp == NULL || scp->fid.cell == cellp->cellID) && scp->cbExpires > 0 && scp->cbServerp != NULL) { @@ -221,7 +222,7 @@ void cm_RevokeCallback(struct rx_call *callp, AFSFid *fidp) * * Called with no locks held. */ -void cm_RevokeVolumeCallback(struct rx_call *callp, AFSFid *fidp) +void cm_RevokeVolumeCallback(struct rx_call *callp, cm_cell_t *cellp, AFSFid *fidp) { long hash; cm_scache_t *scp; @@ -243,6 +244,7 @@ void cm_RevokeVolumeCallback(struct rx_call *callp, AFSFid *fidp) for (hash = 0; hash < cm_data.scacheHashTableSize; hash++) { for(scp=cm_data.scacheHashTablep[hash]; scp; scp=scp->nextp) { if (scp->fid.volume == fidp->Volume && + (cellp == NULL || scp->fid.cell == cellp->cellID) && scp->cbExpires > 0 && scp->cbServerp != NULL) { cm_HoldSCacheNoLock(scp); @@ -339,12 +341,18 @@ SRXAFSCB_CallBack(struct rx_call *callp, AFSCBFids *fidsArrayp, AFSCBs *cbsArray struct rx_peer *peerp; unsigned long host = 0; unsigned short port = 0; + cm_server_t *tsp = NULL; + cm_cell_t * cellp = NULL; MUTEX_ENTER(&callp->lock); if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) { host = rx_HostOf(peerp); port = rx_PortOf(peerp); + + tsp = cm_FindServerByIP(host); + if (tsp) + cellp = tsp->cellp; } osi_Log2(afsd_logp, "SRXAFSCB_CallBack from host 0x%x port %d", @@ -357,9 +365,9 @@ SRXAFSCB_CallBack(struct rx_call *callp, AFSCBFids *fidsArrayp, AFSCBs *cbsArray if (tfidp->Volume == 0) continue; /* means don't do anything */ else if (tfidp->Vnode == 0) - cm_RevokeVolumeCallback(callp, tfidp); + cm_RevokeVolumeCallback(callp, cellp, tfidp); else - cm_RevokeCallback(callp, tfidp); + cm_RevokeCallback(callp, cellp, tfidp); } MUTEX_EXIT(&callp->lock); diff --git a/src/WINNT/afsd/cm_server.c b/src/WINNT/afsd/cm_server.c index 54a1a2577..827f65b6f 100644 --- a/src/WINNT/afsd/cm_server.c +++ b/src/WINNT/afsd/cm_server.c @@ -711,3 +711,18 @@ void cm_FreeServerList(cm_serverRef_t** list, afs_uint32 flags) lock_ReleaseWrite(&cm_serverLock); } +cm_server_t * +cm_FindServerByIP(afs_uint32 ipaddr) +{ + cm_server_t *tsp; + + lock_ObtainRead(&cm_serverLock); + for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) { + if (tsp->addr.sin_addr.S_un.S_addr == ipaddr) + break; + } + lock_ReleaseRead(&cm_serverLock); + + return tsp; +} + diff --git a/src/WINNT/afsd/cm_server.h b/src/WINNT/afsd/cm_server.h index 5387247dd..ba07030af 100644 --- a/src/WINNT/afsd/cm_server.h +++ b/src/WINNT/afsd/cm_server.h @@ -121,4 +121,6 @@ extern void cm_SetServerNo64Bit(cm_server_t * serverp, int no64bit); extern void cm_SetServerNoInlineBulk(cm_server_t * serverp, int no); +extern cm_server_t * cm_FindServerByIP(afs_uint32 addr); + #endif /* __CM_SERVER_H_ENV__ */ -- 2.39.5