summaryrefslogtreecommitdiff
path: root/Assemble.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2013-07-02 11:07:38 +1000
committerNeilBrown <neilb@suse.de>2013-07-02 11:14:09 +1000
commitc39b2e633fd6eb82a8a8e822ef01339806b05bfa (patch)
treeb258a9b32710fe9545220971312b5d2c137f68bf /Assemble.c
parenteb2306f8411070bc7bcd46ad8fee0f02c826380a (diff)
Assemble: ignore devices= if container= is present.
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>
Diffstat (limited to 'Assemble.c')
-rw-r--r--Assemble.c47
1 files changed, 25 insertions, 22 deletions
diff --git a/Assemble.c b/Assemble.c
index a0041c6f..afe5b050 100644
--- a/Assemble.c
+++ b/Assemble.c
@@ -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.
*/