As write to /dev/serio_raw* and to /sys/kernel/debug/serio_raw*/device share a common pattern, this patch extracts that pattern and put it in the serio_raw_write_mainloop() function. Signed-off-by: Che-Liang Chiou <clchiou@xxxxxxxxxxxx> --- drivers/input/serio/serio_raw.c | 27 ++++++++++++++++++++------- 1 files changed, 20 insertions(+), 7 deletions(-) diff --git a/drivers/input/serio/serio_raw.c b/drivers/input/serio/serio_raw.c index bc2a8c7..5d13c64 100644 --- a/drivers/input/serio/serio_raw.c +++ b/drivers/input/serio/serio_raw.c @@ -269,12 +269,12 @@ static ssize_t serio_raw_read(struct file *file, char __user *buffer, serio_raw_fetch_byte); } -static ssize_t serio_raw_write(struct file *file, const char __user *buffer, - size_t count, loff_t *ppos) +static ssize_t serio_raw_write_mainloop(struct serio_raw *serio_raw, + const char __user *buffer, size_t count, + bool write_to_dev, struct queue *queue) { - struct serio_raw_client *client = file->private_data; - struct serio_raw *serio_raw = client->serio_raw; ssize_t written = 0; + bool wakeup = false; int retval; unsigned char c; @@ -293,20 +293,33 @@ static ssize_t serio_raw_write(struct file *file, const char __user *buffer, while (count--) { if (get_user(c, buffer++)) { retval = -EFAULT; - goto out; + break; } - if (serio_write(serio_raw->serio, c)) { + if (write_to_dev && serio_write(serio_raw->serio, c)) { retval = -EIO; - goto out; + break; } + if (queue) + wakeup |= queue_write_byte(queue, c); written++; } + if (queue && wakeup) + queue_wakeup(queue); out: mutex_unlock(&serio_raw_mutex); return written ?: retval; } +static ssize_t serio_raw_write(struct file *file, const char __user *buffer, + size_t count, loff_t *ppos) +{ + struct serio_raw_client *client = file->private_data; + struct serio_raw *serio_raw = client->serio_raw; + + return serio_raw_write_mainloop(serio_raw, buffer, count, true, NULL); +} + static unsigned int serio_raw_poll(struct file *file, poll_table *wait) { struct serio_raw_client *client = file->private_data; -- 1.7.7.3 -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html