Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965475AbbBCLzx (ORCPT ); Tue, 3 Feb 2015 06:55:53 -0500 Received: from szxga01-in.huawei.com ([119.145.14.64]:60324 "EHLO szxga01-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933165AbbBCLzp (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:16 +0000 Message-ID: <1422964277-140278-1-git-send-email-long.wanglong@huawei.com> X-Mailer: git-send-email 1.8.3.4 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 Content-Length: 2501 Lines: 84 With the kernel module *samples/kfifo/inttype-example.ko*, the system will create file /proc/int-fifo. but the current code for this module may have some bug, as the following: # echo 100 > /proc/int-fifo ----------------> OK # echo 1000000 > /proc/int-fifo ----------------> OK # echo 99 > /proc/int-fifo ----------------> Never return # echo 1000 > /proc/int-fifo ----------------> Never return so i found that, the length of the content putting into /proc/int-fifo must be 4, 8, 12 ..... another idea: this kernel module is about a FIFO which type is int. we should put an interger into it, not the string. when we reading from this file, we should get all elements in the FIFO. just as the following: # echo 1 > /proc/int-fifo # echo 2 > /proc/int-fifo # echo 3 > /proc/int-fifo # cat /proc/int-fifo 1 2 3 # echo 101 > /proc/int-fifo # echo 103 > /proc/int-fifo # echo 104 > /proc/int-fifo # echo 102 > /proc/int-fifo # cat /proc/int-fifo 101 103 104 102 with my patch, we can echo an integer into the FIFO. so the following command is OK. echo 1 > /proc/int-fifo without my patch, the command `echo 1 > /proc/int-fifo` will never return, beacuse the following code: 223 int __kfifo_from_user(struct __kfifo *fifo, const void __user *from, 224 unsigned long len, unsigned int *copied) 225 { 226 unsigned int l; 227 unsigned long ret; 228 unsigned int esize = fifo->esize; 229 int err; 230 231 if (esize != 1) 232 len /= esize; 233 234 l = kfifo_unused(fifo); 235 if (len > l) 236 len = l; 237 238 ret = kfifo_copy_from_user(fifo, from, len, fifo->in, copied); 239 if (unlikely(ret)) { 240 len -= ret; 241 err = -EFAULT; 242 } else 243 err = 0; 244 fifo->in += len; 245 return err; 246 } 247 EXPORT_SYMBOL(__kfifo_from_user); int the line 231: if len = 3, esize = 4, then at the line 232 len = 0. Wang Long (1): samples: Fix `echo 1 > /proc/int-fifo` never return error samples/kfifo/inttype-example.c | 51 ++++++++++++++++++++++++++++++++--------- 1 file changed, 40 insertions(+), 11 deletions(-) -- 1.8.3.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/