[NTOS:CC] Simplify CcFlushCache implementation

This commit is contained in:
Jérôme Gardou 2021-01-05 10:45:39 +01:00
parent 9b6240ee03
commit 20fe42c9e9

View file

@ -899,62 +899,72 @@ CcFlushCache (
OUT PIO_STATUS_BLOCK IoStatus) OUT PIO_STATUS_BLOCK IoStatus)
{ {
PROS_SHARED_CACHE_MAP SharedCacheMap; PROS_SHARED_CACHE_MAP SharedCacheMap;
LARGE_INTEGER Offset; LONGLONG FlushStart, FlushEnd;
LONGLONG RemainingLength;
PROS_VACB current;
NTSTATUS Status; NTSTATUS Status;
CCTRACE(CC_API_DEBUG, "SectionObjectPointers=%p FileOffset=0x%I64X Length=%lu\n", CCTRACE(CC_API_DEBUG, "SectionObjectPointers=%p FileOffset=0x%I64X Length=%lu\n",
SectionObjectPointers, FileOffset ? FileOffset->QuadPart : 0LL, Length); SectionObjectPointers, FileOffset ? FileOffset->QuadPart : 0LL, Length);
if (SectionObjectPointers && SectionObjectPointers->SharedCacheMap) if (!SectionObjectPointers || !SectionObjectPointers->SharedCacheMap)
{ {
SharedCacheMap = SectionObjectPointers->SharedCacheMap; Status = STATUS_INVALID_PARAMETER;
ASSERT(SharedCacheMap); goto quit;
if (FileOffset) }
{
Offset = *FileOffset;
RemainingLength = Length;
}
else
{
Offset.QuadPart = 0;
RemainingLength = SharedCacheMap->FileSize.QuadPart;
}
if (IoStatus) SharedCacheMap = SectionObjectPointers->SharedCacheMap;
{ ASSERT(SharedCacheMap);
IoStatus->Status = STATUS_SUCCESS; if (FileOffset)
IoStatus->Information = 0; {
} FlushStart = FileOffset->QuadPart;
Status = RtlLongLongAdd(FlushStart, Length, &FlushEnd);
while (RemainingLength > 0) if (!NT_SUCCESS(Status))
{ goto quit;
current = CcRosLookupVacb(SharedCacheMap, Offset.QuadPart);
if (current != NULL)
{
if (current->Dirty)
{
Status = CcRosFlushVacb(current);
if (!NT_SUCCESS(Status) && IoStatus != NULL)
{
IoStatus->Status = Status;
}
}
CcRosReleaseVacb(SharedCacheMap, current, FALSE, FALSE);
}
Offset.QuadPart += VACB_MAPPING_GRANULARITY;
RemainingLength -= min(RemainingLength, VACB_MAPPING_GRANULARITY);
}
} }
else else
{ {
if (IoStatus) FlushStart = 0;
FlushEnd = SharedCacheMap->FileSize.QuadPart;
}
Status = STATUS_SUCCESS;
if (IoStatus)
{
IoStatus->Information = 0;
}
while (FlushStart < FlushEnd)
{
PROS_VACB vacb = CcRosLookupVacb(SharedCacheMap, FlushStart);
if (vacb != NULL)
{ {
IoStatus->Status = STATUS_INVALID_PARAMETER; if (vacb->Dirty)
{
Status = CcRosFlushVacb(vacb);
if (!NT_SUCCESS(Status))
{
goto quit;
}
}
CcRosReleaseVacb(SharedCacheMap, vacb, FALSE, FALSE);
if (IoStatus)
IoStatus->Information += VACB_MAPPING_GRANULARITY;
} }
if (!NT_SUCCESS(RtlLongLongAdd(FlushStart, VACB_MAPPING_GRANULARITY, &FlushStart)))
{
/* We're at the end of file ! */
break;
}
}
quit:
if (IoStatus)
{
IoStatus->Status = Status;
} }
} }
@ -1188,7 +1198,7 @@ CcRosInitializeFileCache (
FileObject->SectionObjectPointer->SharedCacheMap = SharedCacheMap; FileObject->SectionObjectPointer->SharedCacheMap = SharedCacheMap;
// CcRosTraceCacheMap(SharedCacheMap, TRUE); //CcRosTraceCacheMap(SharedCacheMap, TRUE);
} }
else if (SharedCacheMap->Flags & SHARED_CACHE_MAP_IN_CREATION) else if (SharedCacheMap->Flags & SHARED_CACHE_MAP_IN_CREATION)
{ {