diff options
author | NeilBrown <neilb@suse.de> | 2015-05-14 14:50:42 +1000 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2015-05-15 11:07:25 +1000 |
commit | ada38ebbcb9b28c4f865e77c736a7a467d0fb967 (patch) | |
tree | fae0e641a12becd324c21a5c699e3055a74916f8 | |
parent | 670fe20aa09be5f18233548a053fd81470b07b7c (diff) | |
download | mdadm-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.c | 11 |
1 files changed, 8 insertions, 3 deletions
@@ -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; } |