windows-scache-verification-20080307
[openafs.git] / src / WINNT / afsd / cm_scache.c
index 43a4401..edd0733 100644 (file)
@@ -318,7 +318,7 @@ cm_scache_t *cm_GetNewSCache(void)
                 "invalid cm_scache_t address");
     memset(scp, 0, sizeof(cm_scache_t));
     scp->magic = CM_SCACHE_MAGIC;
-    lock_InitializeMutex(&scp->mx, "cm_scache_t mutex");
+    lock_InitializeRWLock(&scp->rw, "cm_scache_t rw");
     lock_InitializeRWLock(&scp->bufCreateLock, "cm_scache_t bufCreateLock");
 #ifdef USE_BPLUS
     lock_InitializeRWLock(&scp->dirlock, "cm_scache_t dirlock");
@@ -374,7 +374,7 @@ void cm_fakeSCacheInit(int newFile)
         cm_data.fakeSCache.linkCount = 1;
         cm_data.fakeSCache.refCount = 1;
     }
-    lock_InitializeMutex(&cm_data.fakeSCache.mx, "cm_scache_t mutex");
+    lock_InitializeRWLock(&cm_data.fakeSCache.rw, "cm_scache_t rw");
 }
 
 long
@@ -461,6 +461,8 @@ cm_ValidateSCache(void)
 
     for ( i=0; i < cm_data.scacheHashTableSize; i++ ) {
         for ( scp = cm_data.scacheHashTablep[i]; scp; scp = scp->nextp ) {
+            afs_uint32 hash;
+            hash = CM_SCACHE_HASH(&scp->fid);
             if (scp->magic != CM_SCACHE_MAGIC) {
                 afsi_log("cm_ValidateSCache failure: scp->magic != CM_SCACHE_MAGIC");
                 fprintf(stderr, "cm_ValidateSCache failure: scp->magic != CM_SCACHE_MAGIC\n");
@@ -481,6 +483,11 @@ cm_ValidateSCache(void)
                 fprintf(stderr, "cm_ValidateSCache failure: scp->volp->magic != CM_VOLUME_MAGIC\n");
                 return -12;
             }
+            if (hash != i) {
+                afsi_log("cm_ValidateSCache failure: scp hash != hash index");
+                fprintf(stderr, "cm_ValidateSCache failure: scp hash != hash index\n");
+                return -13;
+            }
         }
     }
 
