Add policy_action support
Add code for easy working 'action' policies. Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
5527fc7462
commit
e3bb5f144b
13
mdadm.h
13
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
|
||||
|
|
45
policy.c
45
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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue