Merge tag 'f2fs-for-5.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeu...
[linux-2.6-microblaze.git] / drivers / md / raid1.c
index ced076b..51f2547 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);
 }
 
@@ -1210,7 +1212,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];
 
        /*
@@ -1220,7 +1222,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();
@@ -1252,7 +1254,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,
@@ -1263,7 +1265,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,
@@ -1292,6 +1294,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;
@@ -1461,6 +1466,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);