Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6d7e32f5 authored by Philipp Reisner's avatar Philipp Reisner
Browse files

drbd: Keep a reference to barrier acked requests

parent 6809384c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1022,6 +1022,7 @@ struct drbd_conf {
	struct drbd_tl_epoch *newest_tle;
	struct drbd_tl_epoch *oldest_tle;
	struct list_head out_of_sequence_requests;
	struct list_head barrier_acked_requests;
	struct hlist_head *tl_hash;
	unsigned int tl_hash_s;

+21 −2
Original line number Diff line number Diff line
@@ -208,6 +208,7 @@ static int tl_init(struct drbd_conf *mdev)
	mdev->oldest_tle = b;
	mdev->newest_tle = b;
	INIT_LIST_HEAD(&mdev->out_of_sequence_requests);
	INIT_LIST_HEAD(&mdev->barrier_acked_requests);

	mdev->tl_hash = NULL;
	mdev->tl_hash_s = 0;
@@ -311,7 +312,7 @@ void tl_release(struct drbd_conf *mdev, unsigned int barrier_nr,
	   These have been list_move'd to the out_of_sequence_requests list in
	   _req_mod(, barrier_acked) above.
	   */
	list_del_init(&b->requests);
	list_splice_init(&b->requests, &mdev->barrier_acked_requests);

	nob = b->next;
	if (test_and_clear_bit(CREATE_BARRIER, &mdev->flags)) {
@@ -343,7 +344,7 @@ void tl_release(struct drbd_conf *mdev, unsigned int barrier_nr,
 * @what:       The action/event to perform with all request objects
 *
 * @what might be one of connection_lost_while_pending, resend, fail_frozen_disk_io,
 * restart_frozen_disk_io.
 * restart_frozen_disk_io, abort_disk_io.
 */
static void _tl_restart(struct drbd_conf *mdev, enum drbd_req_event what)
{
@@ -411,6 +412,24 @@ static void _tl_restart(struct drbd_conf *mdev, enum drbd_req_event what)
		b = tmp;
		list_splice(&carry_reads, &b->requests);
	}

	/* Actions operating on the disk state, also want to work on
	   requests that got barrier acked. */
	switch (what) {
	case abort_disk_io:
	case fail_frozen_disk_io:
	case restart_frozen_disk_io:
		list_for_each_safe(le, tle, &mdev->barrier_acked_requests) {
			req = list_entry(le, struct drbd_request, tl_requests);
			_req_mod(req, what);
		}

	case connection_lost_while_pending:
	case resend:
		break;
	default:
		dev_err(DEV, "what = %d in _tl_restart()\n", what);
	}
}


+1 −0
Original line number Diff line number Diff line
@@ -105,6 +105,7 @@ enum drbd_req_event {
	read_completed_with_error,
	read_ahead_completed_with_error,
	write_completed_with_error,
	abort_disk_io,
	completed_ok,
	resend,
	fail_frozen_disk_io,