From 30321765c28fe04b27dfa77cf13e7347f5bbfb56 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sun, 27 Nov 2005 15:59:32 +0000 Subject: [PATCH] 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. svn path=/trunk/; revision=19691 --- reactos/ntoskrnl/cc/view.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/cc/view.c b/reactos/ntoskrnl/cc/view.c index b9d9fb02cfe..be73d63410a 100644 --- a/reactos/ntoskrnl/cc/view.c +++ b/reactos/ntoskrnl/cc/view.c @@ -244,21 +244,34 @@ CcRosFlushDirtyPages(ULONG Target, PULONG Count) 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->FileObject->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->FileObject->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->FileObject->FsContext))->Resource); if (!NT_SUCCESS(Status) && (Status != STATUS_END_OF_FILE)) { DPRINT1("CC: Failed to flush cache segment.\n"); @@ -443,7 +456,7 @@ CcRosLookupCacheSegment(PBCB Bcb, ULONG FileOffset) if (current->FileOffset <= FileOffset && (current->FileOffset + Bcb->CacheSegmentSize) > FileOffset) { - CcRosCacheSegmentIncRefCount(current); + CcRosCacheSegmentIncRefCount(current); KeReleaseSpinLock(&Bcb->BcbLock, oldIrql); ExEnterCriticalRegionAndAcquireFastMutexUnsafe(¤t->Lock); return(current);