diff --git a/ntoskrnl/cc/copy.c b/ntoskrnl/cc/copy.c
index a70e0ab..ec9d837 100644
--- a/ntoskrnl/cc/copy.c
+++ b/ntoskrnl/cc/copy.c
@@ -258,7 +258,6 @@ CcCopyData (
     NTSTATUS Status;
     LONGLONG CurrentOffset;
     ULONG BytesCopied;
-    KIRQL OldIrql;
     PROS_SHARED_CACHE_MAP SharedCacheMap;
     PLIST_ENTRY ListEntry;
     PROS_VACB Vacb;
@@ -275,7 +274,7 @@ CcCopyData (
     if (!Wait)
     {
         /* test if the requested data is available */
-        KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &OldIrql);
+        ExAcquirePushLockShared(&SharedCacheMap->VacbPushLock);
         /* FIXME: this loop doesn't take into account areas that don't have
          * a VACB in the list yet */
         ListEntry = SharedCacheMap->CacheMapVacbListHead.Flink;
@@ -290,14 +289,14 @@ CcCopyData (
                                   VACB_MAPPING_GRANULARITY,
                                   CurrentOffset, Length))
             {
-                KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, OldIrql);
+                ExReleasePushLock(&SharedCacheMap->VacbPushLock);
                 /* data not available */
                 return FALSE;
             }
             if (Vacb->FileOffset.QuadPart >= CurrentOffset + Length)
                 break;
         }
-        KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, OldIrql);
+        ExReleasePushLock(&SharedCacheMap->VacbPushLock);
     }
 
     PartialLength = CurrentOffset % VACB_MAPPING_GRANULARITY;
diff --git a/ntoskrnl/cc/fs.c b/ntoskrnl/cc/fs.c
index cb98eed..132481d 100644
--- a/ntoskrnl/cc/fs.c
+++ b/ntoskrnl/cc/fs.c
@@ -168,7 +168,6 @@ CcPurgeCacheSection (
     LONGLONG StartOffset;
     LONGLONG EndOffset;
     LIST_ENTRY FreeList;
-    KIRQL OldIrql;
     PLIST_ENTRY ListEntry;
     PROS_VACB Vacb;
     LONGLONG ViewEnd;
@@ -203,7 +202,7 @@ CcPurgeCacheSection (
     Success = TRUE;
 
     KeAcquireGuardedMutex(&ViewLock);
-    KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &OldIrql);
+    ExAcquirePushLockExclusive(&SharedCacheMap->VacbPushLock);
     ListEntry = SharedCacheMap->CacheMapVacbListHead.Flink;
     while (ListEntry != &SharedCacheMap->CacheMapVacbListHead)
     {
@@ -246,7 +245,7 @@ CcPurgeCacheSection (
         RemoveEntryList(&Vacb->CacheMapVacbListEntry);
         InsertHeadList(&FreeList, &Vacb->CacheMapVacbListEntry);
     }
-    KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, OldIrql);
+    ExReleasePushLock(&SharedCacheMap->VacbPushLock);
     KeReleaseGuardedMutex(&ViewLock);
 
     while (!IsListEmpty(&FreeList))
@@ -273,7 +272,6 @@ CcSetFileSizes (
     IN PFILE_OBJECT FileObject,
     IN PCC_FILE_SIZES FileSizes)
 {
-    KIRQL oldirql;
     PROS_SHARED_CACHE_MAP SharedCacheMap;
 
     CCTRACE(CC_API_DEBUG, "FileObject=%p FileSizes=%p\n",
@@ -303,10 +301,10 @@ CcSetFileSizes (
                             FALSE);
     }
 
-    KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &oldirql);
+    ExAcquirePushLockExclusive(&SharedCacheMap->VacbPushLock);
     SharedCacheMap->SectionSize = FileSizes->AllocationSize;
     SharedCacheMap->FileSize = FileSizes->FileSize;
-    KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldirql);
+    ExReleasePushLock(&SharedCacheMap->VacbPushLock);
 }
 
 /*
@@ -337,7 +335,6 @@ CcUninitializeCacheMap (
 {
     NTSTATUS Status;
     PROS_SHARED_CACHE_MAP SharedCacheMap;
-    KIRQL OldIrql;
 
     CCTRACE(CC_API_DEBUG, "FileObject=%p TruncateSize=%p UninitializeCompleteEvent=%p\n",
         FileObject, TruncateSize, UninitializeCompleteEvent);
@@ -346,12 +343,12 @@ CcUninitializeCacheMap (
         FileObject->SectionObjectPointer->SharedCacheMap != NULL)
     {
         SharedCacheMap = FileObject->SectionObjectPointer->SharedCacheMap;
-        KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &OldIrql);
+        ExAcquirePushLockExclusive(&SharedCacheMap->VacbPushLock);
         if (SharedCacheMap->FileSize.QuadPart > TruncateSize->QuadPart)
         {
             SharedCacheMap->FileSize = *TruncateSize;
         }
-        KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, OldIrql);
+        ExReleasePushLock(&SharedCacheMap->VacbPushLock);
         CcPurgeCacheSection(FileObject->SectionObjectPointer,
                             TruncateSize,
                             0,
diff --git a/ntoskrnl/cc/view.c b/ntoskrnl/cc/view.c
index 9a7f716..6da9205 100644
--- a/ntoskrnl/cc/view.c
+++ b/ntoskrnl/cc/view.c
@@ -122,7 +122,6 @@ CcRosTraceCacheMap (
     BOOLEAN Trace )
 {
 #if DBG
-    KIRQL oldirql;
     PLIST_ENTRY current_entry;
     PROS_VACB current;
 
@@ -136,7 +135,7 @@ CcRosTraceCacheMap (
         DPRINT1("Enabling Tracing for CacheMap 0x%p:\n", SharedCacheMap);
 
         KeAcquireGuardedMutex(&ViewLock);
-        KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &oldirql);
+        ExAcquirePushLockShared(&SharedCacheMap->VacbPushLock);
 
         current_entry = SharedCacheMap->CacheMapVacbListHead.Flink;
         while (current_entry != &SharedCacheMap->CacheMapVacbListHead)
@@ -147,7 +146,7 @@ CcRosTraceCacheMap (
             DPRINT1("  VACB 0x%p enabled, RefCount %lu, Dirty %u, PageOut %lu\n",
                     current, current->ReferenceCount, current->Dirty, current->PageOut );
         }
-        KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldirql);
+        ExReleasePushLock(&SharedCacheMap->VacbPushLock);
         KeReleaseGuardedMutex(&ViewLock);
     }
     else
@@ -294,7 +293,6 @@ CcRosTrimCache (
     PLIST_ENTRY current_entry;
     PROS_VACB current;
     ULONG PagesFreed;
-    KIRQL oldIrql;
     LIST_ENTRY FreeList;
     PFN_NUMBER Page;
     ULONG i;
@@ -319,7 +317,7 @@ retry:
                                     VacbLruListEntry);
         current_entry = current_entry->Flink;
 
-        KeAcquireSpinLock(&current->SharedCacheMap->CacheMapLock, &oldIrql);
+        ExAcquirePushLockExclusive(&current->SharedCacheMap->VacbPushLock);
 
         /* Reference the VACB */
         CcRosVacbIncRefCount(current);
