diff options
-rw-r--r-- | config.c | 12 | ||||
-rw-r--r-- | mdadm.h | 3 |
2 files changed, 12 insertions, 3 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; } @@ -885,7 +885,8 @@ extern mddev_ident_t conf_get_ident(char *dev); extern mddev_dev_t conf_get_devs(void); extern struct domain_ent *conf_get_domain(char *devname); extern int conf_get_domain_action(char *devname); -extern struct mdstat_ent *arrays_in_domain(struct domain_ent *domain); +extern struct mdstat_ent *arrays_in_domain(char *devname, + struct domain_ent *domain); extern int conf_test_dev(char *devname); extern int conf_test_metadata(const char *version, int is_homehost); extern struct createinfo *conf_get_create_info(void); |