Fix (among other things) failure to boot when a CD is not inserted, caused by
authorArt Yerkes <art.yerkes@gmail.com>
Mon, 28 Jul 2008 12:38:47 +0000 (12:38 +0000)
committerArt Yerkes <art.yerkes@gmail.com>
Mon, 28 Jul 2008 12:38:47 +0000 (12:38 +0000)
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
reactos/ntoskrnl/io/iomgr/irp.c

index e7296e3..2f63cb5 100644 (file)
@@ -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;
     }
index fdb4806..f4f7ea4 100644 (file)
@@ -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;
     }