Skip to content

Commit

Permalink
kernel/reboot.c: add devm_register_reboot_notifier()
Browse files Browse the repository at this point in the history
Add devm_* wrapper around register_reboot_notifier to simplify device
specific reboot notifier registration/unregistration.

[[email protected]: move `struct device' forward decl to top-of-file]
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Andrey Smirnov <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
ndreys authored and torvalds committed Nov 18, 2017
1 parent c512ac0 commit 2d8364b
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 0 deletions.
4 changes: 4 additions & 0 deletions include/linux/reboot.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
#include <linux/notifier.h>
#include <uapi/linux/reboot.h>

struct device;

#define SYS_DOWN 0x0001 /* Notify of system down */
#define SYS_RESTART SYS_DOWN
#define SYS_HALT 0x0002 /* Notify of system halt */
Expand Down Expand Up @@ -39,6 +41,8 @@ extern int reboot_force;
extern int register_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 unregister_restart_handler(struct notifier_block *);
extern void do_kernel_restart(char *cmd);
Expand Down
27 changes: 27 additions & 0 deletions kernel/reboot.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,33 @@ int unregister_reboot_notifier(struct notifier_block *nb)
}
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
* to restart the system.
Expand Down

0 comments on commit 2d8364b

Please sign in to comment.