[ros-diffs] [hbirr] 19691: Lock the MainResource from fcb, if we are trying to write back a modified cache segment.

hbirr at svn.reactos.com hbirr at svn.reactos.com
Sun Nov 27 16:59:44 CET 2005


Lock the MainResource from fcb, if we are trying to write back a
modified cache segment. 
Usually we have to call the callback function from FSD.
Modified: trunk/reactos/ntoskrnl/cc/view.c
  _____  

Modified: trunk/reactos/ntoskrnl/cc/view.c
--- trunk/reactos/ntoskrnl/cc/view.c	2005-11-27 15:53:46 UTC (rev
19690)
+++ trunk/reactos/ntoskrnl/cc/view.c	2005-11-27 15:59:32 UTC (rev
19691)
@@ -244,21 +244,34 @@

       current = CONTAINING_RECORD(current_entry, CACHE_SEGMENT,
 				  DirtySegmentListEntry);
       current_entry = current_entry->Flink;
+    
+//      Locked =
current->Bcb->Callbacks.AcquireForLazyWrite(current->Bcb->Context,
FALSE);
+      Locked =
ExTryToAcquireResourceExclusiveLite(((FSRTL_COMMON_FCB_HEADER*)(current-
>Bcb->FileObject->FsContext))->Resource);
+      if (!Locked)
+        {
+          continue;
+        }
       Locked = CcTryToAcquireBrokenMutex(&current->Lock);
       if (!Locked)
 	{
+//
current->Bcb->Callbacks.ReleaseFromLazyWrite(current->Bcb->Context);
+
ExReleaseResourceLite(((FSRTL_COMMON_FCB_HEADER*)(current->Bcb->FileObje
ct->FsContext))->Resource);
 	  continue;
 	}
       ASSERT(current->Dirty);
       if (current->ReferenceCount > 1)
 	{
 
ExReleaseFastMutexUnsafeAndLeaveCriticalRegion(&current->Lock);
+//
current->Bcb->Callbacks.ReleaseFromLazyWrite(current->Bcb->Context);
+
ExReleaseResourceLite(((FSRTL_COMMON_FCB_HEADER*)(current->Bcb->FileObje
ct->FsContext))->Resource);
 	  continue;
 	}
       ExReleaseFastMutexUnsafeAndLeaveCriticalRegion(&ViewLock);
       PagesPerSegment = current->Bcb->CacheSegmentSize / PAGE_SIZE;
       Status = CcRosFlushCacheSegment(current);
       ExReleaseFastMutexUnsafeAndLeaveCriticalRegion(&current->Lock);
+//
current->Bcb->Callbacks.ReleaseFromLazyWrite(current->Bcb->Context);
+
ExReleaseResourceLite(((FSRTL_COMMON_FCB_HEADER*)(current->Bcb->FileObje
ct->FsContext))->Resource);
       if (!NT_SUCCESS(Status) &&  (Status != STATUS_END_OF_FILE))
       {
 	 DPRINT1("CC: Failed to flush cache segment.\n");
@@ -443,7 +456,7 @@
       if (current->FileOffset <= FileOffset &&
 	  (current->FileOffset + Bcb->CacheSegmentSize) > FileOffset)
 	{
-      CcRosCacheSegmentIncRefCount(current);
+          CcRosCacheSegmentIncRefCount(current);
 	  KeReleaseSpinLock(&Bcb->BcbLock, oldIrql);
 
ExEnterCriticalRegionAndAcquireFastMutexUnsafe(&current->Lock);
 	  return(current);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.reactos.org/pipermail/ros-diffs/attachments/20051127/1f36888d/attachment.html


More information about the Ros-diffs mailing list