diff options
Diffstat (limited to 'lib/cache/lvmcache.c')
-rw-r--r-- | lib/cache/lvmcache.c | 17 |
1 files changed, 13 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))) { |