From 258329b01b77d2cecce205bc270e63375df20822 Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Mon, 28 Jul 2008 12:38:47 +0000 Subject: [PATCH] Fix (among other things) failure to boot when a CD is not inserted, caused by the new (correct) ASSERT in mutex acquisition in MmProbeAndLockPages, which was erroneously being called from IoBuildAsynchronousFsdRequest at DISPATCH_LEVEL. The only correct course of action when calling IoBuildAsynchronousFsdRequest at DISPATCH_LEVEL is to MmBuildMdlForNonPagedPool since the buffer must be nonpaged (if the IRP completes synchronously, we'll still be at DISPATCH_LEVEL) This is the case when direct io is done at DISPATCH_LEVEL using IoBuildAsynchronousFsdRequest. svn path=/trunk/; revision=34899 --- reactos/drivers/storage/scsiport/scsiport.c | 3 +- reactos/ntoskrnl/io/iomgr/irp.c | 43 ++++++++++++--------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/reactos/drivers/storage/scsiport/scsiport.c b/reactos/drivers/storage/scsiport/scsiport.c index e7296e36c06..2f63cb5ee16 100644 --- a/reactos/drivers/storage/scsiport/scsiport.c +++ b/reactos/drivers/storage/scsiport/scsiport.c @@ -4405,7 +4405,8 @@ SpiCompletionRoutine(PDEVICE_OBJECT DeviceObject, if (Irp->MdlAddress != NULL) { - MmUnlockPages(Irp->MdlAddress); + /* We don't need to unlock this MDL because the request could + * only have come from dispatch level */ IoFreeMdl(Irp->MdlAddress); Irp->MdlAddress = NULL; } diff --git a/reactos/ntoskrnl/io/iomgr/irp.c b/reactos/ntoskrnl/io/iomgr/irp.c index fdb48064786..f4f7ea4a3de 100644 --- a/reactos/ntoskrnl/io/iomgr/irp.c +++ b/reactos/ntoskrnl/io/iomgr/irp.c @@ -682,23 +682,30 @@ IoBuildAsynchronousFsdRequest(IN ULONG MajorFunction, return NULL; } - /* Probe and Lock */ - _SEH_TRY - { - /* Do the probe */ - MmProbeAndLockPages(Irp->MdlAddress, - KernelMode, - MajorFunction == IRP_MJ_READ ? - IoWriteAccess : IoReadAccess); - } - _SEH_HANDLE - { - /* Free the IRP and its MDL */ - IoFreeMdl(Irp->MdlAddress); - IoFreeIrp(Irp); - Irp = NULL; - } - _SEH_END; + if (KeGetCurrentIrql() >= DISPATCH_LEVEL) + { + MmBuildMdlForNonPagedPool(Irp->MdlAddress); + } + else + { + /* Probe and Lock */ + _SEH_TRY + { + /* Do the probe */ + MmProbeAndLockPages(Irp->MdlAddress, + KernelMode, + MajorFunction == IRP_MJ_READ ? + IoWriteAccess : IoReadAccess); + } + _SEH_HANDLE + { + /* Free the IRP and its MDL */ + IoFreeMdl(Irp->MdlAddress); + IoFreeIrp(Irp); + Irp = NULL; + } + _SEH_END; + } /* This is how we know if we failed during the probe */ if (!Irp) return NULL; @@ -1344,7 +1351,7 @@ IofCompleteRequest(IN PIRP Irp, Mdl = Irp->MdlAddress; while (Mdl) { - MmUnlockPages(Mdl); + MmUnlockPages(Mdl); Mdl = Mdl->Next; }