windows-revoke-callback-20070619
authorJeffrey Altman <jaltman@secure-endpoints.com>
Tue, 19 Jun 2007 21:10:56 +0000 (21:10 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Tue, 19 Jun 2007 21:10:56 +0000 (21:10 +0000)
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
src/WINNT/afsd/cm_server.c
src/WINNT/afsd/cm_server.h

index be93ebe..1b694ec 100644 (file)
@@ -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);
index 54a1a25..827f65b 100644 (file)
@@ -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;
+}
+
index 5387247..ba07030 100644 (file)
@@ -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__ */