]> git.ipfire.org Git - ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.31/patches.drivers/ipr-slave-alloc-crash
Move xen patchset to new version's subdir.
[ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.drivers / ipr-slave-alloc-crash
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/ipr-slave-alloc-crash b/src/patches/suse-2.6.27.31/patches.drivers/ipr-slave-alloc-crash
new file mode 100644 (file)
index 0000000..f3979a3
--- /dev/null
@@ -0,0 +1,53 @@
+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;