[patch] fix diskstats_show() accounting with PREEMPT

From: Ingo Molnar
Date: Tue Sep 21 2004 - 10:38:37 EST



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.

Patch attached. (The overwhelming majority of disk_stat_add() callers
have preemption disabled so fixing the remaining two was the best.)

Ingo

Signed-off-by: Ingo Molnar <mingo@xxxxxxx>

--- linux/drivers/block/genhd.c.orig
+++ linux/drivers/block/genhd.c
@@ -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),
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/