"invalid cm_scache_t address");
memset(scp, 0, sizeof(cm_scache_t));
scp->magic = CM_SCACHE_MAGIC;
- lock_InitializeMutex(&scp->mx, "cm_scache_t mutex");
+ lock_InitializeRWLock(&scp->rw, "cm_scache_t rw");
lock_InitializeRWLock(&scp->bufCreateLock, "cm_scache_t bufCreateLock");
#ifdef USE_BPLUS
lock_InitializeRWLock(&scp->dirlock, "cm_scache_t dirlock");
cm_data.fakeSCache.linkCount = 1;
cm_data.fakeSCache.refCount = 1;
}
- lock_InitializeMutex(&cm_data.fakeSCache.mx, "cm_scache_t mutex");
+ lock_InitializeRWLock(&cm_data.fakeSCache.rw, "cm_scache_t rw");
}
long
for ( i=0; i < cm_data.scacheHashTableSize; i++ ) {
for ( scp = cm_data.scacheHashTablep[i]; scp; scp = scp->nextp ) {
+ afs_uint32 hash;
+ hash = CM_SCACHE_HASH(&scp->fid);
if (scp->magic != CM_SCACHE_MAGIC) {
afsi_log("cm_ValidateSCache failure: scp->magic != CM_SCACHE_MAGIC");
fprintf(stderr, "cm_ValidateSCache failure: scp->magic != CM_SCACHE_MAGIC\n");
fprintf(stderr, "cm_ValidateSCache failure: scp->volp->magic != CM_VOLUME_MAGIC\n");
return -12;
}
+ if (hash != i) {
+ afsi_log("cm_ValidateSCache failure: scp hash != hash index");
+ fprintf(stderr, "cm_ValidateSCache failure: scp hash != hash index\n");
+ return -13;
+ }
}
}
for ( scp = cm_data.allSCachesp; scp;
scp = scp->allNextp ) {
if (scp->randomACLp) {
- lock_ObtainMutex(&scp->mx);
+ lock_ObtainWrite(&scp->rw);
cm_FreeAllACLEnts(scp);
- lock_ReleaseMutex(&scp->mx);
+ lock_ReleaseWrite(&scp->rw);
}
if (scp->cbServerp) {
scp->dirDataVersion = -1;
lock_FinalizeRWLock(&scp->dirlock);
#endif
- lock_FinalizeMutex(&scp->mx);
+ lock_FinalizeRWLock(&scp->rw);
lock_FinalizeRWLock(&scp->bufCreateLock);
}
lock_ReleaseWrite(&cm_scacheLock);
for ( scp = cm_data.allSCachesp; scp;
scp = scp->allNextp ) {
- lock_InitializeMutex(&scp->mx, "cm_scache_t mutex");
+ lock_InitializeRWLock(&scp->rw, "cm_scache_t rw");
lock_InitializeRWLock(&scp->bufCreateLock, "cm_scache_t bufCreateLock");
#ifdef USE_BPLUS
lock_InitializeRWLock(&scp->dirlock, "cm_scache_t dirlock");
* assume that no one else is using the one this is returned.
*/
lock_ReleaseWrite(&cm_scacheLock);
- lock_ObtainMutex(&scp->mx);
+ lock_ObtainWrite(&scp->rw);
lock_ObtainWrite(&cm_scacheLock);
#endif
scp->fid = *fidp;
scp->volp = cm_data.rootSCachep->volp;
- cm_GetVolume(scp->volp); /* grab an additional reference */
+ if (scp->volp)
+ cm_GetVolume(scp->volp); /* grab an additional reference */
scp->dotdotFid.cell=AFS_FAKE_ROOT_CELL_ID;
scp->dotdotFid.volume=AFS_FAKE_ROOT_VOL_ID;
scp->dotdotFid.unique=1;
scp->bufDataVersionLow=cm_data.fakeDirVersion;
scp->lockDataVersion=-1; /* no lock yet */
#if not_too_dangerous
- lock_ReleaseMutex(&scp->mx);
+ lock_ReleaseWrite(&scp->rw);
#endif
*outScpp = scp;
lock_ReleaseWrite(&cm_scacheLock);
* assume that no one else is using the one this is returned.
*/
lock_ReleaseWrite(&cm_scacheLock);
- lock_ObtainMutex(&scp->mx);
+ lock_ObtainWrite(&scp->rw);
lock_ObtainWrite(&cm_scacheLock);
#endif
scp->fid = *fidp;
scp->refCount = 1;
osi_Log1(afsd_logp,"cm_GetSCache sets refCount to 1 scp 0x%x", scp);
#if not_too_dangerous
- lock_ReleaseMutex(&scp->mx);
+ lock_ReleaseWrite(&scp->rw);
#endif
/* XXX - The following fields in the cm_scache are
lock_ReleaseMutex(&bufp->mx);
code = cm_GetCallback(scp, userp, reqp, (flags & CM_SCACHESYNC_FORCECB)?1:0);
if (bufLocked) {
- lock_ReleaseMutex(&scp->mx);
+ lock_ReleaseWrite(&scp->rw);
lock_ObtainMutex(&bufp->mx);
- lock_ObtainMutex(&scp->mx);
+ lock_ObtainWrite(&scp->rw);
}
if (code)
return code;
if (bufLocked) lock_ReleaseMutex(&bufp->mx);
code = cm_GetAccessRights(scp, userp, reqp);
if (bufLocked) {
- lock_ReleaseMutex(&scp->mx);
+ lock_ReleaseWrite(&scp->rw);
lock_ObtainMutex(&bufp->mx);
- lock_ObtainMutex(&scp->mx);
+ lock_ObtainWrite(&scp->rw);
}
if (code)
return code;
do {
if (bufLocked)
lock_ReleaseMutex(&bufp->mx);
- osi_SleepM((LONG_PTR) &scp->flags, &scp->mx);
+ osi_SleepW((LONG_PTR) &scp->flags, &scp->rw);
if (bufLocked)
lock_ObtainMutex(&bufp->mx);
- lock_ObtainMutex(&scp->mx);
+ lock_ObtainWrite(&scp->rw);
} while (!cm_SyncOpCheckContinue(scp, flags, bufp));
smb_UpdateServerPriority();
osi_queueData_t *qdp;
cm_buf_t *tbufp;
- lock_AssertMutex(&scp->mx);
+ lock_AssertWrite(&scp->rw);
/* now, update the recorded state for RPC-type calls */
if (flags & CM_SCACHESYNC_FETCHSTATUS)
*/
void cm_DiscardSCache(cm_scache_t *scp)
{
- lock_AssertMutex(&scp->mx);
+ lock_AssertWrite(&scp->rw);
if (scp->cbServerp) {
cm_PutServer(scp->cbServerp);
scp->cbServerp = NULL;