summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDoug Ledford <dledford@redhat.com>2010-04-14 17:00:03 -0400
committerDoug Ledford <dledford@redhat.com>2010-04-14 17:00:03 -0400
commita62eba198bc49379b34690be6082fe93aefbfd3b (patch)
tree59b86bf0e297fbefb9517f30ce65236d758e6aeb
parent53818c957806e7b539febfa8ff0295d54be0885f (diff)
downloadmdadm-a62eba198bc49379b34690be6082fe93aefbfd3b.tar.gz
mdadm-a62eba198bc49379b34690be6082fe93aefbfd3b.tar.xz
mdadm-a62eba198bc49379b34690be6082fe93aefbfd3b.zip
Refactor code slightly to improve code reuse
Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r--config.c68
-rw-r--r--mdadm.h20
2 files changed, 41 insertions, 47 deletions
diff --git a/config.c b/config.c
index 2ccd2fd..52c0fad 100644
--- a/config.c
+++ b/config.c
@@ -695,20 +695,6 @@ void autoline(char *line)
}
}
-struct domain_ent {
- char *spare_group; /* only set this in monitor mode
- when we know what arrays we
- are watching and can reconcile
- them to domains by checking
- constituent device paths */
- struct domain_path {
- char *path;
- struct domain_path *next;
- } *paths;
- int action;
- struct supertype *st;
- struct domain_ent *next;
-};
static struct domain_ent *domain_list = NULL;
void free_domain(struct domain_ent *de)
@@ -1264,6 +1250,25 @@ struct mddev_ident_s *conf_match(struct mdinfo *info, struct supertype *st)
return match;
}
+struct domain_ent *conf_get_domain(char *devname)
+{
+ char *name = strrchr(devname, '/');
+ char *path;
+ struct domain_ent *domain;
+
+ load_conffile();
+ if (!domain_list)
+ return NULL;
+ if (!name++)
+ name = devname;
+ path = get_devpath_from_devname(name);
+ if (!path)
+ return NULL;
+ domain = get_domain_from_devpath(path);
+ free(path);
+ return domain;
+}
+
/*
* Return a linked list of arrays that are in the same domain as the
* constituent device devname. So, if we have a domain that lists ports 2
@@ -1278,18 +1283,9 @@ struct mdstat_ent *arrays_in_domain(char *devname)
struct mdstat_ent *me, *mdstat, *array_list = NULL;
struct dev_member *m;
struct domain_ent *domain, *de;
- char *name;
- char *devpath;
- load_conffile();
/* make sure name is a kernel internal name, not a path */
- name = strrchr(devname, '/');
- if (!name++)
- name = devname;
- devpath = get_devpath_from_devname(name);
- if (!devpath)
- return NULL;
- domain = get_domain_from_devpath(devpath);
+ domain = conf_get_domain(devname);
if (!domain)
return NULL;
@@ -1301,14 +1297,10 @@ struct mdstat_ent *arrays_in_domain(char *devname)
/* don't return subarrays, only containers */
m = NULL;
else for (m = mdstat->members; m; m = m->next) {
- char *member_path = get_devpath_from_devname(m->name);
- if (member_path) {
- de = get_domain_from_devpath(member_path);
- free(member_path);
- if (de == domain)
+ de = conf_get_domain(m->name);
+ if (de == domain)
/* array has at least one member in our domain*/
break;
- }
}
if (m) {
me = mdstat;
@@ -1322,26 +1314,12 @@ struct mdstat_ent *arrays_in_domain(char *devname)
free_mdstat(me);
}
}
- free(devpath);
return array_list;
}
int conf_get_domain_action(char *devname)
{
- char *name = strrchr(devname, '/');
- char *path;
- struct domain_ent *domain;
-
- load_conffile();
- if (!domain_list)
- return incremental;
- if (!name++)
- name = devname;
- path = get_devpath_from_devname(name);
- if (!path)
- return incremental;
- domain = get_domain_from_devpath(path);
- free(path);
+ struct domain_ent *domain = conf_get_domain(devname);
if (!domain)
return incremental;
return domain->action;
diff --git a/mdadm.h b/mdadm.h
index 6247f94..9326d17 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -280,17 +280,32 @@ enum special_options {
enum domain_actions {
ignore,
incremental,
- spare,
- grow,
partition, /* only use on whole devices in order to put a standard
partition table on them, which will invoke new udev
calls for the partitions, and then we will do other
appropriate things with the partitions */
+ spare,
+ grow,
force=512, /* so we can bitwise & this with actions to signify we
should forcibly take over drives even if they have
other metadata on them */
};
+struct domain_ent {
+ char *spare_group; /* only set this in monitor mode
+ when we know what arrays we
+ are watching and can reconcile
+ them to domains by checking
+ constituent device paths */
+ struct domain_path {
+ char *path;
+ struct domain_path *next;
+ } *paths;
+ int action;
+ struct supertype *st;
+ struct domain_ent *next;
+};
+
/* structures read from config file */
/* List of mddevice names and identifiers
* Identifiers can be:
@@ -867,6 +882,7 @@ extern int same_dev(char *one, char *two);
extern int parse_auto(char *str, char *msg, int config);
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(char *devname);
extern int conf_test_dev(char *devname);