Skip to contentSkip to conversation

macsonic: free irq if sonic_open() fails

PATCH Applied Kulikov Vasiliy 3 participants 5 messages Jul 10, 2010 – Jul 13, 2010

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 2/3 macsonic: free irq if sonic_open() fails

macsonic_open() doesn't check sonic_open() return code. If it is error we must free requested IRQ.

---
 drivers/net/macsonic.c |   36 +++++++++++++++++++++++++++---------
 1 files changed, 27 insertions(+), 9 deletions(-)
drivers/net/macsonic.c +27 -9
index adb54fe..3730762 100644
@@ -140,21 +140,39 @@ static irqreturn_t macsonic_interrupt(int irq, void *dev_id)
 
 static int macsonic_open(struct net_device* dev)
 {
-	if (request_irq(dev->irq, sonic_interrupt, IRQ_FLG_FAST, "sonic", dev)) {
-		printk(KERN_ERR "%s: unable to get IRQ %d.\n", dev->name, dev->irq);
-		return -EAGAIN;
+	int retval;
+
+	retval = request_irq(dev->irq, sonic_interrupt, IRQ_FLG_FAST,
+				"sonic", dev);
+	if (retval) {
+		printk(KERN_ERR "%s: unable to get IRQ %d.\n",
+				dev->name, dev->irq);
+		goto err;
 	}
 	/* Under the A/UX interrupt scheme, the onboard SONIC interrupt comes
 	 * in at priority level 3. However, we sometimes get the level 2 inter-
 	 * rupt as well, which must prevent re-entrance of the sonic handler.
 	 */
-	if (dev->irq = IRQ_AUTO_3)
-		if (request_irq(IRQ_NUBUS_9, macsonic_interrupt, IRQ_FLG_FAST, "sonic", dev)) {
-			printk(KERN_ERR "%s: unable to get IRQ %d.\n", dev->name, IRQ_NUBUS_9);
-			free_irq(dev->irq, dev);
-			return -EAGAIN;
+	if (dev->irq = IRQ_AUTO_3) {
+		retval = request_irq(IRQ_NUBUS_9, macsonic_interrupt,
+					IRQ_FLG_FAST, "sonic", dev);
+		if (retval) {
+			printk(KERN_ERR "%s: unable to get IRQ %d.\n",
+					dev->name, IRQ_NUBUS_9);
+			goto err_irq;
 		}
-	return sonic_open(dev);
+	}
+	retval = sonic_open(dev);
+	if (retval)
+		goto err_irq_nubus;
+	return 0;
+
+err_irq_nubus:
+	free_irq(IRQ_NUBUS_9, dev);
+err_irq:
+	free_irq(dev->irq, dev);
+err:
+	return retval;
 }
 
 static int macsonic_close(struct net_device* dev)
Signature · 1 line
1.7.0.4
#1 lore raw
Quoted 6 lines · Kulikov Vasiliy
drivers/net/macsonic.c +6 -0
+	if (dev->irq = IRQ_AUTO_3) {
+		retval = request_irq(IRQ_NUBUS_9, macsonic_interrupt,
+					IRQ_FLG_FAST, "sonic", dev);
+		if (retval) {
+			printk(KERN_ERR "%s: unable to get IRQ %d.\n",
+					dev->name, IRQ_NUBUS_9);

drivers/net/macsonic.c static irqreturn_t macsonic_interrupt(int irq, void *dev_id) · line 170

Quoted 10 lines
drivers/net/macsonic.c +8 -1
+			goto err_irq;
 		}
-	return sonic_open(dev);
+	}
+	retval = sonic_open(dev);
+	if (retval)
+		goto err_irq_nubus;
+	return 0;
+
+err_irq_nubus:

This should be:

+ if (dev->irq = IRQ_AUTO_3)
+ free_irq(IRQ_NUBUS_9, dev);

drivers/net/macsonic.c static irqreturn_t macsonic_interrupt(int irq, void *dev_id) · line 176

Quoted 5 lines
drivers/net/macsonic.c +4 -0
+err_irq:
+	free_irq(dev->irq, dev);
+err:
+	return retval;
 }

regards,
dan carpenter

#2 lore raw
Quoted 21 lines · Dan Carpenter
Quoted 6 lines · Kulikov Vasiliy
drivers/net/macsonic.c +6 -0
+	if (dev->irq = IRQ_AUTO_3) {
+		retval = request_irq(IRQ_NUBUS_9, macsonic_interrupt,
+					IRQ_FLG_FAST, "sonic", dev);
+		if (retval) {
+			printk(KERN_ERR "%s: unable to get IRQ %d.\n",
+					dev->name, IRQ_NUBUS_9);

drivers/net/macsonic.c static irqreturn_t macsonic_interrupt(int irq, void *dev_id) · line 170

Quoted 10 lines
drivers/net/macsonic.c +8 -1
+			goto err_irq;
 		}
-	return sonic_open(dev);
+	}
+	retval = sonic_open(dev);
+	if (retval)
+		goto err_irq_nubus;
+	return 0;
+
+err_irq_nubus:

This should be:

Review

Quoted 2 lines
(quoted diff) +2 -0
+	if (dev->irq = IRQ_AUTO_3)
+		free_irq(IRQ_NUBUS_9, dev);

Of course, thank you.

Quoted 10 lines

drivers/net/macsonic.c static irqreturn_t macsonic_interrupt(int irq, void *dev_id) · line 176

Quoted 6 lines
drivers/net/macsonic.c +4 -0
+err_irq:
+	free_irq(dev->irq, dev);
+err:
+	return retval;
 }

