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>
This commit is contained in:
parent
7564beda19
commit
5ebaf80bc8
|
@ -1323,6 +1323,19 @@ static int resync_start(struct mddev *mddev)
|
||||||
return dlm_lock_sync_interruptible(cinfo->resync_lockres, DLM_LOCK_EX, 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)
|
static int resync_info_update(struct mddev *mddev, sector_t lo, sector_t hi)
|
||||||
{
|
{
|
||||||
struct md_cluster_info *cinfo = mddev->cluster_info;
|
struct md_cluster_info *cinfo = mddev->cluster_info;
|
||||||
|
@ -1562,6 +1575,7 @@ static struct md_cluster_operations cluster_ops = {
|
||||||
.resync_start = resync_start,
|
.resync_start = resync_start,
|
||||||
.resync_finish = resync_finish,
|
.resync_finish = resync_finish,
|
||||||
.resync_info_update = resync_info_update,
|
.resync_info_update = resync_info_update,
|
||||||
|
.resync_info_get = resync_info_get,
|
||||||
.metadata_update_start = metadata_update_start,
|
.metadata_update_start = metadata_update_start,
|
||||||
.metadata_update_finish = metadata_update_finish,
|
.metadata_update_finish = metadata_update_finish,
|
||||||
.metadata_update_cancel = metadata_update_cancel,
|
.metadata_update_cancel = metadata_update_cancel,
|
||||||
|
|
|
@ -14,6 +14,7 @@ struct md_cluster_operations {
|
||||||
int (*leave)(struct mddev *mddev);
|
int (*leave)(struct mddev *mddev);
|
||||||
int (*slot_number)(struct mddev *mddev);
|
int (*slot_number)(struct mddev *mddev);
|
||||||
int (*resync_info_update)(struct mddev *mddev, sector_t lo, sector_t hi);
|
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_start)(struct mddev *mddev);
|
||||||
int (*metadata_update_finish)(struct mddev *mddev);
|
int (*metadata_update_finish)(struct mddev *mddev);
|
||||||
void (*metadata_update_cancel)(struct mddev *mddev);
|
void (*metadata_update_cancel)(struct mddev *mddev);
|
||||||
|
|
|
@ -4785,8 +4785,14 @@ static void end_reshape(struct r10conf *conf)
|
||||||
static void raid10_update_reshape_pos(struct mddev *mddev)
|
static void raid10_update_reshape_pos(struct mddev *mddev)
|
||||||
{
|
{
|
||||||
struct r10conf *conf = mddev->private;
|
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,
|
static int handle_reshape_read_error(struct mddev *mddev,
|
||||||
|
|
Loading…
Reference in New Issue