[lvm-devel] master - lv_manip: add get_lv_type_name/lv_is_linear and lv_is_striped helper fns

Peter Rajnoha prajnoha at fedoraproject.org
Fri Jul 4 14:00:14 UTC 2014


Gitweb:        http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=6b58647848dca8f0e7bab04f4c6491dab28173ff
Commit:        6b58647848dca8f0e7bab04f4c6491dab28173ff
Parent:        a4734354ceedffc72314feb5323e73e63d5e8ec8
Author:        Peter Rajnoha <prajnoha at redhat.com>
AuthorDate:    Tue Jul 1 10:37:01 2014 +0200
Committer:     Peter Rajnoha <prajnoha at redhat.com>
CommitterDate: Fri Jul 4 15:40:17 2014 +0200

lv_manip: add get_lv_type_name/lv_is_linear and lv_is_striped helper fns

The get_lv_type_name helps with translating volume type
to human readable form (can be used in reports or
various messages if needed).

The lv_is_linear and lv_is_striped complete the set of
lv_is_* functions that identify exact volume types.
---
 lib/metadata/lv_manip.c          |  147 ++++++++++++++++++++++++++++++++++++++
 lib/metadata/metadata-exported.h |    8 ++
 2 files changed, 155 insertions(+), 0 deletions(-)

diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index 306a34b..fc98b2a 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -82,6 +82,153 @@ struct pv_and_int {
 	struct physical_volume *pv;
 	int *i;
 };
