]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - policy.c
Improve mddev_ident type definitions.
[thirdparty/mdadm.git] / policy.c
index 8aa4cc8eb3a8116617edcd9cb588961fa5993402..0bc3c4525cd8b98e2292f0ed39893ae70905a63a 100644 (file)
--- a/policy.c
+++ b/policy.c
@@ -137,8 +137,8 @@ static void pol_sort(struct dev_policy **pol)
                        if (p[next] == NULL ||
                            (p[1-next] != NULL &&
                             !(pol_lesseq(prev, p[1-next])
-                              ^pol_lesseq(p[1-next], p[next])
-                              ^pol_lesseq(p[next], prev)))
+                              ^pol_lesseq(prev, p[next])
+                              ^pol_lesseq(p[next], p[1-next])))
                                )
                                next = 1 - next;
 
@@ -377,11 +377,10 @@ struct dev_policy *disk_policy(struct mdinfo *disk)
 
        if (!type)
                return NULL;
-       if (config_rules_has_path) {
+       if (config_rules_has_path)
                path = disk_path(disk);
-               if (!path)
-                       return NULL;
-       }
+       if (!path)
+               return NULL;
 
        pol = path_policy(path, type);
 
@@ -389,6 +388,14 @@ struct dev_policy *disk_policy(struct mdinfo *disk)
        return pol;
 }
 
+struct dev_policy *devnum_policy(int dev)
+{
+       struct mdinfo disk;
+       disk.disk.major = major(dev);
+       disk.disk.minor = minor(dev);
+       return disk_policy(&disk);
+}
+
 /*
  * process policy rules read from config file.
  */
@@ -402,6 +409,7 @@ char rule_part[] = "part-policy";
 char pol_metadata[] = "metadata";
 char pol_act[] = "action";
 char pol_domain[] = "domain";
+char pol_auto[] = "auto";
 
 static int try_rule(char *w, char *name, struct rule **rp)
 {
@@ -436,7 +444,8 @@ void policyline(char *line, char *type)
                else if (! try_rule(w, rule_type, &pr->rule) &&
                         ! try_rule(w, pol_metadata, &pr->rule) &&
                         ! try_rule(w, pol_act, &pr->rule) &&
-                        ! try_rule(w, pol_domain, &pr->rule))
+                        ! try_rule(w, pol_domain, &pr->rule) &&
+                        ! try_rule(w, pol_auto, &pr->rule))
                        fprintf(stderr, Name ": policy rule %s unrecognised and ignored\n",
                                w);
        }
@@ -444,6 +453,32 @@ void policyline(char *line, char *type)
        config_rules = pr;
 }
 
+void policy_add(char *type, ...)
+{
+       va_list ap;
+       struct pol_rule *pr;
+       char *name, *val;
+
+       pr = malloc(sizeof(*pr));
+       pr->type = type;
+       pr->rule = NULL;
+
+       va_start(ap, type);
+       while ((name = va_arg(ap, char*)) != NULL) {
+               struct rule *r;
+
+               val = va_arg(ap, char*);
+               r = malloc(sizeof(*r));
+               r->next = pr->rule;
+               r->name = name;
+               r->value = strdup(val);
+               r->dups = NULL;
+               pr->rule = r;
+       }
+       pr->next = config_rules;
+       config_rules = pr;
+}
+
 void policy_free(void)
 {
        while (config_rules) {
@@ -580,9 +615,9 @@ int domain_test(struct domainlist *dom, struct dev_policy *pol,
        pol = pol_find(pol, pol_domain);
        pol_for_each(p, pol, metadata) {
                found_any = 1;
-               while (dom && strcmp(dom->dom, pol->value) < 0)
+               while (dom && strcmp(dom->dom, p->value) < 0)
                        dom = dom->next;
-               if (!dom || strcmp(dom->dom, pol->value) != 0)
+               if (!dom || strcmp(dom->dom, p->value) != 0)
                        return 0;
        }
        return found_any;