]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - config.c
Release 3.2.6 - stability release
[thirdparty/mdadm.git] / config.c
index c0a6baaf154ed285c0af56d5d826a150935f2342..d8f48e132455ce4b6fd8d7853ffa88a795329a18 100644 (file)
--- a/config.c
+++ b/config.c
@@ -641,7 +641,7 @@ void autoline(char *line)
         * We translate that to policy by creating 'auto=yes' when we see
         * a '+version' line, 'auto=no' if we see '-version' before 'homehost',
         * or 'auto=homehost' if we see '-version' after 'homehost'.
-        * When we see yes, no, +all or -all we stop an any version that hasn't
+        * When we see yes, no, +all or -all we stop and any version that hasn't
         * been seen gets an appropriate auto= entry.
         */
 
@@ -921,19 +921,19 @@ int conf_test_metadata(const char *version, struct dev_policy *pol, int is_homeh
         * else 'yes'.
         */
        struct dev_policy *p;
-       int no=0, found_auto=0;
+       int no=0, found_homehost=0;
        load_conffile();
 
        pol = pol_find(pol, pol_auto);
        pol_for_each(p, pol, version) {
                if (strcmp(p->value, "yes") == 0)
                        return 1;
-               if (strcmp(p->value, "auto") == 0)
-                       found_auto = 1;
+               if (strcmp(p->value, "homehost") == 0)
+                       found_homehost = 1;
                if (strcmp(p->value, "no") == 0)
                        no = 1;
        }
-       if (is_homehost && found_auto)
+       if (is_homehost && found_homehost)
                return 1;
        if (no)
                return 0;
@@ -1019,11 +1019,12 @@ int conf_name_is_free(char *name)
        return 1;
 }
 
-struct mddev_ident *conf_match(struct mdinfo *info, struct supertype *st)
+struct mddev_ident *conf_match(struct supertype *st,
+                              struct mdinfo *info,
+                              char *devname,
+                              int verbose, int *rvp)
 {
        struct mddev_ident *array_list, *match;
-       int verbose = 0;
-       char *devname = NULL;
        array_list = conf_get_ident(NULL);
        match = NULL;
        for (; array_list; array_list = array_list->next) {
@@ -1066,7 +1067,8 @@ struct mddev_ident *conf_match(struct mdinfo *info, struct supertype *st)
                    array_list->super_minor == UnSet) {
                        if (verbose >= 2 && array_list->devname)
                                fprintf(stderr, Name
-                            ": %s doesn't have any identifying information.\n",
+                                       ": %s doesn't have any identifying"
+                                       " information.\n",
                                        array_list->devname);
                        continue;
                }
@@ -1076,15 +1078,54 @@ struct mddev_ident *conf_match(struct mdinfo *info, struct supertype *st)
                        if (verbose >= 0) {
                                if (match->devname && array_list->devname)
                                        fprintf(stderr, Name
-                  ": we match both %s and %s - cannot decide which to use.\n",
-                                               match->devname, array_list->devname);
+                                               ": we match both %s and %s - "
+                                               "cannot decide which to use.\n",
+                                               match->devname,
+                                               array_list->devname);
                                else
                                        fprintf(stderr, Name
-                                               ": multiple lines in mdadm.conf match\n");
+                                               ": multiple lines in mdadm.conf"
+                                               " match\n");
                        }
-                       return NULL;
+                       if (rvp)
+                               *rvp = 2;
+                       match = NULL;
+                       break;
                }
                match = array_list;
        }
        return match;
 }
+
+int conf_verify_devnames(struct mddev_ident *array_list)
+{
+       struct mddev_ident *a1, *a2;
+
+       for (a1 = array_list; a1; a1 = a1->next) {
+               if (!a1->devname)
+                       continue;
+               for (a2 = a1->next; a2; a2 = a2->next) {
+                       if (!a2->devname)
+                               continue;
+                       if (strcmp(a1->devname, a2->devname) != 0)
+                               continue;
+
+                       if (a1->uuid_set && a2->uuid_set) {
+                               char nbuf[64];
+                               __fname_from_uuid(a1->uuid, 0, nbuf, ':');
+                               fprintf(stderr,
+                                       Name ": Devices %s and ",
+                                       nbuf);
+                               __fname_from_uuid(a2->uuid, 0, nbuf, ':');
+                               fprintf(stderr,
+                                       "%s have the same name: %s\n",
+                                       nbuf, a1->devname);
+                       } else
+                               fprintf(stderr, Name ": Device %s given twice"
+                                       " in config file\n", a1->devname);
+                       return 1;
+               }
+       }
+
+       return 0;
+}