Commit 2d8364ba authored by Andrey Smirnov's avatar Andrey Smirnov Committed by Linus Torvalds

kernel/reboot.c: add devm_register_reboot_notifier()

Add devm_* wrapper around register_reboot_notifier to simplify device
specific reboot notifier registration/unregistration.

[akpm@linux-foundation.org: move `struct device' forward decl to top-of-file]
Link: http://lkml.kernel.org/r/20170320171753.1705-1-andrew.smirnov@gmail.comSigned-off-by: default avatarAndrey Smirnov <andrew.smirnov@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent c512ac01
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
#include <linux/notifier.h> #include <linux/notifier.h>
#include <uapi/linux/reboot.h> #include <uapi/linux/reboot.h>
struct device;
#define SYS_DOWN 0x0001 /* Notify of system down */ #define SYS_DOWN 0x0001 /* Notify of system down */
#define SYS_RESTART SYS_DOWN #define SYS_RESTART SYS_DOWN
#define SYS_HALT 0x0002 /* Notify of system halt */ #define SYS_HALT 0x0002 /* Notify of system halt */
...@@ -39,6 +41,8 @@ extern int reboot_force; ...@@ -39,6 +41,8 @@ extern int reboot_force;
extern int register_reboot_notifier(struct notifier_block *); extern int register_reboot_notifier(struct notifier_block *);
extern int unregister_reboot_notifier(struct notifier_block *); extern int unregister_reboot_notifier(struct notifier_block *);
extern int devm_register_reboot_notifier(struct device *, struct notifier_block *);
extern int register_restart_handler(struct notifier_block *); extern int register_restart_handler(struct notifier_block *);
extern int unregister_restart_handler(struct notifier_block *); extern int unregister_restart_handler(struct notifier_block *);
extern void do_kernel_restart(char *cmd); extern void do_kernel_restart(char *cmd);
......
...@@ -104,6 +104,33 @@ int unregister_reboot_notifier(struct notifier_block *nb) ...@@ -104,6 +104,33 @@ int unregister_reboot_notifier(struct notifier_block *nb)
} }
EXPORT_SYMBOL(unregister_reboot_notifier); EXPORT_SYMBOL(unregister_reboot_notifier);
static void devm_unregister_reboot_notifier(struct device *dev, void *res)
{
WARN_ON(unregister_reboot_notifier(*(struct notifier_block **)res));
}
int devm_register_reboot_notifier(struct device *dev, struct notifier_block *nb)
{
struct notifier_block **rcnb;
int ret;
rcnb = devres_alloc(devm_unregister_reboot_notifier,
sizeof(*rcnb), GFP_KERNEL);
if (!rcnb)
return -ENOMEM;
ret = register_reboot_notifier(nb);
if (!ret) {
*rcnb = nb;
devres_add(dev, rcnb);
} else {
devres_free(rcnb);
}
return ret;
}
EXPORT_SYMBOL(devm_register_reboot_notifier);
/* /*
* Notifier list for kernel code which wants to be called * Notifier list for kernel code which wants to be called
* to restart the system. * to restart the system.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment