[lvm-devel] master - lvconvert: prevent duplicate use of metadata lv
David Teigland
teigland at sourceware.org
Tue Apr 11 17:19:17 UTC 2017
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=a96c8b46b62c316381eb029416b92197d9cfa4de
Commit: a96c8b46b62c316381eb029416b92197d9cfa4de
Parent: e0c169f8b7f214100ad11c68b1cab799e8adaaed
Author: David Teigland <teigland at redhat.com>
AuthorDate: Tue Apr 11 12:07:14 2017 -0500
Committer: David Teigland <teigland at redhat.com>
CommitterDate: Tue Apr 11 12:11:00 2017 -0500
lvconvert: prevent duplicate use of metadata lv
The LV being processed cannot be used as the
pool metadata LV.
---
tools/lvconvert.c | 19 +++++++++++++++----
1 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index ee7fb8b..c18b5a4 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -2658,10 +2658,15 @@ static int _lvconvert_swap_pool_metadata(struct cmd_context *cmd,
* Create a new pool LV, using the lv arg as the data sub LV.
* The metadata sub LV is either a new LV created here, or an
* existing LV specified by --poolmetadata.
+ *
+ * process_single_lv is the LV currently being processed by
+ * process_each_lv(). It will sometimes be the same as the
+ * lv arg, and sometimes not.
*/
static int _lvconvert_to_pool(struct cmd_context *cmd,
struct logical_volume *lv,
+ struct logical_volume *process_single_lv,
int to_thinpool,
int to_cachepool,
struct dm_list *use_pvh)
@@ -2773,6 +2778,12 @@ static int _lvconvert_to_pool(struct cmd_context *cmd,
return 0;
}
+ if (metadata_lv == process_single_lv) {
+ log_error("Use a different LV for pool metadata %s.",
+ display_lvname(metadata_lv));
+ return 0;
+ }
+
if (!lv_is_visible(metadata_lv)) {
log_error("Can't convert internal LV %s.",
display_lvname(metadata_lv));
@@ -3765,7 +3776,7 @@ static int _lvconvert_to_pool_single(struct cmd_context *cmd,
} else
use_pvh = &lv->vg->pvs;
- if (!_lvconvert_to_pool(cmd, lv, to_thinpool, to_cachepool, use_pvh))
+ if (!_lvconvert_to_pool(cmd, lv, lv, to_thinpool, to_cachepool, use_pvh))
return_ECMD_FAILED;
return ECMD_PROCESSED;
@@ -3815,7 +3826,7 @@ static int _lvconvert_to_cache_vol_single(struct cmd_context *cmd,
goto out;
}
- if (!_lvconvert_to_pool(cmd, cachepool_lv, 0, 1, &vg->pvs)) {
+ if (!_lvconvert_to_pool(cmd, cachepool_lv, lv, 0, 1, &vg->pvs)) {
log_error("LV %s could not be converted to a cache pool.",
display_lvname(cachepool_lv));
goto out;
@@ -3913,7 +3924,7 @@ static int _lvconvert_to_thin_with_external_single(struct cmd_context *cmd,
goto out;
}
- if (!_lvconvert_to_pool(cmd, thinpool_lv, 1, 0, &vg->pvs)) {
+ if (!_lvconvert_to_pool(cmd, thinpool_lv, lv, 1, 0, &vg->pvs)) {
log_error("LV %s could not be converted to a thin pool.",
display_lvname(thinpool_lv));
goto out;
@@ -4066,7 +4077,7 @@ static int _lvconvert_to_pool_or_swap_metadata_single(struct cmd_context *cmd,
return _lvconvert_swap_pool_metadata_single(cmd, lv, handle);
}
- if (!_lvconvert_to_pool(cmd, lv, to_thinpool, to_cachepool, use_pvh))
+ if (!_lvconvert_to_pool(cmd, lv, lv, to_thinpool, to_cachepool, use_pvh))
return_ECMD_FAILED;
return ECMD_PROCESSED;
More information about the lvm-devel
mailing list