https://git.reactos.org/?p=reactos.git;a=commitdiff;h=cd23d6e19aef6daf321f0d6a5e021e58a09982ef
commit cd23d6e19aef6daf321f0d6a5e021e58a09982ef Author: Jérôme Gardou <[email protected]> AuthorDate: Fri Dec 4 15:45:04 2020 +0100 Commit: Jérôme Gardou <[email protected]> CommitDate: Wed Feb 3 09:41:22 2021 +0100 [NTOS:CC] Honor FO_WRITE_THROUGH flag in CcCopyWrite and fix it in CcZeroData --- ntoskrnl/cc/copy.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/ntoskrnl/cc/copy.c b/ntoskrnl/cc/copy.c index d228a981ea2..357e98162e6 100644 --- a/ntoskrnl/cc/copy.c +++ b/ntoskrnl/cc/copy.c @@ -556,16 +556,13 @@ CcCopyWrite ( if (!SharedCacheMap) return FALSE; - /* FIXME: Honor FileObject FO_WRITE_THROUGH flag */ ASSERT((FileOffset->QuadPart + Length) <= SharedCacheMap->SectionSize.QuadPart); - ASSERT((FileObject->Flags & FO_WRITE_THROUGH) == 0); - CurrentOffset = FileOffset->QuadPart; while(CurrentOffset < WriteEnd) { ULONG VacbOffset = CurrentOffset % VACB_MAPPING_GRANULARITY; - ULONG VacbLength = min(Length, VACB_MAPPING_GRANULARITY - VacbOffset); + ULONG VacbLength = min(WriteEnd - CurrentOffset, VACB_MAPPING_GRANULARITY - VacbOffset); Status = CcRosGetVacb(SharedCacheMap, CurrentOffset, &Vacb); if (!NT_SUCCESS(Status)) @@ -585,7 +582,6 @@ CcCopyWrite ( Buffer = (PVOID)((ULONG_PTR)Buffer + VacbLength); CurrentOffset += VacbLength; - Length -= VacbLength; /* Tell Mm */ Status = MmMakePagesDirty(NULL, Add2Ptr(Vacb->BaseAddress, VacbOffset), VacbLength); @@ -600,6 +596,10 @@ CcCopyWrite ( _SEH2_END; } + /* Flush if needed */ + if (FileObject->Flags & FO_WRITE_THROUGH) + CcFlushCache(FileObject->SectionObjectPointer, FileOffset, Length, NULL); + return TRUE; } @@ -757,7 +757,7 @@ CcZeroData ( Length = EndOffset->QuadPart - StartOffset->QuadPart; WriteOffset.QuadPart = StartOffset->QuadPart; - if (!SharedCacheMap || (FileObject->Flags & FO_WRITE_THROUGH)) + if (!SharedCacheMap) { /* Make this a non-cached write */ IO_STATUS_BLOCK Iosb; @@ -848,5 +848,9 @@ CcZeroData ( _SEH2_END; } + /* Flush if needed */ + if (FileObject->Flags & FO_WRITE_THROUGH) + CcFlushCache(FileObject->SectionObjectPointer, StartOffset, EndOffset->QuadPart - StartOffset->QuadPart, NULL); + return TRUE; }
