diff options
-rw-r--r-- | Assemble.c | 46 | ||||
-rw-r--r-- | Incremental.c | 6 | ||||
-rw-r--r-- | config.c | 2 | ||||
-rw-r--r-- | mdadm.h | 1 | ||||
-rw-r--r-- | mdmon.c | 9 | ||||
-rw-r--r-- | util.c | 9 |
6 files changed, 64 insertions, 9 deletions
@@ -181,6 +181,52 @@ int Assemble(struct supertype *st, char *mddev, int mdfd, mddev ? mddev : "further assembly"); return 1; } + + /* if the configuration specifies a container then we use that to + * determine the devices and retrieve the array configuration + */ +#ifndef MDASSEMBLE + if (ident->container && ident->member) { + int cfd = open(ident->container, O_RDWR); + struct mdinfo *mdi; + struct supertype container; + + if (verbose>0) + fprintf(stderr, Name ": looking to assemble member array %s" + " inside container %s\n", ident->member, ident->container); + if (cfd < 0) { + if (verbose>0) + fprintf(stderr, Name ": unable to open container %s: %s\n", + ident->container, strerror(errno)); + return 1; + } + + mdi = sysfs_read(cfd, fd2devnum(cfd), GET_VERSION); + if (!mdi) { + close(cfd); + if (verbose>0) + fprintf(stderr, Name ": unable to read container %s\n", + ident->container); + return 1; + } + container.ss = find_metadata_methods(mdi->text_version); + sysfs_free(mdi); + if (!container.ss) { + close(cfd); + fprintf(stderr, Name ": %s uses unknown metadata: %s\n", + ident->container, mdi->text_version); + return 1; + } + if (container.ss->load_super(&container, cfd, ident->container)) { + fprintf(stderr, Name ": Cannot load metadata for container %s\n", + ident->container); + return 1; + } + + return Incremental_container(&container, ident->container, + verbose, runstop, ident->autof); + } +#endif if (devlist == NULL) devlist = conf_get_devs(); else if (mdfd >= 0) diff --git a/Incremental.c b/Incremental.c index c9ba1ea..80a0a07 100644 --- a/Incremental.c +++ b/Incremental.c @@ -827,6 +827,9 @@ int Incremental_container(struct supertype *st, char *devname, int verbose, continue; if (strcmp(array_list->member, sub) != 0) continue; + if (array_list->uuid_set && + !same_uuid(ra->uuid, array_list->uuid, st->ss->swapuuid)) + continue; fd = open(array_list->container, O_RDONLY); if (fd < 0) continue; @@ -841,6 +844,9 @@ int Incremental_container(struct supertype *st, char *devname, int verbose, free(dn); /* we have a match */ match = array_list; + if (verbose>0) + fprintf(stderr, Name ": match found for member %s\n", + array_list->member); break; } } @@ -434,6 +434,8 @@ void arrayline(char *line) mis.bitmap_fd = -1; mis.bitmap_file = NULL; mis.name[0] = 0; + mis.container = NULL; + mis.member = NULL; for (w=dl_next(line); w!=line; w=dl_next(w)) { if (w[0] == '/') { @@ -783,6 +783,7 @@ 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 struct superswitch *find_metadata_methods(char *vers); extern int add_disk(int mdfd, struct supertype *st, struct mdinfo *sra, struct mdinfo *info); @@ -92,15 +92,6 @@ int clone_monitor(struct supertype *container) return mon_tid; } -static struct superswitch *find_metadata_methods(char *vers) -{ - if (strcmp(vers, "ddf") == 0) - return &super_ddf; - if (strcmp(vers, "imsm") == 0) - return &super_imsm; - return NULL; -} - int make_pidfile(char *devname, int o_excl) { @@ -1278,6 +1278,15 @@ void append_metadata_update(struct supertype *st, void *buf, int len) *st->update_tail = mu; st->update_tail = &mu->next; } + +struct superswitch *find_metadata_methods(char *vers) +{ + if (strcmp(vers, "ddf") == 0) + return &super_ddf; + if (strcmp(vers, "imsm") == 0) + return &super_imsm; + return NULL; +} #endif /* MDASSEMBLE */ #ifdef __TINYC__ |