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:
parent
9e111ef67a
commit
f61cd7b249
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user