diff --git a/drbd/drbd_int.h b/drbd/drbd_int.h index 68c5427..c8e7ca8 100644 --- a/drbd/drbd_int.h +++ b/drbd/drbd_int.h @@ -90,6 +90,7 @@ extern char usermode_helper[]; #include #include +#include // XXX do we need this? #ifndef TRUE @@ -2122,8 +2146,12 @@ static inline int drbd_queue_order_type(struct drbd_conf *mdev) */ static inline void drbd_blk_run_queue(struct request_queue *q) { - if (q && q->unplug_fn) + if (q && q->unplug_fn) { + /* Caller of unplug is responsible for tracing... */ + blk_add_trace_pdu_int(q, BLK_TA_UNPLUG_IO, NULL, + q->rq.count[READ] + q->rq.count[WRITE]); q->unplug_fn(q); + } } static inline void drbd_kick_lo(struct drbd_conf *mdev) diff --git a/drbd/drbd_req.c b/drbd/drbd_req.c index b8bad09..74fe905 100644 --- a/drbd/drbd_req.c +++ b/drbd/drbd_req.c @@ -306,6 +306,7 @@ static void _complete_master_bio(struct drbd_conf *mdev, struct drbd_request *req, int error) { dump_bio(mdev, req->master_bio, 1); + blk_add_trace_bio(mdev->rq_queue, req->master_bio, BLK_TA_COMPLETE); bio_endio(req->master_bio, error); req->master_bio = NULL; dec_ap_bio(mdev); @@ -879,6 +882,7 @@ STATIC int drbd_make_request_common(struct drbd_conf *mdev, struct bio *bio) /* only pass the error to the upper layers. * if user cannot handle io errors, thats not our business. */ ERR("could not kmalloc() req\n"); + blk_add_trace_bio(mdev->rq_queue, bio, BLK_TA_COMPLETE); bio_endio(bio, -ENOMEM); return 0; } @@ -1068,6 +1072,7 @@ allocate_barrier: dec_ap_pending(mdev); _drbd_end_io_acct(mdev, req); /* THINK: do we want to fail it (-EIO), or pretend success? */ + blk_add_trace_bio(mdev->rq_queue, req->master_bio, BLK_TA_COMPLETE); bio_endio(req->master_bio, 0); req->master_bio = NULL; dec_ap_bio(mdev); @@ -1111,6 +1116,7 @@ allocate_barrier: fail_and_free_req: kfree(b); + blk_add_trace_bio(mdev->rq_queue, bio, BLK_TA_COMPLETE); bio_endio(bio, err); drbd_req_free(req); return 0; @@ -1168,6 +1174,7 @@ int drbd_make_request_26(struct request_queue *q, struct bio *bio) struct drbd_conf *mdev = (struct drbd_conf *) q->queuedata; if (drbd_fail_request_early(mdev, bio_data_dir(bio) & WRITE)) { + blk_add_trace_bio(mdev->rq_queue, bio, BLK_TA_COMPLETE); bio_endio(bio, -EPERM); return 0; } @@ -1182,6 +1189,7 @@ int drbd_make_request_26(struct request_queue *q, struct bio *bio) */ if (unlikely(bio_barrier(bio) && test_bit(NO_BARRIER_SUPP, &mdev->flags))) { /* WARN("Rejecting barrier request as underlying device does not support\n"); */ + blk_add_trace_bio(mdev->rq_queue, bio, BLK_TA_COMPLETE); bio_endio(bio, -EOPNOTSUPP); return 0; } @@ -1210,6 +1218,7 @@ int drbd_make_request_26(struct request_queue *q, struct bio *bio) "(vcnt=%u,idx=%u,size=%u,sector=%llu)\n", bio->bi_vcnt, bio->bi_idx, bio->bi_size, (unsigned long long)bio->bi_sector); + blk_add_trace_bio(mdev->rq_queue, bio, BLK_TA_COMPLETE); bio_endio(bio, -EINVAL); return 0; } else {