[NTOS:CC]

- Unconditionally acquire the VACB lock during map/pin/unpin operations and release it appropriately
CORE-11555 #resolve
CORE-11654 CORE-11504 CORE-11328 #comment This might be fixed with r71993. Could you retry please?

svn path=/trunk/; revision=71993
This commit is contained in:
Thomas Faber 2016-07-25 08:48:50 +00:00
parent 45fe0d3a21
commit 5203dd99be
3 changed files with 12 additions and 29 deletions

View file

@ -185,10 +185,8 @@ CcPinRead (
ASSERT(iBcb->Pinned == FALSE);
iBcb->Pinned = TRUE;
if (InterlockedIncrement(&iBcb->Vacb->PinCount) == 1)
{
CcRosReleaseVacbLock(iBcb->Vacb);
}
iBcb->Vacb->PinCount++;
CcRosReleaseVacbLock(iBcb->Vacb);
if (Flags & PIN_EXCLUSIVE)
{
@ -281,10 +279,8 @@ CcUnpinDataForThread (
{
ExReleaseResourceForThreadLite(&iBcb->Lock, ResourceThreadId);
iBcb->Pinned = FALSE;
if (InterlockedDecrement(&iBcb->Vacb->PinCount) == 0)
{
CcRosAcquireVacbLock(iBcb->Vacb, NULL);
}
CcRosAcquireVacbLock(iBcb->Vacb, NULL);
iBcb->Vacb->PinCount--;
}
CcRosReleaseVacb(iBcb->Vacb->SharedCacheMap,
@ -355,10 +351,8 @@ CcUnpinRepinnedBcb (
{
ExReleaseResourceLite(&iBcb->Lock);
iBcb->Pinned = FALSE;
if (InterlockedDecrement(&iBcb->Vacb->PinCount) == 0)
{
CcRosAcquireVacbLock(iBcb->Vacb, NULL);
}
CcRosAcquireVacbLock(iBcb->Vacb, NULL);
iBcb->Vacb->PinCount--;
}
ExDeleteResourceLite(&iBcb->Lock);
ExFreeToNPagedLookasideList(&iBcbLookasideList, iBcb);

View file

@ -422,10 +422,7 @@ CcRosReleaseVacb (
KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldIrql);
KeReleaseGuardedMutex(&ViewLock);
if (InterlockedCompareExchange(&Vacb->PinCount, 0, 0) == 0)
{
CcRosReleaseVacbLock(Vacb);
}
CcRosReleaseVacbLock(Vacb);
return STATUS_SUCCESS;
}
@ -462,10 +459,7 @@ CcRosLookupVacb (
CcRosVacbIncRefCount(current);
KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldIrql);
KeReleaseGuardedMutex(&ViewLock);
if (InterlockedCompareExchange(&current->PinCount, 0, 0) == 0)
{
CcRosAcquireVacbLock(current, NULL);
}
CcRosAcquireVacbLock(current, NULL);
return current;
}
if (current->FileOffset.QuadPart > FileOffset)
@ -712,10 +706,7 @@ CcRosCreateVacb (
KeReleaseGuardedMutex(&ViewLock);
ExFreeToNPagedLookasideList(&VacbLookasideList, *Vacb);
*Vacb = current;
if (InterlockedCompareExchange(&current->PinCount, 0, 0) == 0)
{
CcRosAcquireVacbLock(current, NULL);
}
CcRosAcquireVacbLock(current, NULL);
return STATUS_SUCCESS;
}
if (current->FileOffset.QuadPart < FileOffset)
@ -945,10 +936,7 @@ CcFlushCache (
}
}
if (InterlockedCompareExchange(&current->PinCount, 0, 0) == 0)
{
CcRosReleaseVacbLock(current);
}
CcRosReleaseVacbLock(current);
KeAcquireGuardedMutex(&ViewLock);
KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &oldIrql);

View file

@ -185,7 +185,8 @@ typedef struct _ROS_VACB
/* Number of references. */
ULONG ReferenceCount;
/* How many times was it pinned? */
volatile LONG PinCount;
_Guarded_by_(Mutex)
LONG PinCount;
/* Pointer to the shared cache map for the file which this view maps data for. */
PROS_SHARED_CACHE_MAP SharedCacheMap;
/* Pointer to the next VACB in a chain. */