"%8u %8u %8llu %8u "
                "%8u %8u %8u"
                "\n",
-               disk_stat_read(disk, reads), disk_stat_read(disk, read_merges),
-               (unsigned long long)disk_stat_read(disk, read_sectors),
-               jiffies_to_msecs(disk_stat_read(disk, read_ticks)),
-               disk_stat_read(disk, writes), 
-               disk_stat_read(disk, write_merges),
-               (unsigned long long)disk_stat_read(disk, write_sectors),
-               jiffies_to_msecs(disk_stat_read(disk, write_ticks)),
+               disk_stat_read(disk, ios[0]), disk_stat_read(disk, merges[0]),
+               (unsigned long long)disk_stat_read(disk, sectors[0]),
+               jiffies_to_msecs(disk_stat_read(disk, ticks[0])),
+               disk_stat_read(disk, ios[1]), disk_stat_read(disk, merges[1]),
+               (unsigned long long)disk_stat_read(disk, sectors[1]),
+               jiffies_to_msecs(disk_stat_read(disk, ticks[1])),
                disk->in_flight,
                jiffies_to_msecs(disk_stat_read(disk, io_ticks)),
                jiffies_to_msecs(disk_stat_read(disk, time_in_queue)));
        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),
-               (unsigned long long)disk_stat_read(gp, read_sectors),
-               jiffies_to_msecs(disk_stat_read(gp, read_ticks)),
-               disk_stat_read(gp, writes), disk_stat_read(gp, write_merges),
-               (unsigned long long)disk_stat_read(gp, write_sectors),
-               jiffies_to_msecs(disk_stat_read(gp, write_ticks)),
+               disk_stat_read(gp, ios[0]), disk_stat_read(gp, merges[0]),
+               (unsigned long long)disk_stat_read(gp, sectors[0]),
+               jiffies_to_msecs(disk_stat_read(gp, ticks[0])),
+               disk_stat_read(gp, ios[1]), disk_stat_read(gp, merges[1]),
+               (unsigned long long)disk_stat_read(gp, sectors[1]),
+               jiffies_to_msecs(disk_stat_read(gp, ticks[1])),
                gp->in_flight,
                jiffies_to_msecs(disk_stat_read(gp, io_ticks)),
                jiffies_to_msecs(disk_stat_read(gp, time_in_queue)));
                        seq_printf(s, "%4d %4d %s %u %u %u %u\n",
                                gp->major, n + gp->first_minor + 1,
                                disk_name(gp, n + 1, buf),
-                               hd->reads, hd->read_sectors,
-                               hd->writes, hd->write_sectors);
+                               hd->ios[0], hd->sectors[0],
+                               hd->ios[1], hd->sectors[1]);
        }
  
        return 0;
 
                return;
 
        if (!new_io) {
-               if (rw == READ)
-                       __disk_stat_inc(rq->rq_disk, read_merges);
-               else
-                       __disk_stat_inc(rq->rq_disk, write_merges);
+               __disk_stat_inc(rq->rq_disk, merges[rw]);
        } else {
                disk_round_stats(rq->rq_disk);
                rq->rq_disk->in_flight++;
 
        if (bdev != bdev->bd_contains) {
                struct hd_struct *p = bdev->bd_part;
+               const int rw = bio_data_dir(bio);
+
+               p->sectors[rw] += bio_sectors(bio);
+               p->ios[rw]++;
 
-               switch (bio_data_dir(bio)) {
-               case READ:
-                       p->read_sectors += bio_sectors(bio);
-                       p->reads++;
-                       break;
-               case WRITE:
-                       p->write_sectors += bio_sectors(bio);
-                       p->writes++;
-                       break;
-               }
                bio->bi_sector += p->start_sect;
                bio->bi_bdev = bdev->bd_contains;
        }
        }
 
        if (blk_fs_request(req) && req->rq_disk) {
-               if (rq_data_dir(req) == READ)
-                       __disk_stat_add(req->rq_disk, read_sectors, nr_bytes >> 9);
-               else
-                       __disk_stat_add(req->rq_disk, write_sectors, nr_bytes >> 9);
+               const int rw = rq_data_dir(req);
+
+               __disk_stat_add(req->rq_disk, sectors[rw], nr_bytes >> 9);
        }
 
        total_bytes = bio_nbytes = 0;
 
        if (disk && blk_fs_request(req)) {
                unsigned long duration = jiffies - req->start_time;
-               switch (rq_data_dir(req)) {
-                   case WRITE:
-                       __disk_stat_inc(disk, writes);
-                       __disk_stat_add(disk, write_ticks, duration);
-                       break;
-                   case READ:
-                       __disk_stat_inc(disk, reads);
-                       __disk_stat_add(disk, read_ticks, duration);
-                       break;
-               }
+               const int rw = rq_data_dir(req);
+
+               __disk_stat_inc(disk, ios[rw]);
+               __disk_stat_add(disk, ticks[rw], duration);
                disk_round_stats(disk);
                disk->in_flight--;
        }
 
 
 static int linear_make_request (request_queue_t *q, struct bio *bio)
 {
+       const int rw = bio_data_dir(bio);
        mddev_t *mddev = q->queuedata;
        dev_info_t *tmp_dev;
        sector_t block;
                return 0;
        }
 
