Commit 30b743a2 authored by Lars Ellenberg's avatar Lars Ellenberg Committed by Philipp Reisner

drbd: improve online-verify progress tracking

For a partial (resumed) online-verify, initialize rs_total not to total
bits, but to number of bits to check in this run, to match the meaning
rs_total has for actual resync.
Signed-off-by: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: default avatarLars Ellenberg <lars.ellenberg@linbit.com>
parent 26525618
...@@ -961,6 +961,10 @@ static union drbd_state sanitize_state(struct drbd_conf *mdev, union drbd_state ...@@ -961,6 +961,10 @@ static union drbd_state sanitize_state(struct drbd_conf *mdev, union drbd_state
/* helper for __drbd_set_state */ /* helper for __drbd_set_state */
static void set_ov_position(struct drbd_conf *mdev, enum drbd_conns cs) static void set_ov_position(struct drbd_conf *mdev, enum drbd_conns cs)
{ {
if (mdev->agreed_pro_version < 90)
mdev->ov_start_sector = 0;
mdev->rs_total = drbd_bm_bits(mdev);
mdev->ov_position = 0;
if (cs == C_VERIFY_T) { if (cs == C_VERIFY_T) {
/* starting online verify from an arbitrary position /* starting online verify from an arbitrary position
* does not fit well into the existing protocol. * does not fit well into the existing protocol.
...@@ -970,11 +974,15 @@ static void set_ov_position(struct drbd_conf *mdev, enum drbd_conns cs) ...@@ -970,11 +974,15 @@ static void set_ov_position(struct drbd_conf *mdev, enum drbd_conns cs)
mdev->ov_start_sector = ~(sector_t)0; mdev->ov_start_sector = ~(sector_t)0;
} else { } else {
unsigned long bit = BM_SECT_TO_BIT(mdev->ov_start_sector); unsigned long bit = BM_SECT_TO_BIT(mdev->ov_start_sector);
if (bit >= mdev->rs_total) if (bit >= mdev->rs_total) {
mdev->ov_start_sector = mdev->ov_start_sector =
BM_BIT_TO_SECT(mdev->rs_total - 1); BM_BIT_TO_SECT(mdev->rs_total - 1);
mdev->rs_total = 1;
} else
mdev->rs_total -= bit;
mdev->ov_position = mdev->ov_start_sector; mdev->ov_position = mdev->ov_start_sector;
} }
mdev->ov_left = mdev->rs_total;
} }
static void drbd_resume_al(struct drbd_conf *mdev) static void drbd_resume_al(struct drbd_conf *mdev)
...@@ -1081,7 +1089,7 @@ int __drbd_set_state(struct drbd_conf *mdev, ...@@ -1081,7 +1089,7 @@ int __drbd_set_state(struct drbd_conf *mdev,
if ((os.conn == C_VERIFY_S || os.conn == C_VERIFY_T) && if ((os.conn == C_VERIFY_S || os.conn == C_VERIFY_T) &&
ns.conn < C_CONNECTED) { ns.conn < C_CONNECTED) {
mdev->ov_start_sector = mdev->ov_start_sector =
BM_BIT_TO_SECT(mdev->rs_total - mdev->ov_left); BM_BIT_TO_SECT(drbd_bm_bits(mdev) - mdev->ov_left);
dev_info(DEV, "Online Verify reached sector %llu\n", dev_info(DEV, "Online Verify reached sector %llu\n",
(unsigned long long)mdev->ov_start_sector); (unsigned long long)mdev->ov_start_sector);
} }
...@@ -1106,14 +1114,7 @@ int __drbd_set_state(struct drbd_conf *mdev, ...@@ -1106,14 +1114,7 @@ int __drbd_set_state(struct drbd_conf *mdev,
unsigned long now = jiffies; unsigned long now = jiffies;
int i; int i;
mdev->ov_position = 0;
mdev->rs_total = drbd_bm_bits(mdev);
if (mdev->agreed_pro_version >= 90)
set_ov_position(mdev, ns.conn); set_ov_position(mdev, ns.conn);
else
mdev->ov_start_sector = 0;
mdev->ov_left = mdev->rs_total
- BM_SECT_TO_BIT(mdev->ov_position);
mdev->rs_start = now; mdev->rs_start = now;
mdev->rs_last_events = 0; mdev->rs_last_events = 0;
mdev->rs_last_sect_ev = 0; mdev->rs_last_sect_ev = 0;
...@@ -1121,7 +1122,7 @@ int __drbd_set_state(struct drbd_conf *mdev, ...@@ -1121,7 +1122,7 @@ int __drbd_set_state(struct drbd_conf *mdev,
mdev->ov_last_oos_start = 0; mdev->ov_last_oos_start = 0;
for (i = 0; i < DRBD_SYNC_MARKS; i++) { for (i = 0; i < DRBD_SYNC_MARKS; i++) {
mdev->rs_mark_left[i] = mdev->rs_total; mdev->rs_mark_left[i] = mdev->ov_left;
mdev->rs_mark_time[i] = now; mdev->rs_mark_time[i] = now;
} }
......
...@@ -239,12 +239,13 @@ static int drbd_seq_show(struct seq_file *seq, void *v) ...@@ -239,12 +239,13 @@ static int drbd_seq_show(struct seq_file *seq, void *v)
mdev->state.conn == C_SYNC_TARGET) mdev->state.conn == C_SYNC_TARGET)
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) {
unsigned long bm_bits = drbd_bm_bits(mdev);
seq_printf(seq, "\t%3d%% %lu/%lu\n", seq_printf(seq, "\t%3d%% %lu/%lu\n",
(int)((mdev->rs_total-mdev->ov_left) / (int)((bm_bits-mdev->ov_left) /
(mdev->rs_total/100+1)), (bm_bits/100+1)),
mdev->rs_total - mdev->ov_left, bm_bits - mdev->ov_left, bm_bits);
mdev->rs_total); }
if (proc_details >= 1 && get_ldev_if_state(mdev, D_FAILED)) { if (proc_details >= 1 && get_ldev_if_state(mdev, D_FAILED)) {
lc_seq_printf_stats(seq, mdev->resync); lc_seq_printf_stats(seq, mdev->resync);
......
...@@ -2005,7 +2005,8 @@ static int receive_DataRequest(struct drbd_conf *mdev, enum drbd_packets cmd, un ...@@ -2005,7 +2005,8 @@ static int receive_DataRequest(struct drbd_conf *mdev, enum drbd_packets cmd, un
mdev->agreed_pro_version >= 90) { mdev->agreed_pro_version >= 90) {
mdev->ov_start_sector = sector; mdev->ov_start_sector = sector;
mdev->ov_position = sector; mdev->ov_position = sector;
mdev->ov_left = mdev->rs_total - BM_SECT_TO_BIT(sector); mdev->ov_left = drbd_bm_bits(mdev) - BM_SECT_TO_BIT(sector);
mdev->rs_total = mdev->ov_left;
dev_info(DEV, "Online Verify start sector: %llu\n", dev_info(DEV, "Online Verify start sector: %llu\n",
(unsigned long long)sector); (unsigned long long)sector);
} }
......
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