diff options
author | NeilBrown <neilb@suse.de> | 2015-05-15 15:11:48 +1000 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2015-05-15 15:11:48 +1000 |
commit | 3ee556f8b6d9aa8c843b9f83e88d90a976259f49 (patch) | |
tree | 0a8fbf38a434bbc94a33e2b628f35558e156920f | |
parent | 2c3e39ebf9c60de6427eb4b4af50855bcb958a4e (diff) | |
download | mdadm-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.c | 4 |
1 files changed, 3 insertions, 1 deletions
@@ -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; } |