Author: cgutman Date: Fri Jun 3 05:38:27 2011 New Revision: 52071
URL: http://svn.reactos.org/svn/reactos?rev=52071&view=rev Log: [USBSTOR] - Don't leave DISPATCH_LEVEL while holding a spin lock acquired at DISPATCH_LEVEL - Synchronize cancellation checking by acquiring the cancel spin lock
Modified: branches/usb-bringup/drivers/usb/usbstor/queue.c
Modified: branches/usb-bringup/drivers/usb/usbstor/queue.c URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbstor/... ============================================================================== --- branches/usb-bringup/drivers/usb/usbstor/queue.c [iso-8859-1] (original) +++ branches/usb-bringup/drivers/usb/usbstor/queue.c [iso-8859-1] Fri Jun 3 05:38:27 2011 @@ -56,19 +56,19 @@ KeAcquireSpinLockAtDpcLevel(&FDODeviceExtension->IrpListLock);
// + // remove the irp from the list + // + RemoveEntryList(&Irp->Tail.Overlay.ListEntry); + + // + // release irp list lock + // + KeReleaseSpinLockFromDpcLevel(&FDODeviceExtension->IrpListLock); + + // // now release the cancel lock // IoReleaseCancelSpinLock(Irp->CancelIrql); - - // - // remove the irp from the list - // - RemoveEntryList(&Irp->Tail.Overlay.ListEntry); - - // - // release irp list lock - // - KeReleaseSpinLockFromDpcLevel(&FDODeviceExtension->IrpListLock);
// // set cancel status @@ -132,6 +132,21 @@ FDODeviceExtension->IrpPendingCount++;
// + // check if queue is freezed + // + IrpListFreeze = FDODeviceExtension->IrpListFreeze; + + // + // release list lock + // + KeReleaseSpinLock(&FDODeviceExtension->IrpListLock, OldLevel); + + // + // synchronize with cancellations by holding the cancel lock + // + IoAcquireCancelSpinLock(&Irp->CancelIrql); + + // // now set the driver cancel routine // OldDriverCancel = IoSetCancelRoutine(Irp, USBSTOR_CancelIo); @@ -142,16 +157,6 @@ if (Irp->Cancel && OldDriverCancel == NULL) { // - // the irp has already been cancelled - // - KeReleaseSpinLock(&FDODeviceExtension->IrpListLock, OldLevel); - - // - // cancel routine requires that cancel spinlock is held - // - IoAcquireCancelSpinLock(&Irp->CancelIrql); - - // // cancel irp // USBSTOR_CancelIo(DeviceObject, Irp); @@ -163,14 +168,9 @@ }
// - // check if queue is freezed - // - IrpListFreeze = FDODeviceExtension->IrpListFreeze; - - // - // release list lock - // - KeReleaseSpinLock(&FDODeviceExtension->IrpListLock, OldLevel); + // release the cancel lock + // + IoReleaseCancelSpinLock(Irp->CancelIrql);
// // if list is freezed, dont start this packet