md-cluster: introduce resync_info_get interface for sanity check
authorGuoqing Jiang <gqjiang@suse.com>
Thu, 18 Oct 2018 08:37:43 +0000 (16:37 +0800)
committerShaohua Li <shli@fb.com>
Thu, 18 Oct 2018 16:36:35 +0000 (09:36 -0700)
Since the resync region from suspend_info means one node
is reshaping this area, so the position of reshape_progress
should be included in the area.

Reviewed-by: NeilBrown <neilb@suse.com>
Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
Signed-off-by: Shaohua Li <shli@fb.com>
drivers/md/md-cluster.c
drivers/md/md-cluster.h
drivers/md/raid10.c

index e223fae..ca4a35f 100644 (file)
@@ -1323,6 +1323,19 @@ static int resync_start(struct mddev *mddev)
        return dlm_lock_sync_interruptible(cinfo->resync_lockres, DLM_LOCK_EX, mddev);
 }
 
+static void resync_info_get(struct mddev *mddev, sector_t *lo, sector_t *hi)
+{
+       struct md_cluster_info *cinfo = mddev->cluster_info;
+       struct suspend_info *s;
+
+       spin_lock_irq(&cinfo->suspend_lock);
+       list_for_each_entry(s, &cinfo->suspend_list, list) {
+               *lo = s->lo;
+               *hi = s->hi;
+       }
+       spin_unlock_irq(&cinfo->suspend_lock);
+}
+
 static int resync_info_update(struct mddev *mddev, sector_t lo, sector_t hi)
 {
        struct md_cluster_info *cinfo = mddev->cluster_info;
@@ -1562,6 +1575,7 @@ static struct md_cluster_operations cluster_ops = {
        .resync_start = resync_start,
        .resync_finish = resync_finish,
        .resync_info_update = resync_info_update,
+       .resync_info_get = resync_info_get,
        .metadata_update_start = metadata_update_start,
        .metadata_update_finish = metadata_update_finish,
        .metadata_update_cancel = metadata_update_cancel,
index 9bd753a..a78e302 100644 (file)
@@ -14,6 +14,7 @@ struct md_cluster_operations {
        int (*leave)(struct mddev *mddev);
        int (*slot_number)(struct mddev *mddev);
        int (*resync_info_update)(struct mddev *mddev, sector_t lo, sector_t hi);
+       void (*resync_info_get)(struct mddev *mddev, sector_t *lo, sector_t *hi);
        int (*metadata_update_start)(struct mddev *mddev);
        int (*metadata_update_finish)(struct mddev *mddev);
        void (*metadata_update_cancel)(struct mddev *mddev);
index 1edd58a..b98e746 100644 (file)
@@ -4785,8 +4785,14 @@ static void end_reshape(struct r10conf *conf)
 static void raid10_update_reshape_pos(struct mddev *mddev)
 {
        struct r10conf *conf = mddev->private;
+       sector_t lo, hi;
 
-       conf->reshape_progress = mddev->reshape_position;
+       md_cluster_ops->resync_info_get(mddev, &lo, &hi);
+       if (((mddev->reshape_position <= hi) && (mddev->reshape_position >= lo))
+           || mddev->reshape_position == MaxSector)
+               conf->reshape_progress = mddev->reshape_position;
+       else
+               WARN_ON_ONCE(1);
 }
 
 static int handle_reshape_read_error(struct mddev *mddev,