]> sourceware.org Git - lvm2.git/commitdiff
vg_read: reuse already parsed config tree
authorZdenek Kabelac <zkabelac@redhat.com>
Fri, 5 Mar 2021 22:04:44 +0000 (23:04 +0100)
committerZdenek Kabelac <zkabelac@redhat.com>
Mon, 8 Mar 2021 14:30:18 +0000 (15:30 +0100)
When parsing VG metadata we can create from a single config tree
also 'vg_committed' that is always created for writable VG.

This avoids extra uncessary step of serializing and deserilizing
just parsed VG.

lib/format_text/import.c
lib/metadata/metadata.c
lib/metadata/vg.c
lib/metadata/vg.h

index 2dc80f13fc34b311f337dcae93d48f5810d34585..2687d172e3ed69195981256b2db612cf330427c5 100644 (file)
@@ -186,6 +186,8 @@ struct volume_group *text_read_metadata(struct format_instance *fid,
                        goto_out;
 
                (*vsn)->read_desc(vg->vgmem, cft, when, desc);
+               vg->committed_cft = cft; /* Reuse CFT for recreation of committed VG */
+               cft = NULL;
                break;
        }
 
@@ -198,7 +200,8 @@ struct volume_group *text_read_metadata(struct format_instance *fid,
                *use_previous_vg = 0;
 
       out:
-       config_destroy(cft);
+       if (cft)
+               config_destroy(cft);
        return vg;
 }
 
index daf49827f2887074fef41e2a7cd59d1fb3c1f0ef..5410eac60c295e77d0ca046ffa39490e6252d18b 100644 (file)
@@ -5186,8 +5186,6 @@ struct volume_group *vg_read(struct cmd_context *cmd, const char *vg_name, const
         * FIXME: be specific about exactly when this works correctly.
         */
        if (writing) {
-               struct dm_config_tree *cft;
-
                if (dm_pool_locked(vg->vgmem)) {
                        /* FIXME: can this happen? */
                        log_warn("WARNING: vg_read no vg copy: pool locked.");
@@ -5208,15 +5206,15 @@ struct volume_group *vg_read(struct cmd_context *cmd, const char *vg_name, const
                        vg->vg_precommitted = NULL;
                }
 
-               if (!(cft = export_vg_to_config_tree(vg))) {
+               if (!vg->committed_cft) {
                        log_warn("WARNING: vg_read no vg copy: copy export failed.");
-                       goto out;
+                       if (!(vg->committed_cft = export_vg_to_config_tree(vg)))
+                               goto out;
                }
 
-               if (!(vg->vg_committed = import_vg_from_config_tree(cmd, vg->fid, cft)))
+               if (!(vg->vg_committed = import_vg_from_config_tree(cmd, vg->fid, vg->committed_cft)))
                        log_warn("WARNING: vg_read no vg copy: copy import failed.");
 
-               dm_config_destroy(cft);
        } else {
                if (vg->vg_precommitted)
                        log_error(INTERNAL_ERROR "vg_read vg %p vg_precommitted %p", (void *)vg, (void *)vg->vg_precommitted);
index 9a8693c0baf09e0b66269908163c2005c3226b3b..e659579c253930bd9b1f80c32c1ed09b5e0cdb34 100644 (file)
@@ -79,6 +79,8 @@ static void _free_vg(struct volume_group *vg)
 
        log_debug_mem("Freeing VG %s at %p.", vg->name ? : "<no name>", (void *)vg);
 
+       if (vg->committed_cft)
+               config_destroy(vg->committed_cft);
        dm_hash_destroy(vg->hostnames);
        dm_pool_destroy(vg->vgmem);
 }
index fa1b036210fb5351e1b2224a2458ff74928663a8..36d1ed1556c94f404399c20c73b679e5d375aee0 100644 (file)
@@ -50,9 +50,9 @@ struct volume_group {
         * The parsed committed (on-disk) copy of this VG; is NULL if this VG is committed
         * version (i.e. vg_committed == NULL *implies* this is the committed copy,
         * there is no guarantee that if this VG is the same as the committed one
-        * this will be NULL). The pointer is maintained by calls to
-        * _vg_update_vg_committed.
+        * this will be NULL). The pointer is maintained by calls to vg_write & vg_commit
         */
+       struct dm_config_tree *committed_cft;
        struct volume_group *vg_committed;
        struct volume_group *vg_precommitted;
 
This page took 0.039737 seconds and 5 git commands to generate.