Changes ic->reads and ic->writes to be atomic_t. --- diff/drivers/md/dm-iostats.c 2002-12-16 14:37:05.000000000 +0000 +++ source/drivers/md/dm-iostats.c 2002-12-16 14:36:35.000000000 +0000 @@ -39,8 +39,8 @@ struct iostats_c { unsigned long flags; struct dm_dev *dev; - uint32_t reads; - uint32_t writes; + atomic_t reads; + atomic_t writes; /* * These fields are only present if we are recording the @@ -109,6 +109,8 @@ kfree(ic); return -ENXIO; } + atomic_set(&ic->reads, 0); + atomic_set(&ic->writes, 0); return 0; } @@ -136,7 +138,6 @@ j = jiffies - io->start_io; if (io->rw == WRITE) { - ic->writes++; ic->total_w += j; ic->count_w++; if (ic->count_w > MAX_COUNT) { @@ -144,7 +145,6 @@ ic->count_w = 1; } } else { - ic->reads++; ic->total_r += j; ic->count_r++; if (ic->count_r > MAX_COUNT) { @@ -194,10 +194,12 @@ { struct iostats_c *ic = (struct iostats_c *) ti->private; + /* FIXME: what do we do when these counters wrap ? */ if (rw == WRITE) - ic->writes++; + atomic_inc(&ic->writes); + else - ic->reads++; + atomic_inc(&ic->reads); if (test_bit(IOF_LATENCY, &ic->flags)) _hook_io(ic, ti, bh, rw); @@ -226,7 +228,7 @@ if (test_bit(IOF_LATENCY, &ic->flags)) { snprintf(result, maxlen, "%s %u %u", kdevname(to_kdev_t(ic->dev->bdev->bd_dev)), - ic->reads, ic->writes); + atomic_read(&ic->reads), atomic_read(&ic->writes)); } else { uint avg_r, avg_w; @@ -234,7 +236,8 @@ avg_w = _calc(ic->total_w, ic->count_w); snprintf(result, maxlen, "%s %u %u %u %u", kdevname(to_kdev_t(ic->dev->bdev->bd_dev)), - ic->reads, ic->writes, avg_r, avg_w); + atomic_read(&ic->reads), atomic_read(&ic->writes), + avg_r, avg_w); } break;