summaryrefslogtreecommitdiffstats
path: root/liblvm
diff options
context:
space:
mode:
authorDave Wysochanski <dwysocha@redhat.com>2010-02-24 18:16:26 +0000
committerDave Wysochanski <dwysocha@redhat.com>2010-02-24 18:16:26 +0000
commita6ca9ac0bc97e260f59134e8baa9cdefa577fbb4 (patch)
treebec5674b451f21e5f529e4bf80d4300e9acf5686 /liblvm
parenta8ab58677074d4e112e3dc3a2eb10b964a457a99 (diff)
downloadlvm2-a6ca9ac0bc97e260f59134e8baa9cdefa577fbb4.tar.gz
lvm2-a6ca9ac0bc97e260f59134e8baa9cdefa577fbb4.tar.xz
lvm2-a6ca9ac0bc97e260f59134e8baa9cdefa577fbb4.zip
Add lvm_lv_get_tags(), lvm_lv_add_tag(), and lvm_lv_remove_tag().
Add lvm2app functions to manage LV tags. For lvm_lv_get_tags(), we return a list of tags, similar to other functions that return lists. An empty list is returned if there are no tags. NULL is returned if there is a problem obtaining the list of tags. Signed-off-by: Dave Wysochanski <dwysocha@redhat.com>
Diffstat (limited to 'liblvm')
-rw-r--r--liblvm/.exported_symbols3
-rw-r--r--liblvm/lvm2app.h48
-rw-r--r--liblvm/lvm_lv.c35
3 files changed, 86 insertions, 0 deletions
diff --git a/liblvm/.exported_symbols b/liblvm/.exported_symbols
index 74312489..9b61d452 100644
--- a/liblvm/.exported_symbols
+++ b/liblvm/.exported_symbols
@@ -26,6 +26,9 @@ lvm_lv_get_name
lvm_lv_get_size
lvm_lv_is_active
lvm_lv_is_suspended
+lvm_lv_add_tag
+lvm_lv_remove_tag
+lvm_lv_get_tags
lvm_vg_create
lvm_vg_extend
lvm_vg_reduce
diff --git a/liblvm/lvm2app.h b/liblvm/lvm2app.h
index 41ce18c9..e0523012 100644
--- a/liblvm/lvm2app.h
+++ b/liblvm/lvm2app.h
@@ -835,6 +835,54 @@ uint64_t lvm_lv_is_active(const lv_t lv);
uint64_t lvm_lv_is_suspended(const lv_t lv);
/**
+ * Add/remove a tag to/from a LV.
+ *
+ * These functions require calling lvm_vg_write to commit the change to disk.
+ * After successfully adding/removing a tag, use lvm_vg_write to commit the
+ * new VG to disk. Upon failure, retry the operation or release the VG handle
+ * with lvm_vg_close.
+ *
+ * \param lv
+ * Logical volume handle.
+ *
+ * \param tag
+ * Tag to add/remove to/from LV.
+ *
+ * \return
+ * 0 (success) or -1 (failure).
+ */
+int lvm_lv_add_tag(lv_t lv, const char *tag);
+int lvm_lv_remove_tag(lv_t lv, const char *tag);
+
+/**
+ * Return the list of logical volume tags.
+ *
+ * The memory allocated for the list is tied to the vg_t handle and will be
+ * released when lvm_vg_close is called.
+ *
+ * To process the list, use the dm_list iterator functions. For example:
+ * lv_t lv;
+ * struct dm_list *tags;
+ * struct lvm_str_list *strl;
+ *
+ * tags = lvm_lv_get_tags(lv);
+ * dm_list_iterate_items(strl, tags) {
+ * tag = strl->str;
+ * // do something with tag
+ * }
+ *
+ *
+ * \return
+ * A list with entries of type struct lvm_str_list, containing the
+ * tag strings attached to volume group.
+ * If no tags are attached to the LV, an empty list is returned
+ * (check with dm_list_empty()).
+ * If there is a problem obtaining the list of tags, NULL is returned.
+ */
+struct dm_list *lvm_lv_get_tags(const lv_t lv);
+
+
+/**
* Resize logical volume to new_size bytes.
*
* NOTE: This function is currently not implemented.
diff --git a/liblvm/lvm_lv.c b/liblvm/lvm_lv.c
index 7a37d2c8..86175aeb 100644
--- a/liblvm/lvm_lv.c
+++ b/liblvm/lvm_lv.c
@@ -20,9 +20,19 @@
#include "segtype.h"
#include "locking.h"
#include "activate.h"
+#include "lvm_misc.h"
#include <string.h>
+static int _lv_check_handle(const lv_t lv, const int vg_writeable)
+{
+ if (!lv || !lv->vg || vg_read_error(lv->vg))
+ return -1;
+ if (vg_writeable && !vg_check_write_mode(lv->vg))
+ return -1;
+ return 0;
+}
+
/* FIXME: have lib/report/report.c _disp function call lv_size()? */
uint64_t lvm_lv_get_size(const lv_t lv)
{
@@ -68,6 +78,31 @@ uint64_t lvm_lv_is_suspended(const lv_t lv)
return 0;
}
+int lvm_lv_add_tag(lv_t lv, const char *tag)
+{
+ if (_lv_check_handle(lv, 1))
+ return -1;
+ if (!lv_change_tag(lv, tag, 1))
+ return -1;
+ return 0;
+}
+
+
+int lvm_lv_remove_tag(lv_t lv, const char *tag)
+{
+ if (_lv_check_handle(lv, 1))
+ return -1;
+ if (!lv_change_tag(lv, tag, 0))
+ return -1;
+ return 0;
+}
+
+
+struct dm_list *lvm_lv_get_tags(const lv_t lv)
+{
+ return tag_list_copy(lv->vg->vgmem, &lv->tags);
+}
+
/* Set defaults for non-segment specific LV parameters */
static void _lv_set_default_params(struct lvcreate_params *lp,
vg_t vg, const char *lvname,