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;