]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - mdadm.c
Assorted fixed for a "make everything" build
[thirdparty/mdadm.git] / mdadm.c
diff --git a/mdadm.c b/mdadm.c
index dcb49d0abffb27c0749a5cd63636f6cfed2e193e..51e16f3fccb223f1c64370a5c6190404e29fb4ff 100644 (file)
--- a/mdadm.c
+++ b/mdadm.c
@@ -74,6 +74,7 @@ int main(int argc, char *argv[])
                .require_homehost = 1,
        };
        struct shape s = {
+               .journaldisks   = 0,
                .level          = UnSet,
                .layout         = UnSet,
                .bitmap_chunk   = UnSet,
@@ -189,6 +190,7 @@ int main(int argc, char *argv[])
                case 'a':
                case Add:
                case AddSpare:
+               case AddJournal:
                case 'r':
                case Remove:
                case Replace:
@@ -755,6 +757,8 @@ int main(int argc, char *argv[])
                                continue;
                        if (strcmp(c.update, "no-bbl") == 0)
                                continue;
+                       if (strcmp(c.update, "force-no-bbl") == 0)
+                               continue;
                        if (strcmp(c.update, "metadata") == 0)
                                continue;
                        if (strcmp(c.update, "revert-reshape") == 0)
@@ -788,7 +792,7 @@ int main(int argc, char *argv[])
                "     'sparc2.2', 'super-minor', 'uuid', 'name', 'nodes', 'resync',\n"
                "     'summaries', 'homehost', 'home-cluster', 'byteorder', 'devicesize',\n"
                "     'no-bitmap', 'metadata', 'revert-reshape'\n"
-               "     'bbl', 'no-bbl'\n"
+               "     'bbl', 'no-bbl', 'force-no-bbl'\n"
                                );
                        exit(outf == stdout ? 0 : 2);
 
@@ -806,8 +810,9 @@ int main(int argc, char *argv[])
                        c.update = optarg;
                        if (strcmp(c.update, "devicesize") != 0 &&
                            strcmp(c.update, "bbl") != 0 &&
+                           strcmp(c.update, "force-no-bbl") != 0 &&
                            strcmp(c.update, "no-bbl") != 0) {
-                               pr_err("only 'devicesize', 'bbl' and 'no-bbl' can be updated with --re-add\n");
+                               pr_err("only 'devicesize', 'bbl', 'no-bbl', and 'force-no-bbl' can be updated with --re-add\n");
                                exit(2);
                        }
                        continue;
@@ -924,6 +929,13 @@ int main(int argc, char *argv[])
                case O(MANAGE,AddSpare): /* add drive - never re-add */
                        devmode = 'S';
                        continue;
+               case O(MANAGE,AddJournal): /* add journal */
+                       if (s.journaldisks && (s.level < 4 || s.level > 6)) {
+                               pr_err("--add-journal is only supported for RAID level 4/5/6.\n");
+                               exit(2);
+                       }
+                       devmode = 'j';
+                       continue;
                case O(MANAGE,ReAdd):
                        devmode = 'A';
                        continue;
@@ -1170,6 +1182,23 @@ int main(int argc, char *argv[])
                case O(INCREMENTAL, IncrementalPath):
                        remove_path = optarg;
                        continue;
+               case O(CREATE, WriteJournal):
+                       if (s.journaldisks) {
+                               pr_err("Please specify only one journal device for the array.\n");
+                               pr_err("Ignoring --write-journal %s...\n", optarg);
+                               continue;
+                       }
+                       dv = xmalloc(sizeof(*dv));
+                       dv->devname = optarg;
+                       dv->disposition = 'j';  /* WriteJournal */
+                       dv->used = 0;
+                       dv->next = NULL;
+                       *devlistend = dv;
+                       devlistend = &dv->next;
+                       devs_found++;
+
+                       s.journaldisks = 1;
+                       continue;
                }
                /* We have now processed all the valid options. Anything else is
                 * an error
@@ -1197,6 +1226,11 @@ int main(int argc, char *argv[])
                exit(0);
        }
 
+       if (s.journaldisks && (s.level < 4 || s.level > 6)) {
+               pr_err("--write-journal is only supported for RAID level 4/5/6.\n");
+               exit(2);
+       }
+
        if (!mode && devs_found) {
                mode = MISC;
                devmode = 'Q';
@@ -1293,11 +1327,15 @@ int main(int argc, char *argv[])
                c.require_homehost = 0;
        }
 
+       rv = 0;
+
+       set_hooks(); /* set hooks from libs */
+
        if (c.homecluster == NULL && (c.nodes > 0)) {
                c.homecluster = conf_get_homecluster();
                if (c.homecluster == NULL)
                        rv = get_cluster_name(&c.homecluster);
-               if (rv != 0) {
+               if (rv) {
                        pr_err("The md can't get cluster name\n");
                        exit(1);
                }
@@ -1322,7 +1360,6 @@ int main(int argc, char *argv[])
                /* --scan implied --brief unless -vv */
                c.brief = 1;
 
-       rv = 0;
        switch(mode) {
        case MANAGE:
                /* readonly, add/remove, readwrite, runstop */
@@ -1409,8 +1446,9 @@ int main(int argc, char *argv[])
                }
 
                if (s.bitmap_file) {
-                       if (strcmp(s.bitmap_file, "internal")==0) {
-                               pr_err("'internal' bitmaps not supported with --build\n");
+                       if (strcmp(s.bitmap_file, "internal")==0 ||
+                           strcmp(s.bitmap_file, "clustered") == 0) {
+                               pr_err("'internal' and 'clustered' bitmaps not supported with --build\n");
                                rv |= 1;
                                break;
                        }
@@ -1500,8 +1538,6 @@ int main(int argc, char *argv[])
                        else
                                c.delay = 60;
                }
-               if (c.delay == 0)
-                       c.delay = 60;
                rv= Monitor(devlist, mailaddr, program,
                            &c, daemonise, oneshot,
                            dosyslog, pidfile, increments,