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

drbd: Keep a reference to barrier acked requests

Signed-off-by: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: default avatarLars Ellenberg <lars.ellenberg@linbit.com>
parent 6809384c
...@@ -1022,6 +1022,7 @@ struct drbd_conf { ...@@ -1022,6 +1022,7 @@ struct drbd_conf {
struct drbd_tl_epoch *newest_tle; struct drbd_tl_epoch *newest_tle;
struct drbd_tl_epoch *oldest_tle; struct drbd_tl_epoch *oldest_tle;
struct list_head out_of_sequence_requests; struct list_head out_of_sequence_requests;
struct list_head barrier_acked_requests;
struct hlist_head *tl_hash; struct hlist_head *tl_hash;
unsigned int tl_hash_s; unsigned int tl_hash_s;
......
...@@ -208,6 +208,7 @@ static int tl_init(struct drbd_conf *mdev) ...@@ -208,6 +208,7 @@ static int tl_init(struct drbd_conf *mdev)
mdev->oldest_tle = b; mdev->oldest_tle = b;
mdev->newest_tle = b; mdev->newest_tle = b;
INIT_LIST_HEAD(&mdev->out_of_sequence_requests); INIT_LIST_HEAD(&mdev->out_of_sequence_requests);
INIT_LIST_HEAD(&mdev->barrier_acked_requests);
mdev->tl_hash = NULL; mdev->tl_hash = NULL;
mdev->tl_hash_s = 0; mdev->tl_hash_s = 0;
...@@ -311,7 +312,7 @@ void tl_release(struct drbd_conf *mdev, unsigned int barrier_nr, ...@@ -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 These have been list_move'd to the out_of_sequence_requests list in
_req_mod(, barrier_acked) above. _req_mod(, barrier_acked) above.
*/ */
list_del_init(&b->requests); list_splice_init(&b->requests, &mdev->barrier_acked_requests);
nob = b->next; nob = b->next;
if (test_and_clear_bit(CREATE_BARRIER, &mdev->flags)) { if (test_and_clear_bit(CREATE_BARRIER, &mdev->flags)) {
...@@ -343,7 +344,7 @@ void tl_release(struct drbd_conf *mdev, unsigned int barrier_nr, ...@@ -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: The action/event to perform with all request objects
* *
* @what might be one of connection_lost_while_pending, resend, fail_frozen_disk_io, * @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) 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) ...@@ -411,6 +412,24 @@ static void _tl_restart(struct drbd_conf *mdev, enum drbd_req_event what)
b = tmp; b = tmp;
list_splice(&carry_reads, &b->requests); 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);
}
} }
......
...@@ -105,6 +105,7 @@ enum drbd_req_event { ...@@ -105,6 +105,7 @@ enum drbd_req_event {
read_completed_with_error, read_completed_with_error,
read_ahead_completed_with_error, read_ahead_completed_with_error,
write_completed_with_error, write_completed_with_error,
abort_disk_io,
completed_ok, completed_ok,
resend, resend,
fail_frozen_disk_io, fail_frozen_disk_io,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment