From: Ingo Molnar <mingo@elte.hu>

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 <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 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),
_