]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - mdadm.c
added --path <path_id> to give the information on the 'path-id' of removed device
[thirdparty/mdadm.git] / mdadm.c
diff --git a/mdadm.c b/mdadm.c
index acbf4ac3f56ee3ac8d4caae4c7c3d6b04cf01826..0eef6bc80738a6d0e3cd7447cf41b9de00171c2c 100644 (file)
--- a/mdadm.c
+++ b/mdadm.c
@@ -48,7 +48,7 @@ int main(int argc, char *argv[])
        int raiddisks = 0;
        int max_disks = MD_SB_DISKS; /* just a default */
        int sparedisks = 0;
-       struct mddev_ident_s ident;
+       struct mddev_ident ident;
        char *configfile = NULL;
        char *cp;
        char *update = NULL;
@@ -62,9 +62,9 @@ int main(int argc, char *argv[])
        char *backup_file = NULL;
        int bitmap_chunk = UnSet;
        int SparcAdjust = 0;
-       mddev_dev_t devlist = NULL;
-       mddev_dev_t *devlistend = & devlist;
-       mddev_dev_t dv;
+       struct mddev_dev *devlist = NULL;
+       struct mddev_dev **devlistend = & devlist;
+       struct mddev_dev *dv;
        int devs_found = 0;
        int verbose = 0;
        int quiet = 0;
@@ -104,6 +104,7 @@ int main(int argc, char *argv[])
        int rebuild_map = 0;
        int auto_update_home = 0;
        char *subarray = NULL;
+       char *remove_path = NULL;
 
        int print_help = 0;
        FILE *outf;
@@ -265,7 +266,6 @@ int main(int argc, char *argv[])
                                        dv->writemostly = writemostly;
                                        dv->re_add = re_add;
                                        dv->used = 0;
-                                       dv->content = NULL;
                                        dv->next = NULL;
                                        *devlistend = dv;
                                        devlistend = &dv->next;
@@ -320,7 +320,6 @@ int main(int argc, char *argv[])
                        dv->writemostly = writemostly;
                        dv->re_add = re_add;
                        dv->used = 0;
-                       dv->content = NULL;
                        dv->next = NULL;
                        *devlistend = dv;
                        devlistend = &dv->next;
@@ -691,6 +690,8 @@ int main(int argc, char *argv[])
                "     'summaries', 'homehost', 'byteorder', 'devicesize'.\n");
                        exit(outf == stdout ? 0 : 2);
 
+               case O(INCREMENTAL,NoDegraded):
+                       fprintf(stderr, Name ": --no-degraded is deprecated in Incremental mode\n");
                case O(ASSEMBLE,NoDegraded): /* --no-degraded */
                        runstop = -1; /* --stop isn't allowed for --assemble,
                                       * so we overload slightly */
@@ -793,6 +794,9 @@ int main(int argc, char *argv[])
                        devmode = 'r';
                        continue;
                case O(MANAGE,'f'): /* set faulty */
+               case O(INCREMENTAL,'f'): /* r for incremental is taken, use f
+                                         * even though we will both fail and
+                                         * remove the device */
                        devmode = 'f';
                        continue;
                case O(INCREMENTAL,'R'):
@@ -813,6 +817,9 @@ int main(int argc, char *argv[])
                        }
                        runstop = -1;
                        continue;
+               case O(MANAGE,'t'):
+                       test = 1;
+                       continue;
 
                case O(MISC,'Q'):
                case O(MISC,'D'):
@@ -937,6 +944,9 @@ int main(int argc, char *argv[])
                case O(INCREMENTAL, 'r'):
                        rebuild_map = 1;
                        continue;
+               case O(INCREMENTAL, IncrementalPath):
+                       remove_path = optarg;
+                       continue;
                }
                /* We have now processed all the valid options. Anything else is
                 * an error
@@ -1092,7 +1102,7 @@ int main(int argc, char *argv[])
                        rv = Manage_ro(devlist->devname, mdfd, readonly);
                if (!rv && devs_found>1)
                        rv = Manage_subdevs(devlist->devname, mdfd,
-                                           devlist->next, verbose-quiet);
+                                           devlist->next, verbose-quiet, test);
                if (!rv && readonly < 0)
                        rv = Manage_ro(devlist->devname, mdfd, readonly);
                if (!rv && runstop)
@@ -1102,7 +1112,7 @@ int main(int argc, char *argv[])
                if (devs_found == 1 && ident.uuid_set == 0 &&
                    ident.super_minor == UnSet && ident.name[0] == 0 && !scan ) {
                        /* Only a device has been given, so get details from config file */
-                       mddev_ident_t array_ident = conf_get_ident(devlist->devname);
+                       struct mddev_ident *array_ident = conf_get_ident(devlist->devname);
                        if (array_ident == NULL) {
                                fprintf(stderr, Name ": %s not identified in config file.\n",
                                        devlist->devname);
@@ -1134,7 +1144,7 @@ int main(int argc, char *argv[])
                                exit(1);
                        }
                        for (dv = devlist ; dv ; dv=dv->next) {
-                               mddev_ident_t array_ident = conf_get_ident(dv->devname);
+                               struct mddev_ident *array_ident = conf_get_ident(dv->devname);
                                if (array_ident == NULL) {
                                        fprintf(stderr, Name ": %s not identified in config file.\n",
                                                dv->devname);
@@ -1150,8 +1160,8 @@ int main(int argc, char *argv[])
                                               verbose-quiet, force);
                        }
                } else {
-                       mddev_ident_t a, array_list =  conf_get_ident(NULL);
-                       mddev_dev_t devlist = conf_get_devs();
+                       struct mddev_ident *a, *array_list =  conf_get_ident(NULL);
+                       struct mddev_dev *devlist = conf_get_devs();
                        int cnt = 0;
                        int failures, successes;
                        if (devlist == NULL) {
@@ -1207,7 +1217,7 @@ int main(int argc, char *argv[])
                                int acnt;
                                ident.autof = autof;
                                do {
-                                       mddev_dev_t devlist = conf_get_devs();
+                                       struct mddev_dev *devlist = conf_get_devs();
                                        acnt = 0;
                                        do {
                                                rv2 = Assemble(ss, NULL,
@@ -1559,6 +1569,11 @@ int main(int argc, char *argv[])
                         ": --incremental --scan meaningless without --run.\n");
                                break;
                        }
+                       if (devmode == 'f') {
+                               fprintf(stderr, Name
+                        ": --incremental --scan --fail not supported.\n");
+                               break;
+                       }
                        rv = IncrementalScan(verbose);
                }
                if (!devlist) {
@@ -1575,8 +1590,13 @@ int main(int argc, char *argv[])
                        rv = 1;
                        break;
                }
-               rv = Incremental(devlist->devname, verbose-quiet, runstop,
-                                ss, homehost, require_homehost, autof);
+               if (devmode == 'f')
+                       rv = IncrementalRemove(devlist->devname, remove_path,
+                                              verbose-quiet);
+               else
+                       rv = Incremental(devlist->devname, verbose-quiet,
+                                        runstop, ss, homehost,
+                                        require_homehost, autof);
                break;
        case AUTODETECT:
                autodetect();