From 8b4677dca33bfa332a2e2cc59c09d2f6e4a37cea Mon Sep 17 00:00:00 2001 From: Dave Wysochanski Date: Wed, 22 Jul 2009 22:24:16 +0000 Subject: [PATCH] Add lvm_vg_open() to open an existing VG for reading or writing. lvm_vg_open() calls internal vg_read() function which is the entry point for reading an existing VG. In addition to the mode, we include a 'flags' parameter for future extensions. Signed-off-by: Dave Wysochanski --- liblvm/.exported_symbols | 1 + liblvm/lvm.h | 23 +++++++++++++++++++++++ liblvm/lvm_vg.c | 26 ++++++++++++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/liblvm/.exported_symbols b/liblvm/.exported_symbols index 8f4b6c716..3895c9d34 100644 --- a/liblvm/.exported_symbols +++ b/liblvm/.exported_symbols @@ -5,6 +5,7 @@ lvm_vg_create lvm_vg_extend lvm_vg_set_extent_size lvm_vg_write +lvm_vg_open lvm_vg_close lvm_vg_remove lvm_errno diff --git a/liblvm/lvm.h b/liblvm/lvm.h index e179d8727..5805546c2 100644 --- a/liblvm/lvm.h +++ b/liblvm/lvm.h @@ -190,4 +190,27 @@ int lvm_vg_remove(vg_t *vg); */ int lvm_vg_close(vg_t *vg); +/** + * Open an existing VG. + * + * Open a VG for reading or writing. + * + * \param libh + * Handle obtained from lvm_create. + * + * \param vgname + * Name of the VG to open. + * + * \param mode + * Open mode - either "r" (read) or "w" (read/write). + * Any other character results in an error with EINVAL set. + * + * \param flags + * Open flags - currently ignored. + * + * \return non-NULL VG handle (success) or NULL (failure). + */ +vg_t *lvm_vg_open(lvm_t libh, const char *vgname, const char *mode, + uint32_t flags); + #endif /* _LIB_LVM_H */ diff --git a/liblvm/lvm_vg.c b/liblvm/lvm_vg.c index f4341633e..b8348757f 100644 --- a/liblvm/lvm_vg.c +++ b/liblvm/lvm_vg.c @@ -12,6 +12,9 @@ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include +#include + #include "lib.h" #include "lvm.h" #include "toolcontext.h" @@ -80,3 +83,26 @@ int lvm_vg_remove(vg_t *vg) bad: return 0; } + +vg_t *lvm_vg_open(lvm_t libh, const char *vgname, const char *mode, + uint32_t flags) +{ + uint32_t internal_flags = 0; + vg_t *vg; + + if (!strncmp(mode, "w", 1)) + internal_flags |= READ_FOR_UPDATE; + else if (strncmp(mode, "r", 1)) { + log_errno(EINVAL, "Invalid VG open mode"); + return NULL; + } + + vg = vg_read((struct cmd_context *)libh, vgname, NULL, internal_flags); + if (vg_read_error(vg)) { + /* FIXME: use log_errno either here in inside vg_read */ + vg_release(vg); + return NULL; + } + + return vg; +}