diff mbox series

HID: hid-debug: fix nonblocking read semantics wrt EIO/ERESTARTSYS

Message ID 20200908221149.8986-1-laurent.gauthier@soccasys.com
State New
Delegated to: Jiri Kosina
Headers show
Series HID: hid-debug: fix nonblocking read semantics wrt EIO/ERESTARTSYS | expand

Commit Message

Laurent Gauthier Sept. 8, 2020, 10:11 p.m. UTC
When the file has been open in non-blocking mode, EIO or ERESTARTSYS
would never be returned even if they should (for example when device
has been unplugged, you want EIO and not EAGAIN to be returned).

Move the O_NONBLOCK check after other checks have been performed.

Based on similar to patches hidraw and hiddev by Founder Fang
<founder.fang@gmail.com> and Jiri Kosina <jkosina@suse.cz>.

Signed-off-by: Laurent Gauthier <laurent.gauthier@soccasys.com>
---
 drivers/hid/hid-debug.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

Comments

Jiri Kosina Sept. 9, 2020, 6:48 a.m. UTC | #1
On Wed, 9 Sep 2020, Laurent Gauthier wrote:

> When the file has been open in non-blocking mode, EIO or ERESTARTSYS
> would never be returned even if they should (for example when device
> has been unplugged, you want EIO and not EAGAIN to be returned).
> 
> Move the O_NONBLOCK check after other checks have been performed.

Makes sense, good catch. Applied, thanks.
diff mbox series

Patch

diff --git a/drivers/hid/hid-debug.c b/drivers/hid/hid-debug.c
index 9453147d020d..d7eaf9100370 100644
--- a/drivers/hid/hid-debug.c
+++ b/drivers/hid/hid-debug.c
@@ -1101,11 +1101,6 @@  static ssize_t hid_debug_events_read(struct file *file, char __user *buffer,
 		set_current_state(TASK_INTERRUPTIBLE);
 
 		while (kfifo_is_empty(&list->hid_debug_fifo)) {
-			if (file->f_flags & O_NONBLOCK) {
-				ret = -EAGAIN;
-				break;
-			}
-
 			if (signal_pending(current)) {
 				ret = -ERESTARTSYS;
 				break;
@@ -1122,6 +1117,11 @@  static ssize_t hid_debug_events_read(struct file *file, char __user *buffer,
 				goto out;
 			}
 
+			if (file->f_flags & O_NONBLOCK) {
+				ret = -EAGAIN;
+				break;
+			}
+
 			/* allow O_NONBLOCK from other threads */
 			mutex_unlock(&list->read_mutex);
 			schedule();