]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
DEVEL15-windows-scache-deadlock-20080801
authorJeffrey Altman <jaltman@secure-endpoints.com>
Fri, 1 Aug 2008 22:36:05 +0000 (22:36 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Fri, 1 Aug 2008 22:36:05 +0000 (22:36 +0000)
LICENSE MIT

do not recycle a deleted scache object unless the refcount is 0

(cherry picked from commit 807a9aa7b20ab4f457f5235513a5ab15828d6e5c)

src/WINNT/afsd/cm_scache.c

index 1f023af2e1b617ef189ba855bef88faf4a798a2d..1ac0e680d78c4afee1829d0b08dbddadf598ae54 100644 (file)
@@ -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);
     }
 }