On 08/03/2012 07:07 AM, majianpeng wrote:
> I met a odd prblem:read /proc/partitions may return zero.
> 
> I wrote a file test.c:
> int main()
> {
>       char buff[4096];
>       int ret;
>       int fd;
>       printf("pid=%d\n",getpid());
>       while (1) {
>               fd = open("/proc/partitions", O_RDONLY);
>               if (fd < 0) {
>                       printf("open error %s\n", strerror(errno));
>                       return 0;
>               }
>               ret = read(fd, buff, 4096);
>               if (ret <= 0)
>                       printf("ret=%d, %s, %ld\n", ret,
>                               strerror(errno), lseek(fd,0,SEEK_CUR));
>               close(fd);
>       }
>       exit(0);
> }
> 
> You can reproduce by:
> 1:while true;do cat /proc/partitions > /dev/null ;done
> 2:./test
> 
> I reviewed the code and found:
>>> static void *show_partition_start(struct seq_file *seqf, loff_t *pos)
>>> {
>>>     static void *p;
> 
>>>     p = disk_seqf_start(seqf, pos);
>>>     if (!IS_ERR_OR_NULL(p) && !*pos)
>>>             seq_puts(seqf, "major minor  #blocks  name\n\n");
>>>     return p;
>>> }
>               test                                                            
> cat /proc/partitions
>       p = disk_seqf_start()(Not NULL)
>                                                                       p = 
> disk_seqf_start()(NULL because pos)
>       if (!IS_ERR_OR_NULL(p) && !*pos)
> 
> Signed-off-by: Jianpeng Ma <[email protected]>
> ---
>  block/genhd.c |    2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/block/genhd.c b/block/genhd.c
> index cac7366..d839723 100644
> --- a/block/genhd.c
> +++ b/block/genhd.c
> @@ -835,7 +835,7 @@ static void disk_seqf_stop(struct seq_file *seqf, void *v)
>  
>  static void *show_partition_start(struct seq_file *seqf, loff_t *pos)
>  {
> -     static void *p;
> +     void *p;
>  
>       p = disk_seqf_start(seqf, pos);
>       if (!IS_ERR_OR_NULL(p) && !*pos)

Huh, that looks like a clear bug. I've applied it, thanks.

-- 
Jens Axboe

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to