IoStatus->Information = 0;
if (WriteThrough)
{
+ KeEnterCriticalRegion();
ExAcquirePushLockExclusive(&iBcb->CacheSegment->Lock);
if (iBcb->CacheSegment->Dirty)
{
IoStatus->Status = STATUS_SUCCESS;
}
ExReleasePushLockExclusive(&iBcb->CacheSegment->Lock);
+ KeLeaveCriticalRegion();
}
else
{
KeReleaseSpinLock(&Bcb->BcbLock, oldIrql);
KeReleaseGuardedMutex(&ViewLock);
ExReleasePushLock(&CacheSeg->Lock);
+ KeLeaveCriticalRegion();
return(STATUS_SUCCESS);
}
{
CcRosCacheSegmentIncRefCount(current);
KeReleaseSpinLock(&Bcb->BcbLock, oldIrql);
+ KeEnterCriticalRegion();
ExAcquirePushLockExclusive(¤t->Lock);
return(current);
}
CacheSeg->Dirty = TRUE;
ExReleasePushLock(&CacheSeg->Lock);
+ KeLeaveCriticalRegion();
return(STATUS_SUCCESS);
}
KeReleaseSpinLock(&Bcb->BcbLock, oldIrql);
ExReleasePushLock(&CacheSeg->Lock);
+ KeLeaveCriticalRegion();
+
return(STATUS_SUCCESS);
}
current->DirtySegmentListEntry.Blink = NULL;
current->ReferenceCount = 1;
ExInitializePushLock(¤t->Lock);
+ KeEnterCriticalRegion();
ExAcquirePushLockExclusive(¤t->Lock);
KeAcquireGuardedMutex(&ViewLock);
KeReleaseGuardedMutex(&ViewLock);
ExFreeToNPagedLookasideList(&CacheSegLookasideList, *CacheSeg);
*CacheSeg = current;
- ExAcquirePushLockExclusive(¤t->Lock);
+ /* We're still in the critical region from above */
+ ExAcquirePushLockExclusive(¤t->Lock);
return STATUS_SUCCESS;
}
if (current->FileOffset < FileOffset)
IoStatus->Status = Status;
}
}
- KeAcquireSpinLock(&Bcb->BcbLock, &oldIrql);
ExReleasePushLock(¤t->Lock);
+ KeLeaveCriticalRegion();
+ KeAcquireSpinLock(&Bcb->BcbLock, &oldIrql);
CcRosCacheSegmentDecRefCount(current);
KeReleaseSpinLock(&Bcb->BcbLock, oldIrql);
}