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)
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;
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;
}
}
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);
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)
{
*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__