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; }