Index: drbd_req.c =================================================================== --- drbd_req.c (revision 13563) +++ drbd_req.c (working copy) @@ -255,6 +255,7 @@ print_rq_state(req, "_req_may_be_done"); MUST_HOLD(&mdev->req_lock) + if (s & RQ_NET_QUEUED) return; if (s & RQ_NET_PENDING) return; if (s & RQ_LOCAL_PENDING) return; @@ -638,11 +639,7 @@ if (req->rq_state & RQ_NET_PENDING) dec_ap_pending(mdev); req->rq_state &= ~(RQ_NET_OK|RQ_NET_PENDING); req->rq_state |= RQ_NET_DONE; - /* if it is still queued, we may not complete it here. - * it will be canceled soon. - * FIXME we should change the code so this can not happen. */ - if (!(req->rq_state & RQ_NET_QUEUED)) - _req_may_be_done(req,error); + _req_may_be_done(req,error); break; case write_acked_by_peer_and_sis: @@ -662,9 +659,7 @@ D_ASSERT(req->rq_state & RQ_NET_PENDING); dec_ap_pending(mdev); req->rq_state &= ~RQ_NET_PENDING; - if (req->rq_state & RQ_NET_SENT) - _req_may_be_done(req,error); - /* else: done by handed_over_to_network */ + _req_may_be_done(req,error); break; case neg_acked: @@ -673,9 +668,7 @@ req->rq_state &= ~(RQ_NET_OK|RQ_NET_PENDING); /* FIXME THINK! is it DONE now, or is it not? */ req->rq_state |= RQ_NET_DONE; - if (req->rq_state & RQ_NET_SENT) - _req_may_be_done(req,error); - /* else: done by handed_over_to_network */ + _req_may_be_done(req,error); break; case barrier_acked: @@ -714,11 +707,7 @@ dec_ap_pending(mdev); req->rq_state &= ~RQ_NET_PENDING; req->rq_state |= (RQ_NET_OK|RQ_NET_DONE); - /* can it happen that we receive the DataReply - * before the send DataRequest function returns? */ - if (req->rq_state & RQ_NET_SENT) - _req_may_be_done(req,error); - /* else: done by handed_over_to_network */ + _req_may_be_done(req,error); break; }; }