diff options
author | Peter Rajnoha <prajnoha@redhat.com> | 2016-03-01 15:19:23 +0100 |
---|---|---|
committer | Peter Rajnoha <prajnoha@redhat.com> | 2016-03-03 11:26:51 +0100 |
commit | 937f72b168302c9d8acb1a8e06525106df00fe2f (patch) | |
tree | 635a5fec3410f827fab9baff1914c4131d4c4aac | |
parent | e573eca554374ba6889a7f89fcb9850ae13c793e (diff) | |
download | lvm2-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.c | 36 | ||||
-rw-r--r-- | lib/metadata/metadata-exported.h | 3 |
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 */ |