+
+typedef enum {
+	LV_TYPE_UNKNOWN,
+	LV_TYPE_PVMOVE,
+	LV_TYPE_ORIGIN,
+	LV_TYPE_EXTERNAL_ORIGIN,
+	LV_TYPE_SNAPSHOT,
+	LV_TYPE_THIN,
+	LV_TYPE_THIN_SNAPSHOT,
+	LV_TYPE_THIN_POOL,
+	LV_TYPE_THIN_POOL_DATA,
+	LV_TYPE_THIN_POOL_METADATA,
+	LV_TYPE_THIN_POOL_METADATA_SPARE,
+	LV_TYPE_CACHE,
+	LV_TYPE_CACHE_POOL,
+	LV_TYPE_CACHE_POOL_DATA,
+	LV_TYPE_CACHE_POOL_METADATA,
+	LV_TYPE_CACHE_POOL_METADATA_SPARE,
+	LV_TYPE_VIRTUAL,
+	LV_TYPE_RAID,
+	LV_TYPE_RAID_IMAGE,
+	LV_TYPE_RAID_METADATA,
+	LV_TYPE_MIRROR,
+	LV_TYPE_MIRROR_IMAGE,
+	LV_TYPE_MIRROR_LOG,
+	LV_TYPE_LINEAR,
+	LV_TYPE_STRIPED
+} lv_type_t;
+
+static const char *_lv_type_names[] = {
+	[LV_TYPE_UNKNOWN] =                     "unknown",
+	[LV_TYPE_PVMOVE] =                      "pvmove",
+	[LV_TYPE_ORIGIN] =                      "origin",
+	[LV_TYPE_EXTERNAL_ORIGIN] =             "external-origin",
+	[LV_TYPE_SNAPSHOT] =                    "snapshot",
+	[LV_TYPE_THIN] =                        "thin",
+	[LV_TYPE_THIN_SNAPSHOT] =               "thin-snapshot",
+	[LV_TYPE_THIN_POOL] =                   "thin-pool",
+	[LV_TYPE_THIN_POOL_DATA] =              "thin-pool-data",
+	[LV_TYPE_THIN_POOL_METADATA] =          "thin-pool-metadata",
+	[LV_TYPE_THIN_POOL_METADATA_SPARE] =    "thin-pool-metadata-spare",
+	[LV_TYPE_CACHE] =                       "cache",
+	[LV_TYPE_CACHE_POOL] =                  "cache-pool",
+	[LV_TYPE_CACHE_POOL_DATA] =             "cache-pool-data",
+	[LV_TYPE_CACHE_POOL_METADATA] =         "cache-pool-metadata",
+	[LV_TYPE_CACHE_POOL_METADATA_SPARE] =   "cache-pool-metadata-spare",
+	[LV_TYPE_VIRTUAL] =                     "virtual",
+	[LV_TYPE_RAID] =                        "raid",
+	[LV_TYPE_RAID_IMAGE] =                  "raid-image",
+	[LV_TYPE_RAID_METADATA] =               "raid-metadata",
+	[LV_TYPE_MIRROR] =                      "mirror",
+	[LV_TYPE_MIRROR_IMAGE] =                "mirror-image",
+	[LV_TYPE_MIRROR_LOG] =                  "mirror-log",
+	[LV_TYPE_LINEAR] =                      "linear",
+	[LV_TYPE_STRIPED] =                     "striped"
+};
+
+static lv_type_t _get_lv_type(const struct logical_volume *lv)
+{
+	lv_type_t type = LV_TYPE_UNKNOWN;
+	struct lv_segment *seg;
+
+	if (lv->status & PVMOVE)
+		type = LV_TYPE_PVMOVE;
+	else if (lv_is_origin(lv))
+		type = LV_TYPE_ORIGIN;
+	else if (lv_is_external_origin(lv))
+		type = LV_TYPE_EXTERNAL_ORIGIN;
+	else if (lv_is_cow(lv))
+		type = LV_TYPE_SNAPSHOT;
+	else if (lv_is_thin_volume(lv))
+		type = first_seg(lv)->origin ? LV_TYPE_THIN_SNAPSHOT : LV_TYPE_THIN;
+	else if (lv_is_thin_pool(lv))
+		type = LV_TYPE_THIN_POOL;
+	else if (lv_is_thin_pool_data(lv))
+		type = LV_TYPE_THIN_POOL_DATA;
+	else if (lv_is_thin_pool_metadata(lv))
+		type = LV_TYPE_THIN_POOL_METADATA;
+	else if (lv_is_pool_metadata_spare(lv))
+		type = LV_TYPE_THIN_POOL_METADATA_SPARE;
+	else if (lv_is_cache(lv))
+		type = LV_TYPE_CACHE;
+	else if (lv_is_cache_pool(lv))
+		type = LV_TYPE_CACHE_POOL;
+	else if (lv_is_cache_pool_data(lv))
+		type = LV_TYPE_CACHE_POOL_DATA;
+	else if (lv_is_cache_pool_metadata(lv))
+		type = LV_TYPE_CACHE_POOL_METADATA;
+	else if (lv_is_pool_metadata_spare(lv))
+		type = LV_TYPE_CACHE_POOL_METADATA_SPARE;
+	else if (lv_is_virtual(lv))
+		type = LV_TYPE_VIRTUAL;
+	else if (lv_is_raid(lv))
+		type = LV_TYPE_RAID;
+	else if (lv_is_raid_image(lv))
+		type = LV_TYPE_RAID_IMAGE;
+	else if (lv_is_raid_metadata(lv))
+		type = LV_TYPE_RAID_METADATA;
+	else if (lv_is_mirrored(lv))
+		type = LV_TYPE_MIRROR;
+	else if (lv_is_mirror_image(lv))
+		type = LV_TYPE_MIRROR_IMAGE;
+	else if (lv_is_mirror_log(lv))
+		type = LV_TYPE_MIRROR_LOG;
+
+	/* none of the above, check linear... */
+	if (type == LV_TYPE_UNKNOWN) {
+		type = LV_TYPE_LINEAR;
+		dm_list_iterate_items(seg, &lv->segments) {
+			if (!seg_is_linear(seg)) {
+				type = LV_TYPE_UNKNOWN;
+				break;
+			}
+		}
+	}
+
+	/* ...if not even linear, check striped... */
+	if (type == LV_TYPE_UNKNOWN) {
+		type = LV_TYPE_STRIPED;
+		dm_list_iterate_items(seg, &lv->segments) {
+			if (!seg_is_striped(seg)) {
+				type = LV_TYPE_UNKNOWN;
+				break;
+			}
+		}
+	}
+
+	return type;
+}
+
+const char *lv_type_name(const struct logical_volume *lv) {
+	lv_type_t type = _get_lv_type(lv);
+	return _lv_type_names[type];
+}
+
+int lv_is_linear(const struct logical_volume *lv)
+{
+	lv_type_t type = _get_lv_type(lv);
+	return type == LV_TYPE_LINEAR;
+}
+
+int lv_is_striped(const struct logical_volume *lv)
+{
+	lv_type_t type = _get_lv_type(lv);
+	return type == LV_TYPE_STRIPED;
+}
+
 static int _lv_is_on_pv(struct logical_volume *lv, void *data)
 {
 	int *is_on_pv = ((struct pv_and_int *)data)->i;
diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h
index 85ea944..bfb4651 100644
--- a/lib/metadata/metadata-exported.h
+++ b/lib/metadata/metadata-exported.h
@@ -899,6 +899,14 @@ int get_pv_list_for_lv(struct dm_pool *mem,
 struct lv_segment *first_seg(const struct logical_volume *lv);
 struct lv_segment *last_seg(const struct logical_volume *lv);
 
+/* Human-readable LV type name. */
+const char *lv_type_name(const struct logical_volume *lv);
+
+/*
+ * Useful function to determine linear and striped volumes.
+ */
+int lv_is_linear(const struct logical_volume *lv);
+int lv_is_striped(const struct logical_volume *lv);
 
 /*
 * Useful functions for managing snapshots.




More information about the lvm-devel mailing list