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>
This commit is contained in:
parent
9c03f1622a
commit
ae44855ae8
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue