From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965348AbbBCLzt (ORCPT ); Tue, 3 Feb 2015 06:55:49 -0500 Received: from szxga01-in.huawei.com ([119.145.14.64]:60346 "EHLO szxga01-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933862AbbBCLzp (ORCPT ); Tue, 3 Feb 2015 06:55:45 -0500 From: Wang Long To: CC: , , Subject: [PATCH] samples: Fix `echo 1 > /proc/int-fifo` never return error Date: Tue, 3 Feb 2015 11:51:17 +0000 Message-ID: <1422964277-140278-2-git-send-email-long.wanglong@huawei.com> X-Mailer: git-send-email 1.8.3.4 In-Reply-To: <1422964277-140278-1-git-send-email-long.wanglong@huawei.com> References: <1422964277-140278-1-git-send-email-long.wanglong@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.107.197.200] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org echo 99 > /proc/int-fifo ------------> Never return echo 1000 > /proc/int-fifo ------------> Never return this patch fix it. Signed-off-by: Wang Long --- samples/kfifo/inttype-example.c | 51 ++++++++++++++++++++++++++++++++--------- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/samples/kfifo/inttype-example.c b/samples/kfifo/inttype-example.c index 8dc3c2e..cc0db5f 100644 --- a/samples/kfifo/inttype-example.c +++ b/samples/kfifo/inttype-example.c @@ -6,6 +6,7 @@ * Released under the GPL version 2 only. * */ +#include #include #include @@ -23,6 +24,9 @@ /* name of the proc entry */ #define PROC_FIFO "int-fifo" +/* Worst case buffer size needed for holding an integer. */ +#define PROC_NUMBUF 13 + /* lock for procfs read access */ static DEFINE_MUTEX(read_lock); @@ -108,33 +112,58 @@ static int __init testfunc(void) static ssize_t fifo_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { - int ret; - unsigned int copied; + char buffer[PROC_NUMBUF]; + int value; + int err; - if (mutex_lock_interruptible(&write_lock)) - return -ERESTARTSYS; + memset(buffer, 0, sizeof(buffer)); - ret = kfifo_from_user(&test, buf, count, &copied); + if (count > sizeof(buffer) - 1) + count = sizeof(buffer) - 1; + if (copy_from_user(buffer, buf, count)) { + err = -EFAULT; + goto out; + } - mutex_unlock(&write_lock); + err = kstrtoint(strstrip(buffer), 0, &value); + if (err) + goto out; + + if (kfifo_is_full(&test)) { + err = -EINVAL; + goto out; + } - return ret ? ret : copied; + if (mutex_lock_interruptible(&write_lock)) + return -ERESTARTSYS; + kfifo_put(&test, value); + mutex_unlock(&write_lock); +out: + return err < 0 ? err : count; } static ssize_t fifo_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { - int ret; - unsigned int copied; + char buffer[PROC_NUMBUF * FIFO_SIZE]; + int value; + size_t len = 0; + ssize_t ret = -1; + + memset(buffer, 0, sizeof(buffer)); if (mutex_lock_interruptible(&read_lock)) return -ERESTARTSYS; - ret = kfifo_to_user(&test, buf, count, &copied); + while (!kfifo_is_empty(&test)){ + ret = kfifo_get(&test, &value); + len = snprintf(buffer, sizeof(buffer), "%s%d\n", buffer, value); + } mutex_unlock(&read_lock); + ret = copy_to_user(buf, buffer, len); - return ret ? ret : copied; + return ret ? ret : len; } static const struct file_operations fifo_fops = { -- 1.8.3.1