]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
HID: hid-debug: fix nonblocking read semantics wrt EIO/ERESTARTSYS
authorLaurent Gauthier <laurent.gauthier@soccasys.com>
Tue, 8 Sep 2020 22:11:49 +0000 (00:11 +0200)
committerJiri Kosina <jkosina@suse.cz>
Wed, 9 Sep 2020 06:47:38 +0000 (08:47 +0200)
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>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/hid-debug.c

index 9453147d020db2bda87d5353890140d6e7947e6c..d7eaf91003706052bdb28502b07340bc9467492c 100644 (file)
@@ -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();