@@ -328,7 +326,7 @@ retry:
         if (InterlockedCompareExchange((PLONG)&current->MappedCount, 0, 0) > 0 && !current->Dirty)
         {
             /* We have to break these locks because Cc sucks */
-            KeReleaseSpinLock(&current->SharedCacheMap->CacheMapLock, oldIrql);
+            ExReleasePushLock(&current->SharedCacheMap->VacbPushLock);
             KeReleaseGuardedMutex(&ViewLock);
 
             /* Page out the VACB */
@@ -341,7 +339,7 @@ retry:
 
             /* Reacquire the locks */
             KeAcquireGuardedMutex(&ViewLock);
-            KeAcquireSpinLock(&current->SharedCacheMap->CacheMapLock, &oldIrql);
+            ExAcquirePushLockExclusive(&current->SharedCacheMap->VacbPushLock);
         }
 
         /* Dereference the VACB */
@@ -365,7 +363,7 @@ retry:
             (*NrFreed) += PagesFreed;
         }
 
-        KeReleaseSpinLock(&current->SharedCacheMap->CacheMapLock, oldIrql);
+        ExReleasePushLock(&current->SharedCacheMap->VacbPushLock);
     }
 
     KeReleaseGuardedMutex(&ViewLock);
@@ -452,7 +450,6 @@ CcRosLookupVacb (
 {
     PLIST_ENTRY current_entry;
     PROS_VACB current;
-    KIRQL oldIrql;
 
     ASSERT(SharedCacheMap);
 
@@ -460,7 +457,7 @@ CcRosLookupVacb (
            SharedCacheMap, FileOffset);
 
     KeAcquireGuardedMutex(&ViewLock);
-    KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &oldIrql);
+    ExAcquirePushLockShared(&SharedCacheMap->VacbPushLock);
 
     current_entry = SharedCacheMap->CacheMapVacbListHead.Flink;
     while (current_entry != &SharedCacheMap->CacheMapVacbListHead)
@@ -473,7 +470,7 @@ CcRosLookupVacb (
                            FileOffset))
         {
             CcRosVacbIncRefCount(current);
-            KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldIrql);
+            ExReleasePushLock(&SharedCacheMap->VacbPushLock);
             KeReleaseGuardedMutex(&ViewLock);
             return current;
         }
