--- /dev/null
+From fujita.tomonori@lab.ntt.co.jp Tue Mar 11 20:46:52 2008
+To: stable@kernel.org
+Cc: chrisw@sous-sol.org, James.Bottomley@HansenPartnership.com, Mark_Salyzyn@adaptec.com, jeff@garzik.org, tomof@acm.org
+Subject: SCSI ips: handle scsi_add_host() failure, and other err cleanups
+From: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
+Message-Id: <20080312102542V.fujita.tomonori@lab.ntt.co.jp>
+Date: Wed, 12 Mar 2008 10:25:42 +0900
+
+From: Jeff Garzik <jeff@garzik.org>
+commit 2551a13e61d3c3df6c2da6de5a3ece78e6d67111
+
+FUJITA Tomonori notes:
+ It didn't intend to fix a critical bug, however, it turned out that it
+ does. Without this patch, the ips driver in 2.6.23 and 2.6.24 doesn't
+ work at all. You can find the more details at the following thread:
+
+ http://marc.info/?t=120293911900023&r=1&w=2
+
+Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
+Acked-by: "Salyzyn, Mark" <mark_salyzyn@adaptec.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ drivers/scsi/ips.c | 18 +++++++++++++-----
+ 1 file changed, 13 insertions(+), 5 deletions(-)
+
+--- a/drivers/scsi/ips.c
++++ b/drivers/scsi/ips.c
+@@ -6842,13 +6842,10 @@ ips_register_scsi(int index)
+ if (request_irq(ha->irq, do_ipsintr, IRQF_SHARED, ips_name, ha)) {
+ IPS_PRINTK(KERN_WARNING, ha->pcidev,
+ "Unable to install interrupt handler\n");
+- scsi_host_put(sh);
+- return -1;
++ goto err_out_sh;
+ }
+
+ kfree(oldha);
+- ips_sh[index] = sh;
+- ips_ha[index] = ha;
+
+ /* Store away needed values for later use */
+ sh->io_port = ha->io_addr;
+@@ -6867,10 +6864,21 @@ ips_register_scsi(int index)
+ sh->max_channel = ha->nbus - 1;
+ sh->can_queue = ha->max_cmds - 1;
+
+- scsi_add_host(sh, NULL);
++ if (scsi_add_host(sh, &ha->pcidev->dev))
++ goto err_out;
++
++ ips_sh[index] = sh;
++ ips_ha[index] = ha;
++
+ scsi_scan_host(sh);
+
+ return 0;
++
++err_out:
++ free_irq(ha->pcidev->irq, ha);
++err_out_sh:
++ scsi_host_put(sh);
++ return -1;
+ }
+
+ /*---------------------------------------------------------------------------*/