[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>
This commit is contained in:
parent
3cd041fb7f
commit
bf2a1928f3
|
@ -886,6 +886,7 @@ static void __exit aic94xx_exit(void)
|
||||||
asd_remove_driver_attrs(&aic94xx_pci_driver.driver);
|
asd_remove_driver_attrs(&aic94xx_pci_driver.driver);
|
||||||
pci_unregister_driver(&aic94xx_pci_driver);
|
pci_unregister_driver(&aic94xx_pci_driver);
|
||||||
sas_release_transport(aic94xx_transport_template);
|
sas_release_transport(aic94xx_transport_template);
|
||||||
|
asd_release_firmware();
|
||||||
asd_destroy_global_caches();
|
asd_destroy_global_caches();
|
||||||
asd_printk("%s version %s unloaded\n", ASD_DRIVER_DESCRIPTION,
|
asd_printk("%s version %s unloaded\n", ASD_DRIVER_DESCRIPTION,
|
||||||
ASD_DRIVER_VERSION);
|
ASD_DRIVER_VERSION);
|
||||||
|
|
|
@ -1232,6 +1232,13 @@ static int asd_seq_start_lseq(struct asd_ha_struct *asd_ha, int lseq)
|
||||||
return asd_seq_unpause_lseq(asd_ha, lseq);
|
return asd_seq_unpause_lseq(asd_ha, lseq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int asd_release_firmware(void)
|
||||||
|
{
|
||||||
|
if (sequencer_fw)
|
||||||
|
release_firmware(sequencer_fw);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int asd_request_firmware(struct asd_ha_struct *asd_ha)
|
static int asd_request_firmware(struct asd_ha_struct *asd_ha)
|
||||||
{
|
{
|
||||||
int err, i;
|
int err, i;
|
||||||
|
|
|
@ -63,6 +63,7 @@ int asd_pause_lseq(struct asd_ha_struct *asd_ha, u8 lseq_mask);
|
||||||
int asd_unpause_lseq(struct asd_ha_struct *asd_ha, u8 lseq_mask);
|
int asd_unpause_lseq(struct asd_ha_struct *asd_ha, u8 lseq_mask);
|
||||||
int asd_init_seqs(struct asd_ha_struct *asd_ha);
|
int asd_init_seqs(struct asd_ha_struct *asd_ha);
|
||||||
int asd_start_seqs(struct asd_ha_struct *asd_ha);
|
int asd_start_seqs(struct asd_ha_struct *asd_ha);
|
||||||
|
int asd_release_firmware(void);
|
||||||
|
|
||||||
void asd_update_port_links(struct asd_ha_struct *asd_ha, struct asd_phy *phy);
|
void asd_update_port_links(struct asd_ha_struct *asd_ha, struct asd_phy *phy);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue