From fd1b11894295468f6a388adaffbddd0bcabf7731 Mon Sep 17 00:00:00 2001 From: Alasdair Kergon Date: Tue, 22 Apr 2008 12:54:33 +0000 Subject: [PATCH] Check lv_count in vg_validate. Fix internal LV counter when a snapshot is removed. --- WHATS_NEW | 2 ++ lib/metadata/lv_manip.c | 3 ++- lib/metadata/metadata.c | 10 ++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/WHATS_NEW b/WHATS_NEW index 212b0c834..821d41db8 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,7 @@ Version 2.02.36 - ================================= + Check lv_count in vg_validate. + Fix internal LV counter when a snapshot is removed. Fix metadata corruption writing lvm1-formatted metadata with snapshots. Add --prefixes to reporting tools for field name prefix output format. Fix lvconvert -m0 allocatable space check. diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c index d947b6ee0..066f21843 100644 --- a/lib/metadata/lv_manip.c +++ b/lib/metadata/lv_manip.c @@ -439,7 +439,8 @@ static int _lv_reduce(struct logical_volume *lv, uint32_t extents, int delete) list_del(&lvl->list); - lv->vg->lv_count--; + if (!(lv->status & SNAPSHOT)) + lv->vg->lv_count--; } else if (lv->vg->fid->fmt->ops->lv_setup && !lv->vg->fid->fmt->ops->lv_setup(lv->vg->fid, lv)) return_0; diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c index 91050949d..8182734a7 100644 --- a/lib/metadata/metadata.c +++ b/lib/metadata/metadata.c @@ -1177,6 +1177,7 @@ int vg_validate(struct volume_group *vg) struct lv_list *lvl, *lvl2; char uuid[64] __attribute((aligned(8))); int r = 1; + uint32_t lv_count; /* FIXME Also check there's no data/metadata overlap */ @@ -1210,6 +1211,15 @@ int vg_validate(struct volume_group *vg) r = 0; } + if ((lv_count = (uint32_t) list_size(&vg->lvs)) != + vg->lv_count + 2 * vg->snapshot_count) { + log_error("Internal error: #internal LVs (%u) != #LVs (%" + PRIu32 ") + 2 * #snapshots (%" PRIu32 ") in VG %s", + list_size(&vg->lvs), vg->lv_count, + vg->snapshot_count, vg->name); + r = 0; + } + list_iterate_items(lvl, &vg->lvs) { list_iterate_items(lvl2, &vg->lvs) { if (lvl == lvl2)