summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2010-08-23 14:33:28 +1000
committerNeilBrown <neilb@suse.de>2010-09-06 11:26:27 +1000
commite3bb5f144bfdfb3ae66be8de2393e87162f01264 (patch)
tree6109bf855cbfe8d8ae14b1db6b8704332ab3d8b8
parent5527fc74620ecc831d7c854c200e34211ceb63de (diff)
Add policy_action support
Add code for easy working 'action' policies. Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--mdadm.h13
-rw-r--r--policy.c45
2 files changed, 58 insertions, 0 deletions
diff --git a/mdadm.h b/mdadm.h
index 796d7623..ce57f9e8 100644
--- 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
diff --git a/policy.c b/policy.c
index abf9ee8c..8b37ead6 100644
--- 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;
+}