1
0
Fork 0

watchdog: sb_wdog: release irq and reboot notifier in error path and module_exit()

irq and reboot notifier are acquired in module_init() but never released.
They should be released correctly, otherwise reloading the module or error
during module_init() will cause a problem.

Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Cc: Andrew Sharp <andy.sharp@lsi.com>
Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
wifi-calibration
Akinobu Mita 2010-08-21 18:27:50 +09:00 committed by Wim Van Sebroeck
parent 9c03f1622a
commit ae44855ae8
1 changed files with 9 additions and 3 deletions

View File

@ -305,7 +305,7 @@ static int __init sbwdog_init(void)
if (ret) { if (ret) {
printk(KERN_ERR "%s: failed to request irq 1 - %d\n", printk(KERN_ERR "%s: failed to request irq 1 - %d\n",
ident.identity, ret); ident.identity, ret);
return ret; goto out;
} }
ret = misc_register(&sbwdog_miscdev); ret = misc_register(&sbwdog_miscdev);
@ -313,14 +313,20 @@ static int __init sbwdog_init(void)
printk(KERN_INFO "%s: timeout is %ld.%ld secs\n", printk(KERN_INFO "%s: timeout is %ld.%ld secs\n",
ident.identity, ident.identity,
timeout / 1000000, (timeout / 100000) % 10); timeout / 1000000, (timeout / 100000) % 10);
} else return 0;
free_irq(1, (void *)user_dog); }
free_irq(1, (void *)user_dog);
out:
unregister_reboot_notifier(&sbwdog_notifier);
return ret; return ret;
} }
static void __exit sbwdog_exit(void) static void __exit sbwdog_exit(void)
{ {
misc_deregister(&sbwdog_miscdev); misc_deregister(&sbwdog_miscdev);
free_irq(1, (void *)user_dog);
unregister_reboot_notifier(&sbwdog_notifier);
} }
module_init(sbwdog_init); module_init(sbwdog_init);