From: Jeffrey Altman Date: Mon, 15 Aug 2011 04:34:00 +0000 (-0400) Subject: Windows: cm_ShutdownSCache corrections X-Git-Tag: upstream/1.6.0^2~6 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=392ed2ae9883dd1f32284b7a244e8b8eec8debfc;p=packages%2Fo%2Fopenafs.git Windows: cm_ShutdownSCache corrections Obtain cm_scache.dirlock, cm_scache.rw and cm_scacheLock in the correct order. Do not release cm_scache.rw when it is not held. Since the cm_scacheLock is being dropped, preserve the value of scp->allNextp prior to dropping the lock. Reviewed-on: http://gerrit.openafs.org/5279 Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman (cherry picked from commit c58ae34f72d25434cd59228806ca59a6ff39a903) Change-Id: I65f3c4be5436031cdd99d912b0277b54d4033bf6 Reviewed-on: http://gerrit.openafs.org/5282 Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear --- diff --git a/src/WINNT/afsd/cm_scache.c b/src/WINNT/afsd/cm_scache.c index 90615b0d5..ef74caff4 100644 --- a/src/WINNT/afsd/cm_scache.c +++ b/src/WINNT/afsd/cm_scache.c @@ -580,18 +580,22 @@ cm_SuspendSCache(void) long cm_ShutdownSCache(void) { - cm_scache_t * scp; + cm_scache_t * scp, * nextp; lock_ObtainWrite(&cm_scacheLock); for ( scp = cm_data.allSCachesp; scp; - scp = scp->allNextp ) { + scp = nextp ) { + nextp = scp->allNextp; + lock_ReleaseWrite(&cm_scacheLock); +#ifdef USE_BPLUS + lock_ObtainWrite(&scp->dirlock); +#endif + lock_ObtainWrite(&scp->rw); + lock_ObtainWrite(&cm_scacheLock); + if (scp->randomACLp) { - lock_ReleaseWrite(&cm_scacheLock); - lock_ObtainWrite(&scp->rw); - lock_ObtainWrite(&cm_scacheLock); cm_FreeAllACLEnts(scp); - lock_ReleaseWrite(&scp->rw); } if (scp->cbServerp) { @@ -607,6 +611,7 @@ cm_ShutdownSCache(void) freeBtree(scp->dirBplus); scp->dirBplus = NULL; scp->dirDataVersion = CM_SCACHE_VERSION_BAD; + lock_ReleaseWrite(&scp->dirlock); lock_FinalizeRWLock(&scp->dirlock); #endif lock_FinalizeRWLock(&scp->rw);