ioremap balanced with iounmap for drivers/mtd subsystem
ioremap must be balanced by an iounmap and failing to do so can result in a memory leak. Tested (compilation only) with: - allmodconfig - Modifying drivers/mtd/maps/Kconfig and drivers/mtd/nand/Kconfig to make sure that the changed file is compiling without warning Signed-off-by: Amol Lad <amol@verismonetworks.com> Signed-off-by: David Woodhouse <dwmw2@infradead.org>
This commit is contained in:

committed by
David Woodhouse

parent
dd8e9ed6ed
commit
25f0c659fe
@@ -277,6 +277,7 @@ int __init nettel_init(void)
|
||||
nettel_amd_map.virt = ioremap_nocache(amdaddr, maxsize);
|
||||
if (!nettel_amd_map.virt) {
|
||||
printk("SNAPGEAR: failed to ioremap() BOOTCS\n");
|
||||
iounmap(nettel_mmcrp);
|
||||
return(-EIO);
|
||||
}
|
||||
simple_map_init(&nettel_amd_map);
|
||||
@@ -337,7 +338,8 @@ int __init nettel_init(void)
|
||||
nettel_amd_map.virt = NULL;
|
||||
#else
|
||||
/* Only AMD flash supported */
|
||||
return(-ENXIO);
|
||||
rc = -ENXIO;
|
||||
goto out_unmap2;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -361,14 +363,15 @@ int __init nettel_init(void)
|
||||
nettel_intel_map.virt = ioremap_nocache(intel0addr, maxsize);
|
||||
if (!nettel_intel_map.virt) {
|
||||
printk("SNAPGEAR: failed to ioremap() ROMCS1\n");
|
||||
return(-EIO);
|
||||
rc = -EIO;
|
||||
goto out_unmap2;
|
||||
}
|
||||
simple_map_init(&nettel_intel_map);
|
||||
|
||||
intel_mtd = do_map_probe("cfi_probe", &nettel_intel_map);
|
||||
if (!intel_mtd) {
|
||||
iounmap(nettel_intel_map.virt);
|
||||
return(-ENXIO);
|
||||
rc = -ENXIO;
|
||||
goto out_unmap1;
|
||||
}
|
||||
|
||||
/* Set PAR to the detected size */
|
||||
@@ -394,13 +397,14 @@ int __init nettel_init(void)
|
||||
nettel_intel_map.virt = ioremap_nocache(intel0addr, maxsize);
|
||||
if (!nettel_intel_map.virt) {
|
||||
printk("SNAPGEAR: failed to ioremap() ROMCS1/2\n");
|
||||
return(-EIO);
|
||||
rc = -EIO;
|
||||
goto out_unmap2;
|
||||
}
|
||||
|
||||
intel_mtd = do_map_probe("cfi_probe", &nettel_intel_map);
|
||||
if (! intel_mtd) {
|
||||
iounmap((void *) nettel_intel_map.virt);
|
||||
return(-ENXIO);
|
||||
rc = -ENXIO;
|
||||
goto out_unmap1;
|
||||
}
|
||||
|
||||
intel1size = intel_mtd->size - intel0size;
|
||||
@@ -456,6 +460,18 @@ int __init nettel_init(void)
|
||||
#endif
|
||||
|
||||
return(rc);
|
||||
|
||||
#ifdef CONFIG_MTD_CFI_INTELEXT
|
||||
out_unmap1:
|
||||
iounmap((void *) nettel_intel_map.virt);
|
||||
#endif
|
||||
|
||||
out_unmap2:
|
||||
iounmap(nettel_mmcrp);
|
||||
iounmap(nettel_amd_map.virt);
|
||||
|
||||
return(rc);
|
||||
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
@@ -469,6 +485,10 @@ void __exit nettel_cleanup(void)
|
||||
del_mtd_partitions(amd_mtd);
|
||||
map_destroy(amd_mtd);
|
||||
}
|
||||
if (nettel_mmcrp) {
|
||||
iounmap(nettel_mmcrp);
|
||||
nettel_mmcrp = NULL;
|
||||
}
|
||||
if (nettel_amd_map.virt) {
|
||||
iounmap(nettel_amd_map.virt);
|
||||
nettel_amd_map.virt = NULL;
|
||||
|
Reference in New Issue
Block a user