diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/cache/lvmcache.c | 17 | ||||
-rw-r--r-- | lib/cache/lvmcache.h | 1 |
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 */ |