Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 213111
b: refs/heads/master
c: cfa0341
h: refs/heads/master
i:
  213109: 51c4f95
  213107: a1f16a7
  213103: e5f5fe5
v: v3
  • Loading branch information
Philipp Reisner committed Oct 14, 2010
1 parent 3d4112d commit 41e29dc
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 15 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 84dfb9f564208a0331131d1ab922382c7d61a553
refs/heads/master: cfa03415a14dd0055f2ff8c3d348d4c1452acba6
34 changes: 20 additions & 14 deletions trunk/drivers/block/drbd/drbd_req.c
Original file line number Diff line number Diff line change
Expand Up @@ -226,8 +226,6 @@ void _req_may_be_done(struct drbd_request *req, struct bio_and_error *m)
return;
if (s & RQ_LOCAL_PENDING)
return;
if (mdev->state.susp)
return;

if (req->master_bio) {
/* this is data_received (remote read)
Expand Down Expand Up @@ -284,6 +282,14 @@ void _req_may_be_done(struct drbd_request *req, struct bio_and_error *m)
* protocol A or B, barrier ack still pending... */
}

static void _req_may_be_done_not_susp(struct drbd_request *req, struct bio_and_error *m)
{
struct drbd_conf *mdev = req->mdev;

if (!mdev->state.susp)
_req_may_be_done(req, m);
}

/*
* checks whether there was an overlapping request
* or ee already registered.
Expand Down Expand Up @@ -425,7 +431,7 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what,
req->rq_state |= (RQ_LOCAL_COMPLETED|RQ_LOCAL_OK);
req->rq_state &= ~RQ_LOCAL_PENDING;

_req_may_be_done(req, m);
_req_may_be_done_not_susp(req, m);
put_ldev(mdev);
break;

Expand All @@ -434,15 +440,15 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what,
req->rq_state &= ~RQ_LOCAL_PENDING;

__drbd_chk_io_error(mdev, FALSE);
_req_may_be_done(req, m);
_req_may_be_done_not_susp(req, m);
put_ldev(mdev);
break;

case read_ahead_completed_with_error:
/* it is legal to fail READA */
req->rq_state |= RQ_LOCAL_COMPLETED;
req->rq_state &= ~RQ_LOCAL_PENDING;
_req_may_be_done(req, m);
_req_may_be_done_not_susp(req, m);
put_ldev(mdev);
break;

Expand All @@ -460,7 +466,7 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what,
/* no point in retrying if there is no good remote data,
* or we have no connection. */
if (mdev->state.pdsk != D_UP_TO_DATE) {
_req_may_be_done(req, m);
_req_may_be_done_not_susp(req, m);
break;
}

Expand Down Expand Up @@ -546,7 +552,7 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what,
req->rq_state &= ~RQ_NET_QUEUED;
/* if we did it right, tl_clear should be scheduled only after
* this, so this should not be necessary! */
_req_may_be_done(req, m);
_req_may_be_done_not_susp(req, m);
break;

case handed_over_to_network:
Expand All @@ -571,7 +577,7 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what,
* "completed_ok" events came in, once we return from
* _drbd_send_zc_bio (drbd_send_dblock), we have to check
* whether it is done already, and end it. */
_req_may_be_done(req, m);
_req_may_be_done_not_susp(req, m);
break;

case read_retry_remote_canceled:
Expand All @@ -587,7 +593,7 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what,
/* if it is still queued, we may not complete it here.
* it will be canceled soon. */
if (!(req->rq_state & RQ_NET_QUEUED))
_req_may_be_done(req, m);
_req_may_be_done(req, m); /* Allowed while state.susp */
break;

case write_acked_by_peer_and_sis:
Expand Down Expand Up @@ -622,7 +628,7 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what,
D_ASSERT(req->rq_state & RQ_NET_PENDING);
dec_ap_pending(mdev);
req->rq_state &= ~RQ_NET_PENDING;
_req_may_be_done(req, m);
_req_may_be_done_not_susp(req, m);
break;

case neg_acked:
Expand All @@ -632,15 +638,15 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what,
req->rq_state &= ~(RQ_NET_OK|RQ_NET_PENDING);

req->rq_state |= RQ_NET_DONE;
_req_may_be_done(req, m);
_req_may_be_done_not_susp(req, m);
/* else: done by handed_over_to_network */
break;

case fail_frozen_disk_io:
if (!(req->rq_state & RQ_LOCAL_COMPLETED))
break;

_req_may_be_done(req, m);
_req_may_be_done(req, m); /* Allowed while state.susp */
break;

case restart_frozen_disk_io:
Expand Down Expand Up @@ -685,15 +691,15 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what,
}
D_ASSERT(req->rq_state & RQ_NET_SENT);
req->rq_state |= RQ_NET_DONE;
_req_may_be_done(req, m);
_req_may_be_done(req, m); /* Allowed while state.susp */
break;

case data_received:
D_ASSERT(req->rq_state & RQ_NET_PENDING);
dec_ap_pending(mdev);
req->rq_state &= ~RQ_NET_PENDING;
req->rq_state |= (RQ_NET_OK|RQ_NET_DONE);
_req_may_be_done(req, m);
_req_may_be_done_not_susp(req, m);
break;
};

Expand Down

0 comments on commit 41e29dc

Please sign in to comment.