summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDoug Ledford <dledford@redhat.com>2010-04-15 18:09:11 -0400
committerDoug Ledford <dledford@redhat.com>2010-04-15 18:09:11 -0400
commit884a1cc4b343a9a26cf89c21f59133536309b10b (patch)
treec6c30db6372c5fe913bb636af72380238e0458a6
parent097c0ef1870e64667f85e689286228035af8323e (diff)
downloadmdadm-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.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);