diff options
author | Darrick J. Wong <djwong@us.ibm.com> | 2007-01-11 17:15:26 -0500 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2007-01-13 17:19:07 -0500 |
commit | bf2a1928f3e5d44934e974940a8260a57fcc8a58 (patch) | |
tree | 29e1353a5c3f834f68b6b72d3ed8232b571e3895 | |
parent | 3cd041fb7f50f4cee3bc3a2b0ce02b1562894894 (diff) |
[SCSI] aic94xx: Match request_firmware with release_firmware
The vmalloc() blob holding the sequencer firmware wasn't being released at
module unload time, which resulted in a memory leak.
Signed-off-by: Alexis Bruemmer <alexisb@us.ibm.com>
Acked-by: Darrick J. Wong <djwong@us.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
-rw-r--r-- | drivers/scsi/aic94xx/aic94xx_init.c | 1 | ||||
-rw-r--r-- | drivers/scsi/aic94xx/aic94xx_seq.c | 7 | ||||
-rw-r--r-- | drivers/scsi/aic94xx/aic94xx_seq.h | 1 |
3 files changed, 9 insertions, 0 deletions
diff --git a/drivers/scsi/aic94xx/aic94xx_init.c b/drivers/scsi/aic94xx/aic94xx_init.c index 9a9ea74c8d9e..6faa10f59c18 100644 --- a/drivers/scsi/aic94xx/aic94xx_init.c +++ b/drivers/scsi/aic94xx/aic94xx_init.c | |||
@@ -886,6 +886,7 @@ static void __exit aic94xx_exit(void) | |||
886 | asd_remove_driver_attrs(&aic94xx_pci_driver.driver); | 886 | asd_remove_driver_attrs(&aic94xx_pci_driver.driver); |
887 | pci_unregister_driver(&aic94xx_pci_driver); | 887 | pci_unregister_driver(&aic94xx_pci_driver); |
888 | sas_release_transport(aic94xx_transport_template); | 888 | sas_release_transport(aic94xx_transport_template); |
889 | asd_release_firmware(); | ||
889 | asd_destroy_global_caches(); | 890 | asd_destroy_global_caches(); |
890 | asd_printk("%s version %s unloaded\n", ASD_DRIVER_DESCRIPTION, | 891 | asd_printk("%s version %s unloaded\n", ASD_DRIVER_DESCRIPTION, |
891 | ASD_DRIVER_VERSION); | 892 | ASD_DRIVER_VERSION); |
diff --git a/drivers/scsi/aic94xx/aic94xx_seq.c b/drivers/scsi/aic94xx/aic94xx_seq.c index 845112539d05..21569ecd8ec8 100644 --- a/drivers/scsi/aic94xx/aic94xx_seq.c +++ b/drivers/scsi/aic94xx/aic94xx_seq.c | |||
@@ -1232,6 +1232,13 @@ static int asd_seq_start_lseq(struct asd_ha_struct *asd_ha, int lseq) | |||
1232 | return asd_seq_unpause_lseq(asd_ha, lseq); | 1232 | return asd_seq_unpause_lseq(asd_ha, lseq); |
1233 | } | 1233 | } |
1234 | 1234 | ||
1235 | int asd_release_firmware(void) | ||
1236 | { | ||
1237 | if (sequencer_fw) | ||
1238 | release_firmware(sequencer_fw); | ||
1239 | return 0; | ||
1240 | } | ||
1241 | |||
1235 | static int asd_request_firmware(struct asd_ha_struct *asd_ha) | 1242 | static int asd_request_firmware(struct asd_ha_struct *asd_ha) |
1236 | { | 1243 | { |
1237 | int err, i; | 1244 | int err, i; |
diff --git a/drivers/scsi/aic94xx/aic94xx_seq.h b/drivers/scsi/aic94xx/aic94xx_seq.h index 9e715e5496af..9437ff0ae3a4 100644 --- a/drivers/scsi/aic94xx/aic94xx_seq.h +++ b/drivers/scsi/aic94xx/aic94xx_seq.h | |||
@@ -63,6 +63,7 @@ int asd_pause_lseq(struct asd_ha_struct *asd_ha, u8 lseq_mask); | |||
63 | int asd_unpause_lseq(struct asd_ha_struct *asd_ha, u8 lseq_mask); | 63 | int asd_unpause_lseq(struct asd_ha_struct *asd_ha, u8 lseq_mask); |
64 | int asd_init_seqs(struct asd_ha_struct *asd_ha); | 64 | int asd_init_seqs(struct asd_ha_struct *asd_ha); |
65 | int asd_start_seqs(struct asd_ha_struct *asd_ha); | 65 | int asd_start_seqs(struct asd_ha_struct *asd_ha); |
66 | int asd_release_firmware(void); | ||
66 | 67 | ||
67 | void asd_update_port_links(struct asd_ha_struct *asd_ha, struct asd_phy *phy); | 68 | void asd_update_port_links(struct asd_ha_struct *asd_ha, struct asd_phy *phy); |
68 | #endif | 69 | #endif |