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

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

drbd: show progress bar and ETA for online-verify

parent ea5442af
Loading
Loading
Loading
Loading
+4 −1
Original line number Original line Diff line number Diff line
@@ -2157,6 +2157,9 @@ static inline void drbd_get_syncer_progress(struct drbd_conf *mdev,
	 * units of BM_BLOCK_SIZE.
	 * units of BM_BLOCK_SIZE.
	 * for the percentage, we don't care. */
	 * for the percentage, we don't care. */


	if (mdev->state.conn == C_VERIFY_S || mdev->state.conn == C_VERIFY_T)
		*bits_left = mdev->ov_left;
	else
		*bits_left = drbd_bm_total_weight(mdev) - mdev->rs_failed;
		*bits_left = drbd_bm_total_weight(mdev) - mdev->rs_failed;
	/* >> 10 to prevent overflow,
	/* >> 10 to prevent overflow,
	 * +1 to prevent division by zero */
	 * +1 to prevent division by zero */
+40 −12
Original line number Original line Diff line number Diff line
@@ -45,6 +45,19 @@ const struct file_operations drbd_proc_fops = {
	.release	= single_release,
	.release	= single_release,
};
};


void seq_printf_with_thousands_grouping(struct seq_file *seq, long v)
{
	/* v is in kB/sec. We don't expect TiByte/sec yet. */
	if (unlikely(v >= 1000000)) {
		/* cool: > GiByte/s */
		seq_printf(seq, "%ld,", v / 1000000);
		v /= 1000000;
		seq_printf(seq, "%03ld,%03ld", v/1000, v % 1000);
	} else if (likely(v >= 1000))
		seq_printf(seq, "%ld,%03ld", v/1000, v % 1000);
	else
		seq_printf(seq, "%ld", v);
}


/*lge
/*lge
 * progress bars shamelessly adapted from driver/md/md.c
 * progress bars shamelessly adapted from driver/md/md.c
@@ -94,6 +107,7 @@ static void drbd_syncer_progress(struct drbd_conf *mdev, struct seq_file *seq)
	/* Rolling marks. last_mark+1 may just now be modified.  last_mark+2 is
	/* Rolling marks. last_mark+1 may just now be modified.  last_mark+2 is
	 * at least (DRBD_SYNC_MARKS-2)*DRBD_SYNC_MARK_STEP old, and has at
	 * at least (DRBD_SYNC_MARKS-2)*DRBD_SYNC_MARK_STEP old, and has at
	 * least DRBD_SYNC_MARK_STEP time before it will be modified. */
	 * least DRBD_SYNC_MARK_STEP time before it will be modified. */
	/* ------------------------ ~18s average ------------------------ */
	i = (mdev->rs_last_mark + 2) % DRBD_SYNC_MARKS;
	i = (mdev->rs_last_mark + 2) % DRBD_SYNC_MARKS;
	dt = (jiffies - mdev->rs_mark_time[i]) / HZ;
	dt = (jiffies - mdev->rs_mark_time[i]) / HZ;
	if (dt > (DRBD_SYNC_MARK_STEP * DRBD_SYNC_MARKS))
	if (dt > (DRBD_SYNC_MARK_STEP * DRBD_SYNC_MARKS))
@@ -107,14 +121,29 @@ static void drbd_syncer_progress(struct drbd_conf *mdev, struct seq_file *seq)
	seq_printf(seq, "finish: %lu:%02lu:%02lu",
	seq_printf(seq, "finish: %lu:%02lu:%02lu",
		rt / 3600, (rt % 3600) / 60, rt % 60);
		rt / 3600, (rt % 3600) / 60, rt % 60);


	/* current speed average over (SYNC_MARKS * SYNC_MARK_STEP) jiffies */
	dbdt = Bit2KB(db/dt);
	dbdt = Bit2KB(db/dt);
	if (dbdt > 1000)
	seq_printf(seq, " speed: ");
		seq_printf(seq, " speed: %ld,%03ld",
	seq_printf_with_thousands_grouping(seq, dbdt);
			dbdt/1000, dbdt % 1000);
	seq_printf(seq, " (");
	else
	/* ------------------------- ~3s average ------------------------ */
		seq_printf(seq, " speed: %ld", dbdt);
	if (proc_details >= 1) {
		/* this is what drbd_rs_should_slow_down() uses */
		i = (mdev->rs_last_mark + DRBD_SYNC_MARKS-1) % DRBD_SYNC_MARKS;
		dt = (jiffies - mdev->rs_mark_time[i]) / HZ;
		if (dt > (DRBD_SYNC_MARK_STEP * DRBD_SYNC_MARKS))
			stalled = 1;

		if (!dt)
			dt++;
		db = mdev->rs_mark_left[i] - rs_left;
		rt = (dt * (rs_left / (db/100+1)))/100; /* seconds */


		dbdt = Bit2KB(db/dt);
		seq_printf_with_thousands_grouping(seq, dbdt);
		seq_printf(seq, " -- ");
	}

	/* --------------------- long term average ---------------------- */
	/* mean speed since syncer started
	/* mean speed since syncer started
	 * we do account for PausedSync periods */
	 * we do account for PausedSync periods */
	dt = (jiffies - mdev->rs_start - mdev->rs_paused) / HZ;
	dt = (jiffies - mdev->rs_start - mdev->rs_paused) / HZ;
@@ -122,11 +151,8 @@ static void drbd_syncer_progress(struct drbd_conf *mdev, struct seq_file *seq)
		dt = 1;
		dt = 1;
	db = mdev->rs_total - rs_left;
	db = mdev->rs_total - rs_left;
	dbdt = Bit2KB(db/dt);
	dbdt = Bit2KB(db/dt);
	if (dbdt > 1000)
	seq_printf_with_thousands_grouping(seq, dbdt);
		seq_printf(seq, " (%ld,%03ld)",
	seq_printf(seq, ")");
			dbdt/1000, dbdt % 1000);
	else
		seq_printf(seq, " (%ld)", dbdt);


	if (mdev->state.conn == C_SYNC_TARGET) {
	if (mdev->state.conn == C_SYNC_TARGET) {
		if (mdev->c_sync_rate > 1000)
		if (mdev->c_sync_rate > 1000)
@@ -236,7 +262,9 @@ static int drbd_seq_show(struct seq_file *seq, void *v)
				   Bit2KB(drbd_bm_total_weight(mdev)));
				   Bit2KB(drbd_bm_total_weight(mdev)));
		}
		}
		if (mdev->state.conn == C_SYNC_SOURCE ||
		if (mdev->state.conn == C_SYNC_SOURCE ||
		    mdev->state.conn == C_SYNC_TARGET)
		    mdev->state.conn == C_SYNC_TARGET ||
		    mdev->state.conn == C_VERIFY_S ||
		    mdev->state.conn == C_VERIFY_T)
			drbd_syncer_progress(mdev, seq);
			drbd_syncer_progress(mdev, seq);


		if (mdev->state.conn == C_VERIFY_S || mdev->state.conn == C_VERIFY_T) {
		if (mdev->state.conn == C_VERIFY_S || mdev->state.conn == C_VERIFY_T) {