Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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 <neilb@suse.com>
Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
Signed-off-by: Shaohua Li <shli@fb.com>

authored by

Guoqing Jiang and committed by
Shaohua Li
5ebaf80b 7564beda

+22 -1
+14
drivers/md/md-cluster.c
··· 1323 1323 return dlm_lock_sync_interruptible(cinfo->resync_lockres, DLM_LOCK_EX, mddev); 1324 1324 } 1325 1325 1326 + static void resync_info_get(struct mddev *mddev, sector_t *lo, sector_t *hi) 1327 + { 1328 + struct md_cluster_info *cinfo = mddev->cluster_info; 1329 + struct suspend_info *s; 1330 + 1331 + spin_lock_irq(&cinfo->suspend_lock); 1332 + list_for_each_entry(s, &cinfo->suspend_list, list) { 1333 + *lo = s->lo; 1334 + *hi = s->hi; 1335 + } 1336 + spin_unlock_irq(&cinfo->suspend_lock); 1337 + } 1338 + 1326 1339 static int resync_info_update(struct mddev *mddev, sector_t lo, sector_t hi) 1327 1340 { 1328 1341 struct md_cluster_info *cinfo = mddev->cluster_info; ··· 1575 1562 .resync_start = resync_start, 1576 1563 .resync_finish = resync_finish, 1577 1564 .resync_info_update = resync_info_update, 1565 + .resync_info_get = resync_info_get, 1578 1566 .metadata_update_start = metadata_update_start, 1579 1567 .metadata_update_finish = metadata_update_finish, 1580 1568 .metadata_update_cancel = metadata_update_cancel,
+1
drivers/md/md-cluster.h
··· 14 14 int (*leave)(struct mddev *mddev); 15 15 int (*slot_number)(struct mddev *mddev); 16 16 int (*resync_info_update)(struct mddev *mddev, sector_t lo, sector_t hi); 17 + void (*resync_info_get)(struct mddev *mddev, sector_t *lo, sector_t *hi); 17 18 int (*metadata_update_start)(struct mddev *mddev); 18 19 int (*metadata_update_finish)(struct mddev *mddev); 19 20 void (*metadata_update_cancel)(struct mddev *mddev);
+7 -1
drivers/md/raid10.c
··· 4785 4785 static void raid10_update_reshape_pos(struct mddev *mddev) 4786 4786 { 4787 4787 struct r10conf *conf = mddev->private; 4788 + sector_t lo, hi; 4788 4789 4789 - conf->reshape_progress = mddev->reshape_position; 4790 + md_cluster_ops->resync_info_get(mddev, &lo, &hi); 4791 + if (((mddev->reshape_position <= hi) && (mddev->reshape_position >= lo)) 4792 + || mddev->reshape_position == MaxSector) 4793 + conf->reshape_progress = mddev->reshape_position; 4794 + else 4795 + WARN_ON_ONCE(1); 4790 4796 } 4791 4797 4792 4798 static int handle_reshape_read_error(struct mddev *mddev,