1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-18 10:04:20 +03:00

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@redhat.com>
This commit is contained in:
Dave Wysochanski 2010-06-28 20:38:39 +00:00
parent 9e111ef67a
commit f61cd7b249

View File

@ -174,6 +174,7 @@ int add_pv_to_vg(struct volume_group *vg, const char *pv_name,
struct format_instance *fid = vg->fid; struct format_instance *fid = vg->fid;
struct dm_pool *mem = vg->vgmem; struct dm_pool *mem = vg->vgmem;
char uuid[64] __attribute((aligned(8))); char uuid[64] __attribute((aligned(8)));
struct dm_list *mdas;
log_verbose("Adding physical volume '%s' to volume group '%s'", log_verbose("Adding physical volume '%s' to volume group '%s'",
pv_name, vg->name); pv_name, vg->name);
@ -217,9 +218,24 @@ int add_pv_to_vg(struct volume_group *vg, const char *pv_name,
*/ */
pv->pe_alloc_count = 0; 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, if (!fid->fmt->ops->pv_setup(fid->fmt, UINT64_C(0), 0,
vg->extent_size, 0, 0, 0UL, UINT64_C(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' " log_error("Format-specific setup of physical volume '%s' "
"failed.", pv_name); "failed.", pv_name);
return 0; return 0;