From: Ingo Molnar There is another (minor) bug that the smp_processor_id() debugger unearthed: diskstats_show() could do a disk_round_stats() -> disk_stat_add() with preemption enabled - possibly resulting in losing statistics updates. Signed-off-by: Ingo Molnar Signed-off-by: Andrew Morton --- 25-akpm/drivers/block/genhd.c | 4 ++++ 1 files changed, 4 insertions(+) diff -puN drivers/block/genhd.c~fix-diskstats_show-accounting-with-preempt drivers/block/genhd.c --- 25/drivers/block/genhd.c~fix-diskstats_show-accounting-with-preempt Tue Sep 21 14:38:57 2004 +++ 25-akpm/drivers/block/genhd.c Tue Sep 21 14:38:57 2004 @@ -365,7 +365,9 @@ static ssize_t disk_size_read(struct gen static ssize_t disk_stats_read(struct gendisk * disk, char *page) { + preempt_disable(); disk_round_stats(disk); + preempt_enable(); return sprintf(page, "%8u %8u %8llu %8u " "%8u %8u %8llu %8u " @@ -494,7 +496,9 @@ static int diskstats_show(struct seq_fil "\n\n"); */ + preempt_disable(); disk_round_stats(gp); + preempt_enable(); seq_printf(s, "%4d %4d %s %u %u %llu %u %u %u %llu %u %u %u %u\n", gp->major, n + gp->first_minor, disk_name(gp, n, buf), disk_stat_read(gp, reads), disk_stat_read(gp, read_merges), _