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(¤t->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(¤t->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(¤t->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(¤t->Lock);
return(current);