/* INCLUDES ******************************************************************/
#include <ntoskrnl.h>
+
#define NDEBUG
#include <debug.h>
-/* GLOBALS *****************************************************************/
-
-NTSTATUS CcRosInternalFreeVacb(PROS_VACB Vacb);
-
/* FUNCTIONS *****************************************************************/
/*
CcGetFileObjectFromBcb (
IN PVOID Bcb)
{
- PINTERNAL_BCB iBcb = (PINTERNAL_BCB)Bcb;
+ PINTERNAL_BCB iBcb = CONTAINING_RECORD(Bcb, INTERNAL_BCB, PFCB);
CCTRACE(CC_API_DEBUG, "Bcb=%p\n", Bcb);
IN BOOLEAN UninitializeCacheMaps)
{
PROS_SHARED_CACHE_MAP SharedCacheMap;
+ PPRIVATE_CACHE_MAP PrivateCacheMap;
LONGLONG StartOffset;
LONGLONG EndOffset;
LIST_ENTRY FreeList;
CCTRACE(CC_API_DEBUG, "SectionObjectPointer=%p\n FileOffset=%p Length=%lu UninitializeCacheMaps=%d",
SectionObjectPointer, FileOffset, Length, UninitializeCacheMaps);
- if (UninitializeCacheMaps)
+ /* Obtain the shared cache from the section */
+ SharedCacheMap = SectionObjectPointer->SharedCacheMap;
+ if (!SharedCacheMap)
{
- DPRINT1("FIXME: CcPurgeCacheSection not uninitializing private cache maps\n");
+ Success = TRUE;
+ goto purgeMm;
}
- SharedCacheMap = SectionObjectPointer->SharedCacheMap;
- if (!SharedCacheMap)
- return FALSE;
+ if (UninitializeCacheMaps)
+ {
+ /*
+ * We have gotten the acknowledgement that
+ * the caller wants to unintialize the private
+ * cache maps so let's do this. Since we already
+ * have the shared cache map from above, iterate
+ * over that cache's private lists.
+ */
+ while (!IsListEmpty(&SharedCacheMap->PrivateList))
+ {
+ /*
+ * This list is not empty, grab the
+ * private cache map.
+ */
+ PrivateCacheMap = CONTAINING_RECORD(SharedCacheMap->PrivateList.Flink, PRIVATE_CACHE_MAP, PrivateLinks);
+
+ /* Unintialize the private cache now */
+ CcUninitializeCacheMap(PrivateCacheMap->FileObject, NULL, NULL);
+ }
+ }
StartOffset = FileOffset != NULL ? FileOffset->QuadPart : 0;
if (Length == 0 || FileOffset == NULL)
ASSERT(Refs == 0);
}
+ /* Now make sure that Mm doesn't hold some pages here. */
+purgeMm:
+ if (Success)
+ Success = MmPurgeSegment(SectionObjectPointer, FileOffset, Length);
+
return Success;
}
IN PFILE_OBJECT FileObject,
IN PCC_FILE_SIZES FileSizes)
{
- KIRQL oldirql;
+ KIRQL OldIrql;
PROS_SHARED_CACHE_MAP SharedCacheMap;
+ LARGE_INTEGER OldSectionSize;
CCTRACE(CC_API_DEBUG, "FileObject=%p FileSizes=%p\n",
FileObject, FileSizes);
if (SharedCacheMap == NULL)
return;
- if (FileSizes->AllocationSize.QuadPart < SharedCacheMap->SectionSize.QuadPart)
+ /* Update the relevant fields */
+ KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &OldIrql);
+ OldSectionSize = SharedCacheMap->SectionSize;
+ SharedCacheMap->SectionSize = FileSizes->AllocationSize;
+ SharedCacheMap->FileSize = FileSizes->FileSize;
+ SharedCacheMap->ValidDataLength = FileSizes->ValidDataLength;
+ KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, OldIrql);
+
+ if (FileSizes->AllocationSize.QuadPart < OldSectionSize.QuadPart)
{
CcPurgeCacheSection(FileObject->SectionObjectPointer,
&FileSizes->AllocationSize,
0,
FALSE);
}
-
- KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &oldirql);
- SharedCacheMap->SectionSize = FileSizes->AllocationSize;
- SharedCacheMap->FileSize = FileSizes->FileSize;
- KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldirql);
+ else
+ {
+ /* Extend our section object */
+ MmExtendSection(SharedCacheMap->Section, &SharedCacheMap->SectionSize);
+ }
}
/*