From a734105be86696454b2525c518c79e4026a1fe46 Mon Sep 17 00:00:00 2001 From: Philipp Reisner Date: Tue, 14 Aug 2012 11:28:52 +0200 Subject: [PATCH] --- yaml --- r: 346241 b: refs/heads/master c: 5af2e8ce2b463c2cc8e4a074f9d8f660ae7c1d8f h: refs/heads/master i: 346239: b075f10f9b3a2b4943136715c7fcbda1e2a53f41 v: v3 --- [refs] | 2 +- trunk/drivers/block/drbd/drbd_req.c | 18 ++++++------------ 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/[refs] b/[refs] index d8808b3c9c4c..f3a060de9b96 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 715306f69d85f7ea21eaef4efe75b8364cfea1d5 +refs/heads/master: 5af2e8ce2b463c2cc8e4a074f9d8f660ae7c1d8f diff --git a/trunk/drivers/block/drbd/drbd_req.c b/trunk/drivers/block/drbd/drbd_req.c index 266ef24b3c74..5ddb01edd933 100644 --- a/trunk/drivers/block/drbd/drbd_req.c +++ b/trunk/drivers/block/drbd/drbd_req.c @@ -304,18 +304,6 @@ static int drbd_req_put_completion_ref(struct drbd_request *req, struct bio_and_ if (!atomic_sub_and_test(put, &req->completion_ref)) return 0; - if (drbd_suspended(mdev)) { - /* We do not allow completion while suspended. Re-get a - * reference, so whatever happens when this is resumed - * may put and complete. */ - - D_ASSERT(!(req->rq_state & RQ_COMPLETION_SUSP)); - req->rq_state |= RQ_COMPLETION_SUSP; - atomic_inc(&req->completion_ref); - return 0; - } - - /* else */ drbd_req_complete(req, m); if (req->rq_state & RQ_POSTPONED) { @@ -338,6 +326,9 @@ static void mod_rq_state(struct drbd_request *req, struct bio_and_error *m, int c_put = 0; int k_put = 0; + if (drbd_suspended(mdev) && !((s | clear) & RQ_COMPLETION_SUSP)) + set |= RQ_COMPLETION_SUSP; + /* apply */ req->rq_state &= ~clear; @@ -366,6 +357,9 @@ static void mod_rq_state(struct drbd_request *req, struct bio_and_error *m, if (!(s & RQ_NET_SENT) && (set & RQ_NET_SENT)) atomic_add(req->i.size >> 9, &mdev->ap_in_flight); + if (!(s & RQ_COMPLETION_SUSP) && (set & RQ_COMPLETION_SUSP)) + atomic_inc(&req->completion_ref); + /* progress: put references */ if ((s & RQ_COMPLETION_SUSP) && (clear & RQ_COMPLETION_SUSP))