From: Founder Fang Date: Wed, 21 Nov 2012 07:20:31 +0000 (+0800) Subject: HID: hidraw: fix nonblock read return EAGAIN after device removed X-Git-Tag: v3.8-rc1~130^2^2~1 X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=7611e8d26d8dd0e5e132b46e905cb579daf9da1e;p=~emulex%2Finfiniband.git HID: hidraw: fix nonblock read return EAGAIN after device removed When nonblock read the condition check (file->f_flags & O_NONBLOCK) always be true, signal_pending and device exist checking never get a chance to run, so the user mode code always get EAGAIN even if device removed. move nonblock mode checking to the last can fix this problem. Signed-off-by: Founder Fang Reviewed-by: Dmitry Torokhov Signed-off-by: Jiri Kosina --- diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c index 7c47fc3f7b2..1d8c0219117 100644 --- a/drivers/hid/hidraw.c +++ b/drivers/hid/hidraw.c @@ -57,10 +57,6 @@ static ssize_t hidraw_read(struct file *file, char __user *buffer, size_t count, set_current_state(TASK_INTERRUPTIBLE); while (list->head == list->tail) { - if (file->f_flags & O_NONBLOCK) { - ret = -EAGAIN; - break; - } if (signal_pending(current)) { ret = -ERESTARTSYS; break; @@ -69,6 +65,10 @@ static ssize_t hidraw_read(struct file *file, char __user *buffer, size_t count, ret = -EIO; break; } + if (file->f_flags & O_NONBLOCK) { + ret = -EAGAIN; + break; + } /* allow O_NONBLOCK to work well from other threads */ mutex_unlock(&list->read_mutex);