]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Add policy_action support
authorNeilBrown <neilb@suse.de>
Mon, 23 Aug 2010 04:33:28 +0000 (14:33 +1000)
committerNeilBrown <neilb@suse.de>
Mon, 6 Sep 2010 01:26:27 +0000 (11:26 +1000)
Add code for easy working 'action' policies.

Signed-off-by: NeilBrown <neilb@suse.de>
mdadm.h
policy.c

diff --git a/mdadm.h b/mdadm.h
index 796d76239a18afa53cb1473c069e893447ba9c1a..ce57f9e8bd32897d4d2bc6d064c7a006e588c7fe 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -792,6 +792,19 @@ extern void dev_policy_free(struct dev_policy *p);
 extern void pol_new(struct dev_policy **pol, char *name, char *val, char *metadata);
 extern struct dev_policy *pol_find(struct dev_policy *pol, char *name);
 
+enum policy_action {
+       act_default,
+       act_include,
+       act_re_add,
+       act_spare,
+       act_force_spare,
+       act_err
+};
+
+extern int policy_action_allows(struct dev_policy *plist, const char *metadata,
+                               enum policy_action want);
+extern int disk_action_allows(struct mdinfo *disk, const char *metadata,
+                             enum policy_action want);
 #if __GNUC__ < 3
 struct stat64;
 #endif
index abf9ee8ce3cd1e58bec689051a234c892a5ac55c..8b37ead60bc69b2ece0c00478d37c5a4c43be173 100644 (file)
--- a/policy.c
+++ b/policy.c
@@ -459,3 +459,48 @@ void dev_policy_free(struct dev_policy *p)
                free(t);
        }
 }
+
+static enum policy_action map_act(char *act)
+{
+       if (strcmp(act, "include") == 0)
+               return act_include;
+       if (strcmp(act, "re-add") == 0)
+               return act_re_add;
+       if (strcmp(act, "spare") == 0)
+               return act_spare;
+       if (strcmp(act, "force-spare") == 0)
+               return act_force_spare;
+       return act_err;
+}
+
+static enum policy_action policy_action(struct dev_policy *plist, const char *metadata)
+{
+       enum policy_action rv = act_default;
+       struct dev_policy *p;
+
+       plist = pol_find(plist, pol_act);
+       pol_for_each(p, plist, metadata) {
+               enum policy_action a = map_act(p->value);
+               if (a > rv)
+                       rv = a;
+       }
+       return rv;
+}
+
+int policy_action_allows(struct dev_policy *plist, const char *metadata, enum policy_action want)
+{
+       enum policy_action act = policy_action(plist, metadata);
+
+       if (act == act_err)
+               return 0;
+       return (act >= want);
+}
+
+int disk_action_allows(struct mdinfo *disk, const char *metadata, enum policy_action want)
+{
+       struct dev_policy *pol = disk_policy(disk);
+       int rv = policy_action_allows(pol, metadata, want);
+
+       dev_policy_free(pol);
+       return rv;
+}