diff options
author | Philipp Reisner <philipp.reisner@linbit.com> | 2010-10-26 10:02:27 -0400 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2011-03-10 05:34:43 -0500 |
commit | 759fbdfba66e620aceb3e73167e6003d1b8b0b0b (patch) | |
tree | 34080a67cfdee2c0a2000126622bf65d4a7e0936 /drivers/block/drbd/drbd_req.c | |
parent | 688593c5a82068aea64df0b836793dfbbaa646d7 (diff) |
drbd: Track the numbers of sectors in flight
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers/block/drbd/drbd_req.c')
-rw-r--r-- | drivers/block/drbd/drbd_req.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c index 08f53ce9b88f..5c60d77d447c 100644 --- a/drivers/block/drbd/drbd_req.c +++ b/drivers/block/drbd/drbd_req.c | |||
@@ -558,6 +558,9 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what, | |||
558 | 558 | ||
559 | case handed_over_to_network: | 559 | case handed_over_to_network: |
560 | /* assert something? */ | 560 | /* assert something? */ |
561 | if (bio_data_dir(req->master_bio) == WRITE) | ||
562 | atomic_add(req->size>>9, &mdev->ap_in_flight); | ||
563 | |||
561 | if (bio_data_dir(req->master_bio) == WRITE && | 564 | if (bio_data_dir(req->master_bio) == WRITE && |
562 | mdev->net_conf->wire_protocol == DRBD_PROT_A) { | 565 | mdev->net_conf->wire_protocol == DRBD_PROT_A) { |
563 | /* this is what is dangerous about protocol A: | 566 | /* this is what is dangerous about protocol A: |
@@ -591,6 +594,9 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what, | |||
591 | dec_ap_pending(mdev); | 594 | dec_ap_pending(mdev); |
592 | req->rq_state &= ~(RQ_NET_OK|RQ_NET_PENDING); | 595 | req->rq_state &= ~(RQ_NET_OK|RQ_NET_PENDING); |
593 | req->rq_state |= RQ_NET_DONE; | 596 | req->rq_state |= RQ_NET_DONE; |
597 | if (req->rq_state & RQ_NET_SENT && req->rq_state & RQ_WRITE) | ||
598 | atomic_sub(req->size>>9, &mdev->ap_in_flight); | ||
599 | |||
594 | /* if it is still queued, we may not complete it here. | 600 | /* if it is still queued, we may not complete it here. |
595 | * it will be canceled soon. */ | 601 | * it will be canceled soon. */ |
596 | if (!(req->rq_state & RQ_NET_QUEUED)) | 602 | if (!(req->rq_state & RQ_NET_QUEUED)) |
@@ -628,14 +634,17 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what, | |||
628 | req->rq_state |= RQ_NET_OK; | 634 | req->rq_state |= RQ_NET_OK; |
629 | D_ASSERT(req->rq_state & RQ_NET_PENDING); | 635 | D_ASSERT(req->rq_state & RQ_NET_PENDING); |
630 | dec_ap_pending(mdev); | 636 | dec_ap_pending(mdev); |
637 | atomic_sub(req->size>>9, &mdev->ap_in_flight); | ||
631 | req->rq_state &= ~RQ_NET_PENDING; | 638 | req->rq_state &= ~RQ_NET_PENDING; |
632 | _req_may_be_done_not_susp(req, m); | 639 | _req_may_be_done_not_susp(req, m); |
633 | break; | 640 | break; |
634 | 641 | ||
635 | case neg_acked: | 642 | case neg_acked: |
636 | /* assert something? */ | 643 | /* assert something? */ |
637 | if (req->rq_state & RQ_NET_PENDING) | 644 | if (req->rq_state & RQ_NET_PENDING) { |
638 | dec_ap_pending(mdev); | 645 | dec_ap_pending(mdev); |
646 | atomic_sub(req->size>>9, &mdev->ap_in_flight); | ||
647 | } | ||
639 | req->rq_state &= ~(RQ_NET_OK|RQ_NET_PENDING); | 648 | req->rq_state &= ~(RQ_NET_OK|RQ_NET_PENDING); |
640 | 649 | ||
641 | req->rq_state |= RQ_NET_DONE; | 650 | req->rq_state |= RQ_NET_DONE; |
@@ -692,6 +701,8 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what, | |||
692 | } | 701 | } |
693 | D_ASSERT(req->rq_state & RQ_NET_SENT); | 702 | D_ASSERT(req->rq_state & RQ_NET_SENT); |
694 | req->rq_state |= RQ_NET_DONE; | 703 | req->rq_state |= RQ_NET_DONE; |
704 | if (mdev->net_conf->wire_protocol == DRBD_PROT_A) | ||
705 | atomic_sub(req->size>>9, &mdev->ap_in_flight); | ||
695 | _req_may_be_done(req, m); /* Allowed while state.susp */ | 706 | _req_may_be_done(req, m); /* Allowed while state.susp */ |
696 | break; | 707 | break; |
697 | 708 | ||