|
@@ -757,7 +757,7 @@ static int drbd_may_do_local_read(struct drbd_conf *mdev, sector_t sector, int s
|
|
|
return 0 == drbd_bm_count_bits(mdev, sbnr, ebnr);
|
|
|
}
|
|
|
|
|
|
-static int drbd_make_request_common(struct drbd_conf *mdev, struct bio *bio)
|
|
|
+static int drbd_make_request_common(struct drbd_conf *mdev, struct bio *bio, unsigned long start_time)
|
|
|
{
|
|
|
const int rw = bio_rw(bio);
|
|
|
const int size = bio->bi_size;
|
|
@@ -778,6 +778,7 @@ static int drbd_make_request_common(struct drbd_conf *mdev, struct bio *bio)
|
|
|
bio_endio(bio, -ENOMEM);
|
|
|
return 0;
|
|
|
}
|
|
|
+ req->start_time = start_time;
|
|
|
|
|
|
local = get_ldev(mdev);
|
|
|
if (!local) {
|
|
@@ -1076,12 +1077,15 @@ int drbd_make_request_26(struct request_queue *q, struct bio *bio)
|
|
|
{
|
|
|
unsigned int s_enr, e_enr;
|
|
|
struct drbd_conf *mdev = (struct drbd_conf *) q->queuedata;
|
|
|
+ unsigned long start_time;
|
|
|
|
|
|
if (drbd_fail_request_early(mdev, bio_data_dir(bio) & WRITE)) {
|
|
|
bio_endio(bio, -EPERM);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+ start_time = jiffies;
|
|
|
+
|
|
|
/*
|
|
|
* what we "blindly" assume:
|
|
|
*/
|
|
@@ -1096,7 +1100,7 @@ int drbd_make_request_26(struct request_queue *q, struct bio *bio)
|
|
|
|
|
|
if (likely(s_enr == e_enr)) {
|
|
|
inc_ap_bio(mdev, 1);
|
|
|
- return drbd_make_request_common(mdev, bio);
|
|
|
+ return drbd_make_request_common(mdev, bio, start_time);
|
|
|
}
|
|
|
|
|
|
/* can this bio be split generically?
|
|
@@ -1138,10 +1142,10 @@ int drbd_make_request_26(struct request_queue *q, struct bio *bio)
|
|
|
|
|
|
D_ASSERT(e_enr == s_enr + 1);
|
|
|
|
|
|
- while (drbd_make_request_common(mdev, &bp->bio1))
|
|
|
+ while (drbd_make_request_common(mdev, &bp->bio1, start_time))
|
|
|
inc_ap_bio(mdev, 1);
|
|
|
|
|
|
- while (drbd_make_request_common(mdev, &bp->bio2))
|
|
|
+ while (drbd_make_request_common(mdev, &bp->bio2, start_time))
|
|
|
inc_ap_bio(mdev, 1);
|
|
|
|
|
|
dec_ap_bio(mdev);
|