Author: cgutman
Date: Mon Dec 19 08:22:16 2011
New Revision: 54692

URL: http://svn.reactos.org/svn/reactos?rev=54692&view=rev
Log:
[NTOSKRNL]
- Always use push locks within a critical region

Modified:
    trunk/reactos/ntoskrnl/cc/pin.c
    trunk/reactos/ntoskrnl/cc/view.c

Modified: trunk/reactos/ntoskrnl/cc/pin.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cc/pin.c?rev=54692&r1=54691&r2=54692&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/cc/pin.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/cc/pin.c [iso-8859-1] Mon Dec 19 08:22:16 2011
@@ -240,6 +240,7 @@
       IoStatus->Information = 0;
       if (WriteThrough)
         {
+          KeEnterCriticalRegion();
           ExAcquirePushLockExclusive(&iBcb->CacheSegment->Lock);
           if (iBcb->CacheSegment->Dirty)
             {
@@ -250,6 +251,7 @@
               IoStatus->Status = STATUS_SUCCESS;
             }
           ExReleasePushLockExclusive(&iBcb->CacheSegment->Lock);
+          KeLeaveCriticalRegion();
         }
       else
         {

Modified: trunk/reactos/ntoskrnl/cc/view.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cc/view.c?rev=54692&r1=54691&r2=54692&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/cc/view.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/cc/view.c [iso-8859-1] Mon Dec 19 08:22:16 2011
@@ -448,6 +448,7 @@
   KeReleaseSpinLock(&Bcb->BcbLock, oldIrql);
   KeReleaseGuardedMutex(&ViewLock);
   ExReleasePushLock(&CacheSeg->Lock);
+  KeLeaveCriticalRegion();
 
   return(STATUS_SUCCESS);
 }
@@ -476,6 +477,7 @@
         {
             CcRosCacheSegmentIncRefCount(current);
             KeReleaseSpinLock(&Bcb->BcbLock, oldIrql);
+            KeEnterCriticalRegion();
             ExAcquirePushLockExclusive(&current->Lock);
             return(current);
         }
@@ -525,6 +527,7 @@
 
   CacheSeg->Dirty = TRUE;
   ExReleasePushLock(&CacheSeg->Lock);
+  KeLeaveCriticalRegion();
 
   return(STATUS_SUCCESS);
 }
@@ -574,6 +577,8 @@
   KeReleaseSpinLock(&Bcb->BcbLock, oldIrql);
 
   ExReleasePushLock(&CacheSeg->Lock);
+  KeLeaveCriticalRegion();
+
   return(STATUS_SUCCESS);
 }
 
@@ -621,6 +626,7 @@
   current->DirtySegmentListEntry.Blink = NULL;
   current->ReferenceCount = 1;
   ExInitializePushLock(&current->Lock);
+  KeEnterCriticalRegion();
   ExAcquirePushLockExclusive(&current->Lock);
   KeAcquireGuardedMutex(&ViewLock);
 
@@ -655,7 +661,8 @@
        KeReleaseGuardedMutex(&ViewLock);
        ExFreeToNPagedLookasideList(&CacheSegLookasideList, *CacheSeg);
        *CacheSeg = current;
-        ExAcquirePushLockExclusive(&current->Lock);
+    /* We're still in the critical region from above */
+    ExAcquirePushLockExclusive(&current->Lock);
        return STATUS_SUCCESS;
      }
      if (current->FileOffset < FileOffset)
@@ -1040,8 +1047,9 @@
                         IoStatus->Status = Status;
                     }
                 }
+                ExReleasePushLock(&current->Lock);
+                KeLeaveCriticalRegion();
                 KeAcquireSpinLock(&Bcb->BcbLock, &oldIrql);
-                ExReleasePushLock(&current->Lock);
                 CcRosCacheSegmentDecRefCount(current);
                 KeReleaseSpinLock(&Bcb->BcbLock, oldIrql);
             }


Reply via email to