Commit a2f5bfcf711aa72ad5587b533a1909334c2533a4

Authored by Hannes Reinecke
Committed by James Bottomley
1 parent c59c61493f

[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 <jbeulich@novell.com>
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>

Showing 2 changed files with 4 additions and 10 deletions Side-by-side Diff

drivers/scsi/aic7xxx/aic79xx_pci.c
... ... @@ -377,14 +377,12 @@
377 377 error = ahd_init(ahd);
378 378 if (error != 0)
379 379 return (error);
  380 + ahd->init_level++;
380 381  
381 382 /*
382 383 * Allow interrupts now that we are completely setup.
383 384 */
384   - error = ahd_pci_map_int(ahd);
385   - if (!error)
386   - ahd->init_level++;
387   - return error;
  385 + return ahd_pci_map_int(ahd);
388 386 }
389 387  
390 388 #ifdef CONFIG_PM
drivers/scsi/aic7xxx/aic7xxx_pci.c
... ... @@ -960,16 +960,12 @@
960 960 error = ahc_init(ahc);
961 961 if (error != 0)
962 962 return (error);
  963 + ahc->init_level++;
963 964  
964 965 /*
965 966 * Allow interrupts now that we are completely setup.
966 967 */
967   - error = ahc_pci_map_int(ahc);
968   - if (error != 0)
969   - return (error);
970   -
971   - ahc->init_level++;
972   - return (0);
  968 + return ahc_pci_map_int(ahc);
973 969 }
974 970  
975 971 /*