From: NeilBrown Date: Mon, 23 Aug 2010 04:33:28 +0000 (+1000) Subject: Add policy_action support X-Git-Tag: mdadm-3.2~332 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e3bb5f144bfdfb3ae66be8de2393e87162f01264;p=thirdparty%2Fmdadm.git Add policy_action support Add code for easy working 'action' policies. Signed-off-by: NeilBrown --- 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; +}