]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Assemble: ignore devices= if container= is present.
authorNeilBrown <neilb@suse.de>
Tue, 2 Jul 2013 01:07:38 +0000 (11:07 +1000)
committerNeilBrown <neilb@suse.de>
Tue, 2 Jul 2013 01:14:09 +0000 (11:14 +1000)
If "container=" is present, then we are going to assemble from the
given container where that container is made of those devices or not.
So in this case the "devices=" is purely documentation and is best
ignored.

As part of this, move the test on the "container=" value when that
start with "/" up before the device is opened.  There sooner we test
things, the better.

Reported-by: Martin Wilck <mwilck@arcor.de>
Signed-off-by: NeilBrown <neilb@suse.de>
Assemble.c

index a0041c6f11204c9f1ffc09dbffe0a73846d8bc28..afe5b05004af78287b370dcdf39bc4c44cac2736 100644 (file)
@@ -171,8 +171,20 @@ static int select_devices(struct mddev_dev *devlist,
                if (tmpdev->used > 1)
                        continue;
 
-               if (ident->devices &&
-                   !match_oneof(ident->devices, devname)) {
+               if (ident->container) {
+                       if (ident->container[0] == '/' &&
+                           !same_dev(ident->container, devname)) {
+                               if (report_mismatch)
+                                       pr_err("%s is not the container required (%s)\n",
+                                              devname, ident->container);
+                               continue;
+                       }
+               } else if (ident->devices &&
+                          !match_oneof(ident->devices, devname)) {
+                       /* Note that we ignore the "device=" identifier if a
+                        * "container=" is given.  Checking both is unnecessarily
+                        * complicated.
+                        */
                        if (report_mismatch)
                                pr_err("%s is not one of %s\n", devname, ident->devices);
                        continue;
@@ -289,29 +301,20 @@ static int select_devices(struct mddev_dev *devlist,
                        }
                        close(dfd);
 
-                       if (ident->container) {
-                               if (ident->container[0] == '/' &&
-                                   !same_dev(ident->container, devname)) {
+                       if (ident->container && ident->container[0] != '/') {
+                               /* we have a uuid */
+                               int uuid[4];
+
+                               content = *contentp;
+                               tst->ss->getinfo_super(tst, content, NULL);
+
+                               if (!parse_uuid(ident->container, uuid) ||
+                                   !same_uuid(content->uuid, uuid, tst->ss->swapuuid)) {
                                        if (report_mismatch)
-                                               pr_err("%s is not the container required (%s)\n",
-                                                      devname, ident->container);
+                                               pr_err("%s has wrong UUID to be required container\n",
+                                                      devname);
                                        goto loop;
                                }
-                               if (ident->container[0] != '/') {
-                                       /* we have a uuid */
-                                       int uuid[4];
-
-                                       content = *contentp;
-                                       tst->ss->getinfo_super(tst, content, NULL);
-
-                                       if (!parse_uuid(ident->container, uuid) ||
-                                           !same_uuid(content->uuid, uuid, tst->ss->swapuuid)) {
-                                               if (report_mismatch)
-                                                       pr_err("%s has wrong UUID to be required container\n",
-                                                              devname);
-                                               goto loop;
-                                       }
-                               }
                        }
                        /* It is worth looking inside this container.
                         */