[lvm-devel] LVM2/lib/metadata metadata.c
wysochanski at sourceware.org
wysochanski at sourceware.org
Mon Jun 28 20:38:41 UTC 2010
CVSROOT: /cvs/lvm2
Module name: LVM2
Changes by: wysochanski at sourceware.org 2010-06-28 20:38:40
Modified files:
lib/metadata : metadata.c
Log message:
Ensure fid mda lists are populated correctly during vgextend.
The vgextend path calls add_pv_to_vg(). Inside add_pv_to_vg(),
we must ensure we pass the correct mdas list into pv_setup(), as
copies of mdas are placed on the vg->fid list. If we don't place
the mdas on the correct vg->fid list, the various counts may be
incorrect and the metadata balance algorithm will not work when
called from vg_write() path.
Signed-off-by: Dave Wysochanski <dwysocha at redhat.com>
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/metadata.c.diff?cvsroot=lvm2&r1=1.360&r2=1.361
--- LVM2/lib/metadata/metadata.c 2010/06/28 20:37:54 1.360
+++ LVM2/lib/metadata/metadata.c 2010/06/28 20:38:39 1.361
@@ -174,6 +174,7 @@
struct format_instance *fid = vg->fid;
struct dm_pool *mem = vg->vgmem;
char uuid[64] __attribute((aligned(8)));
+ struct dm_list *mdas;
log_verbose("Adding physical volume '%s' to volume group '%s'",
pv_name, vg->name);
@@ -217,9 +218,24 @@
*/
pv->pe_alloc_count = 0;
+ /*
+ * FIXME: this does not work entirely correctly in the case where a PV
+ * has 2 mdas and only one is ignored; ideally all non-ignored mdas
+ * should be placed on metadata_areas list and ignored on the
+ * metadata_areas_ignored list; however this requires another
+ * fairly complex refactoring to remove the 'mdas' parameter from both
+ * pv_setup and pv_write. For now, we only put ignored mdas on the
+ * metadata_areas_ignored list if all mdas in the PV are ignored;
+ * otherwise, we use the non-ignored list.
+ */
+ if (!pv_mda_used_count(pv))
+ mdas = &fid->metadata_areas_ignored;
+ else
+ mdas = &fid->metadata_areas_in_use;
+
if (!fid->fmt->ops->pv_setup(fid->fmt, UINT64_C(0), 0,
vg->extent_size, 0, 0, 0UL, UINT64_C(0),
- &fid->metadata_areas_in_use, pv, vg)) {
+ mdas, pv, vg)) {
log_error("Format-specific setup of physical volume '%s' "
"failed.", pv_name);
return 0;
More information about the lvm-devel
mailing list