Index: drbd-8.0.6/drbd/drbd_main.c =================================================================== --- drbd-8.0.6/drbd/drbd_main.c (revision 21335) +++ drbd-8.0.6/drbd/drbd_main.c (working copy) @@ -228,10 +228,7 @@ b = mdev->oldest_barrier; mdev->oldest_barrier = b->next; - /* in protocol C this list should be empty, - * unless there is local io pending. - * in protocol A and B, this should not be empty, even though the - * master_bio's could already been completed. */ + /* Clean up list of requests processed during current epoch */ list_for_each_safe(le, tle, &b->requests) { r = list_entry(le, struct drbd_request,tl_requests); _req_mod(r, barrier_acked, 0); Index: drbd-8.0.6/drbd/drbd_req.c =================================================================== --- drbd-8.0.6/drbd/drbd_req.c (revision 21335) +++ drbd-8.0.6/drbd/drbd_req.c (working copy) @@ -661,10 +661,14 @@ req->rq_state |= RQ_NET_SIS; case conflict_discarded_by_peer: /* interesstingly, this is the same thing! */ + req->rq_state |= RQ_NET_DONE; + /* fall through */ case write_acked_by_peer: /* assert something? */ /* protocol C; successfully written on peer */ - req->rq_state |= RQ_NET_DONE; + /* Nothing to do here - used to set NET_DONE but no more */ + /* as we want to keep the tl in place for all protocols */ + /* rest is the same as for: */ case recv_acked_by_peer: /* protocol B; pretends to be sucessfully written on peer. @@ -688,9 +692,6 @@ break; case barrier_acked: - /* can even happen for protocol C, - * when local io is still pending. - * in which case it does nothing. */ if (req->rq_state & RQ_NET_PENDING) { /* barrier came in before all requests have been acked. * this is bad, because if the connection is lost now,