summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2015-05-14 14:50:42 +1000
committerNeilBrown <neilb@suse.de>2015-05-15 11:07:25 +1000
commitada38ebbcb9b28c4f865e77c736a7a467d0fb967 (patch)
treefae0e641a12becd324c21a5c699e3055a74916f8
parent670fe20aa09be5f18233548a053fd81470b07b7c (diff)
downloadmdadm-ada38ebbcb9b28c4f865e77c736a7a467d0fb967.tar.gz
Grow: retry when writing 'reshape' to 'sync_action' is EBUSY.
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>
-rw-r--r--Grow.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/Grow.c b/Grow.c
index 99f3497..fe42b2b 100644
--- 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;
}