]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - mdadm.c
Change some "fprintf(stderr,"s to pr_err.
[thirdparty/mdadm.git] / mdadm.c
diff --git a/mdadm.c b/mdadm.c
index c4c5f2948d950104983cb74f61abdf08bc83dd06..a4980a79ed92321de0fc0756715ffdfab9c55565 100644 (file)
--- a/mdadm.c
+++ b/mdadm.c
@@ -37,6 +37,7 @@ static int misc_scan(char devmode, struct context *c);
 static int stop_scan(int verbose);
 static int misc_list(struct mddev_dev *devlist,
                     struct mddev_ident *ident,
+                    char *dump_directory,
                     struct supertype *ss, struct context *c);
 
 
@@ -94,6 +95,7 @@ int main(int argc, char *argv[])
        int rebuild_map = 0;
        char *remove_path = NULL;
        char *udev_filename = NULL;
+       char *dump_directory = NULL;
 
        int print_help = 0;
        FILE *outf;
@@ -234,6 +236,8 @@ int main(int argc, char *argv[])
                case 'X':
                case 'Q':
                case ExamineBB:
+               case Dump:
+               case Restore:
                        newmode = MISC;
                        break;
 
@@ -465,7 +469,7 @@ int main(int argc, char *argv[])
                case O(CREATE,DataOffset):
                case O(GROW,DataOffset):
                        if (data_offset != INVALID_SECTORS) {
-                               fprintf(stderr, Name ": data-offset may only be specified one. "
+                               pr_err("data-offset may only be specified one. "
                                        "Second value is %s.\n", optarg);
                                exit(2);
                        }
@@ -475,7 +479,7 @@ int main(int argc, char *argv[])
                        else
                                data_offset = parse_size(optarg);
                        if (data_offset == INVALID_SECTORS) {
-                               fprintf(stderr, Name ": invalid data-offset: %s\n",
+                               pr_err("invalid data-offset: %s\n",
                                        optarg);
                                exit(2);
                        }
@@ -982,6 +986,8 @@ int main(int argc, char *argv[])
                case O(MISC, DetailPlatform):
                case O(MISC, KillSubarray):
                case O(MISC, UpdateSubarray):
+               case O(MISC, Dump):
+               case O(MISC, Restore):
                        if (opt == KillSubarray || opt == UpdateSubarray) {
                                if (c.subarray) {
                                        pr_err("subarray can only"
@@ -1006,6 +1012,14 @@ int main(int argc, char *argv[])
                                exit(2);
                        }
                        devmode = opt;
+                       if (opt == Dump || opt == Restore) {
+                               if (dump_directory != NULL) {
+                                       pr_err("dump/restore directory specified twice: %s and %s\n",
+                                              dump_directory, optarg);
+                                       exit(2);
+                               }
+                               dump_directory = optarg;
+                       }
                        continue;
                case O(MISC, UdevRules):
                        if (devmode && devmode != opt) {
@@ -1407,7 +1421,7 @@ int main(int argc, char *argv[])
                                exit(2);
                        }
                } else
-                       rv = misc_list(devlist, &ident, ss, &c);
+                       rv = misc_list(devlist, &ident, dump_directory, ss, &c);
                break;
        case MONITOR:
                if (!devlist && !c.scan) {
@@ -1645,8 +1659,9 @@ static int misc_scan(char devmode, struct context *c)
 
        for (members = 0; members <= 1; members++) {
                for (e=ms ; e ; e=e->next) {
-                       char *name;
+                       char *name = NULL;
                        struct map_ent *me;
+                       struct stat stb;
                        int member = e->metadata_version &&
                                strncmp(e->metadata_version,
                                        "external:/", 10) == 0;
@@ -1656,7 +1671,8 @@ static int misc_scan(char devmode, struct context *c)
                        if (me && me->path
                            && strcmp(me->path, "/unknown") != 0)
                                name = me->path;
-                       else
+                       if (name == NULL ||
+                           stat(name, &stb) != 0)
                                name = get_md_name(e->devnm);
 
                        if (!name) {
@@ -1719,12 +1735,13 @@ static int stop_scan(int verbose)
 
 static int misc_list(struct mddev_dev *devlist,
                     struct mddev_ident *ident,
+                    char *dump_directory,
                     struct supertype *ss, struct context *c)
 {
        struct mddev_dev *dv;
        int rv = 0;
 
-       for (dv=devlist ; dv; dv=dv->next) {
+       for (dv=devlist ; dv; dv=(rv & 16) ? NULL : dv->next) {
                int mdfd;
 
                switch(dv->disposition) {
@@ -1766,6 +1783,13 @@ static int misc_list(struct mddev_dev *devlist,
                        rv |= Update_subarray(dv->devname, c->subarray,
                                              c->update, ident, c->verbose);
                        continue;
+               case Dump:
+                       rv |= Dump_metadata(dv->devname, dump_directory, c, ss);
+                       continue;
+               case Restore:
+                       rv |= Restore_metadata(dv->devname, dump_directory, c, ss,
+                                              (dv == devlist && dv->next == NULL));
+                       continue;
                }
                mdfd = open_mddev(dv->devname, 1);
                if (mdfd>=0) {