[lvm-devel] master - lvconvert: cache and thin conversion validation

Zdenek Kabelac zkabelac at fedoraproject.org
Mon Oct 6 13:33:21 UTC 2014


Gitweb:        http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=60d2a63368686d309c01f1e59d695d0ee8ec9153
Commit:        60d2a63368686d309c01f1e59d695d0ee8ec9153
Parent:        ee344f1a9ee8536eab235ea3d971f59ed769cdd5
Author:        Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate:    Mon Oct 6 13:44:59 2014 +0200
Committer:     Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Mon Oct 6 15:18:06 2014 +0200

lvconvert: cache and thin conversion validation

More test for supported conversion.
---
 WHATS_NEW         |    1 +
 tools/lvconvert.c |   28 ++++++++++++++++++++++++++--
 2 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/WHATS_NEW b/WHATS_NEW
index 980809c..5fc42d6 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
 Version 2.02.112 - 
 =====================================
+  Fix detection of unsupported cache and thin pool lvconversions.
   Fix detection of unsupported lvconversion of cache to snapshot.
   Improve code for creation of cache and cache pool volumes.
   Check cluster-wide (not local) active status before removing LV.
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index 1a5d559..36fafbe 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -2802,13 +2802,18 @@ static int _lvconvert_pool(struct cmd_context *cmd,
 	}
 
 	if (lv_is_thin_pool(pool_lv) && (segtype_is_cache_pool(lp->segtype) || lp->cache)) {
-		log_error("Cannot convert thin pool volume %s as cache pool data volume.",
+		log_error("Can't convert thin pool LV %s.", display_lvname(pool_lv));
+		return 0;
+	}
+
+	if (lv_is_cache(pool_lv) && !segtype_is_thin_pool(lp->segtype)) {
+		log_error("Cached LV %s could be only converted into a thin pool volume.",
 			  display_lvname(pool_lv));
 		return 0;
 	}
 
 	if (lv_is_cache_pool(pool_lv) && (segtype_is_thin_pool(lp->segtype) || lp->thin)) {
-		log_error("Cannot convert cache pool %s as thin pool data volume.",
+		log_error("Cannot convert cache pool %s as pool data volume.",
 			  display_lvname(pool_lv));
 		return 0;
 	}
@@ -3250,6 +3255,25 @@ static int _lvconvert_single(struct cmd_context *cmd, struct logical_volume *lv,
 		return ECMD_PROCESSED;
 	}
 
+	if (lp->cache) {
+		if (lv_is_thin_pool(lv))
+			lv = seg_lv(first_seg(lv), 0); /* cache _tdata */
+		if (!validate_lv_cache_create(NULL, lv))
+			return_ECMD_FAILED;
+	}
+
+	if (lp->thin) {
+		if (lv_is_cache_type(lv) ||
+		    lv_is_pool(lv) ||
+		    lv_is_thin_pool_data(lv) ||
+		    lv_is_thin_pool_metadata(lv)) {
+			log_error("Can't convert %s %s to external origin.",
+				  first_seg(lv)->segtype->name,
+				  display_lvname(lv));
+			return ECMD_FAILED;
+		}
+	}
+
 	if (arg_count(cmd, repair_ARG)) {
 		if (lv_is_pool(lv)) {
 			if (!_lvconvert_pool_repair(cmd, lv, lp))




More information about the lvm-devel mailing list