https://git.reactos.org/?p=reactos.git;a=commitdiff;h=8bd980e483a1a9154922b…
commit 8bd980e483a1a9154922bfa9bf96e1445575a894
Author:     George Bișoc <george.bisoc(a)reactos.org>
AuthorDate: Sun Jan 30 11:12:31 2022 +0100
Commit:     George Bișoc <george.bisoc(a)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)
     {