From 6937e6d21698b7a81aff9a116a6e09659defbe91 Mon Sep 17 00:00:00 2001 From: Adam Kwolek Date: Wed, 5 Oct 2011 14:00:00 +1100 Subject: [PATCH] Set correct reshape restart position This patch version is simplified compared to previous one. There is no use of freeze_reshape flag in start_reshape(). It is assumed that for reshape starting condition reshape_progress field contains 0 value /correct start position/. For reshape restart case, it contains correct restart position. This approach doesn't make start_reshape() difficult to read/manage and /imho/ kernel changes to change mdstat reporting behavior are not necessary. Setting correct position allows user to see it in the mdstat during reshape restart and reshape process is not reported as resync. Signed-off-by: Adam Kwolek Signed-off-by: NeilBrown --- Grow.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/Grow.c b/Grow.c index 24d4b84b..6f869878 100644 --- a/Grow.c +++ b/Grow.c @@ -696,15 +696,19 @@ static int subarray_set_num(char *container, struct mdinfo *sra, char *name, int return rc; } -int start_reshape(struct mdinfo *sra, int already_running) +int start_reshape(struct mdinfo *sra, int already_running, int data_disks) { int err; + unsigned long long sync_max_to_set; + sysfs_set_num(sra, NULL, "suspend_lo", 0x7FFFFFFFFFFFFFFFULL); - err = sysfs_set_num(sra, NULL, "suspend_hi", 0); - err = err ?: sysfs_set_num(sra, NULL, "suspend_lo", 0); + err = sysfs_set_num(sra, NULL, "suspend_hi", sra->reshape_progress); + err = err ?: sysfs_set_num(sra, NULL, "suspend_lo", + sra->reshape_progress); + sync_max_to_set = sra->reshape_progress / data_disks; if (!already_running) - sysfs_set_num(sra, NULL, "sync_min", 0); - err = err ?: sysfs_set_num(sra, NULL, "sync_max", 0); + sysfs_set_num(sra, NULL, "sync_min", sync_max_to_set); + err = err ?: sysfs_set_num(sra, NULL, "sync_max", sync_max_to_set); if (!already_running) err = err ?: sysfs_set_str(sra, NULL, "sync_action", "reshape"); @@ -2241,7 +2245,8 @@ started: } } - err = start_reshape(sra, restart); + err = start_reshape(sra, restart, + info->array.raid_disks - reshape.parity); if (err) { fprintf(stderr, Name ": Cannot %s reshape for %s\n", -- 2.39.2