drbd: improve online-verify progress tracking
authorLars Ellenberg <lars.ellenberg@linbit.com>
Fri, 5 Nov 2010 08:39:06 +0000 (09:39 +0100)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Thu, 10 Mar 2011 10:18:51 +0000 (11:18 +0100)
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: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
drivers/block/drbd/drbd_main.c
drivers/block/drbd/drbd_proc.c
drivers/block/drbd/drbd_receiver.c

index 8a43ce0edeed12f1007cfeb9474ed857fc8f39cd..a1a2cb1eadf1c55734a681a5413299622e269e8a 100644 (file)
@@ -961,6 +961,10 @@ static union drbd_state sanitize_state(struct drbd_conf *mdev, union drbd_state
 /* helper for __drbd_set_state */
 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) {
                /* starting online verify from an arbitrary position
                 * 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)
                mdev->ov_start_sector = ~(sector_t)0;
        } else {
                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 =
                                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_left = mdev->rs_total;
 }
 
 static void drbd_resume_al(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) &&
            ns.conn < C_CONNECTED) {
                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",
                        (unsigned long long)mdev->ov_start_sector);
        }
@@ -1106,14 +1114,7 @@ int __drbd_set_state(struct drbd_conf *mdev,
                unsigned long now = jiffies;
                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);
-               else
-                       mdev->ov_start_sector = 0;
-               mdev->ov_left = mdev->rs_total
-                             - BM_SECT_TO_BIT(mdev->ov_position);
+               set_ov_position(mdev, ns.conn);
                mdev->rs_start = now;
                mdev->rs_last_events = 0;
                mdev->rs_last_sect_ev = 0;
@@ -1121,7 +1122,7 @@ int __drbd_set_state(struct drbd_conf *mdev,
                mdev->ov_last_oos_start = 0;
 
                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;
                }
 
index 7e6ac307e2dec3ba1c9de2f825d0b1c9cbbbf9af..0b20aa8370229c0e90fe884e31efdeafb0c63054 100644 (file)
@@ -239,12 +239,13 @@ static int drbd_seq_show(struct seq_file *seq, void *v)
                    mdev->state.conn == C_SYNC_TARGET)
                        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",
-                                  (int)((mdev->rs_total-mdev->ov_left) /
-                                        (mdev->rs_total/100+1)),
-                                  mdev->rs_total - mdev->ov_left,
-                                  mdev->rs_total);
+                                  (int)((bm_bits-mdev->ov_left) /
+                                        (bm_bits/100+1)),
+                                  bm_bits - mdev->ov_left, bm_bits);
+               }
 
                if (proc_details >= 1 && get_ldev_if_state(mdev, D_FAILED)) {
                        lc_seq_printf_stats(seq, mdev->resync);
index 8e68be939debefb6e5960ed38c2dd42d67c3a18d..88856a7f42a05340939db3eea166dadad14f0c97 100644 (file)
@@ -2005,7 +2005,8 @@ static int receive_DataRequest(struct drbd_conf *mdev, enum drbd_packets cmd, un
                    mdev->agreed_pro_version >= 90) {
                        mdev->ov_start_sector = 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",
                                        (unsigned long long)sector);
                }