]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Assemble: factor out assemble_container_content
authorDan Williams <dan.j.williams@intel.com>
Tue, 4 Nov 2008 09:51:11 +0000 (20:51 +1100)
committerNeilBrown <neilb@suse.de>
Tue, 4 Nov 2008 09:51:11 +0000 (20:51 +1100)
Factor out, from Incremental_container,  the code for assembling an
array based on information extracted from a container.  We will
shortly use this from Assemble too.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Assemble.c
Incremental.c
mdadm.h

index 6b1e8df10e844a4b901a3c0da11ae9be2e655435..2fa574c8ab2302a1d3aeb66053332a053c2212ee 100644 (file)
@@ -1069,3 +1069,71 @@ int Assemble(struct supertype *st, char *mddev,
        close(mdfd);
        return 0;
 }
+
+#ifndef MDASSEMBLE
+int assemble_container_content(struct supertype *st, int mdfd,
+                              struct mdinfo *content, int runstop,
+                              char *chosen_name, int verbose)
+{
+       struct mdinfo *dev, *sra;
+       int working = 0, preexist = 0;
+       struct map_ent *map = NULL;
+
+       sysfs_init(content, mdfd, 0);
+
+       sra = sysfs_read(mdfd, 0, GET_VERSION);
+       if (sra == NULL || strcmp(sra->text_version, content->text_version) != 0)
+               if (sysfs_set_array(content, md_get_version(mdfd)) != 0)
+                       return 1;
+       if (sra)
+               sysfs_free(sra);
+
+       for (dev = content->devs; dev; dev = dev->next)
+               if (sysfs_add_disk(content, dev) == 0)
+                       working++;
+               else if (errno == EEXIST)
+                       preexist++;
+       if (working == 0)
+               /* Nothing new, don't try to start */ ;
+       else if (runstop > 0 ||
+                (working + preexist) >= content->array.working_disks) {
+               switch(content->array.level) {
+               case LEVEL_LINEAR:
+               case LEVEL_MULTIPATH:
+               case 0:
+                       sysfs_set_str(content, NULL, "array_state",
+                                     "active");
+                       break;
+               default:
+                       sysfs_set_str(content, NULL, "array_state",
+                                     "readonly");
+                       /* start mdmon if needed. */
+                       if (!mdmon_running(st->container_dev))
+                               start_mdmon(st->container_dev);
+                       ping_monitor(devnum2devname(st->container_dev));
+                       break;
+               }
+               sysfs_set_safemode(content, content->safe_mode_delay);
+               if (verbose >= 0) {
+                       fprintf(stderr, Name
+                               ": Started %s with %d devices",
+                               chosen_name, working + preexist);
+                       if (preexist)
+                               fprintf(stderr, " (%d new)", working);
+                       fprintf(stderr, "\n");
+               }
+               /* FIXME should have an O_EXCL and wait for read-auto */
+       } else
+               if (verbose >= 0)
+                       fprintf(stderr, Name
+                               ": %s assembled with %d devices but "
+                               "not started\n",
+                               chosen_name, working);
+       map_update(&map, fd2devnum(mdfd),
+                  content->text_version,
+                  content->uuid, chosen_name);
+
+       return 0;
+}
+#endif
+
index 541fa996f8b1d6d7d437f9145c1e74de9801157d..054040d6dd4b2e4bb6bccb84fbbe73bbfcaccf6c 100644 (file)
@@ -757,12 +757,11 @@ int Incremental_container(struct supertype *st, char *devname, int verbose,
        map_lock(&map);
 
        for (ra = list ; ra ; ra = ra->next) {
-               struct mdinfo *dev, *sra;
                int mdfd;
                char chosen_name[1024];
-               int working = 0, preexist = 0;
                struct map_ent *mp;
                struct mddev_ident_s *match = NULL;
+               int err;
 
                mp = map_by_uuid(&map, ra->uuid);
 
@@ -819,61 +818,11 @@ int Incremental_container(struct supertype *st, char *devname, int verbose,
                        return 2;
                }
 
-
-               sysfs_init(ra, mdfd, 0);
-
-               sra = sysfs_read(mdfd, 0, GET_VERSION);
-               if (sra == NULL || strcmp(sra->text_version, ra->text_version) != 0)
-                       if (sysfs_set_array(ra, md_get_version(mdfd)) != 0)
-                               return 1;
-               if (sra)
-                       sysfs_free(sra);
-
-               for (dev = ra->devs; dev; dev = dev->next)
-                       if (sysfs_add_disk(ra, dev) == 0)
-                               working++;
-                       else if (errno == EEXIST)
-                               preexist++;
-               if (working == 0)
-                       /* Nothing new, don't try to start */ ;
-               else if (runstop > 0 ||
-                        (working + preexist) >= ra->array.working_disks) {
-                       switch(ra->array.level) {
-                       case LEVEL_LINEAR:
-                       case LEVEL_MULTIPATH:
-                       case 0:
-                               sysfs_set_str(ra, NULL, "array_state",
-                                             "active");
-                               break;
-                       default:
-                               sysfs_set_str(ra, NULL, "array_state",
-                                             "readonly");
-                               /* start mdmon if needed. */
-                               if (!mdmon_running(st->container_dev))
-                                       start_mdmon(st->container_dev);
-                               ping_monitor(devnum2devname(st->container_dev));
-                               break;
-                       }
-                       sysfs_set_safemode(ra, ra->safe_mode_delay);
-                       if (verbose >= 0) {
-                               fprintf(stderr, Name
-                                       ": Started %s with %d devices",
-                                       chosen_name, working + preexist);
-                               if (preexist)
-                                       fprintf(stderr, " (%d new)", working);
-                               fprintf(stderr, "\n");
-                       }
-                       /* FIXME should have an O_EXCL and wait for read-auto */
-               } else
-                       if (verbose >= 0)
-                               fprintf(stderr, Name
-                                       ": %s assembled with %d devices but "
-                                       "not started\n",
-                                       chosen_name, working);
-               map_update(&map, fd2devnum(mdfd),
-                          ra->text_version,
-                          ra->uuid, chosen_name);
+               err = assemble_container_content(st, mdfd, ra, runstop,
+                                                chosen_name, verbose);
                close(mdfd);
+               if (err)
+                       return err;
        }
        map_unlock(&map);
        return 0;
diff --git a/mdadm.h b/mdadm.h
index 541c43418a5529918df0b0dd5ff9df1534510e80..e76bc4d33c0f20b35c36b141a1fe8df2f6347b05 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -789,6 +789,9 @@ extern unsigned long long calc_array_size(int level, int raid_disks, int layout,
                                   int chunksize, unsigned long long devsize);
 extern int flush_metadata_updates(struct supertype *st);
 extern void append_metadata_update(struct supertype *st, void *buf, int len);
+extern int assemble_container_content(struct supertype *st, int mdfd,
+                                     struct mdinfo *content, int runstop,
+                                     char *chosen_name, int verbose);
 
 extern int add_disk(int mdfd, struct supertype *st,
                    struct mdinfo *sra, struct mdinfo *info);