summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/cache/lvmcache.c17
-rw-r--r--lib/cache/lvmcache.h1
2 files changed, 14 insertions, 4 deletions
diff --git a/lib/cache/lvmcache.c b/lib/cache/lvmcache.c
index ee7d278f..1d72746d 100644
--- a/lib/cache/lvmcache.c
+++ b/lib/cache/lvmcache.c
@@ -99,6 +99,7 @@ static void _store_metadata(struct volume_group *vg, unsigned precommitted)
{
char uuid[64] __attribute__((aligned(8)));
struct lvmcache_vginfo *vginfo;
+ char *data;
int size;
if (!(vginfo = vginfo_from_vgid((const char *)&vg->id))) {
@@ -106,14 +107,22 @@ static void _store_metadata(struct volume_group *vg, unsigned precommitted)
return;
}
- if (vginfo->vgmetadata)
- _free_cached_vgmetadata(vginfo);
-
- if (!(size = export_vg_to_buffer(vg, &vginfo->vgmetadata))) {
+ if (!(size = export_vg_to_buffer(vg, &data))) {
stack;
+ _free_cached_vgmetadata(vginfo);
return;
}
+ /* Avoid reparsing of the same data string */
+ if (vginfo->vgmetadata && vginfo->vgmetadata_size == size &&
+ strcmp(vginfo->vgmetadata, data) == 0)
+ dm_free(data);
+ else {
+ _free_cached_vgmetadata(vginfo);
+ vginfo->vgmetadata_size = size;
+ vginfo->vgmetadata = data;
+ }
+
vginfo->precommitted = precommitted;
if (!id_write_format((const struct id *)vginfo->vgid, uuid, sizeof(uuid))) {
diff --git a/lib/cache/lvmcache.h b/lib/cache/lvmcache.h
index 080f3b5e..f13cad2b 100644
--- a/lib/cache/lvmcache.h
+++ b/lib/cache/lvmcache.h
@@ -46,6 +46,7 @@ struct lvmcache_vginfo {
char _padding[7];
struct lvmcache_vginfo *next; /* Another VG with same name? */
char *creation_host;
+ size_t vgmetadata_size;
char *vgmetadata; /* Copy of VG metadata as format_text string */
struct config_tree *cft; /* Config tree created from vgmetadata */
/* Lifetime is directly tied to vgmetadata */