| 1 | --- |
| 2 | drivers/input/evdev.c | 10 +++++++--- |
| 3 | 1 file changed, 7 insertions(+), 3 deletions(-) |
| 4 | |
| 5 | --- a/drivers/input/evdev.c |
| 6 | +++ b/drivers/input/evdev.c |
| 7 | @@ -92,7 +92,7 @@ static void evdev_event(struct input_han |
| 8 | unsigned int type, unsigned int code, int value) |
| 9 | { |
| 10 | struct evdev *evdev = handle->private; |
| 11 | - struct evdev_client *client; |
| 12 | + struct evdev_client *client, *c; |
| 13 | struct input_event event; |
| 14 | |
| 15 | do_gettimeofday(&event.time); |
| 16 | @@ -103,9 +103,13 @@ static void evdev_event(struct input_han |
| 17 | rcu_read_lock(); |
| 18 | |
| 19 | client = rcu_dereference(evdev->grab); |
| 20 | - if (client) |
| 21 | + if (client) { |
| 22 | evdev_pass_event(client, &event); |
| 23 | - else |
| 24 | + /* Also pass events to clients that did not grab the device. */ |
| 25 | + list_for_each_entry_rcu(c, &evdev->client_list, node) |
| 26 | + if (c != client) |
| 27 | + evdev_pass_event(c, &event); |
| 28 | + } else |
| 29 | list_for_each_entry_rcu(client, &evdev->client_list, node) |
| 30 | evdev_pass_event(client, &event); |
| 31 | |
| 32 | |