windows-callback-missing-bang-20080108
[openafs.git] / src / WINNT / afsd / cm_callback.c
index 866f8d2..baf23b2 100644 (file)
@@ -32,6 +32,8 @@ osi_rwlock_t cm_callbackLock;
 
 afs_int32 cm_OfflineROIsValid = 0;
 
+afs_int32 cm_giveUpAllCBs = 0;
+
 #ifdef AFS_FREELANCE_CLIENT
 extern osi_mutex_t cm_Freelance_Lock;
 #endif
@@ -353,7 +355,7 @@ SRXAFSCB_CallBack(struct rx_call *callp, AFSCBFids *fidsArrayp, AFSCBs *cbsArray
     unsigned long host = 0;
     unsigned short port = 0;
     cm_server_t *tsp = NULL;
-    cm_cell_t * cellp = NULL;
+    cm_cell_t* cellp = NULL;
 
     MUTEX_ENTER(&callp->lock);
 
@@ -364,11 +366,20 @@ SRXAFSCB_CallBack(struct rx_call *callp, AFSCBFids *fidsArrayp, AFSCBs *cbsArray
         tsp = cm_FindServerByIP(host, CM_SERVER_FILE);
         if (tsp)
             cellp = tsp->cellp;
+
+        if (!cellp)
+            osi_Log2(afsd_logp, "SRXAFSCB_CallBack from host 0x%x port %d",
+                     ntohl(host),
+                     ntohs(port));
+        else 
+            osi_Log3(afsd_logp, "SRXAFSCB_CallBack from host 0x%x port %d for cell %s",
+                     ntohl(host),
+                     ntohs(port),
+                     cellp->name /* does not need to be saved, doesn't change */);
+    } else {
+        osi_Log0(afsd_logp, "SRXAFSCB_CallBack from unknown host");
     }
 
-    osi_Log2(afsd_logp, "SRXAFSCB_CallBack from host 0x%x port %d",
-              ntohl(host),
-              ntohs(port));
 
     for (i=0; i < (long) fidsArrayp->AFSCBFids_len; i++) {
         tfidp = &fidsArrayp->AFSCBFids_val[i];
@@ -744,7 +755,7 @@ SRXAFSCB_GetCE(struct rx_call *callp, long index, AFSDBCacheEntry *cep)
     cep->lock.pid_writer = 0;
     cep->lock.src_indicator = 0;
     cep->Length = scp->length.LowPart;
-    cep->DataVersion = scp->dataVersion;
+    cep->DataVersion = (afs_uint32)(scp->dataVersion & 0xFFFFFFFF);
     cep->callback = afs_data_pointer_to_int32(scp->cbServerp);
     if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp)
         cep->cbExpires = scp->volp->cbExpiresRO;
@@ -858,7 +869,7 @@ SRXAFSCB_GetCE64(struct rx_call *callp, long index, AFSDBCacheEntry64 *cep)
 #else
     cep->Length = (afs_int64) scp->length.QuadPart;
 #endif
-    cep->DataVersion = scp->dataVersion;
+    cep->DataVersion = (afs_uint32)(scp->dataVersion & 0xFFFFFFFF);
     cep->callback = afs_data_pointer_to_int32(scp->cbServerp);
     if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp)
         cep->cbExpires = scp->volp->cbExpiresRO;
@@ -1836,7 +1847,7 @@ void cm_CheckCBExpiration(void)
         
     osi_Log0(afsd_logp, "CheckCBExpiration");
 
-    now = osi_Time();
+    now = time(NULL);
     lock_ObtainWrite(&cm_scacheLock);
     for (i=0; i<cm_data.scacheHashTableSize; i++) {
         for (scp = cm_data.scacheHashTablep[i]; scp; scp=scp->nextp) {
@@ -1899,8 +1910,6 @@ cm_GiveUpAllCallbacks(cm_server_t *tsp, afs_int32 markDown)
                 tsp->downTime = osi_Time();
             }
             cm_ForceNewConnections(tsp);
-            lock_ReleaseMutex(&tsp->mx);
-
             /* Now update the volume status */
             for (tsrvp = tsp->vols; tsrvp; tsrvp = tsrvp->nextp) {
                 for (i=0; i<NUM_SERVER_VOLS; i++) {
@@ -1918,6 +1927,7 @@ cm_GiveUpAllCallbacks(cm_server_t *tsp, afs_int32 markDown)
                     }
                 }
             }
+            lock_ReleaseMutex(&tsp->mx);
         }
     }
 }
@@ -1927,6 +1937,9 @@ cm_GiveUpAllCallbacksAllServers(afs_int32 markDown)
 {
     cm_server_t *tsp;
 
+    if (!cm_giveUpAllCBs)
+        return;
+
     lock_ObtainWrite(&cm_serverLock);
     for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
         cm_GetServerNoLock(tsp);