From: Jeffrey Altman Date: Fri, 1 Aug 2008 22:36:05 +0000 (+0000) Subject: DEVEL15-windows-scache-deadlock-20080801 X-Git-Tag: openafs-devel-1_5_52~43 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=8f4cb5f8ad6a61a70854f17d4fa9410c05a885b0;p=packages%2Fo%2Fopenafs.git DEVEL15-windows-scache-deadlock-20080801 LICENSE MIT do not recycle a deleted scache object unless the refcount is 0 (cherry picked from commit 807a9aa7b20ab4f457f5235513a5ab15828d6e5c) --- diff --git a/src/WINNT/afsd/cm_scache.c b/src/WINNT/afsd/cm_scache.c index 1f023af2e..1ac0e680d 100644 --- a/src/WINNT/afsd/cm_scache.c +++ b/src/WINNT/afsd/cm_scache.c @@ -1821,19 +1821,18 @@ void cm_ReleaseSCacheNoLock(cm_scache_t *scp) afsi_log("%s:%d cm_ReleaseSCacheNoLock scp 0x%p ref %d", file, line, scp, refCount); #endif - if (scp->flags & CM_SCACHEFLAG_DELETED) { + if (refCount == 0 && (scp->flags & CM_SCACHEFLAG_DELETED)) { int deleted = 0; + if (lockstate != OSI_RWLOCK_WRITEHELD) + lock_ConvertRToW(&cm_scacheLock); lock_ObtainWrite(&scp->rw); if (scp->flags & CM_SCACHEFLAG_DELETED) deleted = 1; lock_ReleaseWrite(&scp->rw); - if (deleted) { - if (lockstate != OSI_RWLOCK_WRITEHELD) - lock_ConvertRToW(&cm_scacheLock); + if (refCount == 0 && deleted) cm_RecycleSCache(scp, 0); - if (lockstate != OSI_RWLOCK_WRITEHELD) - lock_ConvertWToR(&cm_scacheLock); - } + if (lockstate != OSI_RWLOCK_WRITEHELD) + lock_ConvertWToR(&cm_scacheLock); } }