DEVEL15-windows-lock-order-20080827
authorJeffrey Altman <jaltman@secure-endpoints.com>
Wed, 27 Aug 2008 13:18:04 +0000 (13:18 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Wed, 27 Aug 2008 13:18:04 +0000 (13:18 +0000)
LICENSE MIT

do not hold cm_scacheLock while obtaining cm_scache_t->rw

(cherry picked from commit c50857b05e6636bef864c9418b21d1bf3c63494a)

src/WINNT/afsd/cm_scache.c

index 486d0c2..d790989 100644 (file)
@@ -747,9 +747,11 @@ long cm_GetSCache(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp,
                 lock_ReleaseWrite(&cm_scacheLock);
                 return CM_ERROR_WOULDBLOCK;
             }
-        } else
+        } else {
+            lock_ReleaseWrite(&cm_scacheLock);
             lock_ObtainWrite(&scp->rw);
-
+            lock_ObtainWrite(&cm_scacheLock);
+        }
         scp->fid = *fidp;
         scp->dotdotFid.cell=AFS_FAKE_ROOT_CELL_ID;
         scp->dotdotFid.volume=AFS_FAKE_ROOT_VOL_ID;
@@ -778,12 +780,12 @@ long cm_GetSCache(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp,
         scp->bufDataVersionLow=cm_data.fakeDirVersion;
         scp->lockDataVersion=-1; /* no lock yet */
         lock_ReleaseWrite(&scp->rw);
+        lock_ReleaseWrite(&cm_scacheLock);
        *outScpp = scp;
 #ifdef DEBUG_REFCOUNT
        afsi_log("%s:%d cm_GetSCache (2) scp 0x%p ref %d", file, line, scp, scp->refCount);
        osi_Log1(afsd_logp,"cm_GetSCache (2) scp 0x%p", scp);
 #endif
-        lock_ReleaseWrite(&cm_scacheLock);
         return 0;
     }
     // end of yj code