aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/block')
-rw-r--r--drivers/block/aoe/aoecmd.c13
-rw-r--r--drivers/block/elevator.c7
-rw-r--r--drivers/block/genhd.c29
-rw-r--r--drivers/block/ll_rw_blk.c47
4 files changed, 41 insertions, 55 deletions
diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c
index 5c9c7c1a3d4c..326ca3876b68 100644
--- a/drivers/block/aoe/aoecmd.c
+++ b/drivers/block/aoe/aoecmd.c
@@ -468,16 +468,11 @@ aoecmd_ata_rsp(struct sk_buff *skb)
468 unsigned long duration = jiffies - buf->start_time; 468 unsigned long duration = jiffies - buf->start_time;
469 unsigned long n_sect = buf->bio->bi_size >> 9; 469 unsigned long n_sect = buf->bio->bi_size >> 9;
470 struct gendisk *disk = d->gd; 470 struct gendisk *disk = d->gd;
471 const int rw = bio_data_dir(buf->bio);
471 472
472 if (bio_data_dir(buf->bio) == WRITE) { 473 disk_stat_inc(disk, ios[rw]);
473 disk_stat_inc(disk, writes); 474 disk_stat_add(disk, ticks[rw], duration);
474 disk_stat_add(disk, write_ticks, duration); 475 disk_stat_add(disk, sectors[rw], n_sect);
475 disk_stat_add(disk, write_sectors, n_sect);
476 } else {
477 disk_stat_inc(disk, reads);
478 disk_stat_add(disk, read_ticks, duration);
479 disk_stat_add(disk, read_sectors, n_sect);
480 }
481 disk_stat_add(disk, io_ticks, duration); 476 disk_stat_add(disk, io_ticks, duration);
482 n = (buf->flags & BUFFL_FAIL) ? -EIO : 0; 477 n = (buf->flags & BUFFL_FAIL) ? -EIO : 0;
483 bio_endio(buf->bio, buf->bio->bi_size, n); 478 bio_endio(buf->bio, buf->bio->bi_size, n);
diff --git a/drivers/block/elevator.c b/drivers/block/elevator.c
index 36f1057084b0..d4a49a3df829 100644
--- a/drivers/block/elevator.c
+++ b/drivers/block/elevator.c
@@ -369,9 +369,14 @@ void __elv_add_request(request_queue_t *q, struct request *rq, int where,
369 case ELEVATOR_INSERT_SORT: 369 case ELEVATOR_INSERT_SORT:
370 BUG_ON(!blk_fs_request(rq)); 370 BUG_ON(!blk_fs_request(rq));
371 rq->flags |= REQ_SORTED; 371 rq->flags |= REQ_SORTED;
372 q->elevator->ops->elevator_add_req_fn(q, rq);
373 if (q->last_merge == NULL && rq_mergeable(rq)) 372 if (q->last_merge == NULL && rq_mergeable(rq))
374 q->last_merge = rq; 373 q->last_merge = rq;
374 /*
375 * Some ioscheds (cfq) run q->request_fn directly, so
376 * rq cannot be accessed after calling
377 * elevator_add_req_fn.
378 */
379 q->elevator->ops->elevator_add_req_fn(q, rq);
375 break; 380 break;
376 381
377 default: 382 default:
diff --git a/drivers/block/genhd.c b/drivers/block/genhd.c
index 486ce1fdeb8c..54aec4a1ae13 100644
--- a/drivers/block/genhd.c
+++ b/drivers/block/genhd.c
@@ -391,13 +391,12 @@ static ssize_t disk_stats_read(struct gendisk * disk, char *page)
391 "%8u %8u %8llu %8u " 391 "%8u %8u %8llu %8u "
392 "%8u %8u %8u" 392 "%8u %8u %8u"
393 "\n", 393 "\n",
394 disk_stat_read(disk, reads), disk_stat_read(disk, read_merges), 394 disk_stat_read(disk, ios[0]), disk_stat_read(disk, merges[0]),
395 (unsigned long long)disk_stat_read(disk, read_sectors), 395 (unsigned long long)disk_stat_read(disk, sectors[0]),
396 jiffies_to_msecs(disk_stat_read(disk, read_ticks)), 396 jiffies_to_msecs(disk_stat_read(disk, ticks[0])),
397 disk_stat_read(disk, writes), 397 disk_stat_read(disk, ios[1]), disk_stat_read(disk, merges[1]),
398 disk_stat_read(disk, write_merges), 398 (unsigned long long)disk_stat_read(disk, sectors[1]),
399 (unsigned long long)disk_stat_read(disk, write_sectors), 399 jiffies_to_msecs(disk_stat_read(disk, ticks[1])),
400 jiffies_to_msecs(disk_stat_read(disk, write_ticks)),
401 disk->in_flight, 400 disk->in_flight,
402 jiffies_to_msecs(disk_stat_read(disk, io_ticks)), 401 jiffies_to_msecs(disk_stat_read(disk, io_ticks)),
403 jiffies_to_msecs(disk_stat_read(disk, time_in_queue))); 402 jiffies_to_msecs(disk_stat_read(disk, time_in_queue)));
@@ -583,12 +582,12 @@ static int diskstats_show(struct seq_file *s, void *v)
583 preempt_enable(); 582 preempt_enable();
584 seq_printf(s, "%4d %4d %s %u %u %llu %u %u %u %llu %u %u %u %u\n", 583 seq_printf(s, "%4d %4d %s %u %u %llu %u %u %u %llu %u %u %u %u\n",
585 gp->major, n + gp->first_minor, disk_name(gp, n, buf), 584 gp->major, n + gp->first_minor, disk_name(gp, n, buf),
586 disk_stat_read(gp, reads), disk_stat_read(gp, read_merges), 585 disk_stat_read(gp, ios[0]), disk_stat_read(gp, merges[0]),
587 (unsigned long long)disk_stat_read(gp, read_sectors), 586 (unsigned long long)disk_stat_read(gp, sectors[0]),
588 jiffies_to_msecs(disk_stat_read(gp, read_ticks)), 587 jiffies_to_msecs(disk_stat_read(gp, ticks[0])),
589 disk_stat_read(gp, writes), disk_stat_read(gp, write_merges), 588 disk_stat_read(gp, ios[1]), disk_stat_read(gp, merges[1]),
590 (unsigned long long)disk_stat_read(gp, write_sectors), 589 (unsigned long long)disk_stat_read(gp, sectors[1]),
591 jiffies_to_msecs(disk_stat_read(gp, write_ticks)), 590 jiffies_to_msecs(disk_stat_read(gp, ticks[1])),
592 gp->in_flight, 591 gp->in_flight,
593 jiffies_to_msecs(disk_stat_read(gp, io_ticks)), 592 jiffies_to_msecs(disk_stat_read(gp, io_ticks)),
594 jiffies_to_msecs(disk_stat_read(gp, time_in_queue))); 593 jiffies_to_msecs(disk_stat_read(gp, time_in_queue)));
@@ -601,8 +600,8 @@ static int diskstats_show(struct seq_file *s, void *v)
601 seq_printf(s, "%4d %4d %s %u %u %u %u\n", 600 seq_printf(s, "%4d %4d %s %u %u %u %u\n",
602 gp->major, n + gp->first_minor + 1, 601 gp->major, n + gp->first_minor + 1,
603 disk_name(gp, n + 1, buf), 602 disk_name(gp, n + 1, buf),
604 hd->reads, hd->read_sectors, 603 hd->ios[0], hd->sectors[0],
605 hd->writes, hd->write_sectors); 604 hd->ios[1], hd->sectors[1]);
606 } 605 }
607 606
608 return 0; 607 return 0;
diff --git a/drivers/block/ll_rw_blk.c b/drivers/block/ll_rw_blk.c
index 0af73512b9a8..2747741677fb 100644
--- a/drivers/block/ll_rw_blk.c
+++ b/drivers/block/ll_rw_blk.c
@@ -2387,16 +2387,9 @@ static void drive_stat_acct(struct request *rq, int nr_sectors, int new_io)
2387 if (!blk_fs_request(rq) || !rq->rq_disk) 2387 if (!blk_fs_request(rq) || !rq->rq_disk)
2388 return; 2388 return;
2389 2389
2390 if (rw == READ) { 2390 if (!new_io) {
2391 __disk_stat_add(rq->rq_disk, read_sectors, nr_sectors); 2391 __disk_stat_inc(rq->rq_disk, merges[rw]);
2392 if (!new_io) 2392 } else {
2393 __disk_stat_inc(rq->rq_disk, read_merges);
2394 } else if (rw == WRITE) {
2395 __disk_stat_add(rq->rq_disk, write_sectors, nr_sectors);
2396 if (!new_io)
2397 __disk_stat_inc(rq->rq_disk, write_merges);
2398 }
2399 if (new_io) {
2400 disk_round_stats(rq->rq_disk); 2393 disk_round_stats(rq->rq_disk);
2401 rq->rq_disk->in_flight++; 2394 rq->rq_disk->in_flight++;
2402 } 2395 }
@@ -2791,17 +2784,11 @@ static inline void blk_partition_remap(struct bio *bio)
2791 2784
2792 if (bdev != bdev->bd_contains) { 2785 if (bdev != bdev->bd_contains) {
2793 struct hd_struct *p = bdev->bd_part; 2786 struct hd_struct *p = bdev->bd_part;
2787 const int rw = bio_data_dir(bio);
2788
2789 p->sectors[rw] += bio_sectors(bio);
2790 p->ios[rw]++;
2794 2791
2795 switch (bio_data_dir(bio)) {
2796 case READ:
2797 p->read_sectors += bio_sectors(bio);
2798 p->reads++;
2799 break;
2800 case WRITE:
2801 p->write_sectors += bio_sectors(bio);
2802 p->writes++;
2803 break;
2804 }
2805 bio->bi_sector += p->start_sect; 2792 bio->bi_sector += p->start_sect;
2806 bio->bi_bdev = bdev->bd_contains; 2793 bio->bi_bdev = bdev->bd_contains;
2807 } 2794 }
@@ -3048,6 +3035,12 @@ static int __end_that_request_first(struct request *req, int uptodate,
3048 (unsigned long long)req->sector); 3035 (unsigned long long)req->sector);
3049 } 3036 }
3050 3037
3038 if (blk_fs_request(req) && req->rq_disk) {
3039 const int rw = rq_data_dir(req);
3040
3041 __disk_stat_add(req->rq_disk, sectors[rw], nr_bytes >> 9);
3042 }
3043
3051 total_bytes = bio_nbytes = 0; 3044 total_bytes = bio_nbytes = 0;
3052 while ((bio = req->bio) != NULL) { 3045 while ((bio = req->bio) != NULL) {
3053 int nbytes; 3046 int nbytes;
@@ -3176,16 +3169,10 @@ void end_that_request_last(struct request *req)
3176 3169
3177 if (disk && blk_fs_request(req)) { 3170 if (disk && blk_fs_request(req)) {
3178 unsigned long duration = jiffies - req->start_time; 3171 unsigned long duration = jiffies - req->start_time;
3179 switch (rq_data_dir(req)) { 3172 const int rw = rq_data_dir(req);
3180 case WRITE: 3173
3181 __disk_stat_inc(disk, writes); 3174 __disk_stat_inc(disk, ios[rw]);
3182 __disk_stat_add(disk, write_ticks, duration); 3175 __disk_stat_add(disk, ticks[rw], duration);
3183 break;
3184 case READ:
3185 __disk_stat_inc(disk, reads);
3186 __disk_stat_add(disk, read_ticks, duration);
3187 break;
3188 }
3189 disk_round_stats(disk); 3176 disk_round_stats(disk);
3190 disk->in_flight--; 3177 disk->in_flight--;
3191 } 3178 }