提交 ae44855a 编写于 作者: A Akinobu Mita 提交者: Wim Van Sebroeck

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: NAkinobu Mita <akinobu.mita@gmail.com>
Cc: Andrew Sharp <andy.sharp@lsi.com>
Signed-off-by: NWim Van Sebroeck <wim@iguana.be>
上级 9c03f162
...@@ -305,7 +305,7 @@ static int __init sbwdog_init(void) ...@@ -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) ...@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册