From: Krzysztof Wojcik Date: Fri, 18 Mar 2011 01:42:17 +0000 (+1100) Subject: Retry writing 'inactive' state during stopping array X-Git-Tag: mdadm-3.2.1~29 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1ae42d9d99713ec40a56b9ba0289e362ace75f87;p=thirdparty%2Fmdadm.git 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 Signed-off-by: NeilBrown --- diff --git a/Manage.c b/Manage.c index 5fd7014a..5808557c 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; }