-       if (bio_data_dir(bio)==WRITE) {
-               disk_stat_inc(mddev->gendisk, writes);
-               disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bio));
-       } else {
-               disk_stat_inc(mddev->gendisk, reads);
-               disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bio));
-       }
+       disk_stat_inc(mddev->gendisk, ios[rw]);
+       disk_stat_add(mddev->gendisk, sectors[rw], bio_sectors(bio));
 
        tmp_dev = which_dev(mddev, bio->bi_sector);
        block = bio->bi_sector >> 1;
 
        idle = 1;
        ITERATE_RDEV(mddev,rdev,tmp) {
                struct gendisk *disk = rdev->bdev->bd_contains->bd_disk;
-               curr_events = disk_stat_read(disk, read_sectors) + 
-                               disk_stat_read(disk, write_sectors) - 
+               curr_events = disk_stat_read(disk, sectors[0]) + 
+                               disk_stat_read(disk, sectors[1]) - 
                                atomic_read(&disk->sync_io);
                /* Allow some slack between valud of curr_events and last_events,
                 * as there are some uninteresting races.
 
        multipath_conf_t *conf = mddev_to_conf(mddev);
        struct multipath_bh * mp_bh;
        struct multipath_info *multipath;
+       const int rw = bio_data_dir(bio);
 
        if (unlikely(bio_barrier(bio))) {
                bio_endio(bio, bio->bi_size, -EOPNOTSUPP);
        mp_bh->master_bio = bio;
        mp_bh->mddev = mddev;
 
-       if (bio_data_dir(bio)==WRITE) {
-               disk_stat_inc(mddev->gendisk, writes);
-               disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bio));
-       } else {
-               disk_stat_inc(mddev->gendisk, reads);
-               disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bio));
-       }
+       disk_stat_inc(mddev->gendisk, ios[rw]);
+       disk_stat_add(mddev->gendisk, sectors[rw], bio_sectors(bio));
 
        mp_bh->path = multipath_map(conf);
        if (mp_bh->path < 0) {
 
        mdk_rdev_t *tmp_dev;
        unsigned long chunk;
        sector_t block, rsect;
+       const int rw = bio_data_dir(bio);
 
        if (unlikely(bio_barrier(bio))) {
                bio_endio(bio, bio->bi_size, -EOPNOTSUPP);
                return 0;
        }
 
-       if (bio_data_dir(bio)==WRITE) {
-               disk_stat_inc(mddev->gendisk, writes);
-               disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bio));
-       } else {
-               disk_stat_inc(mddev->gendisk, reads);
-               disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bio));
-       }
+       disk_stat_inc(mddev->gendisk, ios[rw]);
+       disk_stat_add(mddev->gendisk, sectors[rw], bio_sectors(bio));
 
        chunk_size = mddev->chunk_size >> 10;
        chunk_sects = mddev->chunk_size >> 9;
 
        unsigned long flags;
        struct bio_list bl;
        struct page **behind_pages = NULL;
+       const int rw = bio_data_dir(bio);
 
        if (unlikely(bio_barrier(bio))) {
                bio_endio(bio, bio->bi_size, -EOPNOTSUPP);
        conf->nr_pending++;
        spin_unlock_irq(&conf->resync_lock);
 
-       if (bio_data_dir(bio)==WRITE) {
-               disk_stat_inc(mddev->gendisk, writes);
-               disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bio));
-       } else {
-               disk_stat_inc(mddev->gendisk, reads);
-               disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bio));
-       }
+       disk_stat_inc(mddev->gendisk, ios[rw]);
+       disk_stat_add(mddev->gendisk, sectors[rw], bio_sectors(bio));
 
        /*
         * make_request() can abort the operation when READA is being
        r1_bio->mddev = mddev;
        r1_bio->sector = bio->bi_sector;
 
-       if (bio_data_dir(bio) == READ) {
+       if (rw == READ) {
                /*
                 * read balancing logic:
                 */
 
        struct bio *read_bio;
        int i;
        int chunk_sects = conf->chunk_mask + 1;
+       const int rw = bio_data_dir(bio);
 
        if (unlikely(bio_barrier(bio))) {
                bio_endio(bio, bio->bi_size, -EOPNOTSUPP);
        conf->nr_pending++;
        spin_unlock_irq(&conf->resync_lock);
 
-       if (bio_data_dir(bio)==WRITE) {
-               disk_stat_inc(mddev->gendisk, writes);
-               disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bio));
-       } else {
-               disk_stat_inc(mddev->gendisk, reads);
-               disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bio));
-       }
+       disk_stat_inc(mddev->gendisk, ios[rw]);
+       disk_stat_add(mddev->gendisk, sectors[rw], bio_sectors(bio));
 
        r10_bio = mempool_alloc(conf->r10bio_pool, GFP_NOIO);
 
        r10_bio->mddev = mddev;
        r10_bio->sector = bio->bi_sector;
 
