From 4677d6bfe0764670349c2ac1197f1343ae4248bd Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Mon, 17 Apr 2017 18:37:12 +0000 Subject: [PATCH] [NTOS:CC] - Respect the TruncateSize parameter in CcUninitializeCacheMap. Avoids "freeing dirty VACB" messages for cache views beyond the end of the file. CORE-12893 #resolve svn path=/trunk/; revision=74358 --- reactos/ntoskrnl/cc/fs.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/reactos/ntoskrnl/cc/fs.c b/reactos/ntoskrnl/cc/fs.c index d0f3a385dd1..40476d51eb6 100644 --- a/reactos/ntoskrnl/cc/fs.c +++ b/reactos/ntoskrnl/cc/fs.c @@ -286,13 +286,34 @@ CcUninitializeCacheMap ( IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL) { NTSTATUS Status; + PROS_SHARED_CACHE_MAP SharedCacheMap; + KIRQL OldIrql; CCTRACE(CC_API_DEBUG, "FileObject=%p TruncateSize=%p UninitializeCompleteEvent=%p\n", FileObject, TruncateSize, UninitializeCompleteEvent); + if (TruncateSize != NULL && + FileObject->SectionObjectPointer != NULL && + FileObject->SectionObjectPointer->SharedCacheMap != NULL) + { + SharedCacheMap = FileObject->SectionObjectPointer->SharedCacheMap; + KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &OldIrql); + if (SharedCacheMap->FileSize.QuadPart > TruncateSize->QuadPart) + { + SharedCacheMap->FileSize = *TruncateSize; + } + KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, OldIrql); + CcPurgeCacheSection(FileObject->SectionObjectPointer, + TruncateSize, + 0, + FALSE); + } + Status = CcRosReleaseFileCache(FileObject); if (UninitializeCompleteEvent) + { KeSetEvent(&UninitializeCompleteEvent->Event, IO_NO_INCREMENT, FALSE); + } return NT_SUCCESS(Status); }