[SCSI] ipr: Fix sleeping function called with interrupts disabled
authorBrian King <brking@linux.vnet.ibm.com>
Wed, 22 Apr 2009 13:58:02 +0000 (08:58 -0500)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Mon, 27 Apr 2009 15:32:13 +0000 (10:32 -0500)
The ata_sas_slave_configure was changed such that it now allocates
some memory for a drain buffer for ATAPI devices. Fixup the ipr
driver such that we no longer make this call with interrupts disabled.

Signed-off-by: Brian King <brking@linux.vnet.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
drivers/scsi/ipr.c

index c09d77591f92b8576432544243781ed4df11d39a..dd689ded8609e0709cbb0980d7356359fc6a0524 100644 (file)
@@ -3654,6 +3654,7 @@ static int ipr_slave_configure(struct scsi_device *sdev)
 {
        struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) sdev->host->hostdata;
        struct ipr_resource_entry *res;
+       struct ata_port *ap = NULL;
        unsigned long lock_flags = 0;
 
        spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
@@ -3672,12 +3673,16 @@ static int ipr_slave_configure(struct scsi_device *sdev)
                }
                if (ipr_is_vset_device(res) || ipr_is_scsi_disk(res))
                        sdev->allow_restart = 1;
-               if (ipr_is_gata(res) && res->sata_port) {
+               if (ipr_is_gata(res) && res->sata_port)
+                       ap = res->sata_port->ap;
+               spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+
+               if (ap) {
                        scsi_adjust_queue_depth(sdev, 0, IPR_MAX_CMD_PER_ATA_LUN);
-                       ata_sas_slave_configure(sdev, res->sata_port->ap);
-               } else {
+                       ata_sas_slave_configure(sdev, ap);
+               } else
                        scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun);
-               }
+               return 0;
        }
        spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
        return 0;