https://git.reactos.org/?p=reactos.git;a=commitdiff;h=8bd980e483a1a9154922bf...
commit 8bd980e483a1a9154922bfa9bf96e1445575a894 Author: George Bișoc george.bisoc@reactos.org AuthorDate: Sun Jan 30 11:12:31 2022 +0100 Commit: George Bișoc george.bisoc@reactos.org CommitDate: Wed Feb 2 17:45:59 2022 +0100
[NTOS:CC] Unintialize private cache maps before purging the cache section
Before purging the data cache of a certain section of a file from system cache, we have to unintialize the private cache maps of that section if a filesystem or any other component prompts the kernel to do so. --- ntoskrnl/cc/fs.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-)
diff --git a/ntoskrnl/cc/fs.c b/ntoskrnl/cc/fs.c index bef6502f73f..14e3a4141a0 100644 --- a/ntoskrnl/cc/fs.c +++ b/ntoskrnl/cc/fs.c @@ -161,6 +161,7 @@ CcPurgeCacheSection ( IN BOOLEAN UninitializeCacheMaps) { PROS_SHARED_CACHE_MAP SharedCacheMap; + PPRIVATE_CACHE_MAP PrivateCacheMap; LONGLONG StartOffset; LONGLONG EndOffset; LIST_ENTRY FreeList; @@ -173,11 +174,7 @@ CcPurgeCacheSection ( CCTRACE(CC_API_DEBUG, "SectionObjectPointer=%p\n FileOffset=%p Length=%lu UninitializeCacheMaps=%d", SectionObjectPointer, FileOffset, Length, UninitializeCacheMaps);
- if (UninitializeCacheMaps) - { - DPRINT1("FIXME: CcPurgeCacheSection not uninitializing private cache maps\n"); - } - + /* Obtain the shared cache from the section */ SharedCacheMap = SectionObjectPointer->SharedCacheMap; if (!SharedCacheMap) { @@ -185,6 +182,28 @@ CcPurgeCacheSection ( goto purgeMm; }
+ 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) {