diff options
author | Dan Williams <dan.j.williams@intel.com> | 2008-11-04 20:51:11 +1100 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2008-11-04 20:51:11 +1100 |
commit | 6234c63ccc136a66be341c6bdc42eadc08c285d1 (patch) | |
tree | ff1607da9aeea8f130b6893f7ef94c3e50c8f684 /Incremental.c | |
parent | ce744c97bce1b34147be5e278d2b246743d89536 (diff) | |
download | mdadm-6234c63ccc136a66be341c6bdc42eadc08c285d1.tar.gz mdadm-6234c63ccc136a66be341c6bdc42eadc08c285d1.tar.xz mdadm-6234c63ccc136a66be341c6bdc42eadc08c285d1.zip |
Assemble: factor out assemble_container_content
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>
Diffstat (limited to 'Incremental.c')
-rw-r--r-- | Incremental.c | 61 |
1 files changed, 5 insertions, 56 deletions
diff --git a/Incremental.c b/Incremental.c index 541fa99..054040d 100644 --- a/Incremental.c +++ b/Incremental.c @@ -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; |