patch "iio: buffer: make sure O_NONBLOCK is respected" added to char-misc-linus
Subsystems (2)
This is a note to let you know that I've just added the patch titled
iio: buffer: make sure O_NONBLOCK is respected
to my char-misc git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
in the char-misc-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
From 3da1814184582ed0faf039275a3f02e6f69944ee Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nuno=20S=C3=A1?= <[email protected]>
Date: Thu, 16 Feb 2023 11:14:51 +0100
Subject: iio: buffer: make sure O_NONBLOCK is respected
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
For output buffers, there's no guarantee that the buffer won't be full in the first iteration of the loop in which case we would block independently of userspace passing O_NONBLOCK or not. Fix it by always checking the flag before going to sleep.
While at it (and as it's a bit related), refactored the loop so that the stop condition is 'written != n', i.e, run the loop until all data has been copied into the IIO buffers. This makes the code a bit simpler.
--- drivers/iio/industrialio-buffer.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-)
drivers/iio/industrialio-buffer.c +11 -8
@@ -203,21 +203,24 @@ static ssize_t iio_buffer_write(struct file *filp, const char __user *buf,break ; } +if (filp->f_flags &O_NONBLOCK ) { +if (!written) + ret = -EAGAIN ; +break ; + } +wait_woken (&wait,TASK_INTERRUPTIBLE ,MAX_SCHEDULE_TIMEOUT );continue ; } ret = rb->access->write (rb, n - written, buf + written); -if (ret ==0 && (filp->f_flags &O_NONBLOCK )) - ret = -EAGAIN ; +if (ret <0 ) +break ; -if (ret >0 ) { - written += ret; -if (written != n && !(filp->f_flags &O_NONBLOCK )) -continue ; - } - }while (ret ==0 ); + written += ret; + + }while (written != n);remove_wait_queue (&rb->pollq, &wait);return ret <0 ? ret : written;
Signature · 1 line
2.40.0