summaryrefslogtreecommitdiffstats
path: root/config.c
diff options
context:
space:
mode:
Diffstat (limited to 'config.c')
-rw-r--r--config.c12
1 files changed, 10 insertions, 2 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;
}