regards,
dan carpenter

#3 lore raw

PATCH v2 2/3 macsonic: free irqs if sonic_open() fails

macsonic_open() doesn't check sonic_open() return code. If it is error we must free requested IRQs.

---
 drivers/net/macsonic.c |   37 ++++++++++++++++++++++++++++---------
 1 files changed, 28 insertions(+), 9 deletions(-)
drivers/net/macsonic.c +28 -9
index adb54fe..c93679e 100644
@@ -140,21 +140,40 @@ static irqreturn_t macsonic_interrupt(int irq, void *dev_id)
 
 static int macsonic_open(struct net_device* dev)
 {
-	if (request_irq(dev->irq, sonic_interrupt, IRQ_FLG_FAST, "sonic", dev)) {
-		printk(KERN_ERR "%s: unable to get IRQ %d.\n", dev->name, dev->irq);
-		return -EAGAIN;
+	int retval;
+
+	retval = request_irq(dev->irq, sonic_interrupt, IRQ_FLG_FAST,
+				"sonic", dev);
+	if (retval) {
+		printk(KERN_ERR "%s: unable to get IRQ %d.\n",
+				dev->name, dev->irq);
+		goto err;
 	}
 	/* Under the A/UX interrupt scheme, the onboard SONIC interrupt comes
 	 * in at priority level 3. However, we sometimes get the level 2 inter-
 	 * rupt as well, which must prevent re-entrance of the sonic handler.
 	 */
-	if (dev->irq = IRQ_AUTO_3)
-		if (request_irq(IRQ_NUBUS_9, macsonic_interrupt, IRQ_FLG_FAST, "sonic", dev)) {
-			printk(KERN_ERR "%s: unable to get IRQ %d.\n", dev->name, IRQ_NUBUS_9);
-			free_irq(dev->irq, dev);
-			return -EAGAIN;
+	if (dev->irq = IRQ_AUTO_3) {
+		retval = request_irq(IRQ_NUBUS_9, macsonic_interrupt,
+					IRQ_FLG_FAST, "sonic", dev);
+		if (retval) {
+			printk(KERN_ERR "%s: unable to get IRQ %d.\n",
+					dev->name, IRQ_NUBUS_9);
+			goto err_irq;
 		}
-	return sonic_open(dev);
+	}
+	retval = sonic_open(dev);
+	if (retval)
+		goto err_irq_nubus;
+	return 0;
+
+err_irq_nubus:
+	if (dev->irq = IRQ_AUTO_3)
+		free_irq(IRQ_NUBUS_9, dev);
+err_irq:
+	free_irq(dev->irq, dev);
+err:
+	return retval;
 }
 
 static int macsonic_close(struct net_device* dev)
Signature · 1 line
1.7.0.4