@@ -482,7 +479,7 @@ CcRosLookupVacb (
         current_entry = current_entry->Flink;
     }
 
-    KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldIrql);
+    ExReleasePushLock(&SharedCacheMap->VacbPushLock);
     KeReleaseGuardedMutex(&ViewLock);
 
     return NULL;
@@ -499,7 +496,7 @@ CcRosMarkDirtyVacb (
     SharedCacheMap = Vacb->SharedCacheMap;
 
     KeAcquireGuardedMutex(&ViewLock);
-    KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &oldIrql);
+    ExAcquirePushLockExclusive(&SharedCacheMap->VacbPushLock);
 
     ASSERT(!Vacb->Dirty);
 
@@ -514,7 +511,7 @@ CcRosMarkDirtyVacb (
 
     Vacb->Dirty = TRUE;
 
-    KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldIrql);
+    ExReleasePushLock(&SharedCacheMap->VacbPushLock);
     KeReleaseGuardedMutex(&ViewLock);
 
     /* Schedule a lazy writer run to now that we have dirty VACB */
@@ -532,7 +529,6 @@ CcRosUnmarkDirtyVacb (
     PROS_VACB Vacb,
     BOOLEAN LockViews)
 {
-    KIRQL oldIrql;
     PROS_SHARED_CACHE_MAP SharedCacheMap;
 
     SharedCacheMap = Vacb->SharedCacheMap;
@@ -540,7 +536,7 @@ CcRosUnmarkDirtyVacb (
     if (LockViews)
     {
         KeAcquireGuardedMutex(&ViewLock);
-        KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &oldIrql);
+        ExAcquirePushLockExclusive(&SharedCacheMap->VacbPushLock);
     }
 
     ASSERT(Vacb->Dirty);
@@ -555,7 +551,7 @@ CcRosUnmarkDirtyVacb (
 
     if (LockViews)
     {
-        KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldIrql);
+        ExReleasePushLock(&SharedCacheMap->VacbPushLock);
         KeReleaseGuardedMutex(&ViewLock);
     }
 }
@@ -693,7 +689,6 @@ CcRosFreeUnusedVacb (
 {
     ULONG cFreed;
     BOOLEAN Freed;
-    KIRQL oldIrql;
     PROS_VACB current;
     LIST_ENTRY FreeList;
     PLIST_ENTRY current_entry;
@@ -715,7 +710,7 @@ CcRosFreeUnusedVacb (
                                     VacbLruListEntry);
         current_entry = current_entry->Flink;
 
-        KeAcquireSpinLock(&current->SharedCacheMap->CacheMapLock, &oldIrql);
+        ExAcquirePushLockExclusive(&current->SharedCacheMap->VacbPushLock);
 
         /* Only deal with unused VACB, we will free them */
         Refs = CcRosVacbGetRefCount(current);
@@ -732,7 +727,7 @@ CcRosFreeUnusedVacb (
             InsertHeadList(&FreeList, &current->CacheMapVacbListEntry);
         }
 
-        KeReleaseSpinLock(&current->SharedCacheMap->CacheMapLock, oldIrql);
+        ExReleasePushLock(&current->SharedCacheMap->VacbPushLock);
 
     }
 
@@ -779,7 +774,6 @@ CcRosCreateVacb (
     PROS_VACB previous;
     PLIST_ENTRY current_entry;
     NTSTATUS Status;
-    KIRQL oldIrql;
     ULONG Refs;
     BOOLEAN Retried;
 
@@ -847,7 +841,7 @@ Retry:
      * file offset exist. If there is a VACB, we release
      * our newly created VACB and return the existing one.
      */
-    KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &oldIrql);
+    ExAcquirePushLockExclusive(&SharedCacheMap->VacbPushLock);
     current_entry = SharedCacheMap->CacheMapVacbListHead.Flink;
     previous = NULL;
     while (current_entry != &SharedCacheMap->CacheMapVacbListHead)
@@ -860,7 +854,7 @@ Retry:
                            FileOffset))
         {
             CcRosVacbIncRefCount(current);
-            KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldIrql);
+            ExReleasePushLock(&SharedCacheMap->VacbPushLock);
 #if DBG
             if (SharedCacheMap->Trace)
             {
@@ -898,8 +892,8 @@ Retry:
     {
         InsertHeadList(&SharedCacheMap->CacheMapVacbListHead, &current->CacheMapVacbListEntry);
     }
-    KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldIrql);
     InsertTailList(&VacbLruListHead, &current->VacbLruListEntry);
+    ExReleasePushLock(&SharedCacheMap->VacbPushLock);
     KeReleaseGuardedMutex(&ViewLock);
 
     MI_SET_USAGE(MI_USAGE_CACHE);
