Author: pschweitzer Date: Wed Sep 13 16:13:21 2017 New Revision: 75834
URL: http://svn.reactos.org/svn/reactos?rev=75834&view=rev Log: [NTOSKRNL] Don't call MmBuildMdlForNonPagedPool in CcWriteVirtualAddress(): - BaseAddress comes from PagedPood - Windows returns a locked MDL from paged pool - See tests from r75833 that are getting fixed with that revision
This fixes assertions failures on BtrFS write.
CORE-13763 CORE-13769
Modified: trunk/reactos/ntoskrnl/cc/copy.c
Modified: trunk/reactos/ntoskrnl/cc/copy.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cc/copy.c?rev=7583... ============================================================================== --- trunk/reactos/ntoskrnl/cc/copy.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/cc/copy.c [iso-8859-1] Wed Sep 13 16:13:21 2017 @@ -147,14 +147,30 @@ { return STATUS_INSUFFICIENT_RESOURCES; } - MmBuildMdlForNonPagedPool(Mdl); - Mdl->MdlFlags |= MDL_IO_PAGE_READ; - KeInitializeEvent(&Event, NotificationEvent, FALSE); - Status = IoSynchronousPageWrite(Vacb->SharedCacheMap->FileObject, Mdl, &Vacb->FileOffset, &Event, &IoStatus); - if (Status == STATUS_PENDING) - { - KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); - Status = IoStatus.Status; + + Status = STATUS_SUCCESS; + _SEH2_TRY + { + MmProbeAndLockPages(Mdl, KernelMode, IoReadAccess); + } + _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + KeBugCheck(CACHE_MANAGER); + } _SEH2_END; + + if (NT_SUCCESS(Status)) + { + Mdl->MdlFlags |= MDL_IO_PAGE_READ; + KeInitializeEvent(&Event, NotificationEvent, FALSE); + Status = IoSynchronousPageWrite(Vacb->SharedCacheMap->FileObject, Mdl, &Vacb->FileOffset, &Event, &IoStatus); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + Status = IoStatus.Status; + } + + MmUnlockPages(Mdl); } IoFreeMdl(Mdl); if (!NT_SUCCESS(Status) && (Status != STATUS_END_OF_FILE))