Skip to content

Commit

Permalink
HID: hid-debug: fix nonblocking read semantics wrt EIO/ERESTARTSYS
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Laurent Gauthier authored and Jiri Kosina committed Sep 9, 2020
1 parent fc3abb5 commit c27e088
Showing 1 changed file with 5 additions and 5 deletions.
10 changes: 5 additions & 5 deletions drivers/hid/hid-debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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();
Expand Down

0 comments on commit c27e088

Please sign in to comment.