macsonic: free irq if sonic_open() fails
Subsystems (3)
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
@@ -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
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
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
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
@@ -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
Re: [PATCH 2/3 v2] macsonic: free irqs if sonic_open() fails
From: Kulikov Vasiliy <[email protected]>
Date: Sat, 10 Jul 2010 15:39:06 +0400
Quoted 5 lines
macsonic_open()doesn't checksonic_open()return code. If it is error we must free requested IRQs.Signed-off-by Kulikov Vasiliy <[email protected]>Signed-off-by Dan Carpenter <[email protected]>
Applied.