|
@@ -79,6 +79,7 @@ static int w_md_sync(struct drbd_conf *mdev, struct drbd_work *w, int unused);
|
|
|
static void md_sync_timer_fn(unsigned long data);
|
|
|
static int w_bitmap_io(struct drbd_conf *mdev, struct drbd_work *w, int unused);
|
|
|
static int w_go_diskless(struct drbd_conf *mdev, struct drbd_work *w, int unused);
|
|
|
+static void _tl_clear(struct drbd_conf *mdev);
|
|
|
|
|
|
MODULE_AUTHOR("Philipp Reisner <phil@linbit.com>, "
|
|
|
"Lars Ellenberg <lars@linbit.com>");
|
|
@@ -432,19 +433,10 @@ static void _tl_restart(struct drbd_conf *mdev, enum drbd_req_event what)
|
|
|
|
|
|
/* Actions operating on the disk state, also want to work on
|
|
|
requests that got barrier acked. */
|
|
|
- switch (what) {
|
|
|
- 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);
|
|
|
+ list_for_each_safe(le, tle, &mdev->barrier_acked_requests) {
|
|
|
+ req = list_entry(le, struct drbd_request, tl_requests);
|
|
|
+ _req_mod(req, what);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -458,12 +450,17 @@ static void _tl_restart(struct drbd_conf *mdev, enum drbd_req_event what)
|
|
|
* receiver thread and the worker thread.
|
|
|
*/
|
|
|
void tl_clear(struct drbd_conf *mdev)
|
|
|
+{
|
|
|
+ spin_lock_irq(&mdev->req_lock);
|
|
|
+ _tl_clear(mdev);
|
|
|
+ spin_unlock_irq(&mdev->req_lock);
|
|
|
+}
|
|
|
+
|
|
|
+static void _tl_clear(struct drbd_conf *mdev)
|
|
|
{
|
|
|
struct list_head *le, *tle;
|
|
|
struct drbd_request *r;
|
|
|
|
|
|
- spin_lock_irq(&mdev->req_lock);
|
|
|
-
|
|
|
_tl_restart(mdev, connection_lost_while_pending);
|
|
|
|
|
|
/* we expect this list to be empty. */
|
|
@@ -482,7 +479,6 @@ void tl_clear(struct drbd_conf *mdev)
|
|
|
|
|
|
memset(mdev->app_reads_hash, 0, APP_R_HSIZE*sizeof(void *));
|
|
|
|
|
|
- spin_unlock_irq(&mdev->req_lock);
|
|
|
}
|
|
|
|
|
|
void tl_restart(struct drbd_conf *mdev, enum drbd_req_event what)
|
|
@@ -1476,12 +1472,12 @@ static void after_state_ch(struct drbd_conf *mdev, union drbd_state os,
|
|
|
if (ns.susp_fen) {
|
|
|
/* case1: The outdate peer handler is successful: */
|
|
|
if (os.pdsk > D_OUTDATED && ns.pdsk <= D_OUTDATED) {
|
|
|
- tl_clear(mdev);
|
|
|
if (test_bit(NEW_CUR_UUID, &mdev->flags)) {
|
|
|
drbd_uuid_new_current(mdev);
|
|
|
clear_bit(NEW_CUR_UUID, &mdev->flags);
|
|
|
}
|
|
|
spin_lock_irq(&mdev->req_lock);
|
|
|
+ _tl_clear(mdev);
|
|
|
_drbd_set_state(_NS(mdev, susp_fen, 0), CS_VERBOSE, NULL);
|
|
|
spin_unlock_irq(&mdev->req_lock);
|
|
|
}
|