From 884a1cc4b343a9a26cf89c21f59133536309b10b Mon Sep 17 00:00:00 2001 From: Doug Ledford Date: Thu, 15 Apr 2010 18:09:11 -0400 Subject: Pass the device name to arrays_in_domain along with the domain This allows us to pull the path information for our current device and filter the list of possible matching domains based upon that path information. Since we only support identical partition tables, if an array is comprised of -part1 partitions already, then we know that our new device will only match on -part1 as well. Signed-off-by: Doug Ledford --- config.c | 12 ++++++++++-- mdadm.h | 3 ++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/config.c b/config.c index 55c7ba6..46b5844 100644 --- a/config.c +++ b/config.c @@ -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; } diff --git a/mdadm.h b/mdadm.h index 6b50953..0246516 100644 --- a/mdadm.h +++ b/mdadm.h @@ -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); -- cgit