From 00d83feef4fd22a7b46246ce25d71c852b70acda Mon Sep 17 00:00:00 2001 From: Dmitry Torokhov Date: Fri, 20 Apr 2012 22:33:08 -0700 Subject: [PATCH] --- yaml --- r: 306591 b: refs/heads/master c: 486c8aba39e5f194519cd5c0e85e5d1de8b74b03 h: refs/heads/master i: 306589: 46be9239cee24321ebbe7ac9f2f556b810298d18 306587: 9f0bff17ae48e627968c5bfa526ed7ae70770d27 306583: bcc30cfade4027f0f8cbdfe8f1c7c8b613000c6e 306575: 1cae49ee5947a00f8110dbcb978f8ad8df49160c 306559: 8c33cc6de9866ecc4a64c83e2e9bf11f75059b3b v: v3 --- [refs] | 2 +- trunk/drivers/input/serio/serio_raw.c | 43 ++++++++++++++++----------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/[refs] b/[refs] index 5ba8afef7631..69429aa68b85 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 71f3d070a309504cdfef87b9e98836395b75ae0e +refs/heads/master: 486c8aba39e5f194519cd5c0e85e5d1de8b74b03 diff --git a/trunk/drivers/input/serio/serio_raw.c b/trunk/drivers/input/serio/serio_raw.c index 948fd5a045f7..3e243621c0e3 100644 --- a/trunk/drivers/input/serio/serio_raw.c +++ b/trunk/drivers/input/serio/serio_raw.c @@ -165,31 +165,38 @@ static ssize_t serio_raw_read(struct file *file, char __user *buffer, struct serio_raw *serio_raw = client->serio_raw; char uninitialized_var(c); ssize_t read = 0; - int retval; + int error = 0; - if (serio_raw->dead) - return -ENODEV; + do { + if (serio_raw->dead) + return -ENODEV; - if (serio_raw->head == serio_raw->tail && (file->f_flags & O_NONBLOCK)) - return -EAGAIN; + if (serio_raw->head == serio_raw->tail && + (file->f_flags & O_NONBLOCK)) + return -EAGAIN; - retval = wait_event_interruptible(serio_raw->wait, - serio_raw->head != serio_raw->tail || serio_raw->dead); - if (retval) - return retval; + if (count == 0) + break; - if (serio_raw->dead) - return -ENODEV; + while (read < count && serio_raw_fetch_byte(serio_raw, &c)) { + if (put_user(c, buffer++)) { + error = -EFAULT; + goto out; + } + read++; + } - while (read < count && serio_raw_fetch_byte(serio_raw, &c)) { - if (put_user(c, buffer++)) { - retval = -EFAULT; + if (read) break; - } - read++; - } - return read ?: retval; + if (!(file->f_flags & O_NONBLOCK)) + error = wait_event_interruptible(serio_raw->wait, + serio_raw->head != serio_raw->tail || + serio_raw->dead); + } while (!error); + +out: + return read ?: error; } static ssize_t serio_raw_write(struct file *file, const char __user *buffer,