]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.31/patches.fixes/aic7xxx-leaves-timer-running-on-init-failure
Move xen patchset to new version's subdir.
[people/teissler/ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.fixes / aic7xxx-leaves-timer-running-on-init-failure
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/aic7xxx-leaves-timer-running-on-init-failure b/src/patches/suse-2.6.27.31/patches.fixes/aic7xxx-leaves-timer-running-on-init-failure
new file mode 100644 (file)
index 0000000..bc94ef7
--- /dev/null
@@ -0,0 +1,61 @@
+From: Hannes Reinecke <hare@suse.de>
+Date: Wed, 25 Mar 2009 11:18:16 +0100
+Subject: aic7xxx leaves timer running on init failure
+References: bnc#469576
+
+aic79xx leaves timers inserted when ahd_init() (which inserts
+two timers at its very end) succeeds but ahd_pci_map_int()
+fails. In this case ahd->init_level gets incremented to 5 only
+when that function succeeds, but ahd_free() calls ahd_shutdown()
+only when ahd->init_level == 5, and ahd_shutdown() is where the
+timers get removed. Since the freeing of the IRQ is not controlled
+by ahd->init_level, we should increment init_level prior to
+calling ahd_pci_map_int().
+
+Reported-by: Jan Beulich <jbeulich@novell.com>
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+---
+ drivers/scsi/aic7xxx/aic79xx_pci.c |    6 ++----
+ drivers/scsi/aic7xxx/aic7xxx_pci.c |    8 ++------
+ 2 files changed, 4 insertions(+), 10 deletions(-)
+
+--- a/drivers/scsi/aic7xxx/aic79xx_pci.c
++++ b/drivers/scsi/aic7xxx/aic79xx_pci.c
+@@ -379,14 +379,12 @@ ahd_pci_config(struct ahd_softc *ahd, co
+       error = ahd_init(ahd);
+       if (error != 0)
+               return (error);
++      ahd->init_level++;
+       /*
+        * Allow interrupts now that we are completely setup.
+        */
+-      error = ahd_pci_map_int(ahd);
+-      if (!error)
+-              ahd->init_level++;
+-      return error;
++      return ahd_pci_map_int(ahd);
+ }
+ #ifdef CONFIG_PM
+--- a/drivers/scsi/aic7xxx/aic7xxx_pci.c
++++ b/drivers/scsi/aic7xxx/aic7xxx_pci.c
+@@ -960,16 +960,12 @@ ahc_pci_config(struct ahc_softc *ahc, co
+       error = ahc_init(ahc);
+       if (error != 0)
+               return (error);
++      ahc->init_level++;
+       /*
+        * Allow interrupts now that we are completely setup.
+        */
+-      error = ahc_pci_map_int(ahc);
+-      if (error != 0)
+-              return (error);
+-
+-      ahc->init_level++;
+-      return (0);
++      return ahc_pci_map_int(ahc);
+ }
+ /*