https://git.reactos.org/?p=reactos.git;a=commitdiff;h=e17f61138c60a09969f37a4022eb315ea19a1828

commit e17f61138c60a09969f37a4022eb315ea19a1828
Author:     Pierre Schweitzer <[email protected]>
AuthorDate: Sun Sep 2 14:37:47 2018 +0200
Commit:     Pierre Schweitzer <[email protected]>
CommitDate: Wed Sep 5 22:06:25 2018 +0200

    [NTOSKRNL] When allocating a new BCB, save it in a list
    
    This list is stored in the shared map. Later, this will allow
    reusing BCB when appropriate
---
 ntoskrnl/cc/pin.c              | 22 +++++++++++++++++++++-
 ntoskrnl/cc/view.c             |  1 +
 ntoskrnl/include/internal/cc.h |  3 +++
 3 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/ntoskrnl/cc/pin.c b/ntoskrnl/cc/pin.c
index aba97049f1..07044e23e7 100644
--- a/ntoskrnl/cc/pin.c
+++ b/ntoskrnl/cc/pin.c
@@ -51,6 +51,7 @@ CcMapData (
     NTSTATUS Status;
     PINTERNAL_BCB iBcb;
     LONGLONG ROffset;
+    KIRQL OldIrql;
 
     DPRINT("CcMapData(FileObject 0x%p, FileOffset %I64x, Length %lu, Flags 
0x%lx,"
            " pBcb 0x%p, pBuffer 0x%p)\n", FileObject, FileOffset->QuadPart,
@@ -156,6 +157,10 @@ CcMapData (
     ExInitializeResourceLite(&iBcb->Lock);
     *pBcb = (PVOID)iBcb;
 
+    KeAcquireSpinLock(&SharedCacheMap->BcbSpinLock, &OldIrql);
+    InsertTailList(&SharedCacheMap->BcbList, &iBcb->BcbEntry);
+    KeReleaseSpinLock(&SharedCacheMap->BcbSpinLock, OldIrql);
+
     CCTRACE(CC_API_DEBUG, "FileObject=%p FileOffset=%p Length=%lu Flags=0x%lx 
-> TRUE Bcb=%p\n",
         FileObject, FileOffset, Length, Flags, iBcb);
     return TRUE;
@@ -340,12 +345,20 @@ CcUnpinDataForThread (
 
     if (--iBcb->RefCount == 0)
     {
-        CcRosReleaseVacb(iBcb->Vacb->SharedCacheMap,
+        KIRQL OldIrql;
+        PROS_SHARED_CACHE_MAP SharedCacheMap;
+
+        SharedCacheMap = iBcb->Vacb->SharedCacheMap;
+        CcRosReleaseVacb(SharedCacheMap,
                          iBcb->Vacb,
                          TRUE,
                          iBcb->Dirty,
                          FALSE);
 
+        KeAcquireSpinLock(&SharedCacheMap->BcbSpinLock, &OldIrql);
+        RemoveEntryList(&iBcb->BcbEntry);
+        KeReleaseSpinLock(&SharedCacheMap->BcbSpinLock, OldIrql);
+
         ExDeleteResourceLite(&iBcb->Lock);
         ExFreeToNPagedLookasideList(&iBcbLookasideList, iBcb);
     }
@@ -377,6 +390,8 @@ CcUnpinRepinnedBcb (
     IN PIO_STATUS_BLOCK IoStatus)
 {
     PINTERNAL_BCB iBcb = Bcb;
+    KIRQL OldIrql;
+    PROS_SHARED_CACHE_MAP SharedCacheMap;
 
     CCTRACE(CC_API_DEBUG, "Bcb=%p WriteThrough=%d\n", Bcb, WriteThrough);
 
@@ -408,12 +423,17 @@ CcUnpinRepinnedBcb (
             ASSERT(iBcb->Vacb->PinCount == 0);
         }
 
+        SharedCacheMap = iBcb->Vacb->SharedCacheMap;
         CcRosReleaseVacb(iBcb->Vacb->SharedCacheMap,
                          iBcb->Vacb,
                          TRUE,
                          iBcb->Dirty,
                          FALSE);
 
+        KeAcquireSpinLock(&SharedCacheMap->BcbSpinLock, &OldIrql);
+        RemoveEntryList(&iBcb->BcbEntry);
+        KeReleaseSpinLock(&SharedCacheMap->BcbSpinLock, OldIrql);
+
         ExDeleteResourceLite(&iBcb->Lock);
         ExFreeToNPagedLookasideList(&iBcbLookasideList, iBcb);
     }
diff --git a/ntoskrnl/cc/view.c b/ntoskrnl/cc/view.c
index 6a087e6531..e3c8285254 100644
--- a/ntoskrnl/cc/view.c
+++ b/ntoskrnl/cc/view.c
@@ -1417,6 +1417,7 @@ CcRosInitializeFileCache (
         InitializeListHead(&SharedCacheMap->PrivateList);
         KeInitializeSpinLock(&SharedCacheMap->CacheMapLock);
         InitializeListHead(&SharedCacheMap->CacheMapVacbListHead);
+        InitializeListHead(&SharedCacheMap->BcbList);
     }
 
     KeAcquireGuardedMutex(&ViewLock);
diff --git a/ntoskrnl/include/internal/cc.h b/ntoskrnl/include/internal/cc.h
index 0dcea16f43..0c12004326 100644
--- a/ntoskrnl/include/internal/cc.h
+++ b/ntoskrnl/include/internal/cc.h
@@ -172,6 +172,7 @@ typedef struct _ROS_SHARED_CACHE_MAP
     CSHORT NodeByteSize;
     ULONG OpenCount;
     LARGE_INTEGER FileSize;
+    LIST_ENTRY BcbList;
     LARGE_INTEGER SectionSize;
     PFILE_OBJECT FileObject;
     ULONG DirtyPages;
@@ -181,6 +182,7 @@ typedef struct _ROS_SHARED_CACHE_MAP
     PVOID LazyWriteContext;
     LIST_ENTRY PrivateList;
     ULONG DirtyPageThreshold;
+    KSPIN_LOCK BcbSpinLock;
     PRIVATE_CACHE_MAP PrivateCacheMap;
 
     /* ROS specific */
@@ -235,6 +237,7 @@ typedef struct _INTERNAL_BCB
     BOOLEAN Dirty;
     BOOLEAN Pinned;
     CSHORT RefCount; /* (At offset 0x34 on WinNT4) */
+    LIST_ENTRY BcbEntry;
 } INTERNAL_BCB, *PINTERNAL_BCB;
 
 typedef struct _LAZY_WRITER

Reply via email to