diff options
author | Doug Ledford <dledford@redhat.com> | 2010-04-15 18:09:11 -0400 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2010-04-15 18:09:11 -0400 |
commit | 884a1cc4b343a9a26cf89c21f59133536309b10b (patch) | |
tree | c6c30db6372c5fe913bb636af72380238e0458a6 | |
parent | 097c0ef1870e64667f85e689286228035af8323e (diff) | |
download | mdadm-884a1cc4b343a9a26cf89c21f59133536309b10b.tar.gz mdadm-884a1cc4b343a9a26cf89c21f59133536309b10b.tar.xz mdadm-884a1cc4b343a9a26cf89c21f59133536309b10b.zip |
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 <dledford@redhat.com>
-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); |