diff options
author | David Herrmann <dh.herrmann@gmail.com> | 2014-06-17 22:28:20 +0200 |
---|---|---|
committer | David Herrmann <dh.herrmann@gmail.com> | 2014-06-18 06:34:22 +0200 |
commit | 09734a563772c66f777af2e5024241b8bebbe1a6 (patch) | |
tree | 73ef05fb24d866f55033b6e8eeb89871969d4b09 | |
parent | c1f5f271c959b0605a9041e09868e078c4eb1fd9 (diff) |
Input: evdev - convert to fops_inhibit_file()fops-experimental
WIP
Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
-rw-r--r-- | drivers/input/evdev.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index fd325ec9f064..ba955df66587 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c @@ -50,7 +50,6 @@ struct evdev_client { struct evdev *evdev; struct list_head node; int clkid; - bool revoked; unsigned int bufsize; struct input_event buffer[]; }; @@ -246,7 +245,7 @@ static int evdev_flush(struct file *file, fl_owner_t id) if (retval) return retval; - if (!evdev->exist || client->revoked) + if (!evdev->exist) retval = -ENODEV; else retval = input_flush_device(&evdev->handle, file); @@ -441,7 +440,7 @@ static ssize_t evdev_write(struct file *file, const char __user *buffer, if (retval) return retval; - if (!evdev->exist || client->revoked) { + if (!evdev->exist) { retval = -ENODEV; goto out; } @@ -494,7 +493,7 @@ static ssize_t evdev_read(struct file *file, char __user *buffer, return -EINVAL; for (;;) { - if (!evdev->exist || client->revoked) + if (!evdev->exist || fops_file_inhibited(file)) return -ENODEV; if (client->packet_head == client->tail && @@ -523,7 +522,8 @@ static ssize_t evdev_read(struct file *file, char __user *buffer, if (!(file->f_flags & O_NONBLOCK)) { error = wait_event_interruptible(evdev->wait, client->packet_head != client->tail || - !evdev->exist || client->revoked); + !evdev->exist || + fops_file_inhibited(file)); if (error) return error; } @@ -541,7 +541,7 @@ static unsigned int evdev_poll(struct file *file, poll_table *wait) poll_wait(file, &evdev->wait, wait); - if (evdev->exist && !client->revoked) + if (evdev->exist) mask = POLLOUT | POLLWRNORM; else mask = POLLHUP | POLLERR; @@ -796,11 +796,14 @@ static int evdev_handle_mt_request(struct input_dev *dev, static int evdev_revoke(struct evdev *evdev, struct evdev_client *client, struct file *file) { - client->revoked = true; + fops_inhibit_file(file); + evdev_ungrab(evdev, client); input_flush_device(&evdev->handle, file); wake_up_interruptible(&evdev->wait); + fops_drain_self(file); + return 0; } @@ -1019,7 +1022,7 @@ static long evdev_ioctl_handler(struct file *file, unsigned int cmd, if (retval) return retval; - if (!evdev->exist || client->revoked) { + if (!evdev->exist) { retval = -ENODEV; goto out; } |