[NTOSKRNL]
authorCameron Gutman <aicommander@gmail.com>
Wed, 21 Dec 2011 19:08:59 +0000 (19:08 +0000)
committerCameron Gutman <aicommander@gmail.com>
Wed, 21 Dec 2011 19:08:59 +0000 (19:08 +0000)
- Change the method of segment locking from a push lock to a mutex
- Fixes the 'OldValue.Locked' assertion failure

svn path=/trunk/; revision=54729

reactos/ntoskrnl/cc/pin.c
reactos/ntoskrnl/cc/view.c
reactos/ntoskrnl/include/internal/cc.h

index 2fb8f71..d6e764a 100644 (file)
@@ -240,8 +240,11 @@ CcUnpinRepinnedBcb (
       IoStatus->Information = 0;
       if (WriteThrough)
         {
-          KeEnterCriticalRegion();
-          ExAcquirePushLockExclusive(&iBcb->CacheSegment->Lock);
+            KeWaitForSingleObject(&iBcb->CacheSegment->Mutex,
+                                  Executive,
+                                  KernelMode,
+                                  FALSE,
+                                  NULL);
           if (iBcb->CacheSegment->Dirty)
             {
               IoStatus->Status = CcRosFlushCacheSegment(iBcb->CacheSegment);
@@ -250,8 +253,7 @@ CcUnpinRepinnedBcb (
             {
               IoStatus->Status = STATUS_SUCCESS;
             }
-          ExReleasePushLockExclusive(&iBcb->CacheSegment->Lock);
-          KeLeaveCriticalRegion();
+          KeReleaseMutex(&iBcb->CacheSegment->Mutex, 0);
         }
       else
         {
index a0a35f6..7c29a6f 100644 (file)
@@ -230,25 +230,29 @@ CcRosFlushDirtyPages(ULONG Target, PULONG Count)
         {
             continue;
         }
-        
-        ExAcquirePushLockExclusive(&current->Lock);
-        
+
+        KeWaitForSingleObject(&current->Mutex,
+                              Executive,
+                              KernelMode,
+                              FALSE,
+                              NULL);
+
         ASSERT(current->Dirty);
         if (current->ReferenceCount > 1)
         {
-            ExReleasePushLock(&current->Lock);
+            KeReleaseMutex(&current->Mutex, 0);
             current->Bcb->Callbacks->ReleaseFromLazyWrite(
                 current->Bcb->LazyWriteContext);
             continue;
         }
-        
+
         PagesPerSegment = current->Bcb->CacheSegmentSize / PAGE_SIZE;
 
         KeReleaseGuardedMutex(&ViewLock);
 
         Status = CcRosFlushCacheSegment(current);
 
-        ExReleasePushLock(&current->Lock);
+        KeReleaseMutex(&current->Mutex, 0);
         current->Bcb->Callbacks->ReleaseFromLazyWrite(
             current->Bcb->LazyWriteContext);
 
@@ -440,8 +444,7 @@ CcRosReleaseCacheSegment(PBCB Bcb,
   }
   KeReleaseSpinLock(&Bcb->BcbLock, oldIrql);
   KeReleaseGuardedMutex(&ViewLock);
-  ExReleasePushLock(&CacheSeg->Lock);
-  KeLeaveCriticalRegion();
+  KeReleaseMutex(&CacheSeg->Mutex, 0);
 
   return(STATUS_SUCCESS);
 }
@@ -470,8 +473,11 @@ CcRosLookupCacheSegment(PBCB Bcb, ULONG FileOffset)
         {
             CcRosCacheSegmentIncRefCount(current);
             KeReleaseSpinLock(&Bcb->BcbLock, oldIrql);
-            KeEnterCriticalRegion();
-            ExAcquirePushLockExclusive(&current->Lock);
+            KeWaitForSingleObject(&current->Mutex,
+                                  Executive,
+                                  KernelMode,
+                                  FALSE,
+                                  NULL);
             return(current);
         }
         current_entry = current_entry->Flink;
@@ -519,8 +525,7 @@ CcRosMarkDirtyCacheSegment(PBCB Bcb, ULONG FileOffset)
   KeReleaseGuardedMutex(&ViewLock);
 
   CacheSeg->Dirty = TRUE;
-  ExReleasePushLock(&CacheSeg->Lock);
-  KeLeaveCriticalRegion();
+  KeReleaseMutex(&CacheSeg->Mutex, 0);
 
   return(STATUS_SUCCESS);
 }
@@ -569,8 +574,7 @@ CcRosUnmapCacheSegment(PBCB Bcb, ULONG FileOffset, BOOLEAN NowDirty)
   }
   KeReleaseSpinLock(&Bcb->BcbLock, oldIrql);
 
-  ExReleasePushLock(&CacheSeg->Lock);
-  KeLeaveCriticalRegion();
+  KeReleaseMutex(&CacheSeg->Mutex, 0);
 
   return(STATUS_SUCCESS);
 }
@@ -618,9 +622,12 @@ CcRosCreateCacheSegment(PBCB Bcb,
   current->DirtySegmentListEntry.Flink = NULL;
   current->DirtySegmentListEntry.Blink = NULL;
   current->ReferenceCount = 1;
-  ExInitializePushLock(&current->Lock);
-  KeEnterCriticalRegion();
-  ExAcquirePushLockExclusive(&current->Lock);
+  KeInitializeMutex(&current->Mutex, 0);
+  KeWaitForSingleObject(&current->Mutex,
+                        Executive,
+                        KernelMode,
+                        FALSE,
+                        NULL);
   KeAcquireGuardedMutex(&ViewLock);
 
   *CacheSeg = current;
@@ -650,12 +657,15 @@ CcRosCreateCacheSegment(PBCB Bcb,
                        current );
        }
 #endif
-       ExReleasePushLock(&(*CacheSeg)->Lock);
+       KeReleaseMutex(&(*CacheSeg)->Mutex, 0);
        KeReleaseGuardedMutex(&ViewLock);
        ExFreeToNPagedLookasideList(&CacheSegLookasideList, *CacheSeg);
        *CacheSeg = current;
-    /* We're still in the critical region from above */
-    ExAcquirePushLockExclusive(&current->Lock);
+    KeWaitForSingleObject(&current->Mutex,
+                          Executive,
+                          KernelMode,
+                          FALSE,
+                          NULL);
        return STATUS_SUCCESS;
      }
      if (current->FileOffset < FileOffset)
@@ -1040,8 +1050,7 @@ CcFlushCache(IN PSECTION_OBJECT_POINTERS SectionObjectPointers,
                         IoStatus->Status = Status;
                     }
                 }
-                ExReleasePushLock(&current->Lock);
-                KeLeaveCriticalRegion();
+                KeReleaseMutex(&current->Mutex, 0);
                 KeAcquireSpinLock(&Bcb->BcbLock, &oldIrql);
                 CcRosCacheSegmentDecRefCount(current);
                 KeReleaseSpinLock(&Bcb->BcbLock, oldIrql);
index 30139ec..141e202 100644 (file)
@@ -145,8 +145,8 @@ typedef struct _CACHE_SEGMENT
     LIST_ENTRY CacheSegmentLRUListEntry;
     /* Offset in the file which this cache segment maps. */
     ULONG FileOffset;
-    /* Lock. */
-    EX_PUSH_LOCK Lock;
+    /* Mutex */
+    KMUTEX Mutex;
     /* Number of references. */
     ULONG ReferenceCount;
     /* Pointer to the BCB for the file which this cache segment maps data for. */