summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Herrmann <dh.herrmann@gmail.com>2014-06-17 22:28:20 +0200
committerDavid Herrmann <dh.herrmann@gmail.com>2014-06-18 06:34:22 +0200
commit09734a563772c66f777af2e5024241b8bebbe1a6 (patch)
tree73ef05fb24d866f55033b6e8eeb89871969d4b09
parentc1f5f271c959b0605a9041e09868e078c4eb1fd9 (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.c19
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;
}