]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - config.c
tests: raid6 repair is now tested on every different layout.
[thirdparty/mdadm.git] / config.c
index 38ed8a2b5c3ffa534f2ea5a65a94db32f64a5b12..c58c8fe62424301013572a6103f4d801cdf69f5a 100644 (file)
--- a/config.c
+++ b/config.c
@@ -77,7 +77,7 @@ char DefaultAltConfFile[] = CONFFILE2;
 char DefaultAltConfDir[] = CONFFILE2 ".d";
 
 enum linetype { Devices, Array, Mailaddr, Mailfrom, Program, CreateDev,
-               Homehost, AutoMode, Policy, PartPolicy, LTEnd };
+               Homehost, HomeCluster, AutoMode, Policy, PartPolicy, LTEnd };
 char *keywords[] = {
        [Devices]  = "devices",
        [Array]    = "array",
@@ -86,6 +86,7 @@ char *keywords[] = {
        [Program]  = "program",
        [CreateDev]= "create",
        [Homehost] = "homehost",
+       [HomeCluster] = "homecluster",
        [AutoMode] = "auto",
        [Policy]   = "policy",
        [PartPolicy]="part-policy",
@@ -167,10 +168,10 @@ struct mddev_dev *load_containers(void)
                    !is_subarray(&ent->metadata_version[9])) {
                        d = xmalloc(sizeof(*d));
                        memset(d, 0, sizeof(*d));
-                       me = map_by_devnm(&map, ent->dev);
+                       me = map_by_devnm(&map, ent->devnm);
                        if (me)
                                d->devname = xstrdup(me->path);
-                       else if (asprintf(&d->devname, "/dev/%s", ent->dev) < 0) {
+                       else if (asprintf(&d->devname, "/dev/%s", ent->devnm) < 0) {
                                free(d);
                                continue;
                        }
@@ -187,6 +188,7 @@ struct createinfo createinfo = {
        .autof = 2, /* by default, create devices with standard names */
        .symlinks = 1,
        .names = 0, /* By default, stick with numbered md devices. */
+       .bblist = 1, /* Use a bad block list by default */
 #ifdef DEBIAN
        .gid = 6, /* disk */
        .mode = 0660,
@@ -306,6 +308,10 @@ static void createline(char *line)
                        createinfo.names = 1;
                else if  (strncasecmp(w, "names=no", 11) == 0)
                        createinfo.names = 0;
+               else if  (strncasecmp(w, "bbl=no", 11) == 0)
+                       createinfo.bblist = 0;
+               else if  (strncasecmp(w, "bbl=yes", 11) == 0)
+                       createinfo.bblist = 1;
                else {
                        pr_err("unrecognised word on CREATE line: %s\n",
                                w);
@@ -391,14 +397,12 @@ void arrayline(char *line)
                                ) {
                                /* This is acceptable */;
                                if (mis.devname)
-                                       pr_err("only give one "
-                                               "device per ARRAY line: %s and %s\n",
+                                       pr_err("only give one device per ARRAY line: %s and %s\n",
                                                mis.devname, w);
                                else
                                        mis.devname = w;
                        }else {
-                               pr_err("%s is an invalid name for "
-                                       "an md device - ignored.\n", w);
+                               pr_err("%s is an invalid name for an md device - ignored.\n", w);
                        }
                } else if (strncasecmp(w, "uuid=", 5)==0 ) {
                        if (mis.uuid_set)
@@ -507,13 +511,9 @@ void mailline(char *line)
 {
        char *w;
 
-       for (w=dl_next(line); w != line ; w=dl_next(w)) {
+       for (w=dl_next(line); w != line ; w=dl_next(w))
                if (alert_email == NULL)
                        alert_email = xstrdup(w);
-               else
-                       pr_err("excess address on MAIL line: %s - ignored\n",
-                               w);
-       }
 }
 
 static char *alert_mail_from = NULL;
@@ -540,13 +540,9 @@ void programline(char *line)
 {
        char *w;
 
-       for (w=dl_next(line); w != line ; w=dl_next(w)) {
+       for (w=dl_next(line); w != line ; w=dl_next(w))
                if (alert_program == NULL)
                        alert_program = xstrdup(w);
-               else
-                       pr_err("excess program on PROGRAM line: %s - ignored\n",
-                               w);
-       }
 }
 
 static char *home_host = NULL;
@@ -563,9 +559,22 @@ void homehostline(char *line)
                                home_host = xstrdup("");
                        else
                                home_host = xstrdup(w);
-               }else
-                       pr_err("excess host name on HOMEHOST line: %s - ignored\n",
-                               w);
+               }
+       }
+}
+
+static char *home_cluster = NULL;
+void homeclusterline(char *line)
+{
+       char *w;
+
+       for (w=dl_next(line); w != line ; w=dl_next(w)) {
+               if (home_cluster == NULL) {
+                       if (strcasecmp(w, "<none>")==0)
+                               home_cluster = xstrdup("");
+                       else
+                               home_cluster = xstrdup(w);
+               }
        }
 }
 
@@ -583,11 +592,10 @@ void autoline(char *line)
        int homehost = 0;
        int i;
 
-       if (auto_seen) {
-               pr_err("AUTO line may only be give once."
-                       "  Subsequent lines ignored\n");
+       if (auto_seen)
                return;
-       }
+       auto_seen = 1;
+
        /* Parse the 'auto' line creating policy statements for the 'auto' policy.
         *
         * The default is 'yes' but the 'auto' line might over-ride that.
@@ -614,6 +622,24 @@ void autoline(char *line)
         * been seen gets an appropriate auto= entry.
         */
 
+       /* If environment variable MDADM_CONF_AUTO is defined, then
+        * it is prepended to the auto line.  This allow a script
+        * to easily disable some metadata types.
+        */
+       w = getenv("MDADM_CONF_AUTO");
+       if (w && *w) {
+               char *l = xstrdup(w);
+               char *head = line;
+               w = strtok(l, " \t");
+               while (w) {
+                       char *nw = dl_strdup(w);
+                       dl_insert(head, nw);
+                       head = nw;
+                       w = strtok(NULL, " \t");
+               }
+               free(l);
+       }
+
        for (super_cnt = 0; superlist[super_cnt]; super_cnt++)
                ;
        seen = xcalloc(super_cnt, 1);
@@ -714,6 +740,9 @@ void conf_file(FILE *f)
                case Homehost:
                        homehostline(line);
                        break;
+               case HomeCluster:
+                       homeclusterline(line);
+                       break;
                case AutoMode:
                        autoline(line);
                        break;
@@ -795,53 +824,57 @@ void load_conffile(void)
 {
        FILE *f;
        char *confdir = NULL;
+       char *head;
 
-       if (loaded) return;
+       if (loaded)
+               return;
        if (conffile == NULL) {
                conffile = DefaultConfFile;
                confdir = DefaultConfDir;
        }
 
-       if (strcmp(conffile, "none") == 0) {
-               loaded = 1;
-               return;
-       }
        if (strcmp(conffile, "partitions")==0) {
                char *list = dl_strdup("DEV");
                dl_init(list);
                dl_add(list, dl_strdup("partitions"));
                devline(list);
                free_line(list);
-               loaded = 1;
-               return;
-       }
-       f = fopen(conffile, "r");
-       /* Debian chose to relocate mdadm.conf into /etc/mdadm/.
-        * To allow Debian users to compile from clean source and still
-        * have a working mdadm, we read /etc/mdadm/mdadm.conf
-        * if /etc/mdadm.conf doesn't exist
-        */
-       if (f == NULL &&
-           conffile == DefaultConfFile) {
-               f = fopen(DefaultAltConfFile, "r");
-               if (f) {
-                       conffile = DefaultAltConfFile;
-                       confdir = DefaultAltConfDir;
+       } else if (strcmp(conffile, "none") != 0) {
+               f = fopen(conffile, "r");
+               /* Debian chose to relocate mdadm.conf into /etc/mdadm/.
+                * To allow Debian users to compile from clean source and still
+                * have a working mdadm, we read /etc/mdadm/mdadm.conf
+                * if /etc/mdadm.conf doesn't exist
+                */
+               if (f == NULL &&
+                   conffile == DefaultConfFile) {
+                       f = fopen(DefaultAltConfFile, "r");
+                       if (f) {
+                               conffile = DefaultAltConfFile;
+                               confdir = DefaultAltConfDir;
+                       }
                }
-       }
-       if (f) {
-               loaded = 1;
-               conf_file_or_dir(f);
-               fclose(f);
-       }
-       if (confdir) {
-               f = fopen(confdir, "r");
                if (f) {
-                       loaded = 1;
                        conf_file_or_dir(f);
                        fclose(f);
                }
+               if (confdir) {
+                       f = fopen(confdir, "r");
+                       if (f) {
+                               conf_file_or_dir(f);
+                               fclose(f);
+                       }
+               }
        }
+       /* If there was no AUTO line, process an empty line
+        * now so that the MDADM_CONF_AUTO env var gets processed.
+        */
+       head = dl_strdup("AUTO");
+       dl_init(head);
+       autoline(head);
+       free_line(head);
+
+       loaded = 1;
 }
 
 char *conf_get_mailaddr(void)
@@ -870,6 +903,12 @@ char *conf_get_homehost(int *require_homehostp)
        return home_host;
 }
 
+char *conf_get_homecluster(void)
+{
+       load_conffile();
+       return home_cluster;
+}
+
 struct createinfo *conf_get_create_info(void)
 {
        load_conffile();
@@ -1105,8 +1144,7 @@ struct mddev_ident *conf_match(struct supertype *st,
                    !array_list->devices &&
                    array_list->super_minor == UnSet) {
                        if (verbose >= 2 && array_list->devname)
-                               pr_err("%s doesn't have any identifying"
-                                      " information.\n",
+                               pr_err("%s doesn't have any identifying information.\n",
                                       array_list->devname);
                        continue;
                }
@@ -1115,13 +1153,11 @@ struct mddev_ident *conf_match(struct supertype *st,
                if (match) {
                        if (verbose >= 0) {
                                if (match->devname && array_list->devname)
-                                       pr_err("we match both %s and %s - "
-                                              "cannot decide which to use.\n",
+                                       pr_err("we match both %s and %s - cannot decide which to use.\n",
                                               match->devname,
                                               array_list->devname);
                                else
-                                       pr_err("multiple lines in mdadm.conf"
-                                              " match\n");
+                                       pr_err("multiple lines in mdadm.conf match\n");
                        }
                        if (rvp)
                                *rvp = 2;
@@ -1158,8 +1194,7 @@ int conf_verify_devnames(struct mddev_ident *array_list)
                                        "%s have the same name: %s\n",
                                        nbuf, a1->devname);
                        } else
-                               pr_err("Device %s given twice"
-                                       " in config file\n", a1->devname);
+                               pr_err("Device %s given twice in config file\n", a1->devname);
                        return 1;
                }
        }