summaryrefslogtreecommitdiffstats
path: root/drivers/staging/comedi/comedi_fops.c
diff options
context:
space:
mode:
authorIan Abbott2015-10-09 13:26:51 +0200
committerGreg Kroah-Hartman2015-10-13 19:28:40 +0200
commit3834234f99a07d1a84918cb15e9431420c5405f4 (patch)
tree001c13c3f3295c70c9ac7be2f61b276ad6852941 /drivers/staging/comedi/comedi_fops.c
parentstaging: comedi: don't allocate buffer space when polling for write (diff)
downloadkernel-qcow2-linux-3834234f99a07d1a84918cb15e9431420c5405f4.tar.gz
kernel-qcow2-linux-3834234f99a07d1a84918cb15e9431420c5405f4.tar.xz
kernel-qcow2-linux-3834234f99a07d1a84918cb15e9431420c5405f4.zip
staging: comedi: check command started by file being polled
Currently, the "poll" file operation checks if an asynchronous "read" (or "write" command is active on the "read" (or "write" subdevice, but does not consider whether the command was started from the file object being polled. Since that is the only file object able to read (or write) data, take it into consideration. With this change, if no read (or write) command is running on the subdevice, or it is started by a different file object, the file object is marked as readable (or writeable) regardless, but the read (or write) file operation will return an error. Signed-off-by: Ian Abbott <abbotti@mev.co.uk> Reviewed-by: H Hartley Sweeten <hsweeten@visionengravers.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/comedi/comedi_fops.c')
-rw-r--r--drivers/staging/comedi/comedi_fops.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c
index 42f6971c8061..1d6bef285821 100644
--- a/drivers/staging/comedi/comedi_fops.c
+++ b/drivers/staging/comedi/comedi_fops.c
@@ -2275,7 +2275,7 @@ static unsigned int comedi_poll(struct file *file, poll_table *wait)
s_read = s;
if (s && s->async) {
poll_wait(file, &s->async->wait_head, wait);
- if (!s->busy || !comedi_is_subdevice_running(s) ||
+ if (s->busy != file || !comedi_is_subdevice_running(s) ||
(s->async->cmd.flags & CMDF_WRITE) ||
comedi_buf_read_n_available(s) > 0)
mask |= POLLIN | POLLRDNORM;
@@ -2287,7 +2287,7 @@ static unsigned int comedi_poll(struct file *file, poll_table *wait)
if (s != s_read)
poll_wait(file, &s->async->wait_head, wait);
- if (!s->busy || !comedi_is_subdevice_running(s) ||
+ if (s->busy != file || !comedi_is_subdevice_running(s) ||
!(s->async->cmd.flags & CMDF_WRITE) ||
comedi_buf_write_n_available(s) >= bps)
mask |= POLLOUT | POLLWRNORM;