- 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
IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL)
{
NTSTATUS Status;
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);
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)
Status = CcRosReleaseFileCache(FileObject);
if (UninitializeCompleteEvent)
KeSetEvent(&UninitializeCompleteEvent->Event, IO_NO_INCREMENT, FALSE);
KeSetEvent(&UninitializeCompleteEvent->Event, IO_NO_INCREMENT, FALSE);
return NT_SUCCESS(Status);
}
return NT_SUCCESS(Status);
}