summaryrefslogtreecommitdiff
path: root/lib/metadata/metadata.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/metadata/metadata.c')
-rw-r--r--lib/metadata/metadata.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
index a1a31eb27..ec9e9f6fc 100644
--- a/lib/metadata/metadata.c
+++ b/lib/metadata/metadata.c
@@ -4017,6 +4017,54 @@ struct dm_list *get_vgids(struct cmd_context *cmd, int include_internal)
return lvmcache_get_vgids(cmd, include_internal);
}
+int get_vgnameids(struct cmd_context *cmd, struct dm_list *vgnameids,
+ const char *only_this_vgname, int include_internal)
+{
+ struct vgnameid_list *vgnl;
+ struct format_type *fmt;
+
+ if (only_this_vgname) {
+ if (!(vgnl = dm_pool_alloc(cmd->mem, sizeof(*vgnl)))) {
+ log_error("vgnameid_list allocation failed.");
+ return 0;
+ }
+
+ vgnl->vg_name = dm_pool_strdup(cmd->mem, only_this_vgname);
+ vgnl->vgid = NULL;
+ dm_list_add(vgnameids, &vgnl->list);
+ return 1;
+ }
+
+ if (lvmetad_active()) {
+ /*
+ * This just gets the list of names/ids from lvmetad
+ * and does not populate lvmcache.
+ */
+ lvmetad_get_vgnameids(cmd, vgnameids);
+
+ if (include_internal) {
+ dm_list_iterate_items(fmt, &cmd->formats) {
+ if (!(vgnl = dm_pool_alloc(cmd->mem, sizeof(*vgnl)))) {
+ log_error("vgnameid_list allocation failed.");
+ return 0;
+ }
+
+ vgnl->vg_name = dm_pool_strdup(cmd->mem, fmt->orphan_vg_name);
+ vgnl->vgid = NULL;
+ dm_list_add(vgnameids, &vgnl->list);
+ }
+ }
+ } else {
+ /*
+ * The non-lvmetad case. This function begins by calling
+ * lvmcache_label_scan() to populate lvmcache.
+ */
+ lvmcache_get_vgnameids(cmd, include_internal, vgnameids);
+ }
+
+ return 1;
+}
+
static int _get_pvs(struct cmd_context *cmd, uint32_t warn_flags,
struct dm_list *pvslist, struct dm_list *vgslist)
{