]> git.neil.brown.name Git - mdadm.git/commitdiff
Grow: retry when writing 'reshape' to 'sync_action' is EBUSY.
authorNeilBrown <neilb@suse.de>
Thu, 14 May 2015 04:50:42 +0000 (14:50 +1000)
committerNeilBrown <neilb@suse.de>
Fri, 15 May 2015 01:07:25 +0000 (11:07 +1000)
EBUSY can be returned if something has recently happened
to cause md to want to check if recovery is needed, but hasn't
had a chance yet.

This can easily happen in testing.

So retry a few times in that case.

Signed-off-by: NeilBrown <neilb@suse.de>
Grow.c

diff --git a/Grow.c b/Grow.c
index 99f349731fd43a97178714cdb2648614085a6df5..fe42b2b04584fab4279a032df2b512f6b9f78878 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -718,9 +718,14 @@ int start_reshape(struct mdinfo *sra, int already_running,
        if (!already_running)
                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");
-
+       if (!already_running && err == 0) {
+               int cnt = 5;
+               do {
+                       err = sysfs_set_str(sra, NULL, "sync_action", "reshape");
+                       if (err)
+                               sleep(1);
+               } while (err && errno == EBUSY && cnt-- > 0);
+       }
        return err;
 }