--- /dev/null
+From: Brian King <brking@linux.vnet.ibm.com>
+Subject: ipr: Fix sleeping function called with interrupts disabled
+References: bnc#501234
+Patch-Mainline: Yes
+
+During 2.6.30-rc2-git2 bootup on a power 7 box, i found the following BUG in
+the boot log
+
+BUG: sleeping function called from invalid context at mm/slab.c:3055
+in_atomic(): 0, irqs_disabled(): 1, pid: 198, name: modprobe
+
+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: Hannes Reinecke <hare@suse.de>
+---
+
+ drivers/scsi/ipr.c | 13 +++++++++----
+ 1 file changed, 9 insertions(+), 4 deletions(-)
+
+--- a/drivers/scsi/ipr.c
++++ b/drivers/scsi/ipr.c
+@@ -3658,6 +3658,7 @@ static int ipr_slave_configure(struct sc
+ {
+ 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);
+@@ -3676,12 +3677,16 @@ static int ipr_slave_configure(struct sc
+ }
+ 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;