summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Rajnoha <prajnoha@redhat.com>2016-03-01 15:19:23 +0100
committerPeter Rajnoha <prajnoha@redhat.com>2016-03-03 11:26:51 +0100
commit937f72b168302c9d8acb1a8e06525106df00fe2f (patch)
tree635a5fec3410f827fab9baff1914c4131d4c4aac
parente573eca554374ba6889a7f89fcb9850ae13c793e (diff)
downloadlvm2-937f72b168302c9d8acb1a8e06525106df00fe2f.tar.gz
metadata: add get_or_create_glv and get_or_create_glvl
The get_or_create_glv is helper function that retrieves any existing generic_logical_volume wrapper for the LV. If the wrapper does not exist yet, it's created. The get_org_create_glvl is the same as get_or_create_glv but it creates the glv_list wrapper in addition so it can be added to a list.
-rw-r--r--lib/metadata/lv_manip.c36
-rw-r--r--lib/metadata/metadata-exported.h3
2 files changed, 39 insertions, 0 deletions
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index 069042c0f..da6077085 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -5307,6 +5307,42 @@ char *generate_lv_name(struct volume_group *vg, const char *format,
return buffer;
}
+struct generic_logical_volume *get_or_create_glv(struct dm_pool*mem, struct logical_volume *lv, int *glv_created)
+{
+ struct generic_logical_volume *glv;
+
+ if (!(glv = lv->this_glv)) {
+ if (!(glv = dm_pool_zalloc(mem, sizeof(struct generic_logical_volume)))) {
+ log_error("Failed to allocate generic logical volume structure.");
+ return NULL;
+ }
+ glv->live = lv;
+ lv->this_glv = glv;
+ if (glv_created)
+ *glv_created = 1;
+ } else if (glv_created)
+ *glv_created = 0;
+
+ return glv;
+}
+
+struct glv_list *get_or_create_glvl(struct dm_pool *mem, struct logical_volume *lv, int *glv_created)
+{
+ struct glv_list *glvl;
+
+ if (!(glvl = dm_pool_zalloc(mem, sizeof(struct glv_list)))) {
+ log_error("Failed to allocate generic logical volume list item.");
+ return NULL;
+ }
+
+ if (!(glvl->glv = get_or_create_glv(mem, lv, glv_created))) {
+ dm_pool_free(mem, glvl);
+ return_NULL;
+ }
+
+ return glvl;
+}
+
struct logical_volume *alloc_lv(struct dm_pool *mem)
{
struct logical_volume *lv;
diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h
index 97cba5117..76597ba6f 100644
--- a/lib/metadata/metadata-exported.h
+++ b/lib/metadata/metadata-exported.h
@@ -1238,6 +1238,9 @@ dm_percent_t copy_percent(const struct logical_volume *lv_mirr);
char *generate_lv_name(struct volume_group *vg, const char *format,
char *buffer, size_t len);
+struct generic_logical_volume *get_or_create_glv(struct dm_pool *mem, struct logical_volume *lv, int *glv_created);
+struct glv_list *get_or_create_glvl(struct dm_pool *mem, struct logical_volume *lv, int *glv_created);
+
/*
* Begin skeleton for external LVM library
*/