diff mbox

HID: hidraw: fix nonblock read return EAGAIN after device removed

Message ID CAHLfQUnhEQBC+yzB3jFnJbB7jMvuVjr1M62kzxWzMN2v0i=VzA@mail.gmail.com (mailing list archive)
State New, archived
Delegated to: Jiri Kosina
Headers show

Commit Message

founder.fang Nov. 26, 2012, 2:30 a.m. UTC
Hi Linux-Input, Jiri, Dmitry,
this patch is related to nonblock read on hidraw device.
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 <founder.fang@gmail.com>

                                mutex_unlock(&list->read_mutex);
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Dmitry Torokhov Nov. 26, 2012, 8:15 a.m. UTC | #1
Hi Founder,

On Mon, Nov 26, 2012 at 10:30:37AM +0800, founder.fang wrote:
> Hi Linux-Input, Jiri, Dmitry,
> this patch is related to nonblock read on hidraw device.
> 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 <founder.fang@gmail.com>
> 

Reviewed-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

Makes sense to me. However it looks like your mailer line-wrapped the
patch, please resend so Jiri can apply it.

Thanks.
Jiri Kosina Nov. 26, 2012, 1:18 p.m. UTC | #2
On Mon, 26 Nov 2012, Dmitry Torokhov wrote:

> > Hi Linux-Input, Jiri, Dmitry,
> > this patch is related to nonblock read on hidraw device.
> > 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 <founder.fang@gmail.com>
> > 
> 
> Reviewed-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
> 
> Makes sense to me. However it looks like your mailer line-wrapped the
> patch, please resend so Jiri can apply it.

For some reason, the patch has been sent to me twice, once it has been 
fine and the second time it has been line wrapped.

I have now applied the non-broken version. Thanks,
diff mbox

Patch

--- hid-git/drivers/hid/hidraw.c.orig   2012-11-21 14:37:04.977106383 +0800
+++ hid-git/drivers/hid/hidraw.c        2012-11-21 14:40:35.882152200 +0800
@@ -57,10 +57,6 @@  static ssize_t hidraw_read(struct file *
                        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 *
                                        ret = -EIO;
                                        break;
                                }
+                               if (file->f_flags & O_NONBLOCK) {
+                                       ret = -EAGAIN;
+                                       break;
+                               }

                                /* allow O_NONBLOCK to work well from
other threads */