1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-09-07 09:44:20 +03:00

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.
This commit is contained in:
Zdenek Kabelac
2016-07-22 14:16:55 +02:00
parent 259f9dd718
commit 27a767d5e8
2 changed files with 30 additions and 2 deletions

View File

@@ -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

View File

@@ -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;