[NTOS:CC]
authorThomas Faber <thomas.faber@reactos.org>
Mon, 17 Apr 2017 18:37:12 +0000 (18:37 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Mon, 17 Apr 2017 18:37:12 +0000 (18:37 +0000)
- 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

index d0f3a38..40476d5 100644 (file)
@@ -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);
 }