diff options
author | Doug Ledford <dledford@redhat.com> | 2010-04-14 17:00:03 -0400 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2010-04-14 17:00:03 -0400 |
commit | a62eba198bc49379b34690be6082fe93aefbfd3b (patch) | |
tree | 59b86bf0e297fbefb9517f30ce65236d758e6aeb | |
parent | 53818c957806e7b539febfa8ff0295d54be0885f (diff) | |
download | mdadm-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.c | 68 | ||||
-rw-r--r-- | mdadm.h | 20 |
2 files changed, 41 insertions, 47 deletions
@@ -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; @@ -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); |