* particularly from a set of policy rules in mdadm.conf
*/
-void pol_new(struct dev_policy **pol, char *name, char *val, char *metadata)
+static void pol_new(struct dev_policy **pol, char *name, const char *val,
+ const char *metadata)
{
struct dev_policy *n = malloc(sizeof(*n));
const char *real_metadata = NULL;
real_metadata = super1.name;
}
if (!real_metadata) {
- static char *prev = NULL;
+ static const char *prev = NULL;
if (prev != metadata) {
fprintf(stderr, Name ": metadata=%s unrecognised - ignoring rule\n",
metadata);
{
struct pol_rule *rules;
struct dev_policy *pol = NULL;
+ int i;
if (!type)
return NULL;
}
rules = rules->next;
}
+
+ /* Now add any metadata-specific internal knowledge
+ * about this path
+ */
+ for (i=0; superlist[i]; i++)
+ if (superlist[i]->get_disk_controller_domain) {
+ const char *d =
+ superlist[i]->get_disk_controller_domain(path);
+ if (d)
+ pol_new(&pol, pol_domain, d, superlist[i]->name);
+ }
+
pol_sort(&pol);
pol_dedup(pol);
return pol;
}
+void pol_add(struct dev_policy **pol,
+ char *name, char *val,
+ char *metadata)
+{
+ pol_new(pol, name, val, metadata);
+ pol_sort(pol);
+ pol_dedup(*pol);
+}
+
+
/*
* disk_policy() gathers policy information for the
* disk described in the given mdinfo (disk.{major,minor}).
}
}
-static enum policy_action map_act(char *act)
+static enum policy_action map_act(const char *act)
{
if (strcmp(act, "include") == 0)
return act_include;
* As dev policies are already sorted, this is fairly easy to manage.
*/
-static struct domainlist **domain_merge_one(struct domainlist **domp, char *domain)
+static struct domainlist **domain_merge_one(struct domainlist **domp,
+ const char *domain)
{
/* merge a domain name into a sorted list and return the
* location of the insertion or match
return domp;
}
+#if (DEBUG)
+void dump_policy(struct dev_policy *policy)
+{
+ while (policy) {
+ dprintf("policy: %p name: %s value: %s metadata: %s\n",
+ policy,
+ policy->name,
+ policy->value,
+ policy->metadata);
+ policy = policy->next;
+ }
+}
+#endif
+
void domain_merge(struct domainlist **domp, struct dev_policy *pollist,
const char *metadata)
{
struct dev_policy *pol;
pollist = pol_find(pollist, pol_domain);
pol_for_each(pol, pollist, metadata)
- domp = domain_merge_one(domp, pol->value);
+ domain_merge_one(domp, pol->value);
}
int domain_test(struct domainlist *dom, struct dev_policy *pol,
return found_any;
}
+void domainlist_add_dev(struct domainlist **dom, int devnum, const char *metadata)
+{
+ struct dev_policy *pol = devnum_policy(devnum);
+ domain_merge(dom, pol, metadata);
+ dev_policy_free(pol);
+}
+
struct domainlist *domain_from_array(struct mdinfo *mdi, const char *metadata)
{
struct domainlist *domlist = NULL;
- for (mdi = mdi->devs ; mdi ; mdi = mdi->next) {
- struct dev_policy *pol = disk_policy(mdi);
+ for (mdi = mdi->devs ; mdi ; mdi = mdi->next)
+ domainlist_add_dev(&domlist, makedev(mdi->disk.major,
+ mdi->disk.minor),
+ metadata);
- domain_merge(&domlist, pol, metadata);
- dev_policy_free(pol);
- }
return domlist;
}
+void domain_add(struct domainlist **domp, char *domain)
+{
+ domain_merge_one(domp, domain);
+}
+
+
void domain_free(struct domainlist *dl)
{
while (dl) {