summaryrefslogtreecommitdiff
path: root/policy.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2010-11-22 20:58:07 +1100
committerNeilBrown <neilb@suse.de>2010-11-22 20:58:07 +1100
commite78dda3bf5ff840b65e85dbd7fc24ec4ccd291a5 (patch)
treeda8f35e89c6ea9ee90ca54674a416fdfa67dd044 /policy.c
parent2feb22efbc216e53486cc20c05df13f8340a9d49 (diff)
Monitor: policy based spare migration.
Rather than only migrating between arrays with the same spare_group, we now migrate based on domains set in the policy. In order for spare_group to continue to work, we treat it as a domain of the destination array, and a domain of any device we might remove from a source array. Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'policy.c')
-rw-r--r--policy.c36
1 files changed, 29 insertions, 7 deletions
diff --git a/policy.c b/policy.c
index cc126949..ad5850bd 100644
--- a/policy.c
+++ b/policy.c
@@ -40,7 +40,7 @@
* particularly from a set of policy rules in mdadm.conf
*/
-void pol_new(struct dev_policy **pol, char *name, char *val, char *metadata)
+static void pol_new(struct dev_policy **pol, char *name, char *val, char *metadata)
{
struct dev_policy *n = malloc(sizeof(*n));
const char *real_metadata = NULL;
@@ -365,6 +365,16 @@ struct dev_policy *path_policy(char *path, char *type)
return pol;
}
+void pol_add(struct dev_policy **pol,
+ char *name, char *val,
+ char *metadata)
+{
+ pol_new(pol, name, val, metadata);
+ pol_sort(pol);
+ pol_dedup(*pol);
+}
+
+
/*
* disk_policy() gathers policy information for the
* disk described in the given mdinfo (disk.{major,minor}).
@@ -600,7 +610,7 @@ void domain_merge(struct domainlist **domp, struct dev_policy *pollist,
struct dev_policy *pol;
pollist = pol_find(pollist, pol_domain);
pol_for_each(pol, pollist, metadata)
- domp = domain_merge_one(domp, pol->value);
+ domain_merge_one(domp, pol->value);
}
int domain_test(struct domainlist *dom, struct dev_policy *pol,
@@ -625,19 +635,31 @@ int domain_test(struct domainlist *dom, struct dev_policy *pol,
return found_any;
}
+void domainlist_add_dev(struct domainlist **dom, int devnum, const char *metadata)
+{
+ struct dev_policy *pol = devnum_policy(devnum);
+ domain_merge(dom, pol, metadata);
+ dev_policy_free(pol);
+}
+
struct domainlist *domain_from_array(struct mdinfo *mdi, const char *metadata)
{
struct domainlist *domlist = NULL;
- for (mdi = mdi->devs ; mdi ; mdi = mdi->next) {
- struct dev_policy *pol = disk_policy(mdi);
+ for (mdi = mdi->devs ; mdi ; mdi = mdi->next)
+ domainlist_add_dev(&domlist, makedev(mdi->disk.major,
+ mdi->disk.minor),
+ metadata);
- domain_merge(&domlist, pol, metadata);
- dev_policy_free(pol);
- }
return domlist;
}
+void domain_add(struct domainlist **domp, char *domain)
+{
+ domain_merge_one(domp, domain);
+}
+
+
void domain_free(struct domainlist *dl)
{
while (dl) {