]> sourceware.org Git - lvm2.git/commitdiff
Ensure fid mda lists are populated correctly during vgextend.
authorDave Wysochanski <dwysocha@redhat.com>
Mon, 28 Jun 2010 20:38:39 +0000 (20:38 +0000)
committerDave Wysochanski <dwysocha@redhat.com>
Mon, 28 Jun 2010 20:38:39 +0000 (20:38 +0000)
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>
lib/metadata/metadata.c

index d6ba01524724ca4aa983b08ffba66ccfaaa9e818..1ba7867c82112ff8731c2d9afb37556b1d6cb837 100644 (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 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 @@ int add_pv_to_vg(struct volume_group *vg, const char *pv_name,
         */
        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;
This page took 0.041835 seconds and 5 git commands to generate.