From a2f5bfcf711aa72ad5587b533a1909334c2533a4 Mon Sep 17 00:00:00 2001 From: Hannes Reinecke Date: Wed, 25 Mar 2009 11:19:37 +0100 Subject: [PATCH] [SCSI] aic7xxx: leaves timer running on init failure 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 Signed-off-by: James Bottomley --- drivers/scsi/aic7xxx/aic79xx_pci.c | 6 ++---- drivers/scsi/aic7xxx/aic7xxx_pci.c | 8 ++------ 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/drivers/scsi/aic7xxx/aic79xx_pci.c b/drivers/scsi/aic7xxx/aic79xx_pci.c index a734d77e880e..b8423c428a14 100644 --- a/drivers/scsi/aic7xxx/aic79xx_pci.c +++ b/drivers/scsi/aic7xxx/aic79xx_pci.c @@ -377,14 +377,12 @@ ahd_pci_config(struct ahd_softc *ahd, const struct ahd_pci_identity *entry) 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 diff --git a/drivers/scsi/aic7xxx/aic7xxx_pci.c b/drivers/scsi/aic7xxx/aic7xxx_pci.c index c07cb6eebb02..4347c8dc459f 100644 --- 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, const struct ahc_pci_identity *entry) 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); } /*