From a4ac6c87cd9fd00ec5a85597ece38b4cd2cc1be5 Mon Sep 17 00:00:00 2001 From: David Teigland Date: Mon, 30 Nov 2015 15:12:01 -0600 Subject: vg_read: look up vgid from name When vg_read is given a vgid, it looks up the vgname in lvmcache. Now, in the same way, when vg_read is given a vgname, look up the vgid in lvmcache. --- lib/cache/lvmcache.c | 17 +++++++++++++++++ lib/cache/lvmcache.h | 1 + lib/metadata/metadata.c | 10 +++++++++- 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/lib/cache/lvmcache.c b/lib/cache/lvmcache.c index 985ff43a5..e375388fb 100644 --- a/lib/cache/lvmcache.c +++ b/lib/cache/lvmcache.c @@ -614,6 +614,23 @@ const char *lvmcache_vgname_from_vgid(struct dm_pool *mem, const char *vgid) return vgname; } +const char *lvmcache_vgid_from_vgname(struct cmd_context *cmd, const char *vgname) +{ + struct lvmcache_vginfo *vginfo; + + if (!(vginfo = dm_hash_lookup(_vgname_hash, vgname))) + return_NULL; + + if (!vginfo->next) + return dm_pool_strdup(cmd->mem, vginfo->vgid); + + /* + * There are multiple VGs with this name to choose from. + * Return an error because we don't know which VG is intended. + */ + return NULL; +} + static int _info_is_valid(struct lvmcache_info *info) { if (info->status & CACHE_INVALID) diff --git a/lib/cache/lvmcache.h b/lib/cache/lvmcache.h index b968a12e9..509cfd6f6 100644 --- a/lib/cache/lvmcache.h +++ b/lib/cache/lvmcache.h @@ -99,6 +99,7 @@ struct lvmcache_vginfo *lvmcache_vginfo_from_vgname(const char *vgname, struct lvmcache_vginfo *lvmcache_vginfo_from_vgid(const char *vgid); struct lvmcache_info *lvmcache_info_from_pvid(const char *pvid, int valid_only); const char *lvmcache_vgname_from_vgid(struct dm_pool *mem, const char *vgid); +const char *lvmcache_vgid_from_vgname(struct cmd_context *cmd, const char *vgname); struct device *lvmcache_device_from_pvid(struct cmd_context *cmd, const struct id *pvid, unsigned *scan_done_once, uint64_t *label_sector); const char *lvmcache_pvid_from_devname(struct cmd_context *cmd, diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c index bf030d37f..ec645ae14 100644 --- a/lib/metadata/metadata.c +++ b/lib/metadata/metadata.c @@ -3617,8 +3617,16 @@ static struct volume_group *_vg_read(struct cmd_context *cmd, } /* Now determine the correct vgname if none was supplied */ - if (!vgname && !(vgname = lvmcache_vgname_from_vgid(cmd->mem, vgid))) + if (!vgname && !(vgname = lvmcache_vgname_from_vgid(cmd->mem, vgid))) { + log_debug_metadata("Cache did not find VG name from vgid %.32s", vgid); return_NULL; + } + + /* Determine the correct vgid if none was supplied */ + if (!vgid && !(vgid = lvmcache_vgid_from_vgname(cmd, vgname))) { + log_debug_metadata("Cache did not find VG vgid from name %s", vgname); + return_NULL; + } if (use_precommitted && !(fmt->features & FMT_PRECOMMIT)) use_precommitted = 0; -- cgit v1.2.1