diff options
Diffstat (limited to 'config.c')
-rw-r--r-- | config.c | 12 |
1 files changed, 10 insertions, 2 deletions
@@ -1290,12 +1290,15 @@ struct domain_ent *conf_get_domain(char *devname) * this information to determine what array we might add our new device * to either as a replacement drive or as a hot spare. */ -struct mdstat_ent *arrays_in_domain(struct domain_ent *domain) +struct mdstat_ent *arrays_in_domain(char *devname, struct domain_ent *domain) { struct mdstat_ent *me, *mdstat, *array_list = NULL; struct dev_member *m; struct domain_ent *de; + char *devpath, *mempath, *devpart, *mempart; + devpath = get_devpath_from_devname(devname); + devpart = strrchr(devpath, ':'); mdstat = mdstat_read(0, 0); while (mdstat) { if (mdstat->metadata_version && @@ -1304,12 +1307,16 @@ struct mdstat_ent *arrays_in_domain(struct domain_ent *domain) /* don't return subarrays, only containers */ m = NULL; else for (m = mdstat->members; m; m = m->next) { + mempath = get_devpath_from_devname(m->name); + mempart = strrchr(mempath, ':'); de = conf_get_domain(m->name); - if (de == domain) + if (de == domain && strcmp(mempart, devpart) == 0) /* array has at least one member in our domain*/ break; + free(mempath); } if (m) { + free(mempath); me = mdstat; mdstat = mdstat->next; me->next = array_list; @@ -1321,6 +1328,7 @@ struct mdstat_ent *arrays_in_domain(struct domain_ent *domain) free_mdstat(me); } } + free(devpath); return array_list; } |