-       if (bio_data_dir(bio) == READ) {
+       if (rw == READ) {
                /*
                 * read balancing logic:
                 */
 
        sector_t new_sector;
        sector_t logical_sector, last_sector;
        struct stripe_head *sh;
+       const int rw = bio_data_dir(bi);
 
        if (unlikely(bio_barrier(bi))) {
                bio_endio(bi, bi->bi_size, -EOPNOTSUPP);
 
        md_write_start(mddev, bi);
 
-       if (bio_data_dir(bi)==WRITE) {
-               disk_stat_inc(mddev->gendisk, writes);
-               disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bi));
-       } else {
-               disk_stat_inc(mddev->gendisk, reads);
-               disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bi));
-       }
+       disk_stat_inc(mddev->gendisk, ios[rw]);
+       disk_stat_add(mddev->gendisk, sectors[rw], bio_sectors(bi));
 
        logical_sector = bi->bi_sector & ~((sector_t)STRIPE_SECTORS-1);
        last_sector = bi->bi_sector + (bi->bi_size>>9);
 
        sector_t new_sector;
        sector_t logical_sector, last_sector;
        struct stripe_head *sh;
+       const int rw = bio_data_dir(bi);
 
        if (unlikely(bio_barrier(bi))) {
                bio_endio(bi, bi->bi_size, -EOPNOTSUPP);
 
        md_write_start(mddev, bi);
 
-       if (bio_data_dir(bi)==WRITE) {
-               disk_stat_inc(mddev->gendisk, writes);
-               disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bi));
-       } else {
-               disk_stat_inc(mddev->gendisk, reads);
-               disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bi));
-       }
+       disk_stat_inc(mddev->gendisk, ios[rw]);
+       disk_stat_add(mddev->gendisk, sectors[rw], bio_sectors(bi));
 
        logical_sector = bi->bi_sector & ~((sector_t)STRIPE_SECTORS-1);
        last_sector = bi->bi_sector + (bi->bi_size>>9);
        if (--bi->bi_phys_segments == 0) {
                int bytes = bi->bi_size;
 
-               if ( bio_data_dir(bi) == WRITE )
+               if (rw == WRITE )
                        md_write_end(mddev);
                bi->bi_size = 0;
                bi->bi_end_io(bi, bytes, 0);
 
 static ssize_t part_stat_read(struct hd_struct * p, char *page)
 {
        return sprintf(page, "%8u %8llu %8u %8llu\n",
-                      p->reads, (unsigned long long)p->read_sectors,
-                      p->writes, (unsigned long long)p->write_sectors);
+                      p->ios[0], (unsigned long long)p->sectors[0],
+                      p->ios[1], (unsigned long long)p->sectors[1]);
 }
 static struct part_attribute part_attr_uevent = {
        .attr = {.name = "uevent", .mode = S_IWUSR },
        disk->part[part-1] = NULL;
        p->start_sect = 0;
        p->nr_sects = 0;
-       p->reads = p->writes = p->read_sectors = p->write_sectors = 0;
+       p->ios[0] = p->ios[1] = 0;
+       p->sectors[0] = p->sectors[1] = 0;
        devfs_remove("%s/part%d", disk->devfs_name, part);
        kobject_unregister(&p->kobj);
 }
 
        sector_t start_sect;
        sector_t nr_sects;
        struct kobject kobj;
-       unsigned reads, read_sectors, writes, write_sectors;
+       unsigned ios[2], sectors[2];
        int policy, partno;
 };
 
 #define GENHD_FL_SUPPRESS_PARTITION_INFO       32
 
 struct disk_stats {
-       unsigned read_sectors, write_sectors;
-       unsigned reads, writes;
-       unsigned read_merges, write_merges;
-       unsigned read_ticks, write_ticks;
+       unsigned sectors[2];
+       unsigned ios[2];
+       unsigned merges[2];
+       unsigned ticks[2];
        unsigned io_ticks;
        unsigned time_in_queue;
 };