[lvm-devel] master - lvconvert: reusing old cache pool metadata needs -Zn

Zdenek Kabelac zkabelac at fedoraproject.org
Fri Jul 22 12:42:31 UTC 2016


Gitweb:        http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=27a767d5e8cedf9cac31eb3562cf8fdd4aa88b7c
Commit:        27a767d5e8cedf9cac31eb3562cf8fdd4aa88b7c
Parent:        259f9dd71817ad33195384dbeca14b39dfb77ae1
Author:        Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate:    Fri Jul 22 14:16:55 2016 +0200
Committer:     Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Fri Jul 22 14:40:26 2016 +0200

lvconvert: reusing old cache pool metadata needs -Zn

When cache pool is reused for a new cached volume, there is
normally no need to 'keep' old cache-pool metadata as this
could cause major data lose.

Unlike with 'lvcreate -H -LX --cachepool' conversion, this lvconvert
path left the metadata unzeroed - partly for making easier some
debugging, but this was rather a bug.

So to keep possible reattach of 'unzeroed' metadata, user
now has to use 'lvconvert -Zn' for such conversion. In this case
the prompt will appear about possibe data loss and to proceed,
user has to confirm such operation. Without -Zn metadata are wiped.
---
 WHATS_NEW         |    1 +
 tools/lvconvert.c |   31 +++++++++++++++++++++++++++++--
 2 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/WHATS_NEW b/WHATS_NEW
index 79c4317..0d6d010 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
 Version 2.02.162 - 
 =================================
+  lvconvert reuse cachepool metadade now ONLY with -Zn and clear otherwise.
   Enabled lvconvert --uncache to work with partial VG.
 
 Version 2.02.161 - 15th July 2016
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index 2fd6094..9dd7254 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -372,7 +372,7 @@ static int _read_pool_params(struct cmd_context *cmd, int *pargc, char ***pargv,
 	} else {
 		if (arg_from_list_is_set(cmd, "is valid only with thin pools",
 					 discards_ARG, originname_ARG, thinpool_ARG,
-					 zero_ARG, -1))
+					 -1))
 			return_0;
 		if (lp->thin) {
 			log_error("--thin requires --thinpool.");
@@ -420,6 +420,7 @@ static int _read_pool_params(struct cmd_context *cmd, int *pargc, char ***pargv,
 
 	} else if (arg_from_list_is_set(cmd, "is valid only with pools",
 					poolmetadatasize_ARG, poolmetadataspare_ARG,
+					zero_ARG,
 					-1))
 		return_0;
 
@@ -2970,9 +2971,35 @@ static int _lvconvert_pool(struct cmd_context *cmd,
 		if (!metadata_lv) {
 			if (arg_from_list_is_set(cmd, "is invalid with existing pool",
 						 chunksize_ARG, discards_ARG,
-						 zero_ARG, poolmetadatasize_ARG, -1))
+						 poolmetadatasize_ARG, -1))
+				return_0;
+
+			if (lp->thin &&
+			    arg_from_list_is_set(cmd, "is invalid with existing thin pool",
+						 zero_ARG, -1))
 				return_0;
 
+			if (lp->cache) {
+				/* Check is user has not requested -Zn */
+				if (!arg_int_value(cmd, zero_ARG, 1)) {
+					/* Note: requires rather deep know-how to skip zeroing
+					 * so show major warnings */
+					log_warn("WARNING: Reusing old cache pool metadata %s to "
+						 "for volume caching.",
+						 display_lvname(pool_lv));
+					log_warn("THIS MAY DESTROY YOUR DATA (filesystem etc.)");
+
+					if (!lp->yes &&
+					    yes_no_prompt("Do you really want to keep old metadata for "
+							  "cache pool volume %s? [y/n]: ",
+							  display_lvname(pool_lv)) == 'n') {
+						log_error("Conversion aborted.");
+						return 0;
+					}
+				} else if (!wipe_cache_pool(pool_lv))
+					return_0;
+			}
+
 			if (lp->thin || lp->cache)
 				/* already pool, can continue converting volume */
 				return 1;




More information about the lvm-devel mailing list