diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2010-03-22 01:31:26 -0400 |
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2010-04-14 02:26:02 -0400 |
| commit | 97f5f0cd8cd0a05449cbb77d1e6f02e026875802 (patch) | |
| tree | e101f38dfd7bf4e759e96617f69ceedd497608e3 /kernel | |
| parent | b91c4be730668e801aa6a2ea95f467cd9a1e0983 (diff) | |
Input: implement SysRq as a separate input handler
Instead of keeping SysRq support inside of legacy keyboard driver split
it out into a separate input handler (filter). This stops most SysRq input
events from leaking into evdev clients (some events, such as first SysRq
scancode - not keycode - event, are still leaked into both legacy keyboard
and evdev).
[martinez.javier@gmail.com: fix compile error when CONFIG_MAGIC_SYSRQ is
not defined]
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/sysctl.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 8686b0f5fc12..ce724a0dd0bb 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
| @@ -163,6 +163,27 @@ static int proc_taint(struct ctl_table *table, int write, | |||
| 163 | void __user *buffer, size_t *lenp, loff_t *ppos); | 163 | void __user *buffer, size_t *lenp, loff_t *ppos); |
| 164 | #endif | 164 | #endif |
| 165 | 165 | ||
| 166 | #ifdef CONFIG_MAGIC_SYSRQ | ||
| 167 | static int __sysrq_enabled; /* Note: sysrq code ises it's own private copy */ | ||
| 168 | |||
| 169 | static int sysrq_sysctl_handler(ctl_table *table, int write, | ||
| 170 | void __user *buffer, size_t *lenp, | ||
| 171 | loff_t *ppos) | ||
| 172 | { | ||
| 173 | int error; | ||
| 174 | |||
| 175 | error = proc_dointvec(table, write, buffer, lenp, ppos); | ||
| 176 | if (error) | ||
| 177 | return error; | ||
| 178 | |||
| 179 | if (write) | ||
| 180 | sysrq_toggle_support(__sysrq_enabled); | ||
| 181 | |||
| 182 | return 0; | ||
| 183 | } | ||
| 184 | |||
| 185 | #endif | ||
| 186 | |||
| 166 | static struct ctl_table root_table[]; | 187 | static struct ctl_table root_table[]; |
| 167 | static struct ctl_table_root sysctl_table_root; | 188 | static struct ctl_table_root sysctl_table_root; |
| 168 | static struct ctl_table_header root_table_header = { | 189 | static struct ctl_table_header root_table_header = { |
| @@ -567,7 +588,7 @@ static struct ctl_table kern_table[] = { | |||
| 567 | .data = &__sysrq_enabled, | 588 | .data = &__sysrq_enabled, |
| 568 | .maxlen = sizeof (int), | 589 | .maxlen = sizeof (int), |
| 569 | .mode = 0644, | 590 | .mode = 0644, |
| 570 | .proc_handler = proc_dointvec, | 591 | .proc_handler = sysrq_sysctl_handler, |
| 571 | }, | 592 | }, |
| 572 | #endif | 593 | #endif |
| 573 | #ifdef CONFIG_PROC_SYSCTL | 594 | #ifdef CONFIG_PROC_SYSCTL |
