• Jianpeng Ma's avatar
    block: Don't use static to define "void *p" in show_partition_start() · 06768067
    Jianpeng Ma authored
    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: default avatarJianpeng Ma <majianpeng@gmail.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    06768067
genhd.c 43.5 KB