summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Teigland <teigland@redhat.com>2015-11-30 15:12:01 -0600
committerDavid Teigland <teigland@redhat.com>2015-11-30 15:19:38 -0600
commita4ac6c87cd9fd00ec5a85597ece38b4cd2cc1be5 (patch)
treebab33bede00528ef5eea721b49b93e940a0ae5c3
parentcf20dc7762a203e1feed75fd699baa6dcee694e8 (diff)
downloadlvm2-dev-dct-dupvgnamesD.tar.gz
vg_read: look up vgid from namedev-dct-dupvgnamesD
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.
-rw-r--r--lib/cache/lvmcache.c17
-rw-r--r--lib/cache/lvmcache.h1
-rw-r--r--lib/metadata/metadata.c10
3 files changed, 27 insertions, 1 deletions
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;