diff options
author | Krzysztof Wojcik <krzysztof.wojcik@intel.com> | 2011-03-18 12:42:17 +1100 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2011-03-18 12:42:17 +1100 |
commit | 1ae42d9d99713ec40a56b9ba0289e362ace75f87 (patch) | |
tree | a50775fb21dab5b052f383511ac75e1374fa0b69 | |
parent | 983fff45a163e35f1a4d309b39ee9a0cbbc2195a (diff) | |
download | mdadm-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.c | 25 |
1 files changed, 18 insertions, 7 deletions
@@ -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; } |