From 8a843a8ac3c86166bee296709113c83c1fb27803 Mon Sep 17 00:00:00 2001 From: Dmitry Torokhov Date: Wed, 2 May 2012 00:13:36 -0700 Subject: [PATCH] --- yaml --- r: 306607 b: refs/heads/master c: dba4258068f822b7dafc78c28fe9c99c551eca7e h: refs/heads/master i: 306605: 7b4f00087efcf9e78e42e41400f26ce8e78199a6 306603: df0422ee2e810f5bbfe813bee777e4c69acf8db5 306599: e94ff2bacd8f143926ddf680b339c7ffd68f61c7 306591: 00d83feef4fd22a7b46246ce25d71c852b70acda v: v3 --- [refs] | 2 +- trunk/drivers/input/evdev.c | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index efcfa50e313a..4aa1d1cb2f8c 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f31ad406693f114e57ad4651eb17deb68419c7cb +refs/heads/master: dba4258068f822b7dafc78c28fe9c99c551eca7e diff --git a/trunk/drivers/input/evdev.c b/trunk/drivers/input/evdev.c index 4b2e10d5d641..9226b4d9118f 100644 --- a/trunk/drivers/input/evdev.c +++ b/trunk/drivers/input/evdev.c @@ -180,7 +180,10 @@ static int evdev_grab(struct evdev *evdev, struct evdev_client *client) static int evdev_ungrab(struct evdev *evdev, struct evdev_client *client) { - if (evdev->grab != client) + struct evdev_client *grab = rcu_dereference_protected(evdev->grab, + lockdep_is_held(&evdev->mutex)); + + if (grab != client) return -EINVAL; rcu_assign_pointer(evdev->grab, NULL); @@ -259,8 +262,7 @@ static int evdev_release(struct inode *inode, struct file *file) struct evdev *evdev = client->evdev; mutex_lock(&evdev->mutex); - if (evdev->grab == client) - evdev_ungrab(evdev, client); + evdev_ungrab(evdev, client); mutex_unlock(&evdev->mutex); evdev_detach_client(evdev, client);