summaryrefslogtreecommitdiffstats
path: root/lib/metadata/vg.c
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2011-08-11 17:24:23 +0000
committerZdenek Kabelac <zkabelac@redhat.com>2011-08-11 17:24:23 +0000
commitbb115a7a6ce214734e87d17389f5c7d27454f6cb (patch)
tree81782eb22ec8f42f2078a1277234b59ca3636e76 /lib/metadata/vg.c
parent2836eabc9e20e40f395543a6f4eb354e90f373cd (diff)
downloadlvm2-bb115a7a6ce214734e87d17389f5c7d27454f6cb.tar.gz
lvm2-bb115a7a6ce214734e87d17389f5c7d27454f6cb.tar.xz
lvm2-bb115a7a6ce214734e87d17389f5c7d27454f6cb.zip
Cache and share generated VG structs
Extend vginfo cache with cached VG structure. So if the same metadata are use, skip mda decoding in the case, the same data are in use. This helps for operations like activation of all LVs in one VG, where same data were decoded giving the same output result. Patch adds 1-to-1 connection between volume_group and lvmcache_vginfo.
Diffstat (limited to 'lib/metadata/vg.c')
-rw-r--r--lib/metadata/vg.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/lib/metadata/vg.c b/lib/metadata/vg.c
index ef88a4d3..7aaea3e3 100644
--- a/lib/metadata/vg.c
+++ b/lib/metadata/vg.c
@@ -18,6 +18,7 @@
#include "display.h"
#include "activate.h"
#include "toolcontext.h"
+#include "lvmcache.h"
struct volume_group *alloc_vg(const char *pool_name, struct cmd_context *cmd,
const char *vg_name)
@@ -49,6 +50,8 @@ struct volume_group *alloc_vg(const char *pool_name, struct cmd_context *cmd,
dm_list_init(&vg->tags);
dm_list_init(&vg->removed_pvs);
+ log_debug("Allocated VG %s at %p.", vg->name, vg);
+
return vg;
}
@@ -62,6 +65,8 @@ static void _free_vg(struct volume_group *vg)
return;
}
+ log_debug("Freeing VG %s at %p.", vg->name, vg);
+
dm_pool_destroy(vg->vgmem);
}
@@ -70,6 +75,11 @@ void release_vg(struct volume_group *vg)
if (!vg)
return;
+ /* Check if there are any vginfo holders */
+ if (vg->vginfo &&
+ !vginfo_holders_dec_and_test_for_zero(vg->vginfo))
+ return;
+
_free_vg(vg);
}