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 | |
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>
-rw-r--r-- | Assemble.c | 68 | ||||
-rw-r--r-- | Incremental.c | 61 | ||||
-rw-r--r-- | mdadm.h | 3 |
3 files changed, 76 insertions, 56 deletions
@@ -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 + 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; @@ -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); |