summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config.c12
-rw-r--r--mdadm.h3
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);