diff options
-rw-r--r-- | drivers/iio/industrialio-buffer.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c index 4dcc3a0f9930..c67d83bdc8f0 100644 --- a/drivers/iio/industrialio-buffer.c +++ b/drivers/iio/industrialio-buffer.c | |||
@@ -56,13 +56,34 @@ ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf, | |||
56 | { | 56 | { |
57 | struct iio_dev *indio_dev = filp->private_data; | 57 | struct iio_dev *indio_dev = filp->private_data; |
58 | struct iio_buffer *rb = indio_dev->buffer; | 58 | struct iio_buffer *rb = indio_dev->buffer; |
59 | int ret; | ||
59 | 60 | ||
60 | if (!indio_dev->info) | 61 | if (!indio_dev->info) |
61 | return -ENODEV; | 62 | return -ENODEV; |
62 | 63 | ||
63 | if (!rb || !rb->access->read_first_n) | 64 | if (!rb || !rb->access->read_first_n) |
64 | return -EINVAL; | 65 | return -EINVAL; |
65 | return rb->access->read_first_n(rb, n, buf); | 66 | |
67 | do { | ||
68 | if (!iio_buffer_data_available(rb)) { | ||
69 | if (filp->f_flags & O_NONBLOCK) | ||
70 | return -EAGAIN; | ||
71 | |||
72 | ret = wait_event_interruptible(rb->pollq, | ||
73 | iio_buffer_data_available(rb) || | ||
74 | indio_dev->info == NULL); | ||
75 | if (ret) | ||
76 | return ret; | ||
77 | if (indio_dev->info == NULL) | ||
78 | return -ENODEV; | ||
79 | } | ||
80 | |||
81 | ret = rb->access->read_first_n(rb, n, buf); | ||
82 | if (ret == 0 && (filp->f_flags & O_NONBLOCK)) | ||
83 | ret = -EAGAIN; | ||
84 | } while (ret == 0); | ||
85 | |||
86 | return ret; | ||
66 | } | 87 | } |
67 | 88 | ||
68 | /** | 89 | /** |