From: Jeffrey Altman Date: Wed, 9 Nov 2005 03:05:33 +0000 (+0000) Subject: STABLE14-windows-release-locks-at-shutdown-20051108 X-Git-Tag: openafs-stable-1_4_1-rc2~27 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=9dbe65fcc670ece937e27e75af503ebd2aaf0f49;p=packages%2Fo%2Fopenafs.git 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) --- diff --git a/src/WINNT/afsd/afsd_service.c b/src/WINNT/afsd/afsd_service.c index ad334c1e9..a2c39454d 100644 --- a/src/WINNT/afsd/afsd_service.c +++ b/src/WINNT/afsd/afsd_service.c @@ -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 diff --git a/src/WINNT/afsd/cm_vnodeops.c b/src/WINNT/afsd/cm_vnodeops.c index ad45849d9..99266f39b 100644 --- a/src/WINNT/afsd/cm_vnodeops.c +++ b/src/WINNT/afsd/cm_vnodeops.c @@ -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); + } + } + } +} diff --git a/src/WINNT/afsd/cm_vnodeops.h b/src/WINNT/afsd/cm_vnodeops.h index 569f69880..bb2c2aadb 100644 --- a/src/WINNT/afsd/cm_vnodeops.h +++ b/src/WINNT/afsd/cm_vnodeops.h @@ -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);