]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Incremental.c
Merge branch 'fix' of git://github.com/ldzhong/mdadm
[thirdparty/mdadm.git] / Incremental.c
index 33c0d7fffc67f770a4b9f5d5ad9f633152acdf87..43fddfdc87b1bdbb27fbd013f7afcf46a4f33e27 100644 (file)
@@ -130,8 +130,6 @@ int Incremental(struct mddev_dev *devlist, struct context *c,
        if (must_be_container(dfd)) {
                if (!st)
                        st = super_by_fd(dfd, NULL);
-               if (st)
-                       st->ignore_hw_compat = 1;
                if (st && st->ss->load_container)
                        rv = st->ss->load_container(st, dfd, NULL);
 
@@ -204,9 +202,10 @@ int Incremental(struct mddev_dev *devlist, struct context *c,
                               NULL, c->verbose);
                goto out;
        }
-       st->ignore_hw_compat = 1;
+       st->ignore_hw_compat = 0;
+
        if (st->ss->compare_super == NULL ||
-           st->ss->load_super(st, dfd, NULL)) {
+           st->ss->load_super(st, dfd, c->verbose >= 0 ? devname : NULL)) {
                if (c->verbose >= 0)
                        pr_err("no RAID superblock on %s.\n",
                                devname);
@@ -313,6 +312,12 @@ int Incremental(struct mddev_dev *devlist, struct context *c,
 
        if (mdfd < 0) {
 
+               /* Skip the clustered ones. This should be started by
+                * clustering resource agents
+                */
+               if (info.array.state & (1 << MD_SB_CLUSTERED))
+                       goto out;
+
                /* Couldn't find an existing array, maybe make a new one */
                mdfd = create_mddev(match ? match->devname : NULL,
                                    name_to_use, c->autof, trustworthy, chosen_name);
@@ -1123,6 +1128,7 @@ static int partition_try_spare(char *devname, int *dfdp, struct dev_policy *pol,
                if (st2 == NULL ||
                    st2->ss->load_super(st2, fd, NULL) < 0)
                        goto next;
+               st2->ignore_hw_compat = 0;
 
                if (!st) {
                        /* Check domain policy again, this time referring to metadata */
@@ -1349,8 +1355,7 @@ restart:
                        struct supertype *st = super_by_fd(mdfd, NULL);
                        int ret = 0;
                        struct map_ent *map = NULL;
-                       if (st)
-                               st->ignore_hw_compat = 1;
+
                        if (st && st->ss->load_container)
                                ret = st->ss->load_container(st, mdfd, NULL);
                        close(mdfd);
@@ -1712,17 +1717,21 @@ 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) {
                if (verbose >= 0)
-                       pr_err("Cannot open array %s!!\n", ent->dev);
+                       pr_err("Cannot open array %s!!\n", ent->devnm);
                free_mdstat(ent);
                return 1;
        }
@@ -1744,11 +1753,11 @@ int IncrementalRemove(char *devname, char *id_path, int verbose)
                struct mdstat_ent *mdstat = mdstat_read(0, 0);
                struct mdstat_ent *memb;
                for (memb = mdstat ; memb ; memb = memb->next)
-                       if (is_container_member(memb, ent->dev)) {
+                       if (is_container_member(memb, ent->devnm)) {
                                int subfd = open_dev(memb->devnm);
                                if (subfd >= 0) {
                                        rv |= Manage_subdevs(
-                                               memb->dev, subfd,
+                                               memb->devnm, subfd,
                                                &devlist, verbose, 0,
                                                NULL, 0);
                                        close(subfd);
@@ -1756,7 +1765,7 @@ int IncrementalRemove(char *devname, char *id_path, int verbose)
                        }
                free_mdstat(mdstat);
        } else
-               rv |= Manage_subdevs(ent->dev, mdfd, &devlist,
+               rv |= Manage_subdevs(ent->devnm, mdfd, &devlist,
                                    verbose, 0, NULL, 0);
        if (rv & 2) {
                /* Failed due to EBUSY, try to stop the array.
@@ -1764,7 +1773,7 @@ int IncrementalRemove(char *devname, char *id_path, int verbose)
                 */
                int devid = devnm2devid(ent->devnm);
                run_udisks("--unmount", map_dev(major(devid),minor(devid), 0));
-               rv = Manage_stop(ent->dev, mdfd, verbose, 1);
+               rv = Manage_stop(ent->devnm, mdfd, verbose, 1);
                if (rv)
                        /* At least we can try to trigger a 'remove' */
                        sysfs_uevent(&mdi, "remove");
@@ -1774,7 +1783,7 @@ int IncrementalRemove(char *devname, char *id_path, int verbose)
                }
        } else {
                devlist.disposition = 'r';
-               rv = Manage_subdevs(ent->dev, mdfd, &devlist,
+               rv = Manage_subdevs(ent->devnm, mdfd, &devlist,
                                    verbose, 0, NULL, 0);
        }
        close(mdfd);