From: Jeffrey Altman Date: Fri, 15 Aug 2008 21:17:02 +0000 (+0000) Subject: windows-freelance-deadlock-20080815 X-Git-Tag: openafs-devel-1_5_61~889 X-Git-Url: https://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=20d38bc268b13258e2358591756824d712cdb403 windows-freelance-deadlock-20080815 LICENSE MIT avoid a deadlock in cm_reInitLockMountPoints() and make the function useful again by actually using the index value in the construction of the FIDs --- diff --git a/src/WINNT/afsd/cm_freelance.c b/src/WINNT/afsd/cm_freelance.c index 211eb0d..4899ab0 100644 --- a/src/WINNT/afsd/cm_freelance.c +++ b/src/WINNT/afsd/cm_freelance.c @@ -381,40 +381,42 @@ int cm_reInitLocalMountPoints() { osi_Log0(afsd_logp,"Invalidating local mount point scp... "); - cm_SetFid(&aFid, AFS_FAKE_ROOT_CELL_ID, AFS_FAKE_ROOT_VOL_ID, 1, 1); lock_ObtainWrite(&cm_scacheLock); lock_ObtainMutex(&cm_Freelance_Lock); /* always scache then freelance lock */ - for (i=0; inextp) { if (scp != cm_data.rootSCachep && cm_FidCmp(&scp->fid, &aFid) == 0) { // mark the scp to be reused cm_HoldSCacheNoLock(scp); + lock_ReleaseWrite(&cm_Freelance_Lock); lock_ReleaseWrite(&cm_scacheLock); lock_ObtainWrite(&scp->rw); cm_DiscardSCache(scp); - lock_ReleaseWrite(&scp->rw); - cm_CallbackNotifyChange(scp); - lock_ObtainWrite(&cm_scacheLock); - cm_ReleaseSCacheNoLock(scp); // take the scp out of the hash + lock_ObtainWrite(&cm_scacheLock); for (lscpp = &cm_data.scacheHashTablep[hash], tscp = cm_data.scacheHashTablep[hash]; tscp; lscpp = &tscp->nextp, tscp = tscp->nextp) { if (tscp == scp) { *lscpp = scp->nextp; scp->nextp = NULL; - lock_ObtainWrite(&scp->rw); scp->flags &= ~CM_SCACHEFLAG_INHASH; - lock_ReleaseWrite(&scp->rw); break; } } + + lock_ReleaseWrite(&scp->rw); + lock_ReleaseWrite(&cm_scacheLock); + cm_CallbackNotifyChange(scp); + lock_ObtainWrite(&cm_scacheLock); + cm_ReleaseSCacheNoLock(scp); + lock_ObtainMutex(&cm_Freelance_Lock); } } - cm_SetFid(&aFid, AFS_FAKE_ROOT_CELL_ID, AFS_FAKE_ROOT_VOL_ID, aFid.vnode + 1, 1); } lock_ReleaseWrite(&cm_scacheLock); osi_Log0(afsd_logp,"\tall old scp cleared!");