]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
STABLE14-windows-release-locks-at-shutdown-20051108
authorJeffrey Altman <jaltman@secure-endpoints.com>
Wed, 9 Nov 2005 03:05:33 +0000 (03:05 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Wed, 9 Nov 2005 03:05:33 +0000 (03:05 +0000)
remember to release all of the locks we obtained from the file server
at shutdown.

(cherry picked from commit 685ba16a0b9db8cf5df2e875ff9a6e5b72d6539c)

src/WINNT/afsd/afsd_service.c
src/WINNT/afsd/cm_vnodeops.c
src/WINNT/afsd/cm_vnodeops.h

index ad334c1e96ab17ee178046934768152c1f00623d..a2c39454d5614ea443a12ea37372df5ab9f441c2 100644 (file)
@@ -1351,6 +1351,11 @@ afsd_Main(DWORD argc, LPTSTR *argv)
                                          
     RpcShutdown();                       
 
+    cm_ReleaseAllLocks();
+
+    rx_Finalize();
+    afsi_log("rx finalization complete");
+
     cm_ShutdownMappedMemory();           
 
 #ifdef REGISTER_POWER_NOTIFICATIONS
index ad45849d9d02389ed73609f429592aa7a7760028..99266f39b13ea2daeef85ec47fab22063b2bd013 100644 (file)
@@ -3589,10 +3589,10 @@ static int cm_KeyEquals(cm_key_t k1, cm_key_t k2, int flags);
 
 /* Called with scp->mx held */
 long cm_UnlockByKey(cm_scache_t * scp,
-                    cm_key_t key,
-                    int flags,
-                    cm_user_t * userp,
-                    cm_req_t * reqp)
+                   cm_key_t key,
+                   int flags,
+                   cm_user_t * userp,
+                    cm_req_t * reqp)
 {
     long code = 0;
     AFSFid tfid;
@@ -4520,3 +4520,38 @@ static int cm_KeyEquals(cm_key_t k1, cm_key_t k2, int flags)
         return (k1 == k2);
     }
 }
+
+void cm_ReleaseAllLocks(void)
+{
+    cm_scache_t *scp;
+    cm_req_t req;
+    cm_user_t *userp;
+    cm_key_t   key;
+    cm_file_lock_t *fileLock;
+    int i;
+
+    for (i = 0; i < cm_data.hashTableSize; i++)
+    {
+       for ( scp = cm_data.hashTablep[i]; scp; scp = scp->nextp ) {
+           while (scp->fileLocksH != NULL) {
+               lock_ObtainMutex(&scp->mx);
+               lock_ObtainWrite(&cm_scacheLock);
+               if (!scp->fileLocksH) {
+                   lock_ReleaseWrite(&cm_scacheLock);
+                   lock_ReleaseMutex(&scp->mx);
+                   break;
+               }
+               fileLock = (cm_file_lock_t *)((char *) scp->fileLocksH - offsetof(cm_file_lock_t, fileq));
+               userp = fileLock->userp;
+               cm_HoldUser(userp);
+               key = fileLock->key;
+               cm_HoldSCacheNoLock(scp);
+               lock_ReleaseWrite(&cm_scacheLock);
+               cm_UnlockByKey(scp, key, 0, userp, &req);
+               cm_ReleaseSCache(scp);
+               cm_ReleaseUser(userp);
+               lock_ReleaseMutex(&scp->mx);
+           }
+       }
+    }
+}
index 569f698808998b14b87972936f0455313c04de5a..bb2c2aadb4260b1bd47a70cf4f058667921a5e74 100644 (file)
@@ -172,7 +172,9 @@ extern long cm_LockCheckWrite(cm_scache_t *scp,
         LARGE_INTEGER LLength,
         cm_key_t key);
 
-extern void cm_CheckLocks();
+extern void cm_CheckLocks(void);
+
+extern void cm_ReleaseAllLocks(void);
 
 extern long cm_RetryLock(cm_file_lock_t *oldFileLock, int client_is_dead);