]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
IncRemove: Set "auto-read" only after successful excl open.
authorPawel Baldysiak <pawel.baldysiak@intel.com>
Fri, 27 Feb 2015 14:47:54 +0000 (15:47 +0100)
committerNeilBrown <neilb@suse.de>
Wed, 4 Mar 2015 04:59:53 +0000 (15:59 +1100)
"mdadm -If" - triggered from udev rules when disk is removed from OS -
tries to set array in auto-read-only mode. This can interrupt rebuild
process which is started automatically, e.g. if array is mounted and
spare disk is available (I/O error is detected faster than removing
failed disk by mdadm).
This patch prevents "mdadm -If" from setting array into "auto-read-only",
by requiring exclusive open to succeed.

Signed-off-by: Pawel Baldysiak <pawel.baldysiak@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Incremental.c

index 33c0d7fffc67f770a4b9f5d5ad9f633152acdf87..0c9a9a4cd922a4586b0cc189e73c72bb2dd6d9e2 100644 (file)
@@ -1712,12 +1712,16 @@ int IncrementalRemove(char *devname, char *id_path, int verbose)
                return 1;
        }
        sysfs_init(&mdi, -1, ent->devnm);
-       if (sysfs_get_str(&mdi, NULL, "array_state",
-                         buf, sizeof(buf)) > 0) {
-               if (strncmp(buf, "active", 6) == 0 ||
-                   strncmp(buf, "clean", 5) == 0)
-                       sysfs_set_str(&mdi, NULL,
-                                     "array_state", "read-auto");
+       mdfd = open_dev_excl(ent->devnm);
+       if (mdfd > 0) {
+               close(mdfd);
+               if (sysfs_get_str(&mdi, NULL, "array_state",
+                                 buf, sizeof(buf)) > 0) {
+                       if (strncmp(buf, "active", 6) == 0 ||
+                           strncmp(buf, "clean", 5) == 0)
+                               sysfs_set_str(&mdi, NULL,
+                                             "array_state", "read-auto");
+               }
        }
        mdfd = open_dev(ent->devnm);
        if (mdfd < 0) {