[lvm-devel] master - cache: factor getting cache mode

David Teigland teigland at sourceware.org
Tue Nov 6 21:42:45 UTC 2018


Gitweb:        https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=e26dacf30a656276afdc36516cb7b330da4ff705
Commit:        e26dacf30a656276afdc36516cb7b330da4ff705
Parent:        f3f3d6066b82523867a7e7cdaa3d64ae73a44b2e
Author:        David Teigland <teigland at redhat.com>
AuthorDate:    Mon Nov 5 15:46:07 2018 -0600
Committer:     David Teigland <teigland at redhat.com>
CommitterDate: Tue Nov 6 11:36:28 2018 -0600

cache: factor getting cache mode

so part can be called separately
---
 lib/metadata/cache_manip.c |   67 ++++++++++++++++++++++++++++---------------
 1 files changed, 43 insertions(+), 24 deletions(-)

diff --git a/lib/metadata/cache_manip.c b/lib/metadata/cache_manip.c
index 0cf94ae..b4d269d 100644
--- a/lib/metadata/cache_manip.c
+++ b/lib/metadata/cache_manip.c
@@ -95,32 +95,14 @@ int set_cache_mode(cache_mode_t *mode, const char *cache_mode)
 	return 1;
 }
 
-int cache_set_cache_mode(struct lv_segment *seg, cache_mode_t mode)
+static cache_mode_t _get_cache_mode_from_config(struct cmd_context *cmd,
+						struct profile *profile,
+						struct logical_volume *lv)
 {
-	struct cmd_context *cmd = seg->lv->vg->cmd;
-	struct profile *profile = seg->lv->profile;
+	cache_mode_t mode;
 	const char *str;
 	int id;
 
-	if (seg_is_cache(seg))
-		seg = first_seg(seg->pool_lv);
-	else if (seg_is_cache_pool(seg)) {
-		if (mode == CACHE_MODE_UNSELECTED)
-			return 1;	/* Defaults only for cache */
-	} else {
-		log_error(INTERNAL_ERROR "Cannot set cache mode for non cache volume %s.",
-			  display_lvname(seg->lv));
-		return 0;
-	}
-
-	if (mode != CACHE_MODE_UNSELECTED) {
-		seg->cache_mode = mode;
-		return 1;
-	}
-
-	if (seg->cache_mode != CACHE_MODE_UNSELECTED)
-		return 1;               /* Default already set in cache pool */
-
 	/* Figure default settings from config/profiles */
 	id = allocation_cache_mode_CFG;
 
@@ -131,11 +113,48 @@ int cache_set_cache_mode(struct lv_segment *seg, cache_mode_t mode)
 
 	if (!(str = find_config_tree_str(cmd, id, profile))) {
 		log_error(INTERNAL_ERROR "Cache mode is not determined.");
+		return CACHE_MODE_WRITETHROUGH;
+	}
+
+	if (!(set_cache_mode(&mode, str)))
+		return CACHE_MODE_WRITETHROUGH;
+
+	return mode;
+}
+
+int cache_set_cache_mode(struct lv_segment *seg, cache_mode_t mode)
+{
+	struct cmd_context *cmd = seg->lv->vg->cmd;
+	struct lv_segment *setting_seg;
+
+	/*
+	 * Don't set a cache mode on an unused cache pool, the
+	 * cache mode will be set when it's attached.
+	 */
+	if (seg_is_cache_pool(seg) && (mode == CACHE_MODE_UNSELECTED))
+		return 1;
+
+	if (seg_is_cache_pool(seg))
+		setting_seg = seg;
+
+	else if (seg_is_cache(seg))
+		setting_seg = first_seg(seg->pool_lv);
+
+	else {
+		log_error(INTERNAL_ERROR "Cannot set cache mode for non cache volume %s.",
+			  display_lvname(seg->lv));
 		return 0;
 	}
 
-	if (!(set_cache_mode(&seg->cache_mode, str)))
-		return_0;
+	if (mode != CACHE_MODE_UNSELECTED) {
+		setting_seg->cache_mode = mode;
+		return 1;
+	}
+
+	if (setting_seg->cache_mode != CACHE_MODE_UNSELECTED)
+		return 1;
+
+	setting_seg->cache_mode = _get_cache_mode_from_config(cmd, seg->lv->profile, seg->lv);
 
 	return 1;
 }




More information about the lvm-devel mailing list