diff options
Diffstat (limited to 'drivers/iio/industrialio-buffer.c')
| -rw-r--r-- | drivers/iio/industrialio-buffer.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c index 90462fcf5436..49bf9c59f117 100644 --- a/drivers/iio/industrialio-buffer.c +++ b/drivers/iio/industrialio-buffer.c | |||
| @@ -107,6 +107,7 @@ ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf, | |||
| 107 | { | 107 | { |
| 108 | struct iio_dev *indio_dev = filp->private_data; | 108 | struct iio_dev *indio_dev = filp->private_data; |
| 109 | struct iio_buffer *rb = indio_dev->buffer; | 109 | struct iio_buffer *rb = indio_dev->buffer; |
| 110 | DEFINE_WAIT_FUNC(wait, woken_wake_function); | ||
| 110 | size_t datum_size; | 111 | size_t datum_size; |
| 111 | size_t to_wait; | 112 | size_t to_wait; |
| 112 | int ret; | 113 | int ret; |
| @@ -131,19 +132,29 @@ ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf, | |||
| 131 | else | 132 | else |
| 132 | to_wait = min_t(size_t, n / datum_size, rb->watermark); | 133 | to_wait = min_t(size_t, n / datum_size, rb->watermark); |
| 133 | 134 | ||
| 135 | add_wait_queue(&rb->pollq, &wait); | ||
| 134 | do { | 136 | do { |
| 135 | ret = wait_event_interruptible(rb->pollq, | 137 | if (!indio_dev->info) { |
| 136 | iio_buffer_ready(indio_dev, rb, to_wait, n / datum_size)); | 138 | ret = -ENODEV; |
| 137 | if (ret) | 139 | break; |
| 138 | return ret; | 140 | } |
| 139 | 141 | ||
| 140 | if (!indio_dev->info) | 142 | if (!iio_buffer_ready(indio_dev, rb, to_wait, n / datum_size)) { |
| 141 | return -ENODEV; | 143 | if (signal_pending(current)) { |
| 144 | ret = -ERESTARTSYS; | ||
| 145 | break; | ||
| 146 | } | ||
| 147 | |||
| 148 | wait_woken(&wait, TASK_INTERRUPTIBLE, | ||
| 149 | MAX_SCHEDULE_TIMEOUT); | ||
| 150 | continue; | ||
| 151 | } | ||
| 142 | 152 | ||
| 143 | ret = rb->access->read_first_n(rb, n, buf); | 153 | ret = rb->access->read_first_n(rb, n, buf); |
| 144 | if (ret == 0 && (filp->f_flags & O_NONBLOCK)) | 154 | if (ret == 0 && (filp->f_flags & O_NONBLOCK)) |
| 145 | ret = -EAGAIN; | 155 | ret = -EAGAIN; |
| 146 | } while (ret == 0); | 156 | } while (ret == 0); |
| 157 | remove_wait_queue(&rb->pollq, &wait); | ||
| 147 | 158 | ||
| 148 | return ret; | 159 | return ret; |
| 149 | } | 160 | } |
