staging: comedi: check command started by file being polled
authorIan Abbott <abbotti@mev.co.uk>
Fri, 9 Oct 2015 11:26:51 +0000 (12:26 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 13 Oct 2015 17:28:40 +0000 (10:28 -0700)
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>
drivers/staging/comedi/comedi_fops.c

index 42f6971c8061d4a00eb7edc96d5c4c62d3fe3300..1d6bef28582122819f52a3bb5c78c724ce08f6f2 100644 (file)
@@ -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;