diff options
author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2010-09-30 01:04:21 (GMT) |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2010-09-30 01:26:11 (GMT) |
commit | 1966cb225c6f9040ca163802cbd052c393d4448f (patch) | |
tree | bc6e6536d67d8f3752afb480b412d51e65568a83 | |
parent | 594d63632024636a962be508dfe5ee6bfd309160 (diff) | |
download | linux-1966cb225c6f9040ca163802cbd052c393d4448f.tar.xz |
Input: sysrq - add locking to sysrq_filter()
Similarly to the keyboard handler, we are called by different input
devices and thus need to add spinlock if we want to maintain our
state properly.
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
-rw-r--r-- | drivers/char/sysrq.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/char/sysrq.c b/drivers/char/sysrq.c index ef31bb8..f0ad694 100644 --- a/drivers/char/sysrq.c +++ b/drivers/char/sysrq.c @@ -566,10 +566,16 @@ static const unsigned char sysrq_xlate[KEY_MAX + 1] = static bool sysrq_down; static int sysrq_alt_use; static int sysrq_alt; +static DEFINE_SPINLOCK(sysrq_event_lock); static bool sysrq_filter(struct input_handle *handle, unsigned int type, unsigned int code, int value) { + bool suppress; + + /* We are called with interrupts disabled, just take the lock */ + spin_lock(&sysrq_event_lock); + if (type != EV_KEY) goto out; @@ -601,7 +607,10 @@ static bool sysrq_filter(struct input_handle *handle, unsigned int type, } out: - return sysrq_down; + suppress = sysrq_down; + spin_unlock(&sysrq_event_lock); + + return suppress; } static int sysrq_connect(struct input_handler *handler, @@ -652,8 +661,8 @@ static void sysrq_disconnect(struct input_handle *handle) } /* - * We are matching on KEY_LEFTALT insteard of KEY_SYSRQ because not all - * keyboards have SysRq ikey predefined and so user may add it to keymap + * We are matching on KEY_LEFTALT instead of KEY_SYSRQ because not all + * keyboards have SysRq key predefined and so user may add it to keymap * later, but we expect all such keyboards to have left alt. */ static const struct input_device_id sysrq_ids[] = { |