@@ -531,9 +538,9 @@ cm_ShutdownSCache(void)
     for ( scp = cm_data.allSCachesp; scp;
           scp = scp->allNextp ) {
         if (scp->randomACLp) {
-            lock_ObtainMutex(&scp->mx);
+            lock_ObtainWrite(&scp->rw);
             cm_FreeAllACLEnts(scp);
-            lock_ReleaseMutex(&scp->mx);
+            lock_ReleaseWrite(&scp->rw);
         }
 
         if (scp->cbServerp) {
@@ -550,7 +557,7 @@ cm_ShutdownSCache(void)
         scp->dirDataVersion = -1;
         lock_FinalizeRWLock(&scp->dirlock);
 #endif
-        lock_FinalizeMutex(&scp->mx);
+        lock_FinalizeRWLock(&scp->rw);
         lock_FinalizeRWLock(&scp->bufCreateLock);
     }
     lock_ReleaseWrite(&cm_scacheLock);
@@ -577,7 +584,7 @@ void cm_InitSCache(int newFile, long maxSCaches)
 
             for ( scp = cm_data.allSCachesp; scp;
                   scp = scp->allNextp ) {
-                lock_InitializeMutex(&scp->mx, "cm_scache_t mutex");
+                lock_InitializeRWLock(&scp->rw, "cm_scache_t rw");
                 lock_InitializeRWLock(&scp->bufCreateLock, "cm_scache_t bufCreateLock");
 #ifdef USE_BPLUS
                 lock_InitializeRWLock(&scp->dirlock, "cm_scache_t dirlock");
@@ -739,12 +746,13 @@ long cm_GetSCache(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp,
         * assume that no one else is using the one this is returned.
         */
        lock_ReleaseWrite(&cm_scacheLock);
-       lock_ObtainMutex(&scp->mx);
+       lock_ObtainWrite(&scp->rw);
        lock_ObtainWrite(&cm_scacheLock);
 #endif
         scp->fid = *fidp;
         scp->volp = cm_data.rootSCachep->volp;
-       cm_GetVolume(scp->volp);        /* grab an additional reference */
+        if (scp->volp)
+           cm_GetVolume(scp->volp);    /* grab an additional reference */
         scp->dotdotFid.cell=AFS_FAKE_ROOT_CELL_ID;
         scp->dotdotFid.volume=AFS_FAKE_ROOT_VOL_ID;
         scp->dotdotFid.unique=1;
@@ -770,7 +778,7 @@ long cm_GetSCache(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp,
         scp->bufDataVersionLow=cm_data.fakeDirVersion;
         scp->lockDataVersion=-1; /* no lock yet */
 #if not_too_dangerous
-       lock_ReleaseMutex(&scp->mx);
+       lock_ReleaseWrite(&scp->rw);
 #endif
        *outScpp = scp;
         lock_ReleaseWrite(&cm_scacheLock);
@@ -836,7 +844,7 @@ long cm_GetSCache(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp,
      * assume that no one else is using the one this is returned.
      */
     lock_ReleaseWrite(&cm_scacheLock);
-    lock_ObtainMutex(&scp->mx);
+    lock_ObtainWrite(&scp->rw);
     lock_ObtainWrite(&cm_scacheLock);
 #endif
     scp->fid = *fidp;
@@ -862,7 +870,7 @@ long cm_GetSCache(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp,
     scp->refCount = 1;
     osi_Log1(afsd_logp,"cm_GetSCache sets refCount to 1 scp 0x%x", scp);
 #if not_too_dangerous
-    lock_ReleaseMutex(&scp->mx);
+    lock_ReleaseWrite(&scp->rw);
 #endif
 
     /* XXX - The following fields in the cm_scache are 
@@ -1231,9 +1239,9 @@ long cm_SyncOp(cm_scache_t *scp, cm_buf_t *bufp, cm_user_t *userp, cm_req_t *req
                    lock_ReleaseMutex(&bufp->mx);
                 code = cm_GetCallback(scp, userp, reqp, (flags & CM_SCACHESYNC_FORCECB)?1:0);
                 if (bufLocked) {
-                    lock_ReleaseMutex(&scp->mx);
+                    lock_ReleaseWrite(&scp->rw);
                     lock_ObtainMutex(&bufp->mx);
-                    lock_ObtainMutex(&scp->mx);
+                    lock_ObtainWrite(&scp->rw);
                 }
                 if (code) 
                     return code;
@@ -1258,9 +1266,9 @@ long cm_SyncOp(cm_scache_t *scp, cm_buf_t *bufp, cm_user_t *userp, cm_req_t *req
                 if (bufLocked) lock_ReleaseMutex(&bufp->mx);
                 code = cm_GetAccessRights(scp, userp, reqp);
                 if (bufLocked) {
-                    lock_ReleaseMutex(&scp->mx);
+                    lock_ReleaseWrite(&scp->rw);
                     lock_ObtainMutex(&bufp->mx);
-                    lock_ObtainMutex(&scp->mx);
+                    lock_ObtainWrite(&scp->rw);
                 }
                 if (code) 
                     return code;
@@ -1301,10 +1309,10 @@ long cm_SyncOp(cm_scache_t *scp, cm_buf_t *bufp, cm_user_t *userp, cm_req_t *req
         do {
             if (bufLocked) 
                 lock_ReleaseMutex(&bufp->mx);
-            osi_SleepM((LONG_PTR) &scp->flags, &scp->mx);
+            osi_SleepW((LONG_PTR) &scp->flags, &scp->rw);
             if (bufLocked) 
                 lock_ObtainMutex(&bufp->mx);
-            lock_ObtainMutex(&scp->mx);
+            lock_ObtainWrite(&scp->rw);
         } while (!cm_SyncOpCheckContinue(scp, flags, bufp));
 
        smb_UpdateServerPriority();
@@ -1392,7 +1400,7 @@ void cm_SyncOpDone(cm_scache_t *scp, cm_buf_t *bufp, afs_uint32 flags)
     osi_queueData_t *qdp;
     cm_buf_t *tbufp;
 
-    lock_AssertMutex(&scp->mx);
+    lock_AssertWrite(&scp->rw);
 
     /* now, update the recorded state for RPC-type calls */
     if (flags & CM_SCACHESYNC_FETCHSTATUS)
@@ -1737,7 +1745,7 @@ void cm_MergeStatus(cm_scache_t *dscp,
  */
 void cm_DiscardSCache(cm_scache_t *scp)
 {
-    lock_AssertMutex(&scp->mx);
+    lock_AssertWrite(&scp->rw);
     if (scp->cbServerp) {
         cm_PutServer(scp->cbServerp);
        scp->cbServerp = NULL;