aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/sysrq.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char/sysrq.c')
-rw-r--r--drivers/char/sysrq.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/drivers/char/sysrq.c b/drivers/char/sysrq.c
index ef31bb81e843..eaa5d3efa79d 100644
--- a/drivers/char/sysrq.c
+++ b/drivers/char/sysrq.c
@@ -566,10 +566,16 @@ static const unsigned char sysrq_xlate[KEY_MAX + 1] =
566static bool sysrq_down; 566static bool sysrq_down;
567static int sysrq_alt_use; 567static int sysrq_alt_use;
568static int sysrq_alt; 568static int sysrq_alt;
569static DEFINE_SPINLOCK(sysrq_event_lock);
569 570
570static bool sysrq_filter(struct input_handle *handle, unsigned int type, 571static bool sysrq_filter(struct input_handle *handle, unsigned int type,
571 unsigned int code, int value) 572 unsigned int code, int value)
572{ 573{
574 bool suppress;
575
576 /* We are called with interrupts disabled, just take the lock */
577 spin_lock(&sysrq_event_lock);
578
573 if (type != EV_KEY) 579 if (type != EV_KEY)
574 goto out; 580 goto out;
575 581
@@ -601,7 +607,10 @@ static bool sysrq_filter(struct input_handle *handle, unsigned int type,
601 } 607 }
602 608
603out: 609out:
604 return sysrq_down; 610 suppress = sysrq_down;
611 spin_unlock(&sysrq_event_lock);
612
613 return suppress;
605} 614}
606 615
607static int sysrq_connect(struct input_handler *handler, 616static int sysrq_connect(struct input_handler *handler,
@@ -652,8 +661,8 @@ static void sysrq_disconnect(struct input_handle *handle)
652} 661}
653 662
654/* 663/*
655 * We are matching on KEY_LEFTALT insteard of KEY_SYSRQ because not all 664 * We are matching on KEY_LEFTALT instead of KEY_SYSRQ because not all
656 * keyboards have SysRq ikey predefined and so user may add it to keymap 665 * keyboards have SysRq key predefined and so user may add it to keymap
657 * later, but we expect all such keyboards to have left alt. 666 * later, but we expect all such keyboards to have left alt.
658 */ 667 */
659static const struct input_device_id sysrq_ids[] = { 668static const struct input_device_id sysrq_ids[] = {
@@ -772,6 +781,7 @@ static ssize_t write_sysrq_trigger(struct file *file, const char __user *buf,
772 781
773static const struct file_operations proc_sysrq_trigger_operations = { 782static const struct file_operations proc_sysrq_trigger_operations = {
774 .write = write_sysrq_trigger, 783 .write = write_sysrq_trigger,
784 .llseek = noop_llseek,
775}; 785};
776 786
777static void sysrq_init_procfs(void) 787static void sysrq_init_procfs(void)