summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKrzysztof Wojcik <krzysztof.wojcik@intel.com>2011-03-18 12:42:17 +1100
committerNeilBrown <neilb@suse.de>2011-03-18 12:42:17 +1100
commit1ae42d9d99713ec40a56b9ba0289e362ace75f87 (patch)
treea50775fb21dab5b052f383511ac75e1374fa0b69
parent983fff45a163e35f1a4d309b39ee9a0cbbc2195a (diff)
downloadmdadm-1ae42d9d99713ec40a56b9ba0289e362ace75f87.tar.gz
Retry writing 'inactive' state during stopping array
Issue observed: Sporadicaly stopping arrays using "mdadm -Ss" command does not succeded. Cause: Writting "inactive" to the array state not succeded- array is busy (accessed by udev, blkid etc.) Resolution: If writing 'inactive' fails, wait and retry again (because it is possibly a transient failure) Signed-off-by: Krzysztof Wojcik <krzysztof.wojcik@intel.com> Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--Manage.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/Manage.c b/Manage.c
index 5fd7014..5808557 100644
--- a/Manage.c
+++ b/Manage.c
@@ -224,7 +224,9 @@ int Manage_runstop(char *devname, int fd, int runstop, int quiet)
close(fd);
fprintf(stderr,
Name ": Cannot get exclusive access to %s:"
- " possibly it is still in use.\n",
+ "Perhaps a running "
+ "process, mounted filesystem "
+ "or active volume group?\n",
devname);
return 1;
}
@@ -232,14 +234,23 @@ int Manage_runstop(char *devname, int fd, int runstop, int quiet)
if (mdi &&
mdi->array.level > 0 &&
is_subarray(mdi->text_version)) {
+ int err;
/* This is mdmon managed. */
close(fd);
- if (sysfs_set_str(mdi, NULL,
- "array_state", "inactive") < 0) {
- if (quiet == 0)
- fprintf(stderr, Name
- ": failed to stop array %s: %s\n",
- devname, strerror(errno));
+
+ count = 25;
+ while (count &&
+ (err = sysfs_set_str(mdi, NULL,
+ "array_state",
+ "inactive")) < 0
+ && errno == EBUSY) {
+ usleep(200000);
+ count--;
+ }
+ if (err && !quiet) {
+ fprintf(stderr, Name
+ ": failed to stop array %s: %s\n",
+ devname, strerror(errno));
return 1;
}