summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2015-05-15 15:11:48 +1000
committerNeilBrown <neilb@suse.de>2015-05-15 15:11:48 +1000
commit3ee556f8b6d9aa8c843b9f83e88d90a976259f49 (patch)
tree0a8fbf38a434bbc94a33e2b628f35558e156920f
parent2c3e39ebf9c60de6427eb4b4af50855bcb958a4e (diff)
downloadmdadm-3ee556f8b6d9aa8c843b9f83e88d90a976259f49.tar.gz
Grow: be even more careful about handing a '0' completed value.
Some old kernels set 'completed' to '0' too soon. But modern kernels don't. And when 'mdadm --stop' freezes and resume the grow, 'completed' goes back to zero briefly, which can confuse this logic. So only think '0' might be wrong from an old kernel when the reshape has gone idle. Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--Grow.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/Grow.c b/Grow.c
index fe42b2b..f2cf46a 100644
--- a/Grow.c
+++ b/Grow.c
@@ -3844,9 +3844,11 @@ int progress_reshape(struct mdinfo *info, struct reshape *reshape,
* So we need these extra tests.
*/
if (completed == 0 && advancing
+ && strncmp(action, "idle", 4) == 0
&& info->reshape_progress > 0)
break;
if (completed == 0 && !advancing
+ && strncmp(action, "idle", 4) == 0
&& info->reshape_progress < (info->component_size
* reshape->after.data_disks))
break;
@@ -3863,7 +3865,7 @@ int progress_reshape(struct mdinfo *info, struct reshape *reshape,
char action[20];
if (sysfs_get_str(info, NULL, "sync_action",
action, 20) > 0 &&
- strncmp(action, "reshape", 7) == 0)
+ strncmp(action, "idle", 4) == 0)
completed = max_progress;
}