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

Commit c6ea14df authored by Lars Ellenberg's avatar Lars Ellenberg Committed by Philipp Reisner
Browse files

drbd: factor out advancement of resync marks for progress reporting



This is in preparation to unify progress reporting of
online-verify and resync requests.

Signed-off-by: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: default avatarLars Ellenberg <lars.ellenberg@linbit.com>
parent de228bba
Loading
Loading
Loading
Loading
+17 −13
Original line number Diff line number Diff line
@@ -919,6 +919,22 @@ static void drbd_try_clear_on_disk_bm(struct drbd_conf *mdev, sector_t sector,
	}
}

void drbd_advance_rs_marks(struct drbd_conf *mdev, unsigned long still_to_go)
{
	unsigned long now = jiffies;
	unsigned long last = mdev->rs_mark_time[mdev->rs_last_mark];
	int next = (mdev->rs_last_mark + 1) % DRBD_SYNC_MARKS;
	if (time_after_eq(now, last + DRBD_SYNC_MARK_STEP)) {
		if (mdev->rs_mark_left[mdev->rs_last_mark] != still_to_go &&
		    mdev->state.conn != C_PAUSED_SYNC_T &&
		    mdev->state.conn != C_PAUSED_SYNC_S) {
			mdev->rs_mark_time[next] = now;
			mdev->rs_mark_left[next] = still_to_go;
			mdev->rs_last_mark = next;
		}
	}
}

/* clear the bit corresponding to the piece of storage in question:
 * size byte of data starting from sector.  Only clear a bits of the affected
 * one ore more _aligned_ BM_BLOCK_SIZE blocks.
@@ -969,19 +985,7 @@ void __drbd_set_in_sync(struct drbd_conf *mdev, sector_t sector, int size,
	 */
	count = drbd_bm_clear_bits(mdev, sbnr, ebnr);
	if (count && get_ldev(mdev)) {
		unsigned long now = jiffies;
		unsigned long last = mdev->rs_mark_time[mdev->rs_last_mark];
		int next = (mdev->rs_last_mark + 1) % DRBD_SYNC_MARKS;
		if (time_after_eq(now, last + DRBD_SYNC_MARK_STEP)) {
			unsigned long tw = drbd_bm_total_weight(mdev);
			if (mdev->rs_mark_left[mdev->rs_last_mark] != tw &&
			    mdev->state.conn != C_PAUSED_SYNC_T &&
			    mdev->state.conn != C_PAUSED_SYNC_S) {
				mdev->rs_mark_time[next] = now;
				mdev->rs_mark_left[next] = tw;
				mdev->rs_last_mark = next;
			}
		}
		drbd_advance_rs_marks(mdev, drbd_bm_total_weight(mdev));
		spin_lock_irqsave(&mdev->al_lock, flags);
		drbd_try_clear_on_disk_bm(mdev, sector, count, TRUE);
		spin_unlock_irqrestore(&mdev->al_lock, flags);