From 807a9aa7b20ab4f457f5235513a5ab15828d6e5c Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Fri, 1 Aug 2008 22:35:06 +0000 Subject: [PATCH] windows-scache-deadlock-20080801 LICENSE MIT do not recycle a deleted scache object unless the refcount is 0 --- src/WINNT/afsd/cm_scache.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) 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); } } -- 2.39.5