[parisc-linux] [PATCH] ioremap balanced with iounmap for drivers/parisc

Amol Lad amol at verismonetworks.com
Wed Sep 27 23:53:34 MDT 2006


ioremap must be balanced by an iounmap and failing to do so can result
in a memory leak.

Tested (compilation only) to make sure the files are compiling without
any warning/error due to new changes

Signed-off-by: Amol Lad <amol at verismonetworks.com>
---
 dino.c    |    4 +++-
 eisa.c    |    1 +
 iosapic.c |    1 +
 lba_pci.c |    7 ++++++-
 4 files changed, 11 insertions(+), 2 deletions(-)
---
diff -uprN -X linux-2.6.18-orig/Documentation/dontdiff linux-2.6.18-orig/drivers/parisc/dino.c linux-2.6.18/drivers/parisc/dino.c
--- linux-2.6.18-orig/drivers/parisc/dino.c	2006-09-21 10:15:38.000000000 +0530
+++ linux-2.6.18/drivers/parisc/dino.c	2006-09-28 10:14:07.000000000 +0530
@@ -1007,8 +1007,10 @@ static int __init dino_probe(struct pari
 		dino_bridge_init(dino_dev, name);
 	}
 
-	if (dino_common_init(dev, dino_dev, name))
+	if (dino_common_init(dev, dino_dev, name)) {
+		iounmap(dino_dev->hba.base_addr);
 		return 1;
+	}
 
 	dev->dev.platform_data = dino_dev;
 
diff -uprN -X linux-2.6.18-orig/Documentation/dontdiff linux-2.6.18-orig/drivers/parisc/eisa.c linux-2.6.18/drivers/parisc/eisa.c
--- linux-2.6.18-orig/drivers/parisc/eisa.c	2006-09-21 10:15:38.000000000 +0530
+++ linux-2.6.18/drivers/parisc/eisa.c	2006-09-28 10:14:49.000000000 +0530
@@ -381,6 +381,7 @@ static int __devinit eisa_probe(struct p
 		eisa_dev.root.dma_mask = 0xffffffff; /* wild guess */
 		if (eisa_root_register (&eisa_dev.root)) {
 			printk(KERN_ERR "EISA: Failed to register EISA root\n");
+			iounmap(eisa_eeprom_addr);
 			return -1;
 		}
 	}
diff -uprN -X linux-2.6.18-orig/Documentation/dontdiff linux-2.6.18-orig/drivers/parisc/iosapic.c linux-2.6.18/drivers/parisc/iosapic.c
--- linux-2.6.18-orig/drivers/parisc/iosapic.c	2006-09-21 10:15:38.000000000 +0530
+++ linux-2.6.18/drivers/parisc/iosapic.c	2006-09-28 10:15:30.000000000 +0530
@@ -887,6 +887,7 @@ void *iosapic_register(unsigned long hpa
 	vip = isi->isi_vector = (struct vector_info *)
 		kzalloc(sizeof(struct vector_info) * isi->isi_num_vectors, GFP_KERNEL);
 	if (vip == NULL) {
+		iounmap(isi->addr);
 		kfree(isi);
 		return NULL;
 	}
diff -uprN -X linux-2.6.18-orig/Documentation/dontdiff linux-2.6.18-orig/drivers/parisc/lba_pci.c linux-2.6.18/drivers/parisc/lba_pci.c
--- linux-2.6.18-orig/drivers/parisc/lba_pci.c	2006-08-24 02:46:33.000000000 +0530
+++ linux-2.6.18/drivers/parisc/lba_pci.c	2006-09-28 10:17:56.000000000 +0530
@@ -1574,6 +1574,7 @@ lba_driver_probe(struct parisc_device *d
 		cfg_ops = &mercury_cfg_ops;
 	} else {
 		printk(KERN_ERR "Unknown LBA found at 0x%lx\n", dev->hpa.start);
+		iounmap(addr);
 		return -ENODEV;
 	}
 
@@ -1589,6 +1590,7 @@ lba_driver_probe(struct parisc_device *d
 	lba_dev = kzalloc(sizeof(struct lba_device), GFP_KERNEL);
 	if (!lba_dev) {
 		printk(KERN_ERR "lba_init_chip - couldn't alloc lba_device\n");
+		iounmap(addr);
 		return(1);
 	}
 
@@ -1606,8 +1608,11 @@ lba_driver_probe(struct parisc_device *d
 	pcibios_register_hba(HBA_DATA(lba_dev));
 	spin_lock_init(&lba_dev->lba_lock);
 
-	if (lba_hw_init(lba_dev))
+	if (lba_hw_init(lba_dev)) {
+		iounmap(lba_dev->hba.base_addr);
+		lba_dev->hba.base_addr = NULL;
 		return(1);
+	}
 
 	/* ---------- Third : setup I/O Port and MMIO resources  --------- */
 





More information about the parisc-linux mailing list