[SCSI] allow sleeping in ->eh_bus_reset_handler()
[deliverable/linux.git] / drivers / scsi / 53c700.c
index 8c64212e96082c447d2ed8f5cffb44ca32d7abfe..47cf9bd55d90cf17bedcae92ae5dc944c5e1d26c 100644 (file)
@@ -1957,23 +1957,30 @@ NCR_700_bus_reset(struct scsi_cmnd * SCp)
        printk(KERN_INFO "scsi%d (%d:%d) New error handler wants BUS reset, cmd %p\n\t",
               SCp->device->host->host_no, SCp->device->id, SCp->device->lun, SCp);
        scsi_print_command(SCp);
+
        /* In theory, eh_complete should always be null because the
         * eh is single threaded, but just in case we're handling a
         * reset via sg or something */
-       while(hostdata->eh_complete != NULL) {
+       spin_lock_irq(SCp->device->host->host_lock);
+       while (hostdata->eh_complete != NULL) {
                spin_unlock_irq(SCp->device->host->host_lock);
                msleep_interruptible(100);
                spin_lock_irq(SCp->device->host->host_lock);
        }
+
        hostdata->eh_complete = &complete;
        NCR_700_internal_bus_reset(SCp->device->host);
+
        spin_unlock_irq(SCp->device->host->host_lock);
        wait_for_completion(&complete);
        spin_lock_irq(SCp->device->host->host_lock);
+
        hostdata->eh_complete = NULL;
        /* Revalidate the transport parameters of the failing device */
        if(hostdata->fast)
                spi_schedule_dv_device(SCp->device);
+
+       spin_unlock_irq(SCp->device->host->host_lock);
        return SUCCESS;
 }
 
This page took 0.02434 seconds and 5 git commands to generate.