From 896b860e33e7c99d877933c097842c890a83915b Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sun, 29 Sep 2013 21:08:15 +0000 Subject: [PATCH] [NTOS:CC] - A BCB's cache segment list is sorted -- so actually make use of that property during list traversal - Fix inverted wait condition in CcZeroData - Correct offset check in CcSetFileSizes CORE-7491 svn path=/trunk/; revision=60457 --- reactos/ntoskrnl/cc/copy.c | 8 +++++++- reactos/ntoskrnl/cc/fs.c | 3 +-- reactos/ntoskrnl/cc/view.c | 18 +++++++----------- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/reactos/ntoskrnl/cc/copy.c b/reactos/ntoskrnl/cc/copy.c index 749052c42b6..c5db137be88 100644 --- a/reactos/ntoskrnl/cc/copy.c +++ b/reactos/ntoskrnl/cc/copy.c @@ -371,6 +371,8 @@ CcCopyRead ( IoStatus->Information = 0; return FALSE; } + if (current->FileOffset >= ReadOffset + Length) + break; current_entry = current_entry->Flink; } KeReleaseSpinLock(&Bcb->BcbLock, oldirql); @@ -484,6 +486,8 @@ CcCopyWrite ( /* datas not available */ return FALSE; } + if (CacheSeg->FileOffset >= WriteOffset + Length) + break; current_entry = current_entry->Flink; } KeReleaseSpinLock(&Bcb->BcbLock, oldirql); @@ -683,7 +687,7 @@ CcZeroData ( ULONG TempLength; Bcb = FileObject->SectionObjectPointer->SharedCacheMap; - if (Wait) + if (!Wait) { /* testing, if the requested datas are available */ KeAcquireSpinLock(&Bcb->BcbLock, &oldirql); @@ -702,6 +706,8 @@ CcZeroData ( /* datas not available */ return FALSE; } + if (CacheSeg->FileOffset >= WriteOffset.u.LowPart + Length) + break; current_entry = current_entry->Flink; } KeReleaseSpinLock(&Bcb->BcbLock, oldirql); diff --git a/reactos/ntoskrnl/cc/fs.c b/reactos/ntoskrnl/cc/fs.c index 57d1f7ef354..03894146cac 100644 --- a/reactos/ntoskrnl/cc/fs.c +++ b/reactos/ntoskrnl/cc/fs.c @@ -163,8 +163,7 @@ CcSetFileSizes ( CACHE_SEGMENT, BcbSegmentListEntry); current_entry = current_entry->Flink; - if (current->FileOffset > FileSizes->AllocationSize.QuadPart || - (current->FileOffset == 0 && FileSizes->AllocationSize.QuadPart == 0)) + if (current->FileOffset >= FileSizes->AllocationSize.QuadPart) { if ((current->ReferenceCount == 0) || ((current->ReferenceCount == 1) && current->Dirty)) { diff --git a/reactos/ntoskrnl/cc/view.c b/reactos/ntoskrnl/cc/view.c index 19e90eef112..5bd20bdfa4c 100644 --- a/reactos/ntoskrnl/cc/view.c +++ b/reactos/ntoskrnl/cc/view.c @@ -487,6 +487,8 @@ CcRosLookupCacheSegment ( NULL); return current; } + if (current->FileOffset > FileOffset) + break; current_entry = current_entry->Flink; } @@ -686,18 +688,12 @@ CcRosCreateCacheSegment ( } if (current->FileOffset < FileOffset) { - if (previous == NULL) - { - previous = current; - } - else - { - if (previous->FileOffset < current->FileOffset) - { - previous = current; - } - } + ASSERT(previous == NULL || + previous->FileOffset < current->FileOffset); + previous = current; } + if (current->FileOffset > FileOffset) + break; current_entry = current_entry->Flink; } /* There was no existing segment. */