fix RebuildMap() to retrieve 'subarray' info

RebuildMap falsely returns container info for member arrays.  Retrieving
the subarray and container_dev details prior to ->load_super() changes the
result from:

md127 imsm 082c6371:74b5ce03:64972e41:6b0860d5 /dev/md/imsm
md126 imsm 082c6371:74b5ce03:64972e41:6b0860d5 /dev/md/vol0

...to:

md126 /md127/0 3e03aee2:78c3c593:1e8ecaf0:eefb53ed /dev/md/vol0
md127 imsm 082c6371:74b5ce03:64972e41:6b0860d5 /dev/md/imsm

Reported-by: Ignacy Kasperowicz <ignacy.kasperowicz@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
Dan Williams 2009-07-31 17:11:41 -07:00
parent af99d9ca67
commit f98d41ddb4
1 changed files with 31 additions and 1 deletions

View File

@ -297,6 +297,34 @@ struct map_ent *map_by_name(struct map_ent **map, char *name)
return NULL;
}
/* sets the proper subarray and container_dev according to the metadata
* version super_by_fd does this automatically, this routine is meant as
* a supplement for guess_super()
*/
static void set_member_info(struct supertype *st, struct mdstat_ent *ent)
{
char version[strlen(ent->metadata_version)+1];
st->subarray[0] = '\0';
if (strncmp(ent->metadata_version, "external:", 9) != 0)
return;
strcpy(version, ent->metadata_version);
if (is_subarray(&version[9])) {
char *subarray = strrchr(version, '/');
char *name = &version[10];
if (!subarray)
return;
*subarray++ = '\0';
st->container_dev = devname2devnum(name);
strncpy(st->subarray, subarray, sizeof(st->subarray));
}
}
void RebuildMap(void)
{
struct mdstat_ent *mdstat = mdstat_read(0, 0);
@ -337,8 +365,10 @@ void RebuildMap(void)
st = guess_super(dfd);
if ( st == NULL)
ok = -1;
else
else {
set_member_info(st, md);
ok = st->ss->load_super(st, dfd, NULL);
}
close(dfd);
if (ok != 0)
continue;