windows-remove-give-up-callbacks-scache-recycling-20070627
[openafs.git] / src / WINNT / afsd / cm_scache.c
index d364654..c116369 100644 (file)
@@ -160,18 +160,17 @@ long cm_RecycleSCache(cm_scache_t *scp, afs_int32 flags)
     scp->bulkStatProgress = hzero;
     scp->waitCount = 0;
 
+    if (scp->cbServerp) {
+        cm_PutServer(scp->cbServerp);
+        scp->cbServerp = NULL;
+    }
+    scp->cbExpires = 0;
+
     scp->fid.vnode = 0;
     scp->fid.volume = 0;
     scp->fid.unique = 0;
     scp->fid.cell = 0;
 
-    /* discard callback */
-    if (scp->cbServerp) {
-       cm_PutServer(scp->cbServerp);
-       scp->cbServerp = NULL;
-    }
-    scp->cbExpires = 0;
-
     /* remove from dnlc */
     cm_dnlcPurgedp(scp);
     cm_dnlcPurgevp(scp);
@@ -447,11 +446,33 @@ cm_ValidateSCache(void)
     return cm_dnlcValidate();
 }
 
+void
+cm_SuspendSCache(void)
+{
+    cm_scache_t * scp;
+
+    cm_GiveUpAllCallbacksAllServers();
+
+    lock_ObtainWrite(&cm_scacheLock);
+    for ( scp = cm_data.allSCachesp; scp;
+          scp = scp->allNextp ) {
+        if (scp->cbServerp) {
+            cm_PutServer(scp->cbServerp);
+            scp->cbServerp = NULL;
+        }
+        scp->cbExpires = 0;
+        scp->flags &= ~CM_SCACHEFLAG_CALLBACK;
+    }
+    lock_ReleaseWrite(&cm_scacheLock);
+}
+
 long
 cm_ShutdownSCache(void)
 {
     cm_scache_t * scp;
 
+    lock_ObtainWrite(&cm_scacheLock);
+
     for ( scp = cm_data.allSCachesp; scp;
           scp = scp->allNextp ) {
         if (scp->randomACLp) {
@@ -459,9 +480,20 @@ cm_ShutdownSCache(void)
             cm_FreeAllACLEnts(scp);
             lock_ReleaseMutex(&scp->mx);
         }
+
+        if (scp->cbServerp) {
+            cm_PutServer(scp->cbServerp);
+            scp->cbServerp = NULL;
+        }
+        scp->cbExpires = 0;
+        scp->flags &= ~CM_SCACHEFLAG_CALLBACK;
+
         lock_FinalizeMutex(&scp->mx);
         lock_FinalizeRWLock(&scp->bufCreateLock);
     }
+    lock_ReleaseWrite(&cm_scacheLock);
+
+    cm_GiveUpAllCallbacksAllServers();
 
     return cm_dnlcShutdown();
 }
@@ -1594,13 +1626,10 @@ int cm_DumpSCache(FILE *outputFile, char *cookie, int lock)
   
     for (scp = cm_data.allSCachesp; scp; scp = scp->allNextp) 
     {
-        if (scp->refCount != 0)
-        {
-            sprintf(output, "%s scp=0x%p, fid (cell=%d, volume=%d, vnode=%d, unique=%d) refCount=%u\r\n", 
-                    cookie, scp, scp->fid.cell, scp->fid.volume, scp->fid.vnode, scp->fid.unique, 
-                    scp->refCount);
-            WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL);
-        }
+        sprintf(output, "%s scp=0x%p, fid (cell=%d, volume=%d, vnode=%d, unique=%d) volp=0x%p flags=0x%x refCount=%u\r\n", 
+                cookie, scp, scp->fid.cell, scp->fid.volume, scp->fid.vnode, scp->fid.unique, 
+                scp->volp, scp->flags, scp->refCount);
+        WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL);
     }
   
     sprintf(output, "%s - dumping cm_data.hashTable - cm_data.scacheHashTableSize=%d\r\n", cookie, cm_data.scacheHashTableSize);
@@ -1610,13 +1639,10 @@ int cm_DumpSCache(FILE *outputFile, char *cookie, int lock)
     {
         for(scp = cm_data.scacheHashTablep[i]; scp; scp=scp->nextp) 
         {
-            if (scp->refCount != 0)
-            {
-                sprintf(output, "%s scp=0x%p, hash=%d, fid (cell=%d, volume=%d, vnode=%d, unique=%d) refCount=%u\r\n", 
-                         cookie, scp, i, scp->fid.cell, scp->fid.volume, scp->fid.vnode, 
-                         scp->fid.unique, scp->refCount);
-                WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL);
-            }
+            sprintf(output, "%s scp=0x%p, hash=%d, fid (cell=%d, volume=%d, vnode=%d, unique=%d) volp=0x%p flags=0x%x refCount=%u\r\n", 
+                    cookie, scp, i, scp->fid.cell, scp->fid.volume, scp->fid.vnode, 
+                    scp->fid.unique, scp->volp, scp->flags, scp->refCount);
+            WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL);
         }
     }