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)
-- 
1.7.9.5

Reply via email to