From: Hannes Reinecke 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 Signed-off-by: Hannes Reinecke --- 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); } /*