[lvm-devel] [PATCH 1/3] Add a couple of lvmcache functions to aid in lookups by pvname.
Dave Wysochanski
dwysocha at redhat.com
Sat Feb 13 00:51:48 UTC 2010
It would be nice to clean up some of the pv handling and move away from
the pv as a standalone object. To this end, I introduce a couple helper
functions from lvmcache which allow us to lookup a vgname from a pvname
and an info struct from a pvname. These functions will be used later
in a library function that we will export and will aid in cleaning
up the pv handling.
Signed-off-by: Dave Wysochanski <dwysocha at redhat.com>
---
lib/cache/lvmcache.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++
lib/cache/lvmcache.h | 2 +
2 files changed, 62 insertions(+), 0 deletions(-)
diff --git a/lib/cache/lvmcache.c b/lib/cache/lvmcache.c
index 35ee05b..074d591 100644
--- a/lib/cache/lvmcache.c
+++ b/lib/cache/lvmcache.c
@@ -499,6 +499,66 @@ struct lvmcache_info *info_from_pvid(const char *pvid, int valid_only)
return info;
}
+struct lvmcache_info *info_from_pvname(const char *pvname, int valid_only)
+{
+ struct dm_hash_node *n;
+ struct lvmcache_info *info;
+ char *id;
+
+ if (!_pvid_hash | !pvname)
+ return_NULL;
+
+ /* FIXME: Might want to use another hash for PV names */
+ dm_hash_iterate(n, _pvid_hash) {
+ if (!dm_hash_get_data(_pvid_hash, n))
+ return_NULL;
+
+ id = dm_hash_get_key(_pvid_hash, n);
+ info = info_from_pvid(id, 1);
+
+ if (!strcmp(dev_name(info->dev), pvname)) {
+ if (valid_only && !_info_is_valid(info))
+ return NULL;
+ else
+ return info;
+ }
+ }
+
+ return NULL;
+}
+
+char *lvmcache_vgname_from_pvname(struct cmd_context *cmd, const char *pvname)
+{
+ struct dm_hash_node *n;
+ struct lvmcache_info *info;
+ char *id;
+ char *vgname;
+
+ if (!_pvid_hash | !pvname)
+ return_NULL;
+
+ /* FIXME: Might want to use another hash for PV names */
+ dm_hash_iterate(n, _pvid_hash) {
+ if (!dm_hash_get_data(_pvid_hash, n))
+ return_NULL;
+
+ id = dm_hash_get_key(_pvid_hash, n);
+ info = info_from_pvid(id, 1);
+
+ if (info->vginfo &&
+ !strcmp(dev_name(info->dev), pvname)) {
+ if (!(vgname = dm_pool_alloc(cmd->mem, NAME_LEN+1))) {
+ log_errno(ENOMEM, "pvname allocation failed");
+ return NULL;
+ }
+ strncpy(vgname, info->vginfo->vgname, NAME_LEN);
+ return vgname;
+ }
+ }
+
+ return NULL;
+}
+
static void _rescan_entry(struct lvmcache_info *info)
{
struct label *label;
diff --git a/lib/cache/lvmcache.h b/lib/cache/lvmcache.h
index 2c14b6c..10d1b7f 100644
--- a/lib/cache/lvmcache.h
+++ b/lib/cache/lvmcache.h
@@ -94,6 +94,8 @@ struct lvmcache_vginfo *vginfo_from_vgid(const char *vgid);
struct lvmcache_info *info_from_pvid(const char *pvid, int valid_only);
const char *vgname_from_vgid(struct dm_pool *mem, const char *vgid);
struct device *device_from_pvid(struct cmd_context *cmd, struct id *pvid);
+char *lvmcache_vgname_from_pvname(struct cmd_context *cmd, const char *pvname);
+struct lvmcache_info *info_from_pvname(const char *pvname, int valid_only);
int vgs_locked(void);
int vgname_is_locked(const char *vgname);
--
1.6.0.6
More information about the lvm-devel
mailing list