buf_InsertToRedirQueue(cm_scache_t *scp, cm_buf_t *bufp)
{
lock_AssertWrite(&buf_globalLock);
- if (scp)
- lock_AssertWrite(&scp->rw);
+
+ lock_ObtainMutex(&scp->redirMx);
if (bufp->qFlags & CM_BUF_QINLRU) {
_InterlockedAnd(&bufp->qFlags, ~CM_BUF_QINLRU);
scp->redirLastAccess = bufp->redirLastAccess;
InterlockedIncrement(&scp->redirBufCount);
}
+
+ lock_ReleaseMutex(&scp->redirMx);
}
void
buf_RemoveFromRedirQueue(cm_scache_t *scp, cm_buf_t *bufp)
{
lock_AssertWrite(&buf_globalLock);
- if (scp)
- lock_AssertWrite(&scp->rw);
+
+ lock_ObtainMutex(&scp->redirMx);
_InterlockedAnd(&bufp->qFlags, ~CM_BUF_QREDIR);
osi_QRemoveHT( (osi_queue_t **) &cm_data.buf_redirListp,
&bufp->redirq);
InterlockedDecrement(&scp->redirBufCount);
}
+
+ lock_ReleaseMutex(&scp->redirMx);
}
void
osi_assertx(bufp->qFlags & CM_BUF_QREDIR,
"buf_MoveToHeadOfRedirQueue buffer not held by redirector");
- if (scp)
- lock_AssertWrite(&scp->rw);
+ lock_ObtainMutex(&scp->redirMx);
osi_QRemoveHT( (osi_queue_t **) &cm_data.buf_redirListp,
(osi_queue_t **) &cm_data.buf_redirListEndp,
&bufp->redirq);
scp->redirLastAccess = bufp->redirLastAccess;
}
+
+ lock_ReleaseMutex(&scp->redirMx);
}
#ifdef USE_BPLUS
lock_InitializeRWLock(&scp->dirlock, "cm_scache_t dirlock", LOCK_HIERARCHY_SCACHE_DIRLOCK);
#endif
+ lock_InitializeMutex(&scp->redirMx, "cm_scache_t redirMx", LOCK_HIERARCHY_SCACHE_REDIRMX);
scp->serverLock = -1;
/* and put it in the LRU queue */
lock_InitializeRWLock(&cm_data.fakeSCache.rw, "cm_scache_t rw", LOCK_HIERARCHY_SCACHE);
lock_InitializeRWLock(&cm_data.fakeSCache.bufCreateLock, "cm_scache_t bufCreateLock", LOCK_HIERARCHY_SCACHE_BUFCREATE);
lock_InitializeRWLock(&cm_data.fakeSCache.dirlock, "cm_scache_t dirlock", LOCK_HIERARCHY_SCACHE_DIRLOCK);
+ lock_InitializeMutex(&cm_data.fakeSCache.redirMx, "cm_scache_t redirMx", LOCK_HIERARCHY_SCACHE_REDIRMX);
}
long
#endif
lock_FinalizeRWLock(&scp->rw);
lock_FinalizeRWLock(&scp->bufCreateLock);
+ lock_FinalizeMutex(&scp->redirMx);
}
lock_ReleaseWrite(&cm_scacheLock);
scp->redirBufCount = 0;
scp->redirQueueT = NULL;
scp->redirQueueH = NULL;
+ lock_InitializeMutex(&scp->redirMx, "cm_scache_t redirMx", LOCK_HIERARCHY_SCACHE_REDIRMX);
}
}
cm_allFileLocks = NULL;
code = cm_GetBuffer(scp, bufp, NULL, userp, reqp);
if (code == 0) {
- if (bufp->flags & CM_BUF_DIRTY) {
- if (rwheld) {
- lock_ReleaseWrite(&scp->rw);
- rwheld = 0;
- }
- cm_BufWrite(scp, &bufp->offset, cm_chunkSize, 0, userp, reqp);
- }
+ if (bufp->flags & CM_BUF_DIRTY)
+ cm_BufWrite(scp, &bufp->offset, cm_chunkSize, CM_BUF_WRITE_SCP_LOCKED, userp, reqp);
if (!(bufp->qFlags & CM_BUF_QREDIR)) {
#ifdef VALIDATE_CHECK_SUM
char dbgstr[1024];
#endif
#endif
- if (!rwheld) {
- lock_ObtainWrite(&scp->rw);
- rwheld = 1;
- }
lock_ObtainWrite(&buf_globalLock);
if (!(bufp->flags & CM_BUF_DIRTY) &&
bufp->cmFlags == 0 &&
!(bufp->qFlags & CM_BUF_QREDIR)) {
buf_InsertToRedirQueue(scp, bufp);
lock_ReleaseWrite(&buf_globalLock);
- lock_ReleaseWrite(&scp->rw);
- rwheld = 0;
#ifdef VALIDATE_CHECK_SUM
buf_ComputeCheckSum(bufp);
osi_Log4(afsd_logp, "RDR_BkgFetch Extent2FS Already held by Redirector bufp 0x%p foffset 0x%p coffset 0x%p len 0x%x",
bufp, bufp->offset.QuadPart, bufp->datap - RDR_extentBaseAddress, cm_data.blockSize);
}
-
- if (rwheld) {
- lock_ReleaseWrite(&scp->rw);
- rwheld = 0;
- }
-
} else {
/*
* depending on what the error from cm_GetBuffer is
char dbgstr[1024];
#endif
#endif
- lock_ObtainWrite(&scp->rw);
lock_ObtainWrite(&buf_globalLock);
if (!(bufp->qFlags & CM_BUF_QREDIR)) {
buf_InsertToRedirQueue(scp, bufp);
lock_ReleaseWrite(&buf_globalLock);
- lock_ReleaseWrite(&scp->rw);
#ifdef VALIDATE_CHECK_SUM
buf_ComputeCheckSum(bufp);
* However, we know the buffer is in recent use so move the buffer to the
* front of the queue
*/
- lock_ObtainWrite(&scp->rw);
lock_ObtainWrite(&buf_globalLock);
buf_MoveToHeadOfRedirQueue(scp, bufp);
lock_ReleaseWrite(&buf_globalLock);
- lock_ReleaseWrite(&scp->rw);
osi_Log4(afsd_logp, "RDR_RequestFileExtentsAsync Extent2FS Already held by Redirector bufp 0x%p foffset 0x%p coffset 0x%p len 0x%x",
bufp, ByteOffset.QuadPart, bufp->datap - RDR_extentBaseAddress, cm_data.blockSize);
pExtent->CacheOffset.LowPart);
/* Move the buffer to the front of the queue */
- if (scp)
- lock_ObtainWrite(&scp->rw);
lock_ObtainWrite(&buf_globalLock);
buf_MoveToHeadOfRedirQueue(scp, bufp);
lock_ReleaseWrite(&buf_globalLock);
- if (scp)
- lock_ReleaseWrite(&scp->rw);
buf_Release(bufp);
continue;
}
(pExtent->Flags & AFS_EXTENT_FLAG_RELEASE) )
{
if (bufp->qFlags & CM_BUF_QREDIR) {
- if (scp)
- lock_ObtainWrite(&scp->rw);
lock_ObtainWrite(&buf_globalLock);
if (bufp->qFlags & CM_BUF_QREDIR) {
buf_RemoveFromRedirQueue(scp, bufp);
- lock_ReleaseWrite(&scp->rw);
buf_ReleaseLocked(bufp, TRUE);
- } else {
- if (scp)
- lock_ReleaseWrite(&scp->rw);
}
- if (scp)
- lock_ReleaseWrite(&buf_globalLock);
+ lock_ReleaseWrite(&buf_globalLock);
}
#ifdef ODS_DEBUG
snprintf( dbgstr, 1024,
pExtent->CacheOffset.LowPart);
/* Move the buffer to the front of the queue */
- if (scp)
- lock_ObtainWrite(&scp->rw);
lock_ObtainWrite(&buf_globalLock);
buf_MoveToHeadOfRedirQueue(scp, bufp);
lock_ReleaseWrite(&buf_globalLock);
- if (scp)
- lock_ReleaseWrite(&scp->rw);
buf_Release(bufp);
continue;
}
(pExtent->Flags & AFS_EXTENT_FLAG_RELEASE) )
{
if (bufp->qFlags & CM_BUF_QREDIR) {
- if (scp)
- lock_ObtainWrite(&scp->rw);
lock_ObtainWrite(&buf_globalLock);
if (bufp->qFlags & CM_BUF_QREDIR) {
buf_RemoveFromRedirQueue(scp, bufp);
- if (scp)
- lock_ReleaseWrite(&scp->rw);
buf_ReleaseLocked(bufp, TRUE);
- } else {
- if (scp)
- lock_ReleaseWrite(&scp->rw);
}
lock_ReleaseWrite(&buf_globalLock);
}
lock_ObtainMutex(&bufp->mx);
if (bufp->qFlags & CM_BUF_QREDIR) {
- if (scp)
- lock_ObtainWrite(&scp->rw);
lock_ObtainWrite(&buf_globalLock);
if (bufp->qFlags & CM_BUF_QREDIR) {
buf_RemoveFromRedirQueue(scp, bufp);
- if (scp)
- lock_ReleaseWrite(&scp->rw);
buf_ReleaseLocked(bufp, TRUE);
- } else {
- if (scp)
- lock_ReleaseWrite(&scp->rw);
}
lock_ReleaseWrite(&buf_globalLock);
}