[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)
{ {
Status = STATUS_INVALID_PARAMETER;
goto quit;
}
SharedCacheMap = SectionObjectPointers->SharedCacheMap; SharedCacheMap = SectionObjectPointers->SharedCacheMap;
ASSERT(SharedCacheMap); ASSERT(SharedCacheMap);
if (FileOffset) if (FileOffset)
{ {
Offset = *FileOffset; FlushStart = FileOffset->QuadPart;
RemainingLength = Length; Status = RtlLongLongAdd(FlushStart, Length, &FlushEnd);
if (!NT_SUCCESS(Status))
goto quit;
} }
else else
{ {
Offset.QuadPart = 0; FlushStart = 0;
RemainingLength = SharedCacheMap->FileSize.QuadPart; FlushEnd = SharedCacheMap->FileSize.QuadPart;
} }
Status = STATUS_SUCCESS;
if (IoStatus) if (IoStatus)
{ {
IoStatus->Status = STATUS_SUCCESS;
IoStatus->Information = 0; IoStatus->Information = 0;
} }
while (RemainingLength > 0) while (FlushStart < FlushEnd)
{ {
current = CcRosLookupVacb(SharedCacheMap, Offset.QuadPart); PROS_VACB vacb = CcRosLookupVacb(SharedCacheMap, FlushStart);
if (current != NULL)
if (vacb != NULL)
{ {
if (current->Dirty) if (vacb->Dirty)
{ {
Status = CcRosFlushVacb(current); Status = CcRosFlushVacb(vacb);
if (!NT_SUCCESS(Status) && IoStatus != NULL) if (!NT_SUCCESS(Status))
{ {
IoStatus->Status = Status; goto quit;
} }
} }
CcRosReleaseVacb(SharedCacheMap, current, FALSE, FALSE); CcRosReleaseVacb(SharedCacheMap, vacb, FALSE, FALSE);
if (IoStatus)
IoStatus->Information += VACB_MAPPING_GRANULARITY;
} }
Offset.QuadPart += VACB_MAPPING_GRANULARITY; if (!NT_SUCCESS(RtlLongLongAdd(FlushStart, VACB_MAPPING_GRANULARITY, &FlushStart)))
RemainingLength -= min(RemainingLength, VACB_MAPPING_GRANULARITY);
}
}
else
{ {
/* We're at the end of file ! */
break;
}
}
quit:
if (IoStatus) if (IoStatus)
{ {
IoStatus->Status = STATUS_INVALID_PARAMETER; 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)
{ {