Preliminary -As support for container member arrays
Given an mdadm.conf like the following allow /dev/imsm and /dev/md/r1 to be created by "mdadm -As". DEVICES partitions ARRAY /dev/imsm metadata=imsm auto=md UUID=b98f5dbe-aa859e7b-0e369b89-a80986d4 ARRAY /dev/md/r1 container=/dev/imsm member=0 auto=mdp UUID=3538e39c-b397c2e9-1aa031f9-2bc0eca4 spares=1 Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
parent
1e7bc0ed08
commit
71d60c480a
46
Assemble.c
46
Assemble.c
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
2
config.c
2
config.c
|
@ -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] == '/') {
|
||||
|
|
1
mdadm.h
1
mdadm.h
|
@ -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);
|
||||
|
|
9
mdmon.c
9
mdmon.c
|
@ -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)
|
||||
{
|
||||
|
|
9
util.c
9
util.c
|
@ -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__
|
||||
|
|
Loading…
Reference in New Issue