[lvm-devel] master - libdm: still better API

Zdenek Kabelac zkabelac at fedoraproject.org
Mon Nov 10 23:56:29 UTC 2014


Gitweb:        http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=20b22cd023bdfd30301305ba5b78655619d965f1
Commit:        20b22cd023bdfd30301305ba5b78655619d965f1
Parent:        ca509c97467f5f077463c54fee185442cb98f817
Author:        Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate:    Mon Nov 10 23:41:03 2014 +0100
Committer:     Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Tue Nov 11 00:54:03 2014 +0100

libdm: still better API

Do not use 'any' policy name as a value in config tree - so we stick
with 'policy_settings' and extra 'policy_name' for libdm params.

Update lvm2 API as well.

Example of supported metadata:

 policy = "mq"
 policy_settings {
      migration_threshold = 2048
      sequential_threshold = 512
      random_threshold = 4
      read_promote_adjustment = 10
 }
---
 lib/cache_segtype/cache.c        |   43 +++++++++++++++++++++++++------------
 lib/config/defaults.h            |    1 +
 lib/metadata/metadata-exported.h |    3 +-
 libdm/libdevmapper.h             |   14 ++++++------
 libdm/libdm-deptree.c            |   16 +++++++-------
 5 files changed, 47 insertions(+), 30 deletions(-)

diff --git a/lib/cache_segtype/cache.c b/lib/cache_segtype/cache.c
index ab9d4a0..b42a529 100644
--- a/lib/cache_segtype/cache.c
+++ b/lib/cache_segtype/cache.c
@@ -71,9 +71,18 @@ static int _cache_pool_text_import(struct lv_segment *seg,
 			return SEG_LOG_ERROR("Unknown cache_mode in");
 	}
 
+	if (dm_config_has_node(sn, "policy")) {
+		if (!(str = dm_config_find_str(sn, "policy", NULL)))
+			return SEG_LOG_ERROR("policy must be a string in");
+		if (!(seg->policy_name = dm_pool_strdup(mem, str)))
+			return SEG_LOG_ERROR("Failed to duplicate policy in");
+	} else
+		/* Cannot use 'just' default, so pick one */
+		seg->policy_name = DEFAULT_CACHE_POOL_POLICY; /* TODO: configurable default */
+
 	/*
 	 * Read in policy args:
-	 *   mq {
+	 *   policy_settings {
 	 *	migration_threshold=2048
 	 *	sequention_threashold=100
 	 *	random_threashold=200
@@ -88,14 +97,13 @@ static int _cache_pool_text_import(struct lv_segment *seg,
 	 *
 	 *   If the policy is not present, default policy is used.
 	 */
-	for (; sn; sn = sn->sib)
-		if (!sn->v) {
-			if (seg->policy_args)
-				return SEG_LOG_ERROR("only a singly policy is supported for");
+	if ((sn = dm_config_find_node(sn, "policy_settings"))) {
+		if (sn->v)
+			return SEG_LOG_ERROR("policy_settings must be a section in");
 
-			if (!(seg->policy_args = dm_config_clone_node_with_mem(mem, sn, 0)))
-				return_0;
-		}
+		if (!(seg->policy_settings = dm_config_clone_node_with_mem(mem, sn, 0)))
+			return_0;
+	}
 
 	if (!attach_pool_data_lv(seg, data_lv))
 		return_0;
@@ -126,8 +134,17 @@ static int _cache_pool_text_export(const struct lv_segment *seg,
 	outf(f, "chunk_size = %" PRIu32, seg->chunk_size);
 	outf(f, "cache_mode = \"%s\"", cache_mode);
 
-	if (seg->policy_args)
-		out_config_node(f, seg->policy_args);
+	if (seg->policy_name)
+		outf(f, "policy = \"%s\"", seg->policy_name);
+
+	if (seg->policy_settings) {
+		if (strcmp(seg->policy_settings->key, "policy_settings")) {
+			log_error(INTERNAL_ERROR "Incorrect policy_settings tree, %s.",
+				  seg->policy_settings->key);
+			return 0;
+		}
+		out_config_node(f, seg->policy_settings);
+	}
 
 	return 1;
 }
