Using iio_device_unregister() on a device currently in use may stall userspace process polling for data availability (poll syscall). If device has vanished before running the iio_buffer_fileops poll hook, the latter will return empty poll event mask. Process will be stalled waiting for events that will never come (if no timeout specified). This patch ensures iio_buffer_poll() returns POLLERR if device has just been unregistered in order to properly notify userspace process something wrong happened (such as removable device unplugged). Signed-off-by: Gregor Boirie <gregor.boirie@xxxxxxxxxx> --- drivers/iio/industrialio-buffer.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c index 90462fc..aad5159 100644 --- a/drivers/iio/industrialio-buffer.c +++ b/drivers/iio/industrialio-buffer.c @@ -155,6 +155,7 @@ ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf, * a wait queue * * Return: (POLLIN | POLLRDNORM) if data is available for reading + * POLLERR if device was unregistered in our back * or 0 for other cases */ unsigned int iio_buffer_poll(struct file *filp, @@ -162,13 +163,20 @@ unsigned int iio_buffer_poll(struct file *filp, { struct iio_dev *indio_dev = filp->private_data; struct iio_buffer *rb = indio_dev->buffer; + bool rdy; if (!indio_dev->info) - return 0; + return POLLERR; poll_wait(filp, &rb->pollq, wait); - if (iio_buffer_ready(indio_dev, rb, rb->watermark, 0)) + rdy = iio_buffer_ready(indio_dev, rb, rb->watermark, 0); + + if (!indio_dev->info) + return POLLERR; + + if (rdy) return POLLIN | POLLRDNORM; + return 0; } -- 2.1.4 -- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html