diff options
| author | Jiri Kosina <jkosina@suse.cz> | 2012-02-06 16:11:09 +0100 |
|---|---|---|
| committer | Jiri Kosina <jkosina@suse.cz> | 2012-02-06 16:12:16 +0100 |
| commit | d4730ace0c7dbb64513e35b6fc5fd7e7f381e490 (patch) | |
| tree | 18890c096cdd869a593c56de3257faa40af8e050 /drivers/input/evdev.c | |
| parent | c1c454b8691cc95aa83f19273ed7845914c70e83 (diff) | |
| parent | 23783f817bceedd6d4e549385e3f400ea64059e5 (diff) | |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux into upstream-fixes
Sync with Linus' tree. This is necessary to have a base for
patch that fixes commit 35b4c01e29b ("power_supply: add "powers"
links to self-powered HID devices") which went in through Anton's
tree.
Diffstat (limited to 'drivers/input/evdev.c')
| -rw-r--r-- | drivers/input/evdev.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index 4cf25347b015..afc166fcc3d9 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c @@ -369,7 +369,7 @@ static int evdev_fetch_next_event(struct evdev_client *client, spin_lock_irq(&client->buffer_lock); - have_event = client->head != client->tail; + have_event = client->packet_head != client->tail; if (have_event) { *event = client->buffer[client->tail++]; client->tail &= client->bufsize - 1; @@ -386,19 +386,18 @@ static ssize_t evdev_read(struct file *file, char __user *buffer, struct evdev_client *client = file->private_data; struct evdev *evdev = client->evdev; struct input_event event; - int retval; + int retval = 0; if (count < input_event_size()) return -EINVAL; - if (client->packet_head == client->tail && evdev->exist && - (file->f_flags & O_NONBLOCK)) - return -EAGAIN; - - retval = wait_event_interruptible(evdev->wait, - client->packet_head != client->tail || !evdev->exist); - if (retval) - return retval; + if (!(file->f_flags & O_NONBLOCK)) { + retval = wait_event_interruptible(evdev->wait, + client->packet_head != client->tail || + !evdev->exist); + if (retval) + return retval; + } if (!evdev->exist) return -ENODEV; @@ -412,6 +411,9 @@ static ssize_t evdev_read(struct file *file, char __user *buffer, retval += input_event_size(); } + if (retval == 0 && (file->f_flags & O_NONBLOCK)) + return -EAGAIN; + return retval; } |