@@ -266,8 +283,6 @@ static int _cache_add_target_line(struct dev_manager *dm,
 {
 	struct lv_segment *cache_pool_seg = first_seg(seg->pool_lv);
 	char *metadata_uuid, *data_uuid, *origin_uuid;
-	const char *policy_name = seg->cleaner_policy ? "cleaner" :
-		cache_pool_seg->policy_args ? cache_pool_seg->policy_args->key : NULL;
 
 	if (!(metadata_uuid = build_dm_uuid(mem, cache_pool_seg->metadata_lv, NULL)))
 		return_0;
@@ -283,8 +298,8 @@ static int _cache_add_target_line(struct dev_manager *dm,
 					   metadata_uuid,
 					   data_uuid,
 					   origin_uuid,
-					   seg->cleaner_policy ? NULL : cache_pool_seg->policy_args,
-					   policy_name,
+					   seg->cleaner_policy ? "cleaner" : cache_pool_seg->policy_name,
+					   seg->cleaner_policy ? NULL : cache_pool_seg->policy_settings,
 					   cache_pool_seg->chunk_size))
 		return_0;
 
diff --git a/lib/config/defaults.h b/lib/config/defaults.h
index acf768b..cbc95fb 100644
--- a/lib/config/defaults.h
+++ b/lib/config/defaults.h
@@ -96,6 +96,7 @@
 #define DEFAULT_CACHE_POOL_MIN_METADATA_SIZE 2048  /* KB */
 #define DEFAULT_CACHE_POOL_MAX_METADATA_SIZE (16 * 1024 * 1024)  /* KB */
 #define DEFAULT_CACHE_POOL_CACHEMODE "writethrough"
+#define DEFAULT_CACHE_POOL_POLICY "mq"
 
 #define DEFAULT_UMASK 0077
 
diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h
index 0ba1ed5..375f7be 100644
--- a/lib/metadata/metadata-exported.h
+++ b/lib/metadata/metadata-exported.h
@@ -432,7 +432,8 @@ struct lv_segment {
 	uint32_t device_id;			/* For thin, 24bit */
 
 	uint64_t feature_flags;			/* For cache_pool */
-	struct dm_config_node *policy_args;	/* For cache_pool  (-> policy_name) */
+	const char *policy_name;		/* For cache_pool */
+	struct dm_config_node *policy_settings;	/* For cache_pool */
 	unsigned cleaner_policy;		/* For cache */
 
 	struct logical_volume *replicator;/* For replicator-devs - link to replicator LV */
diff --git a/libdm/libdevmapper.h b/libdm/libdevmapper.h
index 62a5941..9ea7dbe 100644
--- a/libdm/libdevmapper.h
+++ b/libdm/libdevmapper.h
@@ -780,13 +780,13 @@ struct dm_config_node;
 /*
  * Use for passing cache policy and all its args e.g.:
  *
- *   mq {
- *	migration_threshold=2048
- *	sequention_threashold=100
- *	...
- *   }
+ * policy_settings {
+ *    migration_threshold=2048
+ *    sequention_threashold=100
+ *    ...
+ * }
  *
- * For policy without any parameters simply specify policy_name.
+ * For policy without any parameters use NULL.
  */
 int dm_tree_node_add_cache_target(struct dm_tree_node *node,
 				  uint64_t size,
@@ -794,8 +794,8 @@ int dm_tree_node_add_cache_target(struct dm_tree_node *node,
 				  const char *metadata_uuid,
 				  const char *data_uuid,
 				  const char *origin_uuid,
-				  const struct dm_config_node *policy,
 				  const char *policy_name,
+				  const struct dm_config_node *policy_settings,
 				  uint32_t chunk_size);
 
 /*
diff --git a/libdm/libdm-deptree.c b/libdm/libdm-deptree.c
index 70373a2..c3a5df6 100644
--- a/libdm/libdm-deptree.c
+++ b/libdm/libdm-deptree.c
@@ -173,7 +173,7 @@ struct load_segment {
 
 	const char *policy_name;	/* Cache */
 	unsigned policy_argc;		/* Cache */
-	struct dm_config_node *policy;	/* Cache */
+	struct dm_config_node *policy_settings;	/* Cache */
 
 	const char *cipher;		/* Crypt */
 	const char *chainmode;		/* Crypt */
@@ -2399,13 +2399,13 @@ static int _cache_emit_segment_line(struct dm_task *dmt,
 		EMIT_PARAMS(pos, " 1 writeback");
 
 	/* Cache Policy */
-	name = seg->policy_name ? : seg->policy ? seg->policy->key : "default";
+	name = seg->policy_name ? : "default";
 
 	EMIT_PARAMS(pos, " %s", name);
 
 	EMIT_PARAMS(pos, " %u", seg->policy_argc * 2);
-	if (seg->policy)
-		for (cn = seg->policy->child; cn; cn = cn->sib)
+	if (seg->policy_settings)
+		for (cn = seg->policy_settings->child; cn; cn = cn->sib)
 			EMIT_PARAMS(pos, " %s %" PRIu64, cn->key, cn->v->v.i);
 
 	return 1;
@@ -3303,8 +3303,8 @@ int dm_tree_node_add_cache_target(struct dm_tree_node *node,
 				  const char *metadata_uuid,
 				  const char *data_uuid,
 				  const char *origin_uuid,
-				  const struct dm_config_node *policy,
 				  const char *policy_name,
+				  const struct dm_config_node *policy_settings,
 				  uint32_t chunk_size)
 {
 	struct dm_config_node *cn;
@@ -3346,11 +3346,11 @@ int dm_tree_node_add_cache_target(struct dm_tree_node *node,
 	seg->policy_name = policy_name;
 
 	/* FIXME: better validation missing */
-	if (policy) {
-		if (!(seg->policy = dm_config_clone_node_with_mem(node->dtree->mem, policy, 0)))
+	if (policy_settings) {
+		if (!(seg->policy_settings = dm_config_clone_node_with_mem(node->dtree->mem, policy_settings, 0)))
 			return_0;
 
-		for (cn = seg->policy->child; cn; cn = cn->sib) {
+		for (cn = seg->policy_settings->child; cn; cn = cn->sib) {
 			if (!cn->v || (cn->v->type != DM_CFG_INT)) {
 				/* For now only  <key> = <int>  pairs are supported */
 				log_error("Cache policy parameter %s is without integer value.", cn->key);




More information about the lvm-devel mailing list