[lvm-devel] master - vgsplit: Fix VG component of lvid.
Alasdair Kergon
agk at fedoraproject.org
Thu Jul 3 18:06:46 UTC 2014
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=1e1c2769a7092959e5c0076767b4973d4e4dc37c
Commit: 1e1c2769a7092959e5c0076767b4973d4e4dc37c
Parent: 64ce3a8066ead3bc2ee16e9cc286d68057bbe956
Author: Alasdair G Kergon <agk at redhat.com>
AuthorDate: Thu Jul 3 19:06:04 2014 +0100
Committer: Alasdair G Kergon <agk at redhat.com>
CommitterDate: Thu Jul 3 19:06:04 2014 +0100
vgsplit: Fix VG component of lvid.
Fix VG component of lvid in vgsplit and vgmerge
Update vg_validate() to detect the error.
Call lv_is_active() before moving LV into new VG, not after.
---
WHATS_NEW | 1 +
lib/metadata/metadata.c | 12 ++++++++++++
tools/vgmerge.c | 1 +
tools/vgsplit.c | 16 +++++++---------
4 files changed, 21 insertions(+), 9 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 625d58f..96c4c65 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.108 -
=================================
+ Fix VG component of lvid in vgsplit/vgmerge and check in vg_validate.
Add lv_full_name and lv_dm_path fields to reports.
Change lv_path field to suppress devices that never appear in /dev/vg.
Postpone thin pool lvconvert prompts (2.02.107).
diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
index 0a6e9e9..50d44ec 100644
--- a/lib/metadata/metadata.c
+++ b/lib/metadata/metadata.c
@@ -2331,6 +2331,7 @@ int vg_validate(struct volume_group *vg)
struct lv_segment *seg;
struct dm_str_list *sl;
char uuid[64] __attribute__((aligned(8)));
+ char uuid2[64] __attribute__((aligned(8)));
int r = 1;
unsigned hidden_lv_count = 0, lv_count = 0, lv_visible_count = 0;
unsigned pv_count = 0;
@@ -2427,6 +2428,17 @@ int vg_validate(struct volume_group *vg)
r = 0;
}
+ if (!id_equal(&lvl->lv->lvid.id[0], &lvl->lv->vg->id)) {
+ if (!id_write_format(&lvl->lv->lvid.id[0], uuid,
+ sizeof(uuid)))
+ stack;
+ if (!id_write_format(&lvl->lv->vg->id, uuid2,
+ sizeof(uuid2)))
+ stack;
+ log_error(INTERNAL_ERROR "LV %s has VG UUID %s but its VG %s has UUID %s",
+ lvl->lv->name, uuid, lvl->lv->vg->name, uuid2);
+ r = 0;
+ }
if (lv_is_cow(lvl->lv))
num_snapshots++;
diff --git a/tools/vgmerge.c b/tools/vgmerge.c
index 3782779..a17a636 100644
--- a/tools/vgmerge.c
+++ b/tools/vgmerge.c
@@ -133,6 +133,7 @@ static int _vgmerge_single(struct cmd_context *cmd, const char *vg_name_to,
dm_list_iterate_items(lvl1, &vg_from->lvs) {
lvl1->lv->vg = vg_to;
+ lvl1->lv->lvid.id[0] = lvl1->lv->vg->id;
}
while (!dm_list_empty(&vg_from->lvs)) {
diff --git a/tools/vgsplit.c b/tools/vgsplit.c
index fb67919..9b0f616 100644
--- a/tools/vgsplit.c
+++ b/tools/vgsplit.c
@@ -16,14 +16,10 @@
#include "tools.h"
#include "metadata.h" /* for 'get_only_segment_using_this_lv' */
-/* FIXME Why not (lv->vg == vg) ? */
static int _lv_is_in_vg(struct volume_group *vg, struct logical_volume *lv)
{
- struct lv_list *lvl;
-
- dm_list_iterate_items(lvl, &vg->lvs)
- if (lv == lvl->lv)
- return 1;
+ if (lv->vg == vg)
+ return 1;
return 0;
}
@@ -34,14 +30,16 @@ static int _move_one_lv(struct volume_group *vg_from,
{
struct logical_volume *lv = dm_list_item(lvh, struct lv_list)->lv;
- dm_list_move(&vg_to->lvs, lvh);
- lv->vg = vg_to;
-
if (lv_is_active(lv)) {
log_error("Logical volume \"%s\" must be inactive", lv->name);
return 0;
}
+ dm_list_move(&vg_to->lvs, lvh);
+ lv->vg = vg_to;
+
+ lv->lvid.id[0] = lv->vg->id;
+
/* Moved pool metadata spare LV */
if (vg_from->pool_metadata_spare_lv == lv) {
vg_to->pool_metadata_spare_lv = lv;
More information about the lvm-devel
mailing list