diff options
Diffstat (limited to 'drivers/char/sysrq.c')
-rw-r--r-- | drivers/char/sysrq.c | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/drivers/char/sysrq.c b/drivers/char/sysrq.c index 05810c8d20bc..13935235e066 100644 --- a/drivers/char/sysrq.c +++ b/drivers/char/sysrq.c | |||
@@ -41,7 +41,34 @@ | |||
41 | #include <asm/irq_regs.h> | 41 | #include <asm/irq_regs.h> |
42 | 42 | ||
43 | /* Whether we react on sysrq keys or just ignore them */ | 43 | /* Whether we react on sysrq keys or just ignore them */ |
44 | int sysrq_enabled = 1; | 44 | int __read_mostly __sysrq_enabled = 1; |
45 | |||
46 | static int __read_mostly sysrq_always_enabled; | ||
47 | |||
48 | int sysrq_on(void) | ||
49 | { | ||
50 | return __sysrq_enabled || sysrq_always_enabled; | ||
51 | } | ||
52 | |||
53 | /* | ||
54 | * A value of 1 means 'all', other nonzero values are an op mask: | ||
55 | */ | ||
56 | static inline int sysrq_on_mask(int mask) | ||
57 | { | ||
58 | return sysrq_always_enabled || __sysrq_enabled == 1 || | ||
59 | (__sysrq_enabled & mask); | ||
60 | } | ||
61 | |||
62 | static int __init sysrq_always_enabled_setup(char *str) | ||
63 | { | ||
64 | sysrq_always_enabled = 1; | ||
65 | printk(KERN_INFO "debug: sysrq always enabled.\n"); | ||
66 | |||
67 | return 1; | ||
68 | } | ||
69 | |||
70 | __setup("sysrq_always_enabled", sysrq_always_enabled_setup); | ||
71 | |||
45 | 72 | ||
46 | static void sysrq_handle_loglevel(int key, struct tty_struct *tty) | 73 | static void sysrq_handle_loglevel(int key, struct tty_struct *tty) |
47 | { | 74 | { |
@@ -379,8 +406,7 @@ void __handle_sysrq(int key, struct tty_struct *tty, int check_mask) | |||
379 | * Should we check for enabled operations (/proc/sysrq-trigger | 406 | * Should we check for enabled operations (/proc/sysrq-trigger |
380 | * should not) and is the invoked operation enabled? | 407 | * should not) and is the invoked operation enabled? |
381 | */ | 408 | */ |
382 | if (!check_mask || sysrq_enabled == 1 || | 409 | if (!check_mask || sysrq_on_mask(op_p->enable_mask)) { |
383 | (sysrq_enabled & op_p->enable_mask)) { | ||
384 | printk("%s\n", op_p->action_msg); | 410 | printk("%s\n", op_p->action_msg); |
385 | console_loglevel = orig_log_level; | 411 | console_loglevel = orig_log_level; |
386 | op_p->handler(key, tty); | 412 | op_p->handler(key, tty); |
@@ -414,9 +440,8 @@ void __handle_sysrq(int key, struct tty_struct *tty, int check_mask) | |||
414 | */ | 440 | */ |
415 | void handle_sysrq(int key, struct tty_struct *tty) | 441 | void handle_sysrq(int key, struct tty_struct *tty) |
416 | { | 442 | { |
417 | if (!sysrq_enabled) | 443 | if (sysrq_on()) |
418 | return; | 444 | __handle_sysrq(key, tty, 1); |
419 | __handle_sysrq(key, tty, 1); | ||
420 | } | 445 | } |
421 | EXPORT_SYMBOL(handle_sysrq); | 446 | EXPORT_SYMBOL(handle_sysrq); |
422 | 447 | ||