From 1ae42d9d99713ec40a56b9ba0289e362ace75f87 Mon Sep 17 00:00:00 2001 From: Krzysztof Wojcik Date: Fri, 18 Mar 2011 12:42:17 +1100 Subject: 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 --- Manage.c | 25 ++++++++++++++++++------- 1 file 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; } -- cgit v1.2.1