Commit e64a3294 authored by Philipp Reisner's avatar Philipp Reisner
Browse files

drbd: Do no sleep long in drbd_start_resync



Work items that sleep too long can cause requests to take as
long as the longest sleeping work item.

Signed-off-by: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: default avatarLars Ellenberg <lars.ellenberg@linbit.com>
parent 1f04af33
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -787,6 +787,7 @@ enum {
	NEW_CUR_UUID,		/* Create new current UUID when thawing IO */
	AL_SUSPENDED,		/* Activity logging is currently suspended. */
	AHEAD_TO_SYNC_SOURCE,   /* Ahead -> SyncSource queued */
	B_RS_H_DONE,		/* Before resync handler done (already executed) */
};

struct drbd_bitmap; /* opaque for drbd_conf */
+36 −22
Original line number Diff line number Diff line
@@ -1487,6 +1487,7 @@ void drbd_start_resync(struct drbd_conf *mdev, enum drbd_conns side)
		   Ahead/Behind and SyncSource/SyncTarget */
	}

	if (!test_bit(B_RS_H_DONE, &mdev->flags)) {
		if (side == C_SYNC_TARGET) {
			/* Since application IO was locked out during C_WF_BITMAP_T and
			   C_WF_SYNC_UUID we are still unmodified. Before going to C_SYNC_TARGET
@@ -1514,8 +1515,21 @@ void drbd_start_resync(struct drbd_conf *mdev, enum drbd_conns side)
				}
			}
		}
	}

	if (current == mdev->tconn->worker.task) {
		/* The worker should not sleep waiting for drbd_state_lock(),
		   that can take long */
		if (test_and_set_bit(CLUSTER_ST_CHANGE, &mdev->flags)) {
			set_bit(B_RS_H_DONE, &mdev->flags);
			mdev->start_resync_timer.expires = jiffies + HZ/5;
			add_timer(&mdev->start_resync_timer);
			return;
		}
	} else {
		drbd_state_lock(mdev);
	}
	clear_bit(B_RS_H_DONE, &mdev->flags);

	if (!get_ldev_if_state(mdev, D_NEGOTIATING)) {
		drbd_state_unlock(mdev);