summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2008-11-04 20:51:11 +1100
committerNeilBrown <neilb@suse.de>2008-11-04 20:51:11 +1100
commit6234c63ccc136a66be341c6bdc42eadc08c285d1 (patch)
treeff1607da9aeea8f130b6893f7ef94c3e50c8f684
parentce744c97bce1b34147be5e278d2b246743d89536 (diff)
downloadmdadm-6234c63ccc136a66be341c6bdc42eadc08c285d1.tar.gz
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.c68
-rw-r--r--Incremental.c61
-rw-r--r--mdadm.h3
3 files changed, 76 insertions, 56 deletions
diff --git a/Assemble.c b/Assemble.c
index 6b1e8df..2fa574c 100644
--- a/Assemble.c
+++ b/Assemble.c
@@ -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;
diff --git a/mdadm.h b/mdadm.h
index 541c434..e76bc4d 100644
--- 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);