]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Grow: be even more careful about handing a '0' completed value.
authorNeilBrown <neilb@suse.de>
Fri, 15 May 2015 05:11:48 +0000 (15:11 +1000)
committerNeilBrown <neilb@suse.de>
Fri, 15 May 2015 05:11:48 +0000 (15:11 +1000)
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>
Grow.c

diff --git a/Grow.c b/Grow.c
index fe42b2b04584fab4279a032df2b512f6b9f78878..f2cf46a64247540e26ee6a05f8170bad129a9f56 100644 (file)
--- 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;
        }