[lvm-devel] master - cache: option

Zdenek Kabelac zkabelac at fedoraproject.org
Mon Nov 10 21:06:34 UTC 2014


Gitweb:        http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=6effcb16fcc912bdca250b45442b783ebe75c481
Commit:        6effcb16fcc912bdca250b45442b783ebe75c481
Parent:        c5c2665a213332904836ad90e2f90dd72b6db4c5
Author:        Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate:    Mon Nov 10 10:07:41 2014 +0100
Committer:     Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Mon Nov 10 22:05:49 2014 +0100

cache: option

---
 lib/metadata/cache_manip.c |   30 ++++++++++++++++++++++++++----
 1 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/lib/metadata/cache_manip.c b/lib/metadata/cache_manip.c
index cce2911..b94b867 100644
--- a/lib/metadata/cache_manip.c
+++ b/lib/metadata/cache_manip.c
@@ -268,8 +268,27 @@ int lv_cache_remove(struct logical_volume *cache_lv)
 		return 0;
 	}
 
-	/* Localy active volume is needed (writeback only?) */
+	/* Localy active volume is needed for writeback */
 	if (!lv_is_active_locally(cache_lv)) {
+		/* Give up any remote locks */
+		if (!deactivate_lv(cache_lv->vg->cmd, cache_lv)) {
+			log_error("Cannot deactivate remotely active cache lv.");
+			return 0;
+		}
+		/* For inactive writethrough just drop cache layer */
+		if (first_seg(cache_seg->pool_lv)->feature_flags &
+		    DM_CACHE_FEATURE_WRITETHROUGH) {
+			corigin_lv = seg_lv(cache_seg, 0);
+			if (!detach_pool_lv(cache_seg))
+				return_0;
+			if (!remove_layer_from_lv(cache_lv, corigin_lv))
+				return_0;
+			if (!lv_remove(corigin_lv))
+				return_0;
+			return 1;
+		}
+
+		/* Otherwise localy active volume is need to sync dirty blocks */
 		cache_lv->status |= LV_TEMPORARY;
 		if (!activate_lv_excl_local(cache_lv->vg->cmd, cache_lv) ||
 		    !lv_is_active_locally(cache_lv)) {
@@ -297,10 +316,13 @@ int lv_cache_remove(struct logical_volume *cache_lv)
 	 */
 	if (!lv_cache_status(cache_lv, &status))
 		return_0;
+	dirty_blocks = status->cache->dirty_blocks;
+	if (!(status->cache->feature_flags & DM_CACHE_FEATURE_WRITETHROUGH))
+		dirty_blocks++; /* Not writethrough - always dirty */
 	is_cleaner = !strcmp(status->cache->policy_name, "cleaner");
 	dm_pool_destroy(status->mem);
 
-	if (!is_cleaner) {
+	if (dirty_blocks && !is_cleaner) {
 		/* Switch to cleaner policy to flush the cache */
 		log_print_unless_silent("Flushing cache for %s.", cache_lv->name);
 		cache_seg->cleaner_policy = 1;
@@ -310,7 +332,7 @@ int lv_cache_remove(struct logical_volume *cache_lv)
 	}
 
 	//FIXME: use polling to do this...
-	do {
+	while (dirty_blocks) {
 		if (!lv_cache_status(cache_lv, &status))
 			return_0;
 		dirty_blocks = status->cache->dirty_blocks;
@@ -320,7 +342,7 @@ int lv_cache_remove(struct logical_volume *cache_lv)
 						dirty_blocks);
 			sleep(1);
 		}
-	} while (dirty_blocks);
+	}
 
 	cache_pool_lv = cache_seg->pool_lv;
 	if (!detach_pool_lv(cache_seg))




More information about the lvm-devel mailing list