[NTOS:CC] Do not write behind concurrently the same file
authorJérôme Gardou <jerome.gardou@reactos.org>
Tue, 22 Dec 2020 10:31:51 +0000 (11:31 +0100)
committerJérôme Gardou <jerome.gardou@reactos.org>
Wed, 3 Feb 2021 08:41:23 +0000 (09:41 +0100)
ntoskrnl/cc/view.c
ntoskrnl/include/internal/cc.h

index 35d0df3..e6ac23c 100644 (file)
@@ -262,6 +262,15 @@ CcRosFlushDirtyPages (
 
         ASSERT(current->Dirty);
 
+        /* Do not lazy-write the same file concurrently. Fastfat ASSERTS on that */
+        if (current->SharedCacheMap->Flags & SHARED_CACHE_MAP_IN_LAZYWRITE)
+        {
+            CcRosVacbDecRefCount(current);
+            continue;
+        }
+
+        current->SharedCacheMap->Flags |= SHARED_CACHE_MAP_IN_LAZYWRITE;
+
         KeReleaseQueuedSpinLock(LockQueueMasterLock, OldIrql);
 
         Locked = current->SharedCacheMap->Callbacks->AcquireForLazyWrite(
@@ -272,6 +281,7 @@ CcRosFlushDirtyPages (
             ASSERT(!Wait);
             OldIrql = KeAcquireQueuedSpinLock(LockQueueMasterLock);
             CcRosVacbDecRefCount(current);
+            current->SharedCacheMap->Flags &= ~SHARED_CACHE_MAP_IN_LAZYWRITE;
             continue;
         }
 
@@ -287,6 +297,8 @@ CcRosFlushDirtyPages (
         CcRosVacbDecRefCount(current);
         OldIrql = KeAcquireQueuedSpinLock(LockQueueMasterLock);
 
+        current->SharedCacheMap->Flags &= ~SHARED_CACHE_MAP_IN_LAZYWRITE;
+
         if (!NT_SUCCESS(Status) && (Status != STATUS_END_OF_FILE) &&
             (Status != STATUS_MEDIA_WRITE_PROTECTED))
         {
index 862a759..65fd3fe 100644 (file)
@@ -200,6 +200,7 @@ typedef struct _ROS_SHARED_CACHE_MAP
 #define READAHEAD_DISABLED 0x1
 #define WRITEBEHIND_DISABLED 0x2
 #define SHARED_CACHE_MAP_IN_CREATION 0x4
+#define SHARED_CACHE_MAP_IN_LAZYWRITE 0x8
 
 typedef struct _ROS_VACB
 {