From 5ebaf80bc8d5826edcc2d1cea26a7d5a4b8f01dd Mon Sep 17 00:00:00 2001 From: Guoqing Jiang Date: Thu, 18 Oct 2018 16:37:43 +0800 Subject: md-cluster: introduce resync_info_get interface for sanity check 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 Signed-off-by: Guoqing Jiang Signed-off-by: Shaohua Li --- drivers/md/md-cluster.c | 14 ++++++++++++++ drivers/md/md-cluster.h | 1 + drivers/md/raid10.c | 8 +++++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/drivers/md/md-cluster.c b/drivers/md/md-cluster.c index e223fae80da3..ca4a35f8bad8 100644 --- a/drivers/md/md-cluster.c +++ b/drivers/md/md-cluster.c @@ -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, diff --git a/drivers/md/md-cluster.h b/drivers/md/md-cluster.h index 9bd753a6a94e..a78e3021775d 100644 --- a/drivers/md/md-cluster.h +++ b/drivers/md/md-cluster.h @@ -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); diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 1edd58a3098b..b98e746e7fc4 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -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, -- cgit v1.2.3