Jianpeng Ma
0676806707
block: Don't use static to define "void *p" in show_partition_start()
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]>
Signed-off-by: Jens Axboe <[email protected]>
|
2012-08-03 10:42:00 +02:00 |
| .. |
|
partitions
|
s390/dasd: re-prioritize partition detection message
|
2012-05-16 14:42:51 +02:00 |
|
blk-cgroup.c
|
blkcg: implement per-blkg request allocation
|
2012-06-26 18:42:49 -04:00 |
|
blk-cgroup.h
|
blkcg: implement per-blkg request allocation
|
2012-06-26 18:42:49 -04:00 |
|
blk-core.c
|
blk: pass from_schedule to non-request unplug functions.
|
2012-07-31 09:08:15 +02:00 |
|
blk-exec.c
|
[SCSI] block: Fix blk_execute_rq_nowait() dead queue handling
|
2012-07-20 08:58:39 +01:00 |
|
blk-flush.c
|
|
|
|
blk-integrity.c
|
|
|
|
blk-ioc.c
|
block: uninitialized ioc->nr_tasks triggers WARN_ON
|
2012-08-01 12:17:27 +02:00 |
|
blk-iopoll.c
|
|
|
|
blk-lib.c
|
block: split discard into aligned requests
|
2012-08-02 09:48:50 +02:00 |
|
blk-map.c
|
block: re-use existing 'reading' variable instead of checking direction again
|
2011-12-21 15:27:24 +01:00 |
|
blk-merge.c
|
block: Add blk_bio_map_sg() helper
|
2012-08-02 23:42:04 +02:00 |
|
blk-settings.c
|
block: do not artificially constrain max_sectors for stacking drivers
|
2012-08-01 10:44:28 +02:00 |
|
blk-softirq.c
|
sched, block: Unify cache detection
|
2012-01-27 13:28:48 +01:00 |
|
blk-sysfs.c
|
blkcg: implement per-blkg request allocation
|
2012-06-26 18:42:49 -04:00 |
|
blk-tag.c
|
block: fix blk_queue_end_tag()
|
2011-12-29 09:16:28 +01:00 |
|
blk-throttle.c
|
block: allocate io_context upfront
|
2012-06-25 11:53:50 +02:00 |
|
blk-timeout.c
|
block: Drop dead function blk_abort_queue()
|
2012-06-15 08:46:23 +02:00 |
|
blk.h
|
block: remove dead func declaration
|
2012-08-01 12:25:54 +02:00 |
|
bsg-lib.c
|
block: drop custom queue draining used by scsi_transport_{iscsi|fc}
|
2012-06-25 11:53:48 +02:00 |
|
bsg.c
|
bsg: fix sysfs link remove warning
|
2012-02-08 20:02:03 +01:00 |
|
cfq-iosched.c
|
block: blkcg_policy_cfq shouldn't be used if !CONFIG_CFQ_GROUP_IOSCHED
|
2012-06-04 10:02:29 +02:00 |
|
compat_ioctl.c
|
block: Add BLKROTATIONAL ioctl
|
2012-01-11 16:29:31 +01:00 |
|
deadline-iosched.c
|
elevator: make elevator_init_fn() return 0/-errno
|
2012-03-06 21:27:21 +01:00 |
|
elevator.c
|
blkcg: implement per-queue policy activation
|
2012-04-20 10:06:06 +02:00 |
|
genhd.c
|
block: Don't use static to define "void *p" in show_partition_start()
|
2012-08-03 10:42:00 +02:00 |
|
ioctl.c
|
block: add partition resize function to blkpg ioctl
|
2012-08-01 12:24:18 +02:00 |
|
Kconfig
|
move fs/partitions to block/
|
2012-01-03 22:54:06 -05:00 |
|
Kconfig.iosched
|
blkcg: make CONFIG_BLK_CGROUP bool
|
2012-03-06 21:27:21 +01:00 |
|
Makefile
|
separate partition format handling from generic code
|
2012-01-03 22:54:06 -05:00 |
|
noop-iosched.c
|
elevator: make elevator_init_fn() return 0/-errno
|
2012-03-06 21:27:21 +01:00 |
|
partition-generic.c
|
block: add partition resize function to blkpg ioctl
|
2012-08-01 12:24:18 +02:00 |
|
scsi_ioctl.c
|
scsi: Silence unnecessary warnings about ioctl to partition
|
2012-06-15 12:52:46 +02:00 |