aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/drbd/drbd_req.c
diff options
context:
space:
mode:
authorPhilipp Reisner <philipp.reisner@linbit.com>2010-10-26 10:02:27 -0400
committerPhilipp Reisner <philipp.reisner@linbit.com>2011-03-10 05:34:43 -0500
commit759fbdfba66e620aceb3e73167e6003d1b8b0b0b (patch)
tree34080a67cfdee2c0a2000126622bf65d4a7e0936 /drivers/block/drbd/drbd_req.c
parent688593c5a82068aea64df0b836793dfbbaa646d7 (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.c13
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