diff options
author | Amol Lad <amol@verismonetworks.com> | 2006-09-21 08:42:43 -0400 |
---|---|---|
committer | David Woodhouse <dwmw2@infradead.org> | 2006-09-22 05:24:31 -0400 |
commit | 25f0c659fe64832d8ee06aa623fffaad708dcf8b (patch) | |
tree | b5740156ac2ce5e39aaaba32ddb21b03379abb48 /drivers/mtd/maps/nettel.c | |
parent | dd8e9ed6ed544e2b924429d29cd2a6b55590109b (diff) |
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>
Diffstat (limited to 'drivers/mtd/maps/nettel.c')
-rw-r--r-- | drivers/mtd/maps/nettel.c | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/drivers/mtd/maps/nettel.c b/drivers/mtd/maps/nettel.c index 0994b5b2e331..198e840ff6db 100644 --- a/drivers/mtd/maps/nettel.c +++ b/drivers/mtd/maps/nettel.c | |||
@@ -277,6 +277,7 @@ int __init nettel_init(void) | |||
277 | nettel_amd_map.virt = ioremap_nocache(amdaddr, maxsize); | 277 | nettel_amd_map.virt = ioremap_nocache(amdaddr, maxsize); |
278 | if (!nettel_amd_map.virt) { | 278 | if (!nettel_amd_map.virt) { |
279 | printk("SNAPGEAR: failed to ioremap() BOOTCS\n"); | 279 | printk("SNAPGEAR: failed to ioremap() BOOTCS\n"); |
280 | iounmap(nettel_mmcrp); | ||
280 | return(-EIO); | 281 | return(-EIO); |
281 | } | 282 | } |
282 | simple_map_init(&nettel_amd_map); | 283 | simple_map_init(&nettel_amd_map); |
@@ -337,7 +338,8 @@ int __init nettel_init(void) | |||
337 | nettel_amd_map.virt = NULL; | 338 | nettel_amd_map.virt = NULL; |
338 | #else | 339 | #else |
339 | /* Only AMD flash supported */ | 340 | /* Only AMD flash supported */ |
340 | return(-ENXIO); | 341 | rc = -ENXIO; |
342 | goto out_unmap2; | ||
341 | #endif | 343 | #endif |
342 | } | 344 | } |
343 | 345 | ||
@@ -361,14 +363,15 @@ int __init nettel_init(void) | |||
361 | nettel_intel_map.virt = ioremap_nocache(intel0addr, maxsize); | 363 | nettel_intel_map.virt = ioremap_nocache(intel0addr, maxsize); |
362 | if (!nettel_intel_map.virt) { | 364 | if (!nettel_intel_map.virt) { |
363 | printk("SNAPGEAR: failed to ioremap() ROMCS1\n"); | 365 | printk("SNAPGEAR: failed to ioremap() ROMCS1\n"); |
364 | return(-EIO); | 366 | rc = -EIO; |
367 | goto out_unmap2; | ||
365 | } | 368 | } |
366 | simple_map_init(&nettel_intel_map); | 369 | simple_map_init(&nettel_intel_map); |
367 | 370 | ||
368 | intel_mtd = do_map_probe("cfi_probe", &nettel_intel_map); | 371 | intel_mtd = do_map_probe("cfi_probe", &nettel_intel_map); |
369 | if (!intel_mtd) { | 372 | if (!intel_mtd) { |
370 | iounmap(nettel_intel_map.virt); | 373 | rc = -ENXIO; |
371 | return(-ENXIO); | 374 | goto out_unmap1; |
372 | } | 375 | } |
373 | 376 | ||
374 | /* Set PAR to the detected size */ | 377 | /* Set PAR to the detected size */ |
@@ -394,13 +397,14 @@ int __init nettel_init(void) | |||
394 | nettel_intel_map.virt = ioremap_nocache(intel0addr, maxsize); | 397 | nettel_intel_map.virt = ioremap_nocache(intel0addr, maxsize); |
395 | if (!nettel_intel_map.virt) { | 398 | if (!nettel_intel_map.virt) { |
396 | printk("SNAPGEAR: failed to ioremap() ROMCS1/2\n"); | 399 | printk("SNAPGEAR: failed to ioremap() ROMCS1/2\n"); |
397 | return(-EIO); | 400 | rc = -EIO; |
401 | goto out_unmap2; | ||
398 | } | 402 | } |
399 | 403 | ||
400 | intel_mtd = do_map_probe("cfi_probe", &nettel_intel_map); | 404 | intel_mtd = do_map_probe("cfi_probe", &nettel_intel_map); |
401 | if (! intel_mtd) { | 405 | if (! intel_mtd) { |
402 | iounmap((void *) nettel_intel_map.virt); | 406 | rc = -ENXIO; |
403 | return(-ENXIO); | 407 | goto out_unmap1; |
404 | } | 408 | } |
405 | 409 | ||
406 | intel1size = intel_mtd->size - intel0size; | 410 | intel1size = intel_mtd->size - intel0size; |
@@ -456,6 +460,18 @@ int __init nettel_init(void) | |||
456 | #endif | 460 | #endif |
457 | 461 | ||
458 | return(rc); | 462 | return(rc); |
463 | |||
464 | #ifdef CONFIG_MTD_CFI_INTELEXT | ||
465 | out_unmap1: | ||
466 | iounmap((void *) nettel_intel_map.virt); | ||
467 | #endif | ||
468 | |||
469 | out_unmap2: | ||
470 | iounmap(nettel_mmcrp); | ||
471 | iounmap(nettel_amd_map.virt); | ||
472 | |||
473 | return(rc); | ||
474 | |||
459 | } | 475 | } |
460 | 476 | ||
461 | /****************************************************************************/ | 477 | /****************************************************************************/ |
@@ -469,6 +485,10 @@ void __exit nettel_cleanup(void) | |||
469 | del_mtd_partitions(amd_mtd); | 485 | del_mtd_partitions(amd_mtd); |
470 | map_destroy(amd_mtd); | 486 | map_destroy(amd_mtd); |
471 | } | 487 | } |
488 | if (nettel_mmcrp) { | ||
489 | iounmap(nettel_mmcrp); | ||
490 | nettel_mmcrp = NULL; | ||
491 | } | ||
472 | if (nettel_amd_map.virt) { | 492 | if (nettel_amd_map.virt) { |
473 | iounmap(nettel_amd_map.virt); | 493 | iounmap(nettel_amd_map.virt); |
474 | nettel_amd_map.virt = NULL; | 494 | nettel_amd_map.virt = NULL; |