@@ -1161,7 +1155,6 @@ CcRosDeleteFileCache (
     PLIST_ENTRY current_entry;
     PROS_VACB current;
     LIST_ENTRY FreeList;
-    KIRQL oldIrql;
 
     ASSERT(SharedCacheMap);
 
@@ -1182,20 +1175,20 @@ CcRosDeleteFileCache (
          * Release all VACBs
          */
         InitializeListHead(&FreeList);
-        KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &oldIrql);
+        ExAcquirePushLockExclusive(&SharedCacheMap->VacbPushLock);
         while (!IsListEmpty(&SharedCacheMap->CacheMapVacbListHead))
         {
             current_entry = RemoveTailList(&SharedCacheMap->CacheMapVacbListHead);
-            KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldIrql);
+            ExReleasePushLock(&SharedCacheMap->VacbPushLock);
 
             current = CONTAINING_RECORD(current_entry, ROS_VACB, CacheMapVacbListEntry);
             RemoveEntryList(&current->VacbLruListEntry);
             InitializeListHead(&current->VacbLruListEntry);
             if (current->Dirty)
             {
-                KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &oldIrql);
+                ExAcquirePushLockExclusive(&SharedCacheMap->VacbPushLock);
                 CcRosUnmarkDirtyVacb(current, FALSE);
-                KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldIrql);
+                ExReleasePushLock(&SharedCacheMap->VacbPushLock);
                 DPRINT1("Freeing dirty VACB\n");
             }
             if (current->MappedCount != 0)
@@ -1206,12 +1199,12 @@ CcRosDeleteFileCache (
             }
             InsertHeadList(&FreeList, &current->CacheMapVacbListEntry);
 
-            KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &oldIrql);
+            ExAcquirePushLockExclusive(&SharedCacheMap->VacbPushLock);
         }
 #if DBG
         SharedCacheMap->Trace = FALSE;
 #endif
-        KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldIrql);
+        ExReleasePushLock(&SharedCacheMap->VacbPushLock);
 
         KeReleaseGuardedMutex(&ViewLock);
         ObDereferenceObject(SharedCacheMap->FileObject);
@@ -1346,9 +1339,9 @@ CcRosReleaseFileCache (
         if (PrivateMap != NULL)
         {
             /* Remove it from the file */
-            KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &OldIrql);
+            ExAcquirePushLockShared(&SharedCacheMap->VacbPushLock);
             RemoveEntryList(&PrivateMap->PrivateLinks);
-            KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, OldIrql);
+            ExReleasePushLock(&SharedCacheMap->VacbPushLock);
 
             /* And free it. */
             if (PrivateMap != &SharedCacheMap->PrivateCacheMap)
@@ -1422,7 +1415,7 @@ CcRosInitializeFileCache (
         SharedCacheMap->DirtyPageThreshold = 0;
         SharedCacheMap->DirtyPages = 0;
         InitializeListHead(&SharedCacheMap->PrivateList);
-        KeInitializeSpinLock(&SharedCacheMap->CacheMapLock);
+        ExInitializePushLock(&SharedCacheMap->VacbPushLock);
         InitializeListHead(&SharedCacheMap->CacheMapVacbListHead);
         FileObject->SectionObjectPointer->SharedCacheMap = SharedCacheMap;
 
@@ -1470,9 +1463,9 @@ CcRosInitializeFileCache (
         KeInitializeSpinLock(&PrivateMap->ReadAheadSpinLock);
 
         /* Link it to the file */
-        KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &OldIrql);
+        ExAcquirePushLockExclusive(&SharedCacheMap->VacbPushLock);
         InsertTailList(&SharedCacheMap->PrivateList, &PrivateMap->PrivateLinks);
-        KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, OldIrql);
+        ExReleasePushLock(&SharedCacheMap->VacbPushLock);
 
         FileObject->PrivateCacheMap = PrivateMap;
         SharedCacheMap->OpenCount++;
diff --git a/ntoskrnl/include/internal/cc.h b/ntoskrnl/include/internal/cc.h
index 0dcea16..a300029 100644
--- a/ntoskrnl/include/internal/cc.h
+++ b/ntoskrnl/include/internal/cc.h
@@ -181,13 +181,13 @@ typedef struct _ROS_SHARED_CACHE_MAP
     PVOID LazyWriteContext;
     LIST_ENTRY PrivateList;
     ULONG DirtyPageThreshold;
+    EX_PUSH_LOCK VacbPushLock;
     PRIVATE_CACHE_MAP PrivateCacheMap;
 
     /* ROS specific */
     LIST_ENTRY CacheMapVacbListHead;
     ULONG TimeStamp;
     BOOLEAN PinAccess;
-    KSPIN_LOCK CacheMapLock;
 #if DBG
     BOOLEAN Trace; /* enable extra trace output for this cache map and it's VACBs */
 #endif
