Merge branch 'md-fixes' of https://git.kernel.org/pub/scm/linux/kernel/git/song/md...
[platform/kernel/linux-rpi.git] / drivers / md / raid1.c
index 753822c..3c44c4b 100644 (file)
@@ -300,6 +300,8 @@ static void call_bio_endio(struct r1bio *r1_bio)
        if (!test_bit(R1BIO_Uptodate, &r1_bio->state))
                bio->bi_status = BLK_STS_IOERR;
 
+       if (blk_queue_io_stat(bio->bi_bdev->bd_disk->queue))
+               bio_end_io_acct(bio, r1_bio->start_time);
        bio_endio(bio);
 }
 
@@ -1208,7 +1210,7 @@ static void raid1_read_request(struct mddev *mddev, struct bio *bio,
        const unsigned long do_sync = (bio->bi_opf & REQ_SYNC);
        int max_sectors;
        int rdisk;
-       bool print_msg = !!r1_bio;
+       bool r1bio_existed = !!r1_bio;
        char b[BDEVNAME_SIZE];
 
        /*
@@ -1218,7 +1220,7 @@ static void raid1_read_request(struct mddev *mddev, struct bio *bio,
         */
        gfp_t gfp = r1_bio ? (GFP_NOIO | __GFP_HIGH) : GFP_NOIO;
 
-       if (print_msg) {
+       if (r1bio_existed) {
                /* Need to get the block device name carefully */
                struct md_rdev *rdev;
                rcu_read_lock();
@@ -1250,7 +1252,7 @@ static void raid1_read_request(struct mddev *mddev, struct bio *bio,
 
        if (rdisk < 0) {
                /* couldn't find anywhere to read from */
-               if (print_msg) {
+               if (r1bio_existed) {
                        pr_crit_ratelimited("md/raid1:%s: %s: unrecoverable I/O read error for block %llu\n",
                                            mdname(mddev),
                                            b,
@@ -1261,7 +1263,7 @@ static void raid1_read_request(struct mddev *mddev, struct bio *bio,
        }
        mirror = conf->mirrors + rdisk;
 
-       if (print_msg)
+       if (r1bio_existed)
                pr_info_ratelimited("md/raid1:%s: redirecting sector %llu to other mirror: %s\n",
                                    mdname(mddev),
                                    (unsigned long long)r1_bio->sector,
@@ -1290,6 +1292,9 @@ static void raid1_read_request(struct mddev *mddev, struct bio *bio,
 
        r1_bio->read_disk = rdisk;
 
+       if (!r1bio_existed && blk_queue_io_stat(bio->bi_bdev->bd_disk->queue))
+               r1_bio->start_time = bio_start_io_acct(bio);
+
        read_bio = bio_clone_fast(bio, gfp, &mddev->bio_set);
 
        r1_bio->bios[rdisk] = read_bio;
@@ -1459,6 +1464,8 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio,
                r1_bio->sectors = max_sectors;
        }
 
+       if (blk_queue_io_stat(bio->bi_bdev->bd_disk->queue))
+               r1_bio->start_time = bio_start_io_acct(bio);
        atomic_set(&r1_bio->remaining, 1);
        atomic_set(&r1_bio->behind_remaining, 0);