Message ID | CAHLfQUnhEQBC+yzB3jFnJbB7jMvuVjr1M62kzxWzMN2v0i=VzA@mail.gmail.com (mailing list archive) |
---|---|
State | New, archived |
Delegated to: | Jiri Kosina |
Headers | show |
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.
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,
--- 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 */
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