]> Pileus Git - ~andy/linux/blobdiff - drivers/hid/usbhid/hiddev.c
HID: hiddev: fix nonblocking read semantics wrt EIO/ERESTARTSYS
[~andy/linux] / drivers / hid / usbhid / hiddev.c
index 711c9656ec0fa69d16dde39b0f806aa2d36202bf..87bd64959a91b4bed5e3745751e237f78ac4470a 100644 (file)
@@ -361,10 +361,6 @@ static ssize_t hiddev_read(struct file * file, char __user * buffer, size_t coun
                        prepare_to_wait(&list->hiddev->wait, &wait, TASK_INTERRUPTIBLE);
 
                        while (list->head == list->tail) {
-                               if (file->f_flags & O_NONBLOCK) {
-                                       retval = -EAGAIN;
-                                       break;
-                               }
                                if (signal_pending(current)) {
                                        retval = -ERESTARTSYS;
                                        break;
@@ -373,6 +369,10 @@ static ssize_t hiddev_read(struct file * file, char __user * buffer, size_t coun
                                        retval = -EIO;
                                        break;
                                }
+                               if (file->f_flags & O_NONBLOCK) {
+                                       retval = -EAGAIN;
+                                       break;
+                               }
 
                                /* let O_NONBLOCK tasks run */
                                mutex_unlock(&list->thread_lock);