STABLE14-windows-release-locks-at-shutdown-20051108

remember to release all of the locks we obtained from the file server
at shutdown.


(cherry picked from commit 685ba16a0b9db8cf5df2e875ff9a6e5b72d6539c)
This commit is contained in:
Jeffrey Altman 2005-11-09 03:05:33 +00:00
parent 9398a1a9c6
commit 9dbe65fcc6
3 changed files with 47 additions and 5 deletions

View 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

View 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);
}
}
}
}

View 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);