1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-03 05:18:29 +03:00

liblvm: remove lvmapi

This has been deprecated for a while.
This commit is contained in:
Joe Thornber 2018-06-08 09:38:05 +01:00
parent e6bb780d24
commit 0d22b58172
29 changed files with 108 additions and 8708 deletions

View File

@ -28,10 +28,6 @@ ifeq ("@INTL@", "yes")
SUBDIRS += po SUBDIRS += po
endif endif
ifeq ("@APPLIB@", "yes")
SUBDIRS += liblvm
endif
ifeq ("@PYTHON_BINDINGS@", "yes") ifeq ("@PYTHON_BINDINGS@", "yes")
SUBDIRS += python SUBDIRS += python
endif endif
@ -43,7 +39,7 @@ endif
ifeq ($(MAKECMDGOALS),distclean) ifeq ($(MAKECMDGOALS),distclean)
SUBDIRS = conf include man test scripts \ SUBDIRS = conf include man test scripts \
libdaemon lib tools daemons libdm \ libdaemon lib tools daemons libdm \
udev po liblvm python udev po python
tools.distclean: test.distclean tools.distclean: test.distclean
endif endif
DISTCLEAN_DIRS += lcov_reports* DISTCLEAN_DIRS += lcov_reports*
@ -54,18 +50,16 @@ include make.tmpl
libdm: include libdm: include
libdaemon: include libdaemon: include
lib: libdm libdaemon lib: libdm libdaemon
liblvm: lib
daemons: lib libdaemon tools daemons: lib libdaemon tools
tools: lib libdaemon device-mapper tools: lib libdaemon device-mapper
po: tools daemons po: tools daemons
man: tools man: tools
all_man: tools all_man: tools
scripts: liblvm libdm scripts: libdm
test: tools daemons test: tools daemons
lib.device-mapper: include.device-mapper lib.device-mapper: include.device-mapper
libdm.device-mapper: include.device-mapper libdm.device-mapper: include.device-mapper
liblvm.device-mapper: include.device-mapper
daemons.device-mapper: libdm.device-mapper daemons.device-mapper: libdm.device-mapper
tools.device-mapper: libdm.device-mapper tools.device-mapper: libdm.device-mapper
scripts.device-mapper: include.device-mapper scripts.device-mapper: include.device-mapper
@ -79,10 +73,6 @@ po.pofile: tools.pofile daemons.pofile
pofile: po.pofile pofile: po.pofile
endif endif
ifeq ("@PYTHON_BINDINGS@", "yes")
python: liblvm
endif
ifneq ("$(CFLOW_CMD)", "") ifneq ("$(CFLOW_CMD)", "")
tools.cflow: libdm.cflow lib.cflow tools.cflow: libdm.cflow lib.cflow
daemons.cflow: tools.cflow daemons.cflow: tools.cflow
@ -159,15 +149,10 @@ install_systemd_units:
install_all_man: install_all_man:
$(MAKE) -C man install_all_man $(MAKE) -C man install_all_man
ifeq ("@PYTHON_BINDINGS@", "yes")
install_python_bindings:
$(MAKE) -C liblvm/python install_python_bindings
endif
install_tmpfiles_configuration: install_tmpfiles_configuration:
$(MAKE) -C scripts install_tmpfiles_configuration $(MAKE) -C scripts install_tmpfiles_configuration
LCOV_TRACES = libdm.info lib.info liblvm.info tools.info \ LCOV_TRACES = libdm.info lib.info tools.info \
libdaemon/client.info libdaemon/server.info \ libdaemon/client.info libdaemon/server.info \
test/unit.info \ test/unit.info \
daemons/clvmd.info \ daemons/clvmd.info \

91
aclocal.m4 vendored
View File

@ -1,6 +1,6 @@
# generated automatically by aclocal 1.15 -*- Autoconf -*- # generated automatically by aclocal 1.15.1 -*- Autoconf -*-
# Copyright (C) 1996-2014 Free Software Foundation, Inc. # Copyright (C) 1996-2017 Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
@ -13,7 +13,7 @@
m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
# =========================================================================== # ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_python_module.html # https://www.gnu.org/software/autoconf-archive/ax_python_module.html
# =========================================================================== # ===========================================================================
# #
# SYNOPSIS # SYNOPSIS
@ -37,7 +37,7 @@ m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun
# and this notice are preserved. This file is offered as-is, without any # and this notice are preserved. This file is offered as-is, without any
# warranty. # warranty.
#serial 8 #serial 9
AU_ALIAS([AC_PYTHON_MODULE], [AX_PYTHON_MODULE]) AU_ALIAS([AC_PYTHON_MODULE], [AX_PYTHON_MODULE])
AC_DEFUN([AX_PYTHON_MODULE],[ AC_DEFUN([AX_PYTHON_MODULE],[
@ -69,9 +69,9 @@ AC_DEFUN([AX_PYTHON_MODULE],[
fi fi
]) ])
dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
dnl serial 11 (pkg-config-0.29) # serial 11 (pkg-config-0.29.1)
dnl
dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>. dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com> dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
dnl dnl
@ -112,7 +112,7 @@ dnl
dnl See the "Since" comment for each macro you use to see what version dnl See the "Since" comment for each macro you use to see what version
dnl of the macros you require. dnl of the macros you require.
m4_defun([PKG_PREREQ], m4_defun([PKG_PREREQ],
[m4_define([PKG_MACROS_VERSION], [0.29]) [m4_define([PKG_MACROS_VERSION], [0.29.1])
m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,
[m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])])
])dnl PKG_PREREQ ])dnl PKG_PREREQ
@ -345,7 +345,75 @@ AS_VAR_COPY([$1], [pkg_cv_][$1])
AS_VAR_IF([$1], [""], [$5], [$4])dnl AS_VAR_IF([$1], [""], [$5], [$4])dnl
])dnl PKG_CHECK_VAR ])dnl PKG_CHECK_VAR
# Copyright (C) 1999-2014 Free Software Foundation, Inc. dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES,
dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND],
dnl [DESCRIPTION], [DEFAULT])
dnl ------------------------------------------
dnl
dnl Prepare a "--with-" configure option using the lowercase
dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and
dnl PKG_CHECK_MODULES in a single macro.
AC_DEFUN([PKG_WITH_MODULES],
[
m4_pushdef([with_arg], m4_tolower([$1]))
m4_pushdef([description],
[m4_default([$5], [build with ]with_arg[ support])])
m4_pushdef([def_arg], [m4_default([$6], [auto])])
m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes])
m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no])
m4_case(def_arg,
[yes],[m4_pushdef([with_without], [--without-]with_arg)],
[m4_pushdef([with_without],[--with-]with_arg)])
AC_ARG_WITH(with_arg,
AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),,
[AS_TR_SH([with_]with_arg)=def_arg])
AS_CASE([$AS_TR_SH([with_]with_arg)],
[yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)],
[auto],[PKG_CHECK_MODULES([$1],[$2],
[m4_n([def_action_if_found]) $3],
[m4_n([def_action_if_not_found]) $4])])
m4_popdef([with_arg])
m4_popdef([description])
m4_popdef([def_arg])
])dnl PKG_WITH_MODULES
dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES,
dnl [DESCRIPTION], [DEFAULT])
dnl -----------------------------------------------
dnl
dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES
dnl check._[VARIABLE-PREFIX] is exported as make variable.
AC_DEFUN([PKG_HAVE_WITH_MODULES],
[
PKG_WITH_MODULES([$1],[$2],,,[$3],[$4])
AM_CONDITIONAL([HAVE_][$1],
[test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"])
])dnl PKG_HAVE_WITH_MODULES
dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES,
dnl [DESCRIPTION], [DEFAULT])
dnl ------------------------------------------------------
dnl
dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after
dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make
dnl and preprocessor variable.
AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES],
[
PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4])
AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"],
[AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])])
])dnl PKG_HAVE_DEFINE_WITH_MODULES
# Copyright (C) 1999-2017 Free Software Foundation, Inc.
# #
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
@ -378,8 +446,9 @@ AC_DEFUN([AM_PATH_PYTHON],
[ [
dnl Find a Python interpreter. Python versions prior to 2.0 are not dnl Find a Python interpreter. Python versions prior to 2.0 are not
dnl supported. (2.0 was released on October 16, 2000). dnl supported. (2.0 was released on October 16, 2000).
dnl FIXME: Remove the need to hard-code Python versions here.
m4_define_default([_AM_PYTHON_INTERPRETER_LIST], m4_define_default([_AM_PYTHON_INTERPRETER_LIST],
[python python2 python3 python3.3 python3.2 python3.1 python3.0 python2.7 dnl [python python2 python3 python3.5 python3.4 python3.3 python3.2 python3.1 python3.0 python2.7 dnl
python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0]) python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0])
AC_ARG_VAR([PYTHON], [the Python interpreter]) AC_ARG_VAR([PYTHON], [the Python interpreter])
@ -580,7 +649,7 @@ for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]]
sys.exit(sys.hexversion < minverhex)" sys.exit(sys.hexversion < minverhex)"
AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])]) AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])])
# Copyright (C) 2001-2014 Free Software Foundation, Inc. # Copyright (C) 2001-2017 Free Software Foundation, Inc.
# #
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,

1996
configure vendored

File diff suppressed because it is too large Load Diff

View File

@ -1108,20 +1108,6 @@ if test "$ODIRECT" = yes; then
AC_DEFINE([O_DIRECT_SUPPORT], 1, [Define to 1 to enable O_DIRECT support.]) AC_DEFINE([O_DIRECT_SUPPORT], 1, [Define to 1 to enable O_DIRECT support.])
fi fi
################################################################################
dnl -- Enable liblvm2app.so
AC_MSG_CHECKING(whether to build liblvm2app.so application library)
AC_ARG_ENABLE(applib,
AC_HELP_STRING([--enable-applib], [build application library]),
APPLIB=$enableval, APPLIB=no)
AC_MSG_RESULT($APPLIB)
AC_SUBST([LVM2APP_LIB])
test "$APPLIB" = yes \
&& LVM2APP_LIB=-llvm2app \
|| LVM2APP_LIB=
AS_IF([test "$APPLIB"],
[AC_MSG_WARN([liblvm2app is deprecated. Use D-Bus API])])
################################################################################ ################################################################################
dnl -- Enable cmdlib dnl -- Enable cmdlib
AC_MSG_CHECKING(whether to compile liblvm2cmd.so) AC_MSG_CHECKING(whether to compile liblvm2cmd.so)
@ -1145,44 +1131,9 @@ AS_IF([test "$NOTIFYDBUS_SUPPORT" = yes && test "BUILD_LVMDBUSD" = yes],
[AC_MSG_WARN([Building D-Bus support without D-Bus notifications.])]) [AC_MSG_WARN([Building D-Bus support without D-Bus notifications.])])
################################################################################ ################################################################################
dnl -- Enable Python liblvm2app bindings dnl -- Enable Python dbus library
AC_MSG_CHECKING(whether to build Python wrapper for liblvm2app.so)
AC_ARG_ENABLE(python_bindings,
AC_HELP_STRING([--enable-python_bindings], [build default Python applib bindings]),
PYTHON_BINDINGS=$enableval, PYTHON_BINDINGS=no)
AC_MSG_RESULT($PYTHON_BINDINGS)
AC_MSG_CHECKING(whether to build Python2 wrapper for liblvm2app.so) if test "$BUILD_LVMDBUSD" = yes; then
AC_ARG_ENABLE(python2_bindings,
AC_HELP_STRING([--enable-python2_bindings], [build Python2 applib bindings]),
PYTHON2_BINDINGS=$enableval, PYTHON2_BINDINGS=no)
AC_MSG_RESULT($PYTHON2_BINDINGS)
AC_MSG_CHECKING(whether to build Python3 wrapper for liblvm2app.so)
AC_ARG_ENABLE(python3_bindings,
AC_HELP_STRING([--enable-python3_bindings], [build Python3 applib bindings]),
PYTHON3_BINDINGS=$enableval, PYTHON3_BINDINGS=no)
AC_MSG_RESULT($PYTHON3_BINDINGS)
if test "$PYTHON_BINDINGS" = yes; then
AC_MSG_ERROR([--enable-python-bindings is replaced by --enable-python2-bindings and --enable-python3-bindings])
fi
if test "$PYTHON2_BINDINGS" = yes; then
AM_PATH_PYTHON([2])
AC_PATH_TOOL(PYTHON2, python2)
test -z "$PYTHON2" && AC_MSG_ERROR([python2 is required for --enable-python2_bindings but cannot be found])
AC_PATH_TOOL(PYTHON2_CONFIG, python2-config)
test -z "$PYTHON2_CONFIG" && AC_PATH_TOOL(PYTHON2_CONFIG, python-config)
test -z "$PYTHON2_CONFIG" && AC_MSG_ERROR([python headers are required for --enable-python2_bindings but cannot be found])
PYTHON2_INCDIRS=`"$PYTHON2_CONFIG" --includes`
PYTHON2_LIBDIRS=`"$PYTHON2_CONFIG" --libs`
PYTHON2DIR=$pythondir
PYTHON_BINDINGS=yes
fi
if test "$PYTHON3_BINDINGS" = yes -o "$BUILD_LVMDBUSD" = yes; then
unset PYTHON PYTHON_CONFIG unset PYTHON PYTHON_CONFIG
unset am_cv_pathless_PYTHON ac_cv_path_PYTHON am_cv_python_platform unset am_cv_pathless_PYTHON ac_cv_path_PYTHON am_cv_python_platform
unset am_cv_python_pythondir am_cv_python_version am_cv_python_pyexecdir unset am_cv_python_pythondir am_cv_python_version am_cv_python_pyexecdir
@ -1196,19 +1147,12 @@ if test "$PYTHON3_BINDINGS" = yes -o "$BUILD_LVMDBUSD" = yes; then
PYTHON3_LIBDIRS=`"$PYTHON3_CONFIG" --libs` PYTHON3_LIBDIRS=`"$PYTHON3_CONFIG" --libs`
PYTHON3DIR=$pythondir PYTHON3DIR=$pythondir
test "$PYTHON3_BINDINGS" = yes && PYTHON_BINDINGS=yes test "$PYTHON3_BINDINGS" = yes && PYTHON_BINDINGS=yes
fi
if test "$BUILD_LVMDBUSD" = yes; then
# To get this macro, install autoconf-archive package then run autoreconf # To get this macro, install autoconf-archive package then run autoreconf
AC_PYTHON_MODULE([pyudev], [Required], python3) AC_PYTHON_MODULE([pyudev], [Required], python3)
AC_PYTHON_MODULE([dbus], [Required], python3) AC_PYTHON_MODULE([dbus], [Required], python3)
fi fi
if test "$PYTHON_BINDINGS" = yes -o "$PYTHON2_BINDINGS" = yes -o "$PYTHON3_BINDINGS" = yes; then
AC_MSG_WARN([Python bindings are deprecated. Use D-Bus API])
test "$APPLIB" != yes && AC_MSG_ERROR([Python_bindings require --enable-applib])
fi
################################################################################ ################################################################################
dnl -- Enable pkg-config dnl -- Enable pkg-config
AC_ARG_ENABLE(pkgconfig, AC_ARG_ENABLE(pkgconfig,
@ -1656,7 +1600,6 @@ LVM_LIBAPI=`echo "$VER" | $AWK -F '[[()]]' '{print $2}'`
AC_DEFINE_UNQUOTED(LVM_CONFIGURE_LINE, "$CONFIGURE_LINE", [configure command line used]) AC_DEFINE_UNQUOTED(LVM_CONFIGURE_LINE, "$CONFIGURE_LINE", [configure command line used])
################################################################################ ################################################################################
AC_SUBST(APPLIB)
AC_SUBST(AWK) AC_SUBST(AWK)
AC_SUBST(BLKID_PC) AC_SUBST(BLKID_PC)
AC_SUBST(BUILD_CMIRRORD) AC_SUBST(BUILD_CMIRRORD)
@ -1843,8 +1786,6 @@ libdaemon/client/Makefile
libdaemon/server/Makefile libdaemon/server/Makefile
libdm/Makefile libdm/Makefile
libdm/libdevmapper.pc libdm/libdevmapper.pc
liblvm/Makefile
liblvm/liblvm2app.pc
man/Makefile man/Makefile
po/Makefile po/Makefile
python/Makefile python/Makefile

View File

@ -28,9 +28,6 @@
/* Path to cmirrord pidfile. */ /* Path to cmirrord pidfile. */
#undef CMIRRORD_PIDFILE #undef CMIRRORD_PIDFILE
/* Define to 0 to exclude libSaCkpt. */
#undef CMIRROR_HAS_CHECKPOINT
/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP /* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
systems. This function is required for `alloca.c' support on those systems. systems. This function is required for `alloca.c' support on those systems.
*/ */
@ -185,9 +182,6 @@
/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
#undef HAVE_DOPRNT #undef HAVE_DOPRNT
/* Define to 1 if you have the `dup2' function. */
#undef HAVE_DUP2
/* Define to 1 if you have the <errno.h> header file. */ /* Define to 1 if you have the <errno.h> header file. */
#undef HAVE_ERRNO_H #undef HAVE_ERRNO_H
@ -209,9 +203,6 @@
/* Define to 1 if getline is available. */ /* Define to 1 if getline is available. */
#undef HAVE_GETLINE #undef HAVE_GETLINE
/* Define to 1 if you have the `getmntent' function. */
#undef HAVE_GETMNTENT
/* Define to 1 if getopt_long is available. */ /* Define to 1 if getopt_long is available. */
#undef HAVE_GETOPTLONG #undef HAVE_GETOPTLONG
@ -236,9 +227,6 @@
/* Define to 1 if dynamic libraries are available. */ /* Define to 1 if dynamic libraries are available. */
#undef HAVE_LIBDL #undef HAVE_LIBDL
/* Define to 1 if you have the <libdlm.h> header file. */
#undef HAVE_LIBDLM_H
/* Define to 1 if you have the <libgen.h> header file. */ /* Define to 1 if you have the <libgen.h> header file. */
#undef HAVE_LIBGEN_H #undef HAVE_LIBGEN_H
@ -283,9 +271,6 @@
/* Define to 1 if you have the `memchr' function. */ /* Define to 1 if you have the `memchr' function. */
#undef HAVE_MEMCHR #undef HAVE_MEMCHR
/* Define to 1 if you have the `memmove' function. */
#undef HAVE_MEMMOVE
/* Define to 1 if you have the <memory.h> header file. */ /* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H #undef HAVE_MEMORY_H
@ -301,30 +286,18 @@
/* Define to 1 if you have a working `mmap' system call. */ /* Define to 1 if you have a working `mmap' system call. */
#undef HAVE_MMAP #undef HAVE_MMAP
/* Define to 1 if you have the <mntent.h> header file. */
#undef HAVE_MNTENT_H
/* Define to 1 if you have the `munmap' function. */ /* Define to 1 if you have the `munmap' function. */
#undef HAVE_MUNMAP #undef HAVE_MUNMAP
/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */ /* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
#undef HAVE_NDIR_H #undef HAVE_NDIR_H
/* Define to 1 if you have the <netdb.h> header file. */
#undef HAVE_NETDB_H
/* Define to 1 if you have the <netinet/in.h> header file. */
#undef HAVE_NETINET_IN_H
/* Define to 1 if you have the `nl_langinfo' function. */ /* Define to 1 if you have the `nl_langinfo' function. */
#undef HAVE_NL_LANGINFO #undef HAVE_NL_LANGINFO
/* Define to 1 if you have the <paths.h> header file. */ /* Define to 1 if you have the <paths.h> header file. */
#undef HAVE_PATHS_H #undef HAVE_PATHS_H
/* Define to 1 if you have the <pthread.h> header file. */
#undef HAVE_PTHREAD_H
/* Define to 1 if the system has the type `ptrdiff_t'. */ /* Define to 1 if the system has the type `ptrdiff_t'. */
#undef HAVE_PTRDIFF_T #undef HAVE_PTRDIFF_T
@ -350,12 +323,6 @@
/* Define to 1 if you have the `rmdir' function. */ /* Define to 1 if you have the `rmdir' function. */
#undef HAVE_RMDIR #undef HAVE_RMDIR
/* Define to 1 if you have the <search.h> header file. */
#undef HAVE_SEARCH_H
/* Define to 1 if you have the `select' function. */
#undef HAVE_SELECT
/* Define to 1 to include support for selinux. */ /* Define to 1 to include support for selinux. */
#undef HAVE_SELINUX #undef HAVE_SELINUX
@ -377,9 +344,6 @@
/* Define to 1 if you have the <signal.h> header file. */ /* Define to 1 if you have the <signal.h> header file. */
#undef HAVE_SIGNAL_H #undef HAVE_SIGNAL_H
/* Define to 1 if you have the `socket' function. */
#undef HAVE_SOCKET
/* Define to 1 if `stat' has the bug that it succeeds when given the /* Define to 1 if `stat' has the bug that it succeeds when given the
zero-length file name argument. */ zero-length file name argument. */
#undef HAVE_STAT_EMPTY_STRING_BUG #undef HAVE_STAT_EMPTY_STRING_BUG
@ -491,9 +455,6 @@
/* Define to 1 if you have the <sys/mman.h> header file. */ /* Define to 1 if you have the <sys/mman.h> header file. */
#undef HAVE_SYS_MMAN_H #undef HAVE_SYS_MMAN_H
/* Define to 1 if you have the <sys/mount.h> header file. */
#undef HAVE_SYS_MOUNT_H
/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'. /* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
*/ */
#undef HAVE_SYS_NDIR_H #undef HAVE_SYS_NDIR_H
@ -504,15 +465,9 @@
/* Define to 1 if you have the <sys/resource.h> header file. */ /* Define to 1 if you have the <sys/resource.h> header file. */
#undef HAVE_SYS_RESOURCE_H #undef HAVE_SYS_RESOURCE_H
/* Define to 1 if you have the <sys/select.h> header file. */
#undef HAVE_SYS_SELECT_H
/* Define to 1 if you have the <sys/sem.h> header file. */ /* Define to 1 if you have the <sys/sem.h> header file. */
#undef HAVE_SYS_SEM_H #undef HAVE_SYS_SEM_H
/* Define to 1 if you have the <sys/socket.h> header file. */
#undef HAVE_SYS_SOCKET_H
/* Define to 1 if you have the <sys/statvfs.h> header file. */ /* Define to 1 if you have the <sys/statvfs.h> header file. */
#undef HAVE_SYS_STATVFS_H #undef HAVE_SYS_STATVFS_H
@ -528,12 +483,6 @@
/* Define to 1 if you have the <sys/types.h> header file. */ /* Define to 1 if you have the <sys/types.h> header file. */
#undef HAVE_SYS_TYPES_H #undef HAVE_SYS_TYPES_H
/* Define to 1 if you have the <sys/uio.h> header file. */
#undef HAVE_SYS_UIO_H
/* Define to 1 if you have the <sys/un.h> header file. */
#undef HAVE_SYS_UN_H
/* Define to 1 if you have the <sys/utsname.h> header file. */ /* Define to 1 if you have the <sys/utsname.h> header file. */
#undef HAVE_SYS_UTSNAME_H #undef HAVE_SYS_UTSNAME_H
@ -555,9 +504,6 @@
/* Define to 1 if you have the <unistd.h> header file. */ /* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H #undef HAVE_UNISTD_H
/* Define to 1 if you have the <utmpx.h> header file. */
#undef HAVE_UTMPX_H
/* valgrind.h found */ /* valgrind.h found */
#undef HAVE_VALGRIND #undef HAVE_VALGRIND
@ -598,6 +544,9 @@
slash. */ slash. */
#undef LSTAT_FOLLOWS_SLASHED_SYMLINK #undef LSTAT_FOLLOWS_SLASHED_SYMLINK
/* Path to lvmconfig binary. */
#undef LVMCONFIG_PATH
/* Path to lvmetad pidfile. */ /* Path to lvmetad pidfile. */
#undef LVMETAD_PIDFILE #undef LVMETAD_PIDFILE
@ -669,15 +618,6 @@
/* Define as the return type of signal handlers (`int' or `void'). */ /* Define as the return type of signal handlers (`int' or `void'). */
#undef RETSIGTYPE #undef RETSIGTYPE
/* Define to the type of arg 1 for `select'. */
#undef SELECT_TYPE_ARG1
/* Define to the type of args 2, 3 and 4 for `select'. */
#undef SELECT_TYPE_ARG234
/* Define to the type of arg 5 for `select'. */
#undef SELECT_TYPE_ARG5
/* Define to 1 to include built-in support for snapshots. */ /* Define to 1 to include built-in support for snapshots. */
#undef SNAPSHOT_INTERNAL #undef SNAPSHOT_INTERNAL

View File

@ -1,254 +0,0 @@
# Doxyfile 1.5.7.1
#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
DOXYFILE_ENCODING = UTF-8
PROJECT_NAME =
PROJECT_NUMBER =
OUTPUT_DIRECTORY = doxygen-output
CREATE_SUBDIRS = NO
OUTPUT_LANGUAGE = English
BRIEF_MEMBER_DESC = YES
REPEAT_BRIEF = YES
ABBREVIATE_BRIEF =
ALWAYS_DETAILED_SEC = NO
INLINE_INHERITED_MEMB = NO
FULL_PATH_NAMES = YES
STRIP_FROM_PATH =
STRIP_FROM_INC_PATH =
SHORT_NAMES = NO
JAVADOC_AUTOBRIEF = NO
QT_AUTOBRIEF = NO
MULTILINE_CPP_IS_BRIEF = NO
INHERIT_DOCS = YES
SEPARATE_MEMBER_PAGES = NO
TAB_SIZE = 8
ALIASES =
OPTIMIZE_OUTPUT_FOR_C = NO
OPTIMIZE_OUTPUT_JAVA = NO
OPTIMIZE_FOR_FORTRAN = NO
OPTIMIZE_OUTPUT_VHDL = NO
BUILTIN_STL_SUPPORT = NO
CPP_CLI_SUPPORT = NO
SIP_SUPPORT = NO
IDL_PROPERTY_SUPPORT = YES
DISTRIBUTE_GROUP_DOC = NO
SUBGROUPING = YES
TYPEDEF_HIDES_STRUCT = NO
SYMBOL_CACHE_SIZE = 0
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
EXTRACT_ALL = YES
EXTRACT_PRIVATE = YES
EXTRACT_STATIC = NO
EXTRACT_LOCAL_CLASSES = YES
EXTRACT_LOCAL_METHODS = NO
EXTRACT_ANON_NSPACES = NO
HIDE_UNDOC_MEMBERS = NO
HIDE_UNDOC_CLASSES = NO
HIDE_FRIEND_COMPOUNDS = NO
HIDE_IN_BODY_DOCS = NO
INTERNAL_DOCS = NO
CASE_SENSE_NAMES = YES
HIDE_SCOPE_NAMES = NO
SHOW_INCLUDE_FILES = YES
INLINE_INFO = YES
SORT_MEMBER_DOCS = YES
SORT_BRIEF_DOCS = NO
SORT_GROUP_NAMES = NO
SORT_BY_SCOPE_NAME = NO
GENERATE_TODOLIST = YES
GENERATE_TESTLIST = YES
GENERATE_BUGLIST = YES
GENERATE_DEPRECATEDLIST= YES
ENABLED_SECTIONS =
MAX_INITIALIZER_LINES = 30
SHOW_USED_FILES = YES
SHOW_DIRECTORIES = NO
SHOW_FILES = YES
SHOW_NAMESPACES = YES
FILE_VERSION_FILTER =
LAYOUT_FILE =
#---------------------------------------------------------------------------
# configuration options related to warning and progress messages
#---------------------------------------------------------------------------
QUIET = NO
WARNINGS = YES
WARN_IF_UNDOCUMENTED = YES
WARN_IF_DOC_ERROR = YES
WARN_NO_PARAMDOC = NO
WARN_FORMAT = "$file:$line: $text"
WARN_LOGFILE =
#---------------------------------------------------------------------------
# configuration options related to the input files
#---------------------------------------------------------------------------
INPUT = ./
INPUT_ENCODING = UTF-8
FILE_PATTERNS = *.c \
*.h
RECURSIVE = NO
EXCLUDE =
EXCLUDE_SYMLINKS = NO
EXCLUDE_PATTERNS =
EXCLUDE_SYMBOLS =
EXAMPLE_PATH = ../test/api
EXAMPLE_PATTERNS =
EXAMPLE_RECURSIVE = NO
IMAGE_PATH =
INPUT_FILTER =
FILTER_PATTERNS =
FILTER_SOURCE_FILES = NO
#---------------------------------------------------------------------------
# configuration options related to source browsing
#---------------------------------------------------------------------------
SOURCE_BROWSER = NO
INLINE_SOURCES = NO
STRIP_CODE_COMMENTS = YES
REFERENCED_BY_RELATION = NO
REFERENCES_RELATION = NO
REFERENCES_LINK_SOURCE = YES
USE_HTAGS = NO
VERBATIM_HEADERS = YES
#---------------------------------------------------------------------------
# configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
ALPHABETICAL_INDEX = NO
COLS_IN_ALPHA_INDEX = 5
IGNORE_PREFIX =
#---------------------------------------------------------------------------
# configuration options related to the HTML output
#---------------------------------------------------------------------------
GENERATE_HTML = YES
HTML_OUTPUT = html
HTML_FILE_EXTENSION = .html
HTML_HEADER =
HTML_FOOTER =
HTML_STYLESHEET =
HTML_ALIGN_MEMBERS = YES
HTML_DYNAMIC_SECTIONS = NO
GENERATE_DOCSET = NO
DOCSET_FEEDNAME = "Doxygen generated docs"
DOCSET_BUNDLE_ID = org.doxygen.Project
GENERATE_HTMLHELP = NO
CHM_FILE =
HHC_LOCATION =
GENERATE_CHI = NO
CHM_INDEX_ENCODING =
BINARY_TOC = NO
TOC_EXPAND = NO
GENERATE_QHP = NO
QCH_FILE =
QHP_NAMESPACE = org.doxygen.Project
QHP_VIRTUAL_FOLDER = doc
QHG_LOCATION =
DISABLE_INDEX = NO
ENUM_VALUES_PER_LINE = 4
GENERATE_TREEVIEW = NONE
TREEVIEW_WIDTH = 250
FORMULA_FONTSIZE = 10
#---------------------------------------------------------------------------
# configuration options related to the LaTeX output
#---------------------------------------------------------------------------
GENERATE_LATEX = YES
LATEX_OUTPUT = latex
LATEX_CMD_NAME = latex
MAKEINDEX_CMD_NAME = makeindex
COMPACT_LATEX = NO
PAPER_TYPE = a4wide
EXTRA_PACKAGES =
LATEX_HEADER =
PDF_HYPERLINKS = YES
USE_PDFLATEX = YES
LATEX_BATCHMODE = NO
LATEX_HIDE_INDICES = NO
#---------------------------------------------------------------------------
# configuration options related to the RTF output
#---------------------------------------------------------------------------
GENERATE_RTF = NO
RTF_OUTPUT = rtf
COMPACT_RTF = NO
RTF_HYPERLINKS = NO
RTF_STYLESHEET_FILE =
RTF_EXTENSIONS_FILE =
#---------------------------------------------------------------------------
# configuration options related to the man page output
#---------------------------------------------------------------------------
GENERATE_MAN = YES
MAN_OUTPUT = man
MAN_EXTENSION = .3
MAN_LINKS = NO
#---------------------------------------------------------------------------
# configuration options related to the XML output
#---------------------------------------------------------------------------
GENERATE_XML = NO
XML_OUTPUT = xml
XML_SCHEMA =
XML_DTD =
XML_PROGRAMLISTING = YES
#---------------------------------------------------------------------------
# configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------
GENERATE_AUTOGEN_DEF = NO
#---------------------------------------------------------------------------
# configuration options related to the Perl module output
#---------------------------------------------------------------------------
GENERATE_PERLMOD = NO
PERLMOD_LATEX = NO
PERLMOD_PRETTY = YES
PERLMOD_MAKEVAR_PREFIX =
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
ENABLE_PREPROCESSING = YES
MACRO_EXPANSION = NO
EXPAND_ONLY_PREDEF = NO
SEARCH_INCLUDES = YES
INCLUDE_PATH = ../libdm
INCLUDE_FILE_PATTERNS =
PREDEFINED =
EXPAND_AS_DEFINED =
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
# Configuration::additions related to external references
#---------------------------------------------------------------------------
TAGFILES =
GENERATE_TAGFILE =
ALLEXTERNALS = NO
EXTERNAL_GROUPS = YES
PERL_PATH = /usr/bin/perl
#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
CLASS_DIAGRAMS = YES
MSCGEN_PATH =
HIDE_UNDOC_RELATIONS = YES
HAVE_DOT = NO
DOT_FONTNAME = FreeSans
DOT_FONTSIZE = 10
DOT_FONTPATH =
CLASS_GRAPH = YES
COLLABORATION_GRAPH = YES
GROUP_GRAPHS = YES
UML_LOOK = NO
TEMPLATE_RELATIONS = NO
INCLUDE_GRAPH = YES
INCLUDED_BY_GRAPH = YES
CALL_GRAPH = YES
CALLER_GRAPH = NO
GRAPHICAL_HIERARCHY = YES
DIRECTORY_GRAPH = YES
DOT_IMAGE_FORMAT = png
DOT_PATH =
DOTFILE_DIRS =
DOT_GRAPH_MAX_NODES = 50
MAX_DOT_GRAPH_DEPTH = 0
DOT_TRANSPARENT = NO
DOT_MULTI_TARGETS = NO
GENERATE_LEGEND = YES
DOT_CLEANUP = YES
#---------------------------------------------------------------------------
# Configuration::additions related to the search engine
#---------------------------------------------------------------------------
SEARCHENGINE = NO

View File

@ -1,81 +0,0 @@
#
# Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
# Copyright (C) 2004-2013 Red Hat, Inc. All rights reserved.
#
# This file is part of LVM2.
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions
# of the GNU General Public License v.2.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
srcdir = @srcdir@
top_srcdir = @top_srcdir@
top_builddir = @top_builddir@
SOURCES =\
lvm_misc.c \
lvm_prop.c \
lvm_base.c \
lvm_lv.c \
lvm_pv.c \
lvm_vg.c
LIB_NAME = liblvm2app
LIB_VERSION = $(LIB_VERSION_APP)
ifeq ("@STATIC_LINK@", "yes")
LIB_STATIC = $(LIB_NAME).a
endif
LIB_SHARED = $(LIB_NAME).$(LIB_SUFFIX)
CLEAN_TARGETS += liblvm.cflow $(LIB_NAME).a
EXPORTED_HEADER = $(srcdir)/lvm2app.h
EXPORTED_FN_PREFIX = lvm
LDDEPS += $(top_builddir)/lib/liblvm-internal.a
include $(top_builddir)/make.tmpl
LDFLAGS += -L$(top_builddir)/lib -L$(top_builddir)/daemons/dmeventd
LIBS += $(LVMINTERNAL_LIBS) -laio
.PHONY: install_dynamic install_static install_include install_pkgconfig
INSTALL_TYPE = install_dynamic
ifeq ("@STATIC_LINK@", "yes")
INSTALL_TYPE += install_static
endif
ifeq ("@PKGCONFIG@", "yes")
INSTALL_TYPE += install_pkgconfig
endif
install: $(INSTALL_TYPE) install_include
install_include: $(srcdir)/lvm2app.h
$(INSTALL_DATA) -D $< $(includedir)/$(<F)
install_dynamic: install_lib_shared
install_static: $(LIB_STATIC)
$(INSTALL_DATA) -D $< $(usrlibdir)/$(<F)
install_pkgconfig: $(LIB_NAME).pc
$(INSTALL_DATA) -D $< $(pkgconfigdir)/lvm2app.pc
liblvm.cflow: $(SOURCES)
set -e; (echo -n "SOURCES += "; \
echo $(SOURCES) | \
sed "s/^/ /;s/ / $(top_srcdir)\/liblvm\//g;s/$$//"; \
) > $@
cflow: liblvm.cflow
DISTCLEAN_TARGETS += $(LIB_NAME).pc

View File

@ -1,11 +0,0 @@
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
Name: lvm2app
Description: lvm2 application library
Version: @LVM_MAJOR@.@LVM_LIBAPI@
Cflags: -I${includedir}
Libs: -L${libdir} -llvm2app
Requires.private: devmapper @BLKID_PC@

File diff suppressed because it is too large Load Diff

View File

@ -1,216 +0,0 @@
/*
* Copyright (C) 2008,2009 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License v.2.1.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "lib/misc/lib.h"
#include "lib/commands/toolcontext.h"
#include "lib/locking/locking.h"
#include "lvm-version.h"
#include "lib/metadata/metadata-exported.h"
#include "liblvm/lvm2app.h"
#include "lvm_misc.h"
const char *lvm_library_get_version(void)
{
return LVM_VERSION;
}
static lvm_t _lvm_init(const char *system_dir)
{
struct cmd_context *cmd;
/* FIXME: logging bound to handle
*/
if (!udev_init_library_context())
stack;
/*
* It's not necessary to use name mangling for LVM:
* - the character set used for VG-LV names is subset of udev character set
* - when we check other devices (e.g. device_is_usable fn), we use major:minor, not dm names
*/
dm_set_name_mangling_mode(DM_STRING_MANGLING_NONE);
/* create context */
/* FIXME: split create_toolcontext */
/* FIXME: make all globals configurable */
cmd = create_toolcontext(0, system_dir, 0, 0, 1, 1);
if (!cmd)
return NULL;
/*
* FIXME: if an non memory error occured, return the cmd (maybe some
* cleanup needed).
*/
/* initialization from lvm_run_command */
init_error_message_produced(0);
/* FIXME: locking_type config option needed? */
/* initialize locking */
if (!init_locking(-1, cmd, 0)) {
/* FIXME: use EAGAIN as error code here */
lvm_quit((lvm_t) cmd);
return NULL;
}
/*
* FIXME: Use cmd->cmd_line as audit trail for liblvm calls. Used in
* archive() call. Possible example:
* cmd_line = "lvm_vg_create: vg1\nlvm_vg_extend vg1 /dev/sda1\n"
*/
cmd->cmd_line = "liblvm";
/*
* Turn off writing to stdout/stderr.
* FIXME Fix lib/ to support a non-interactive mode instead.
*/
log_suppress(1);
return (lvm_t) cmd;
}
lvm_t lvm_init(const char *system_dir)
{
lvm_t h = NULL;
struct saved_env e = store_user_env(NULL);
h = _lvm_init(system_dir);
restore_user_env(&e);
return h;
}
void lvm_quit(lvm_t libh)
{
struct saved_env e = store_user_env((struct cmd_context *)libh);
fin_locking();
destroy_toolcontext((struct cmd_context *)libh);
udev_fin_library_context();
restore_user_env(&e);
}
int lvm_config_reload(lvm_t libh)
{
int rc = 0;
/* FIXME: re-init locking needed here? */
struct saved_env e = store_user_env((struct cmd_context *)libh);
if (!refresh_toolcontext((struct cmd_context *)libh))
rc = -1;
restore_user_env(&e);
return rc;
}
/*
* FIXME: submit a patch to document the --config option
*/
int lvm_config_override(lvm_t libh, const char *config_settings)
{
int rc = 0;
struct cmd_context *cmd = (struct cmd_context *)libh;
struct saved_env e = store_user_env((struct cmd_context *)libh);
if (!override_config_tree_from_string(cmd, config_settings))
rc = -1;
restore_user_env(&e);
return rc;
}
/*
* When full lvm connection is not being used, libh can be NULL
* and this command will internally create a single-use, light-weight
* cmd struct that only has cmd->cft populated from lvm.conf.
*/
int lvm_config_find_bool(lvm_t libh, const char *config_path, int fail)
{
int rc = 0;
struct cmd_context *cmd;
struct saved_env e;
if (libh) {
cmd = (struct cmd_context *)libh;
e = store_user_env((struct cmd_context *)libh);
} else {
if (!(cmd = create_config_context()))
return 0;
}
rc = dm_config_tree_find_bool(cmd->cft, config_path, fail);
if (libh)
restore_user_env(&e);
else
destroy_config_context(cmd);
return rc;
}
int lvm_errno(lvm_t libh)
{
int rc;
struct saved_env e = store_user_env((struct cmd_context *)libh);
rc = stored_errno();
restore_user_env(&e);
return rc;
}
const char *lvm_errmsg(lvm_t libh)
{
const char *rc = NULL;
struct cmd_context *cmd = (struct cmd_context *)libh;
struct saved_env e = store_user_env((struct cmd_context *)libh);
const char *msg = stored_errmsg_with_clear();
if (msg) {
rc = dm_pool_strdup(cmd->mem, msg);
free((void *)msg);
}
restore_user_env(&e);
return rc;
}
const char *lvm_vgname_from_pvid(lvm_t libh, const char *pvid)
{
const char *rc = NULL;
struct cmd_context *cmd = (struct cmd_context *)libh;
struct id id;
struct saved_env e = store_user_env((struct cmd_context *)libh);
if (id_read_format(&id, pvid)) {
rc = find_vgname_from_pvid(cmd, (char *)id.uuid);
} else {
log_error(INTERNAL_ERROR "Unable to convert uuid");
}
restore_user_env(&e);
return rc;
}
const char *lvm_vgname_from_device(lvm_t libh, const char *device)
{
const char *rc = NULL;
struct cmd_context *cmd = (struct cmd_context *)libh;
struct saved_env e = store_user_env(cmd);
rc = find_vgname_from_pvname(cmd, device);
restore_user_env(&e);
return rc;
}
/*
* No context to work with, so no ability to save off and restore env is not
* available and is not needed.
*/
float lvm_percent_to_float(percent_t v)
{
return dm_percent_to_float(v);
}

View File

@ -1,820 +0,0 @@
/*
* Copyright (C) 2008-2013 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License v.2.1.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "lib/misc/lib.h"
#include "lib/metadata/metadata-exported.h"
#include "lib/misc/lvm-string.h"
#include "lib/config/defaults.h"
#include "lib/metadata/segtype.h"
#include "lib/locking/locking.h"
#include "lib/activate/activate.h"
#include "lvm_misc.h"
#include "liblvm/lvm2app.h"
/* FIXME Improve all the log messages to include context. Which VG/LV as a minimum? */
struct lvm_lv_create_params
{
uint32_t magic;
vg_t vg;
struct lvcreate_params lvp;
};
#define LV_CREATE_PARAMS_MAGIC 0xFEED0001
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)
{
uint64_t rc;
struct saved_env e = store_user_env(lv->vg->cmd);
rc = SECTOR_SIZE * lv_size(lv);
restore_user_env(&e);
return rc;
}
const char *lvm_lv_get_uuid(const lv_t lv)
{
const char *rc;
struct saved_env e = store_user_env(lv->vg->cmd);
rc = lv_uuid_dup(lv->vg->vgmem, lv);
restore_user_env(&e);
return rc;
}
const char *lvm_lv_get_name(const lv_t lv)
{
const char *rc;
struct saved_env e = store_user_env(lv->vg->cmd);
rc = dm_pool_strndup(lv->vg->vgmem, lv->name, NAME_LEN+1);
restore_user_env(&e);
return rc;
}
const char *lvm_lv_get_attr(const lv_t lv)
{
const char *rc;
struct saved_env e = store_user_env(lv->vg->cmd);
rc = lv_attr_dup(lv->vg->vgmem, lv);
restore_user_env(&e);
return rc;
}
const char *lvm_lv_get_origin(const lv_t lv)
{
const char *rc;
struct saved_env e = store_user_env(lv->vg->cmd);
rc = lv_origin_dup(lv->vg->vgmem, lv);
restore_user_env(&e);
return rc;
}
struct lvm_property_value lvm_lv_get_property(const lv_t lv, const char *name)
{
struct lvm_property_value rc;
struct saved_env e = store_user_env(lv->vg->cmd);
rc = get_property(NULL, NULL, lv, NULL, NULL, NULL, NULL, name);
restore_user_env(&e);
return rc;
}
struct lvm_property_value lvm_lvseg_get_property(const lvseg_t lvseg,
const char *name)
{
struct lvm_property_value rc;
struct saved_env e = store_user_env(lvseg->lv->vg->cmd);
rc = get_property(NULL, NULL, NULL, lvseg, NULL, NULL, NULL, name);
restore_user_env(&e);
return rc;
}
uint64_t lvm_lv_is_active(const lv_t lv)
{
uint64_t rc = 0;
struct lvinfo info;
struct saved_env e = store_user_env(lv->vg->cmd);
if (lv_info(lv->vg->cmd, lv, 0, &info, 0, 0) &&
info.exists && info.live_table)
rc = 1;
restore_user_env(&e);
return rc;
}
uint64_t lvm_lv_is_suspended(const lv_t lv)
{
uint64_t rc = 0;
struct lvinfo info;
struct saved_env e = store_user_env(lv->vg->cmd);
if (lv_info(lv->vg->cmd, lv, 0, &info, 0, 0) &&
info.exists && info.suspended)
rc = 1;
restore_user_env(&e);
return rc;
}
static 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_add_tag(lv_t lv, const char *tag)
{
int rc;
struct saved_env e = store_user_env(lv->vg->cmd);
rc = _lvm_lv_add_tag(lv, tag);
restore_user_env(&e);
return rc;
}
static 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;
}
int lvm_lv_remove_tag(lv_t lv, const char *tag)
{
int rc;
struct saved_env e = store_user_env(lv->vg->cmd);
rc = _lvm_lv_remove_tag(lv, tag);
restore_user_env(&e);
return rc;
}
struct dm_list *lvm_lv_get_tags(const lv_t lv)
{
struct dm_list *rc;
struct saved_env e = store_user_env(lv->vg->cmd);
rc = tag_list_copy(lv->vg->vgmem, &lv->tags);
restore_user_env(&e);
return rc;
}
/* Set defaults for non-segment specific LV parameters */
static void _lv_set_default_params(struct lvcreate_params *lp,
vg_t vg, const char *lvname,
uint64_t extents)
{
lp->zero = 1;
lp->wipe_signatures = 0;
lp->major = -1;
lp->minor = -1;
lp->activate = CHANGE_AY;
lp->lv_name = lvname; /* FIXME: check this for safety */
lp->pvh = &vg->pvs;
lp->extents = extents;
lp->permission = LVM_READ | LVM_WRITE;
lp->read_ahead = DM_READ_AHEAD_NONE;
lp->alloc = ALLOC_INHERIT;
dm_list_init(&lp->tags);
}
static struct segment_type * _get_segtype(struct cmd_context *cmd) {
struct segment_type *rc = get_segtype_from_string(cmd, SEG_TYPE_NAME_STRIPED);
if (!rc) {
log_error(INTERNAL_ERROR "Segtype striped not found.");
}
return rc;
}
/* Set default for linear segment specific LV parameters */
static int _lv_set_default_linear_params(struct cmd_context *cmd,
struct lvcreate_params *lp)
{
if (!(lp->segtype = _get_segtype(cmd))) {
return 0;
}
lp->stripes = 1;
return 1;
}
/*
* FIXME: This function should probably not commit to disk but require calling
* lvm_vg_write. However, this appears to be non-trivial change until
* lv_create_single is refactored by segtype.
*/
static lv_t _lvm_vg_create_lv_linear(vg_t vg, const char *name, uint64_t size)
{
struct lvcreate_params lp = { 0 };
uint64_t extents;
struct logical_volume *lv;
if (vg_read_error(vg))
return NULL;
if (!vg_check_write_mode(vg))
return NULL;
if (!(extents = extents_from_size(vg->cmd, size / SECTOR_SIZE,
vg->extent_size))) {
log_error("Unable to create LV without size.");
return NULL;
}
_lv_set_default_params(&lp, vg, name, extents);
if (!_lv_set_default_linear_params(vg->cmd, &lp))
return_NULL;
if (!(lv = lv_create_single(vg, &lp)))
return_NULL;
return (lv_t) lv;
}
lv_t lvm_vg_create_lv_linear(vg_t vg, const char *name, uint64_t size)
{
lv_t rc;
struct saved_env e = store_user_env(vg->cmd);
rc = _lvm_vg_create_lv_linear(vg, name, size);
restore_user_env(&e);
return rc;
}
/*
* FIXME: This function should probably not commit to disk but require calling
* lvm_vg_write.
*/
static int _lvm_vg_remove_lv(lv_t lv)
{
if (!lv || !lv->vg || vg_read_error(lv->vg))
return -1;
if (!vg_check_write_mode(lv->vg))
return -1;
if (!lv_remove_single(lv->vg->cmd, lv, DONT_PROMPT, 0))
return -1;
return 0;
}
int lvm_vg_remove_lv(lv_t lv)
{
int rc;
struct saved_env e = store_user_env(lv->vg->cmd);
rc = _lvm_vg_remove_lv(lv);
restore_user_env(&e);
return rc;
}
static int _lvm_lv_activate(lv_t lv)
{
if (!lv || !lv->vg || vg_read_error(lv->vg) || !lv->vg->cmd)
return -1;
/* FIXME: handle pvmove stuff later */
if (lv_is_locked(lv)) {
log_error("Unable to activate locked LV");
return -1;
}
/* FIXME: handle lvconvert stuff later */
if (lv_is_converting(lv)) {
log_error("Unable to activate LV with in-progress lvconvert");
return -1;
}
if (lv_is_origin(lv) ||
lv_is_pvmove(lv) ||
seg_only_exclusive(first_seg(lv))) {
log_verbose("Activating logical volume \"%s\" "
"exclusively", lv->name);
if (!activate_lv_excl(lv->vg->cmd, lv)) {
/* FIXME Improve msg */
log_error("Activate exclusive failed.");
return -1;
}
} else {
log_verbose("Activating logical volume \"%s\"",
lv->name);
if (!activate_lv(lv->vg->cmd, lv)) {
/* FIXME Improve msg */
log_error("Activate failed.");
return -1;
}
}
return 0;
}
int lvm_lv_activate(lv_t lv)
{
int rc;
struct saved_env e = store_user_env(lv->vg->cmd);
rc = _lvm_lv_activate(lv);
restore_user_env(&e);
return rc;
}
static int _lvm_lv_deactivate(lv_t lv)
{
if (!lv || !lv->vg || vg_read_error(lv->vg) || !lv->vg->cmd)
return -1;
log_verbose("Deactivating logical volume \"%s\"", lv->name);
if (!deactivate_lv(lv->vg->cmd, lv)) {
log_error("Deactivate failed.");
return -1;
}
return 0;
}
int lvm_lv_deactivate(lv_t lv)
{
int rc;
struct saved_env e = store_user_env(lv->vg->cmd);
rc = _lvm_lv_deactivate(lv);
restore_user_env(&e);
return rc;
}
static struct dm_list *_lvm_lv_list_lvsegs(lv_t lv)
{
struct dm_list *list;
lvseg_list_t *lvseg;
struct lv_segment *lvl;
if (dm_list_empty(&lv->segments))
return NULL;
if (!(list = dm_pool_zalloc(lv->vg->vgmem, sizeof(*list)))) {
log_errno(ENOMEM, "Memory allocation fail for dm_list.");
return NULL;
}
dm_list_init(list);
dm_list_iterate_items(lvl, &lv->segments) {
if (!(lvseg = dm_pool_zalloc(lv->vg->vgmem, sizeof(*lvseg)))) {
log_errno(ENOMEM,
"Memory allocation fail for lvm_lvseg_list.");
return NULL;
}
lvseg->lvseg = lvl;
dm_list_add(list, &lvseg->list);
}
return list;
}
struct dm_list *lvm_lv_list_lvsegs(lv_t lv)
{
struct dm_list *rc;
struct saved_env e = store_user_env(lv->vg->cmd);
rc = _lvm_lv_list_lvsegs(lv);
restore_user_env(&e);
return rc;
}
lv_t lvm_lv_from_name(vg_t vg, const char *name)
{
lv_t rc = NULL;
struct lv_list *lvl;
struct saved_env e = store_user_env(vg->cmd);
dm_list_iterate_items(lvl, &vg->lvs) {
if (!strcmp(name, lvl->lv->name)) {
rc = lvl->lv;
break;
}
}
restore_user_env(&e);
return rc;
}
static lv_t _lvm_lv_from_uuid(vg_t vg, const char *uuid)
{
struct lv_list *lvl;
struct id id;
if (strlen(uuid) < ID_LEN) {
log_errno (EINVAL, "Invalid UUID string length");
return NULL;
}
if (!id_read_format(&id, uuid)) {
log_errno(EINVAL, "Invalid UUID format.");
return NULL;
}
dm_list_iterate_items(lvl, &vg->lvs) {
if (id_equal(&vg->id, &lvl->lv->lvid.id[0]) &&
id_equal(&id, &lvl->lv->lvid.id[1]))
return lvl->lv;
}
return NULL;
}
lv_t lvm_lv_from_uuid(vg_t vg, const char *uuid)
{
lv_t rc;
struct saved_env e = store_user_env(vg->cmd);
rc = _lvm_lv_from_uuid(vg, uuid);
restore_user_env(&e);
return rc;
}
int lvm_lv_rename(lv_t lv, const char *new_name)
{
int rc = 0;
struct saved_env e = store_user_env(lv->vg->cmd);
if (!lv_rename(lv->vg->cmd, lv, new_name)) {
/* FIXME Improve msg */
log_error("LV rename failed.");
rc = -1;
}
restore_user_env(&e);
return rc;
}
int lvm_lv_resize(const lv_t lv, uint64_t new_size)
{
int rc = 0;
struct lvresize_params lp = {
.sign = SIGN_NONE,
.percent = PERCENT_NONE,
.resize = LV_ANY,
.size = new_size >> SECTOR_SHIFT,
.force = 1, /* Assume the user has a good backup? */
};
struct saved_env e = store_user_env(lv->vg->cmd);
if (!lv_resize(lv, &lp, &lv->vg->pvs)) {
/* FIXME Improve msg */
log_error("LV resize failed.");
/* FIXME Define consistent symbolic return codes */
rc = -1;
}
restore_user_env(&e);
return rc;
}
lv_t lvm_lv_snapshot(const lv_t lv, const char *snap_name,
uint64_t max_snap_size)
{
lv_t rc = NULL;
struct lvm_lv_create_params *lvcp = NULL;
struct saved_env e = store_user_env(lv->vg->cmd);
lvcp = lvm_lv_params_create_snapshot(lv, snap_name, max_snap_size);
if (lvcp) {
rc = lvm_lv_create(lvcp);
}
restore_user_env(&e);
return rc;
}
/* Set defaults for thin pool specific LV parameters */
static int _lv_set_pool_params(struct lvcreate_params *lp,
vg_t vg, const char *pool_name,
uint64_t extents, uint64_t meta_size)
{
uint64_t pool_metadata_size;
_lv_set_default_params(lp, vg, pool_name, extents);
lp->create_pool = 1;
lp->segtype = get_segtype_from_string(vg->cmd, SEG_TYPE_NAME_THIN_POOL);
lp->stripes = 1;
if (!meta_size) {
pool_metadata_size = extents * vg->extent_size /
(lp->chunk_size * (SECTOR_SIZE / 64));
while ((pool_metadata_size >
(DEFAULT_THIN_POOL_OPTIMAL_METADATA_SIZE * 2)) &&
lp->chunk_size < DM_THIN_MAX_DATA_BLOCK_SIZE) {
lp->chunk_size <<= 1;
pool_metadata_size >>= 1;
}
} else
pool_metadata_size = meta_size;
if (pool_metadata_size % vg->extent_size)
pool_metadata_size +=
vg->extent_size - pool_metadata_size % vg->extent_size;
if (!(lp->pool_metadata_extents =
extents_from_size(vg->cmd, pool_metadata_size / SECTOR_SIZE,
vg->extent_size)))
return_0;
return 1;
}
static lv_create_params_t _lvm_lv_params_create_thin_pool(vg_t vg,
const char *pool_name, uint64_t size, uint32_t chunk_size,
uint64_t meta_size, lvm_thin_discards_t discard)
{
uint64_t extents = 0;
struct lvm_lv_create_params *lvcp = NULL;
if (meta_size > (2 * DEFAULT_THIN_POOL_MAX_METADATA_SIZE)) {
log_error("Invalid metadata size");
return NULL;
}
if (meta_size &&
meta_size < (2 * DEFAULT_THIN_POOL_MIN_METADATA_SIZE)) {
log_error("Invalid metadata size");
return NULL;
}
if (vg_read_error(vg))
return NULL;
if (!vg_check_write_mode(vg))
return NULL;
if (pool_name == NULL || !strlen(pool_name)) {
log_error("pool_name invalid");
return NULL;
}
if (!(extents = extents_from_size(vg->cmd, size / SECTOR_SIZE,
vg->extent_size))) {
log_error("Unable to create LV thin pool without size.");
return NULL;
}
lvcp = dm_pool_zalloc(vg->vgmem, sizeof (struct lvm_lv_create_params));
if (lvcp) {
lvcp->vg = vg;
switch (discard) {
case LVM_THIN_DISCARDS_IGNORE:
lvcp->lvp.discards = THIN_DISCARDS_IGNORE;
break;
case LVM_THIN_DISCARDS_NO_PASSDOWN:
lvcp->lvp.discards = THIN_DISCARDS_NO_PASSDOWN;
break;
case LVM_THIN_DISCARDS_PASSDOWN:
lvcp->lvp.discards = THIN_DISCARDS_PASSDOWN;
break;
default:
log_error("Invalid discard argument %d for thin pool creation.", discard);
return NULL;
}
lvcp->lvp.zero_new_blocks = THIN_ZERO_YES;
if (chunk_size)
lvcp->lvp.chunk_size = chunk_size;
else
lvcp->lvp.chunk_size = DEFAULT_THIN_POOL_CHUNK_SIZE * 2;
if (lvcp->lvp.chunk_size < DM_THIN_MIN_DATA_BLOCK_SIZE ||
lvcp->lvp.chunk_size > DM_THIN_MAX_DATA_BLOCK_SIZE) {
log_error("Invalid chunk_size");
return NULL;
}
if (!_lv_set_pool_params(&lvcp->lvp, vg, pool_name, extents, meta_size))
return_NULL;
lvcp->magic = LV_CREATE_PARAMS_MAGIC;
}
return lvcp;
}
lv_create_params_t lvm_lv_params_create_thin_pool(vg_t vg,
const char *pool_name, uint64_t size, uint32_t chunk_size,
uint64_t meta_size, lvm_thin_discards_t discard)
{
lv_create_params_t rc;
struct saved_env e = store_user_env(vg->cmd);
rc = _lvm_lv_params_create_thin_pool(vg, pool_name, size, chunk_size,
meta_size, discard);
restore_user_env(&e);
return rc;
}
/* Set defaults for thin LV specific parameters */
static int _lv_set_thin_params(struct lvcreate_params *lp,
vg_t vg, const char *pool_name,
const char *lvname,
uint32_t extents)
{
_lv_set_default_params(lp, vg, lvname, 0);
lp->pool_name = pool_name;
lp->segtype = get_segtype_from_string(vg->cmd, SEG_TYPE_NAME_THIN);
lp->virtual_extents = extents;
lp->stripes = 1;
return 1;
}
static lv_create_params_t _lvm_lv_params_create_snapshot(const lv_t lv,
const char *snap_name,
uint64_t max_snap_size)
{
uint64_t size = 0;
uint64_t extents = 0;
struct lvm_lv_create_params *lvcp = NULL;
if (vg_read_error(lv->vg)) {
return NULL;
}
if (!vg_check_write_mode(lv->vg))
return NULL;
if (snap_name == NULL || !strlen(snap_name)) {
log_error("snap_name invalid");
return NULL;
}
if (max_snap_size) {
size = max_snap_size >> SECTOR_SHIFT;
if (!(extents = extents_from_size(lv->vg->cmd, size, lv->vg->extent_size)))
return_NULL;
}
if (!size && !lv_is_thin_volume(lv) ) {
log_error("Origin is not thin, specify size of snapshot");
return NULL;
}
lvcp = dm_pool_zalloc(lv->vg->vgmem, sizeof (struct lvm_lv_create_params));
if (lvcp) {
lvcp->vg = lv->vg;
_lv_set_default_params(&lvcp->lvp, lv->vg, snap_name, extents);
if (size) {
if (!(lvcp->lvp.segtype = get_segtype_from_string(lv->vg->cmd, SEG_TYPE_NAME_SNAPSHOT))) {
log_error("Segtype snapshot not found.");
return NULL;
}
lvcp->lvp.chunk_size = 8;
lvcp->lvp.snapshot = 1;
} else {
if (!(lvcp->lvp.segtype = get_segtype_from_string(lv->vg->cmd, SEG_TYPE_NAME_THIN))) {
log_error("Segtype thin not found.");
return NULL;
}
lvcp->lvp.pool_name = first_seg(lv)->pool_lv->name;
}
lvcp->lvp.stripes = 1;
lvcp->lvp.origin_name = lv->name;
lvcp->magic = LV_CREATE_PARAMS_MAGIC;
}
return lvcp;
}
lv_create_params_t lvm_lv_params_create_snapshot(const lv_t lv,
const char *snap_name,
uint64_t max_snap_size)
{
lv_create_params_t rc;
struct saved_env e = store_user_env(lv->vg->cmd);
rc = _lvm_lv_params_create_snapshot(lv, snap_name, max_snap_size);
restore_user_env(&e);
return rc;
}
static lv_create_params_t _lvm_lv_params_create_thin(const vg_t vg,
const char *pool_name,
const char *lvname, uint64_t size)
{
struct lvm_lv_create_params *lvcp = NULL;
uint32_t extents = 0;
/* precondition checks */
if (vg_read_error(vg))
return NULL;
if (!vg_check_write_mode(vg))
return NULL;
if (pool_name == NULL || !strlen(pool_name)) {
log_error("pool_name invalid");
return NULL;
}
if (lvname == NULL || !strlen(lvname)) {
log_error("lvname invalid");
return NULL;
}
if (!(extents = extents_from_size(vg->cmd, size / SECTOR_SIZE,
vg->extent_size))) {
log_error("Unable to create thin LV without size.");
return NULL;
}
lvcp = dm_pool_zalloc(vg->vgmem, sizeof (struct lvm_lv_create_params));
if (lvcp) {
lvcp->vg = vg;
if (!_lv_set_thin_params(&lvcp->lvp, vg, pool_name, lvname, extents))
return_NULL;
lvcp->magic = LV_CREATE_PARAMS_MAGIC;
}
return lvcp;
}
lv_create_params_t lvm_lv_params_create_thin(const vg_t vg, const char *pool_name,
const char *lvname, uint64_t size)
{
lv_create_params_t rc;
struct saved_env e = store_user_env(vg->cmd);
rc = _lvm_lv_params_create_thin(vg, pool_name, lvname, size);
restore_user_env(&e);
return rc;
}
struct lvm_property_value lvm_lv_params_get_property(
const lv_create_params_t params,
const char *name)
{
struct lvm_property_value rc = { .is_valid = 0 };
if (params && params->magic == LV_CREATE_PARAMS_MAGIC) {
struct saved_env e = store_user_env(params->vg->cmd);
rc = get_property(NULL, NULL, NULL, NULL, NULL, &params->lvp, NULL, name);
restore_user_env(&e);
} else
log_error("Invalid lv_create_params parameter");
return rc;
}
int lvm_lv_params_set_property(lv_create_params_t params, const char *name,
struct lvm_property_value *prop)
{
int rc = -1;
if (params && params->magic == LV_CREATE_PARAMS_MAGIC) {
struct saved_env e = store_user_env(params->vg->cmd);
rc = set_property(NULL, NULL, NULL, &params->lvp, NULL, name, prop);
restore_user_env(&e);
} else
log_error("Invalid lv_create_params parameter");
return rc;
}
static lv_t _lvm_lv_create(lv_create_params_t params)
{
struct lv_list *lvl = NULL;
if (params && params->magic == LV_CREATE_PARAMS_MAGIC) {
if (!params->lvp.segtype) {
log_error("segtype parameter is NULL");
return_NULL;
}
if (!lv_create_single(params->vg, &params->lvp))
return_NULL;
/*
* In some case we are making a thin pool so lv_name is not valid, but
* pool is.
*/
if (!(lvl = find_lv_in_vg(params->vg,
(params->lvp.lv_name) ? params->lvp.lv_name : params->lvp.pool_name)))
return_NULL;
return (lv_t) lvl->lv;
}
log_error("Invalid lv_create_params parameter");
return NULL;
}
lv_t lvm_lv_create(lv_create_params_t params)
{
lv_t rc;
struct saved_env e = store_user_env(params->vg->cmd);
rc = _lvm_lv_create(params);
restore_user_env(&e);
return rc;
}

View File

@ -1,168 +0,0 @@
/*
* Copyright (C) 2008-2013 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License v.2.1.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "lib/misc/lib.h"
#include "lib/report/properties.h"
#include "lvm_misc.h"
#include "liblvm/lvm2app.h"
#include "lvm_prop.h"
struct dm_list *tag_list_copy(struct dm_pool *p, struct dm_list *tag_list)
{
struct dm_list *list;
lvm_str_list_t *lsl;
struct dm_str_list *sl;
if (!(list = dm_pool_zalloc(p, sizeof(*list)))) {
log_errno(ENOMEM, "Memory allocation fail for dm_list.");
return NULL;
}
dm_list_init(list);
dm_list_iterate_items(sl, tag_list) {
if (!(lsl = dm_pool_zalloc(p, sizeof(*lsl)))) {
log_errno(ENOMEM,
"Memory allocation fail for lvm_lv_list.");
return NULL;
}
if (!(lsl->str = dm_pool_strdup(p, sl->str))) {
log_errno(ENOMEM,
"Memory allocation fail for lvm_lv_list->str.");
return NULL;
}
dm_list_add(list, &lsl->list);
}
return list;
}
struct lvm_property_value get_property(const pv_t pv, const vg_t vg,
const lv_t lv,
const lvseg_t lvseg,
const pvseg_t pvseg,
const struct lvcreate_params *lvcp,
const struct pvcreate_params *pvcp,
const char *name)
{
struct lvm_property_type prop;
struct lvm_property_value v = { 0 };
prop.id = name;
if (pv) {
if (!pv_get_property(pv, &prop))
return v;
} else if (vg) {
if (!vg_get_property(vg, &prop))
return v;
} else if (lv) {
if (!lv_get_property(lv, &prop))
return v;
} else if (lvseg) {
if (!lvseg_get_property(lvseg, &prop))
return v;
} else if (pvseg) {
if (!pvseg_get_property(pvseg, &prop))
return v;
} else if (lvcp) {
if (!lv_create_param_get_property(lvcp, &prop))
return v;
} else if (pvcp) {
if (!pv_create_param_get_property(pvcp, &prop))
return v;
} else {
log_errno(EINVAL, "Invalid NULL handle passed to library function.");
return v;
}
v.is_settable = prop.is_settable;
v.is_string = prop.is_string;
v.is_integer = prop.is_integer;
v.is_signed = prop.is_signed;
if (v.is_string)
v.value.string = prop.value.string;
if (v.is_integer)
v.value.integer = prop.value.integer;
v.is_valid = 1;
return v;
}
int set_property(const pv_t pv, const vg_t vg, const lv_t lv,
struct lvcreate_params *lvcp,
struct pvcreate_params *pvcp,
const char *name,
struct lvm_property_value *v)
{
struct lvm_property_type prop;
prop.id = name;
if (v->is_string)
prop.value.string = v->value.string;
else
prop.value.integer = v->value.integer;
if (pv) {
if (!pv_set_property(pv, &prop)) {
v->is_valid = 0;
return -1;
}
} else if (vg) {
if (!vg_set_property(vg, &prop)) {
v->is_valid = 0;
return -1;
}
} else if (lv) {
if (!lv_set_property(lv, &prop)) {
v->is_valid = 0;
return -1;
}
} else if (lvcp) {
if (!lv_create_param_set_property(lvcp, &prop)) {
v->is_valid = 0;
return -1;
}
} else if (pvcp) {
if (!pv_create_param_set_property(pvcp, &prop)) {
v->is_valid = 0;
return -1;
}
} else {
return -1;
}
return 0;
}
/*
* Store anything that may need to be restored back to the user on library
* call exit. Currently the only thing we are preserving is the users umask.
*/
struct saved_env store_user_env(struct cmd_context *cmd)
{
struct saved_env env = {0};
if (cmd) {
env.user_umask = umask(cmd->default_settings.umask);
} else {
env.user_umask = umask(0);
umask(env.user_umask);
}
return env;
}
void restore_user_env(const struct saved_env *env)
{
if (env) {
umask(env->user_umask);
}
}

View File

@ -1,46 +0,0 @@
/*
* Copyright (C) 2008-2013 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License v.2.1.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef _LVM2APP_MISC_H
#define _LVM2APP_MISC_H
#include "device_mapper/libdevmapper.h"
#include "liblvm/lvm2app.h"
#include "lib/metadata/metadata-exported.h"
#include "lib/commands/toolcontext.h"
#include <sys/types.h>
#include <sys/stat.h>
struct saved_env
{
mode_t user_umask;
};
struct saved_env store_user_env(struct cmd_context *cmd);
void restore_user_env(const struct saved_env *env);
struct dm_list *tag_list_copy(struct dm_pool *p, struct dm_list *tag_list);
struct lvm_property_value get_property(const pv_t pv, const vg_t vg,
const lv_t lv, const lvseg_t lvseg,
const pvseg_t pvseg,
const struct lvcreate_params *lvcp,
const struct pvcreate_params *pvcp,
const char *name);
int set_property(const pv_t pv, const vg_t vg, const lv_t lv,
struct lvcreate_params *lvcp,
struct pvcreate_params *pvcp,
const char *name,
struct lvm_property_value *value);
#endif

View File

@ -1,74 +0,0 @@
/*
* Copyright (C) 2013 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License v.2.1.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "lvm_prop.h"
#include "device_mapper/libdevmapper.h"
#include "lib/metadata/metadata.h"
/* lv create parameters */
GET_LVCREATEPARAMS_NUM_PROPERTY_FN(skip_zero, lvcp->zero)
SET_LVCREATEPARAMS_NUM_PROPERTY_FN(skip_zero, lvcp->zero)
/* PV create parameters */
GET_PVCREATEPARAMS_NUM_PROPERTY_FN(size, pvcp->pva.size)
SET_PVCREATEPARAMS_NUM_PROPERTY_FN(size, pvcp->pva.size)
GET_PVCREATEPARAMS_NUM_PROPERTY_FN(pvmetadatacopies, pvcp->pva.pvmetadatacopies)
SET_PVCREATEPARAMS_NUM_PROPERTY_FN(pvmetadatacopies, pvcp->pva.pvmetadatacopies)
GET_PVCREATEPARAMS_NUM_PROPERTY_FN(pvmetadatasize, pvcp->pva.pvmetadatasize)
SET_PVCREATEPARAMS_NUM_PROPERTY_FN(pvmetadatasize, pvcp->pva.pvmetadatasize)
GET_PVCREATEPARAMS_NUM_PROPERTY_FN(data_alignment, pvcp->pva.data_alignment)
SET_PVCREATEPARAMS_NUM_PROPERTY_FN(data_alignment, pvcp->pva.data_alignment)
GET_PVCREATEPARAMS_NUM_PROPERTY_FN(data_alignment_offset, pvcp->pva.data_alignment_offset)
SET_PVCREATEPARAMS_NUM_PROPERTY_FN(data_alignment_offset, pvcp->pva.data_alignment_offset)
GET_PVCREATEPARAMS_NUM_PROPERTY_FN(zero, pvcp->zero)
SET_PVCREATEPARAMS_NUM_PROPERTY_FN(zero, pvcp->zero)
struct lvm_property_type _lib_properties[] = {
#include "lvm_prop_fields.h"
{ 0, "", 0, 0, 0, 0, { .integer = 0 }, prop_not_implemented_get,
prop_not_implemented_set },
};
#undef STR
#undef NUM
#undef FIELD
int lv_create_param_get_property(const struct lvcreate_params *lvcp,
struct lvm_property_type *prop)
{
return prop_get_property(_lib_properties, lvcp, prop, LV_CREATE_PARAMS);
}
int lv_create_param_set_property(struct lvcreate_params *lvcp,
struct lvm_property_type *prop)
{
return prop_set_property(_lib_properties, lvcp, prop, LV_CREATE_PARAMS);
}
int pv_create_param_get_property(const struct pvcreate_params *pvcp,
struct lvm_property_type *prop)
{
return prop_get_property(_lib_properties, pvcp, prop, PV_CREATE_PARAMS);
}
int pv_create_param_set_property(struct pvcreate_params *pvcp,
struct lvm_property_type *prop)
{
return prop_set_property(_lib_properties, pvcp, prop, PV_CREATE_PARAMS);
}

View File

@ -1,49 +0,0 @@
/*
* Copyright (C) 2013 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License v.2.1.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "lib/properties/prop_common.h"
#ifndef _LIB_LVM_PROP_H
#define _LIB_LVM_PROP_H
typedef struct lvcreate_params type_lvcreate_params;
typedef struct pvcreate_params type_pvcreate_params;
#define LV_CREATE_PARAMS 1
#define PV_CREATE_PARAMS 2
#define GET_LVCREATEPARAMS_NUM_PROPERTY_FN(NAME, VALUE)\
GET_NUM_PROPERTY_FN(NAME, VALUE, lvcreate_params, lvcp)
#define SET_LVCREATEPARAMS_NUM_PROPERTY_FN(NAME, VALUE) \
SET_NUM_PROPERTY(NAME, VALUE, lvcreate_params, lvcp)
#define GET_PVCREATEPARAMS_NUM_PROPERTY_FN(NAME, VALUE)\
GET_NUM_PROPERTY_FN(NAME, VALUE, pvcreate_params, pvcp)
#define SET_PVCREATEPARAMS_NUM_PROPERTY_FN(NAME, VALUE) \
SET_NUM_PROPERTY(NAME, VALUE, pvcreate_params, pvcp)
int lv_create_param_get_property(const struct lvcreate_params *lvcp,
struct lvm_property_type *prop);
int lv_create_param_set_property(struct lvcreate_params *lvcp,
struct lvm_property_type *prop);
int pv_create_param_get_property(const struct pvcreate_params *pvcp,
struct lvm_property_type *prop);
int pv_create_param_set_property(struct pvcreate_params *pvcp,
struct lvm_property_type *prop);
#endif

View File

@ -1,22 +0,0 @@
/*
* Copyright (C) 2013 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License v.2.1.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
FIELD(LV_CREATE_PARAMS, lvcreate_params, NUM, "skip_zero", zero, 2, uint32, skip_zero, "Skip zeroing on lv creation", 1)
FIELD(PV_CREATE_PARAMS, pvcreate_params, NUM, "size", size, 2, uint64_t, size, "PV size", 1)
FIELD(PV_CREATE_PARAMS, pvcreate_params, NUM, "pvmetadatacopies", pvmetadatacopies, 2, uint64_t, pvmetadatacopies, "PV Metadata copies", 1)
FIELD(PV_CREATE_PARAMS, pvcreate_params, NUM, "pvmetadatasize", pvmetadatasize, 2, uint64_t, pvmetadatasize, "PV Metadata size", 1)
FIELD(PV_CREATE_PARAMS, pvcreate_params, NUM, "data_alignment", data_alignment, 2, uint64_t, data_alignment, "Start data to a multiple of value", 1)
FIELD(PV_CREATE_PARAMS, pvcreate_params, NUM, "data_alignment_offset", data_alignment_offset, 2, uint64_t, data_alignment_offset, "Shift the start of the data area", 1)
FIELD(PV_CREATE_PARAMS, pvcreate_params, NUM, "zero", zero, 2, uint64_t, zero, "Zero first 2048 bytes of device", 1)

View File

@ -1,474 +0,0 @@
/*
* Copyright (C) 2008-2013 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License v.2.1.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stddef.h>
#include "lib/misc/lib.h"
#include "lib/metadata/metadata-exported.h"
#include "lib/misc/lvm-string.h"
#include "lib/datastruct/str_list.h"
#include "lvm_misc.h"
#include "liblvm/lvm2app.h"
#include "lib/locking/locking.h"
#include "lib/commands/toolcontext.h"
#include "lvm_misc.h"
#include "lib/cache/lvmetad.h"
struct lvm_pv_create_params
{
uint32_t magic;
lvm_t libh;
const char *pv_name;
struct pvcreate_params pv_p;
};
#define PV_CREATE_PARAMS_MAGIC 0xFEED0002
const char *lvm_pv_get_uuid(const pv_t pv)
{
const char *rc;
struct saved_env e = store_user_env(pv->vg->cmd);
rc = pv_uuid_dup(pv->vg->vgmem, pv);
restore_user_env(&e);
return rc;
}
const char *lvm_pv_get_name(const pv_t pv)
{
const char *rc;
struct saved_env e = store_user_env(pv->vg->cmd);
rc = dm_pool_strndup(pv->vg->vgmem, pv_dev_name(pv), NAME_LEN);
restore_user_env(&e);
return rc;
}
uint64_t lvm_pv_get_mda_count(const pv_t pv)
{
uint64_t rc;
struct saved_env e = store_user_env(pv->vg->cmd);
rc = (uint64_t) pv_mda_count(pv);
restore_user_env(&e);
return rc;
}
uint64_t lvm_pv_get_dev_size(const pv_t pv)
{
uint64_t rc;
struct saved_env e = store_user_env(pv->vg->cmd);
rc = SECTOR_SIZE * pv_dev_size(pv);
restore_user_env(&e);
return rc;
}
uint64_t lvm_pv_get_size(const pv_t pv)
{
uint64_t rc;
struct saved_env e = store_user_env(pv->vg->cmd);
rc = SECTOR_SIZE * pv_size_field(pv);
restore_user_env(&e);
return rc;
}
uint64_t lvm_pv_get_free(const pv_t pv)
{
uint64_t rc;
struct saved_env e = store_user_env(pv->vg->cmd);
rc = SECTOR_SIZE * pv_free(pv);
restore_user_env(&e);
return rc;
}
struct lvm_property_value lvm_pv_get_property(const pv_t pv, const char *name)
{
struct lvm_property_value rc;
struct saved_env e = store_user_env(pv->vg->cmd);
rc = get_property(pv, NULL, NULL, NULL, NULL, NULL, NULL, name);
restore_user_env(&e);
return rc;
}
struct lvm_property_value lvm_pvseg_get_property(const pvseg_t pvseg,
const char *name)
{
struct lvm_property_value rc;
struct saved_env e = store_user_env(pvseg->pv->vg->cmd);
rc = get_property(NULL, NULL, NULL, NULL, pvseg, NULL, NULL, name);
restore_user_env(&e);
return rc;
}
struct lvm_list_wrapper
{
unsigned long magic;
struct cmd_context *cmd;
struct dm_list pvslist;
struct dm_list vgslist;
};
int lvm_pv_remove(lvm_t libh, const char *pv_name)
{
int rc = 0;
struct cmd_context *cmd = (struct cmd_context *)libh;
struct saved_env e = store_user_env(cmd);
struct dm_list pv_names;
dm_list_init(&pv_names);
if (!str_list_add(cmd->mem, &pv_names, pv_name))
rc = -1;
if (rc >= 0 && !pvremove_many(cmd, &pv_names, 0, 0))
rc = -1;
restore_user_env(&e);
return rc;
}
#define PV_LIST_MAGIC 4026907153U
static struct dm_list *_lvm_list_pvs(lvm_t libh)
{
struct lvm_list_wrapper *rc = NULL;
struct cmd_context *cmd = (struct cmd_context *)libh;
/*
* This memory will get cleared when the library handle
* gets closed, don't try to free is as it doesn't work
* like malloc/free do.
*/
if (!(rc = dm_pool_zalloc(cmd->mem, sizeof(*rc)))) {
log_errno(ENOMEM, "Memory allocation fail for pv list.");
return NULL;
}
if (!lock_vol(cmd, VG_GLOBAL, LCK_VG_WRITE, NULL)) {
log_errno(ENOLCK, "Unable to obtain global lock.");
} else {
dm_list_init(&rc->pvslist);
dm_list_init(&rc->vgslist);
if (!get_pvs_perserve_vg(cmd, &rc->pvslist, &rc->vgslist))
return_NULL;
/*
* If we have no PVs we still need to have access to cmd
* pointer in the free call.
*/
rc->cmd = cmd;
rc->magic = PV_LIST_MAGIC;
}
return &rc->pvslist;
}
struct dm_list *lvm_list_pvs(lvm_t libh)
{
struct dm_list *rc;
struct saved_env e = store_user_env((struct cmd_context *)libh);
rc = _lvm_list_pvs(libh);
restore_user_env(&e);
return rc;
}
int lvm_list_pvs_free(struct dm_list *pvlist)
{
struct lvm_list_wrapper *to_delete;
struct vg_list *vgl;
struct pv_list *pvl;
struct saved_env e;
if (pvlist) {
to_delete = dm_list_struct_base(pvlist, struct lvm_list_wrapper, pvslist);
if (to_delete->magic != PV_LIST_MAGIC) {
log_errno(EINVAL, "Not a correct pvlist structure");
return -1;
}
/*
* Need to ensure that pointer is valid before we can use reference to
* cmd.
*/
e = store_user_env(to_delete->cmd);
dm_list_iterate_items(vgl, &to_delete->vgslist) {
release_vg(vgl->vg);
}
dm_list_iterate_items(pvl, &to_delete->pvslist)
free_pv_fid(pvl->pv);
unlock_vg(to_delete->cmd, NULL, VG_GLOBAL);
to_delete->magic = 0xA5A5A5A5;
restore_user_env(&e);
}
return 0;
}
static struct dm_list *_lvm_pv_list_pvsegs(pv_t pv)
{
struct dm_list *list;
pvseg_list_t *pvseg;
struct pv_segment *pvl;
if (dm_list_empty(&pv->segments))
return NULL;
if (!(list = dm_pool_zalloc(pv->vg->vgmem, sizeof(*list)))) {
log_errno(ENOMEM, "Memory allocation fail for dm_list.");
return NULL;
}
dm_list_init(list);
dm_list_iterate_items(pvl, &pv->segments) {
if (!(pvseg = dm_pool_zalloc(pv->vg->vgmem, sizeof(*pvseg)))) {
log_errno(ENOMEM,
"Memory allocation fail for lvm_pvseg_list.");
return NULL;
}
pvseg->pvseg = pvl;
dm_list_add(list, &pvseg->list);
}
return list;
}
struct dm_list *lvm_pv_list_pvsegs(pv_t pv)
{
struct dm_list *rc;
struct saved_env e = store_user_env(pv->vg->cmd);
rc = _lvm_pv_list_pvsegs(pv);
restore_user_env(&e);
return rc;
}
pv_t lvm_pv_from_name(vg_t vg, const char *name)
{
pv_t rc = NULL;
struct pv_list *pvl;
struct saved_env e = store_user_env(vg->cmd);
dm_list_iterate_items(pvl, &vg->pvs)
if (!strcmp(name, pv_dev_name(pvl->pv))) {
rc = pvl->pv;
break;
}
restore_user_env(&e);
return rc;
}
static pv_t _lvm_pv_from_uuid(vg_t vg, const char *uuid)
{
struct pv_list *pvl;
struct id id;
if (strlen(uuid) < ID_LEN) {
log_errno (EINVAL, "Invalid UUID string length");
return NULL;
}
if (!id_read_format(&id, uuid)) {
log_errno(EINVAL, "Invalid UUID format.");
return NULL;
}
dm_list_iterate_items(pvl, &vg->pvs)
if (id_equal(&id, &pvl->pv->id))
return pvl->pv;
return NULL;
}
pv_t lvm_pv_from_uuid(vg_t vg, const char *uuid)
{
pv_t rc;
struct saved_env e = store_user_env(vg->cmd);
rc = _lvm_pv_from_uuid(vg, uuid);
restore_user_env(&e);
return rc;
}
static int _lvm_pv_resize(const pv_t pv, uint64_t new_size)
{
uint64_t size = new_size >> SECTOR_SHIFT;
if (new_size % SECTOR_SIZE) {
log_errno(EINVAL, "Size not a multiple of 512");
return -1;
}
if (!vg_check_write_mode(pv->vg))
return -1;
if (!pv_resize_single(pv->vg->cmd, pv->vg, pv, size, 1)) {
log_error("PV re-size failed!");
return -1;
}
return 0;
}
int lvm_pv_resize(const pv_t pv, uint64_t new_size)
{
int rc;
struct saved_env e = store_user_env(pv->vg->cmd);
rc = _lvm_pv_resize(pv, new_size);
restore_user_env(&e);
return rc;
}
/*
* Common internal code to create a parameter passing object
*/
static struct lvm_pv_create_params *_lvm_pv_params_create(
lvm_t libh,
const char *pv_name,
struct lvm_pv_create_params *pvcp_in)
{
struct lvm_pv_create_params *pvcp = NULL;
const char *dev = NULL;
struct cmd_context *cmd = (struct cmd_context *)libh;
if (!pv_name || strlen(pv_name) == 0) {
log_error("Invalid pv_name");
return NULL;
}
if (!pvcp_in) {
pvcp = dm_pool_zalloc(cmd->libmem, sizeof(struct lvm_pv_create_params));
} else {
pvcp = pvcp_in;
}
if (!pvcp) {
return NULL;
}
dev = dm_pool_strdup(cmd->libmem, pv_name);
if (!dev) {
return NULL;
}
pvcreate_params_set_defaults(&pvcp->pv_p);
pvcp->pv_p.yes = 1;
pvcp->pv_p.force = DONT_PROMPT;
pvcp->pv_name = dev;
pvcp->libh = libh;
pvcp->magic = PV_CREATE_PARAMS_MAGIC;
return pvcp;
}
pv_create_params_t lvm_pv_params_create(lvm_t libh, const char *pv_name)
{
pv_create_params_t rc;
struct saved_env e = store_user_env((struct cmd_context *)libh);
rc = _lvm_pv_params_create(libh, pv_name, NULL);
restore_user_env(&e);
return rc;
}
struct lvm_property_value lvm_pv_params_get_property(
const pv_create_params_t params,
const char *name)
{
struct lvm_property_value rc = {
.is_valid = 0
};
struct saved_env e;
if (params && params->magic == PV_CREATE_PARAMS_MAGIC) {
e = store_user_env((struct cmd_context *)(params->libh));
rc = get_property(NULL, NULL, NULL, NULL, NULL, NULL, &params->pv_p,
name);
restore_user_env(&e);
} else {
log_error("Invalid pv_create_params parameter");
}
return rc;
}
int lvm_pv_params_set_property(pv_create_params_t params, const char *name,
struct lvm_property_value *prop)
{
int rc = -1;
struct saved_env e;
if (params && params->magic == PV_CREATE_PARAMS_MAGIC) {
e = store_user_env((struct cmd_context *)(params->libh));
rc = set_property(NULL, NULL, NULL, NULL, &params->pv_p, name, prop);
restore_user_env(&e);
} else {
log_error("Invalid pv_create_params parameter");
}
return rc;
}
static int _pv_create(pv_create_params_t params)
{
struct cmd_context *cmd = (struct cmd_context *)params->libh;
int rc = 0;
if (params->pv_p.pva.size) {
if (params->pv_p.pva.size % SECTOR_SIZE) {
log_errno(EINVAL, "Size not a multiple of 512");
return -1;
}
params->pv_p.pva.size = params->pv_p.pva.size >> SECTOR_SHIFT;
}
if (!lock_vol(cmd, VG_ORPHANS, LCK_VG_WRITE, NULL)) {
log_errno(EINVAL, "Can't get lock for orphan PVs");
return -1;
}
if (!(pvcreate_vol(cmd, params->pv_name, &params->pv_p, 1)))
rc = -1;
unlock_vg(cmd, NULL, VG_ORPHANS);
return rc;
}
int lvm_pv_create(lvm_t libh, const char *pv_name, uint64_t size)
{
struct lvm_pv_create_params pp;
int rc = -1;
struct saved_env e = store_user_env((struct cmd_context *)libh);
if (_lvm_pv_params_create(libh, pv_name, &pp)) {
pp.pv_p.pva.size = size;
rc = _pv_create(&pp);
}
restore_user_env(&e);
return rc;
}
int lvm_pv_create_adv(pv_create_params_t params)
{
int rc = -1;
struct saved_env e;
if (params && params->magic == PV_CREATE_PARAMS_MAGIC) {
e = store_user_env((struct cmd_context *)(params->libh));
rc = _pv_create(params);
restore_user_env(&e);
} else {
log_error("Invalid pv_create_params parameter");
}
return rc;
}

View File

@ -1,564 +0,0 @@
/*
* Copyright (C) 2008-2013 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License v.2.1.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "lib/misc/lib.h"
#include "lib/commands/toolcontext.h"
#include "lib/metadata/metadata.h"
#include "lib/format_text/archiver.h"
#include "lib/locking/locking.h"
#include "lib/cache/lvmcache.h"
#include "lib/cache/lvmetad.h"
#include "lvm_misc.h"
#include "liblvm/lvm2app.h"
#include "lib/display/display.h"
#include "lib/cache/lvmetad.h"
int lvm_vg_add_tag(vg_t vg, const char *tag)
{
int rc = -1;
struct saved_env e = store_user_env(vg->cmd);
if (!vg_read_error(vg) && vg_check_write_mode(vg) &&
vg_change_tag(vg, tag, 1))
rc = 0;
restore_user_env(&e);
return rc;
}
int lvm_vg_remove_tag(vg_t vg, const char *tag)
{
int rc = -1;
struct saved_env e = store_user_env(vg->cmd);
if (!vg_read_error(vg) && vg_check_write_mode(vg) &&
vg_change_tag(vg, tag, 0))
rc = 0;
restore_user_env(&e);
return rc;
}
vg_t lvm_vg_create(lvm_t libh, const char *vg_name)
{
struct volume_group *vg = NULL;
struct saved_env e = store_user_env((struct cmd_context *)libh);
vg = vg_lock_and_create((struct cmd_context *)libh, vg_name);
/* FIXME: error handling is still TBD */
if (vg_read_error(vg)) {
release_vg(vg);
vg = NULL;
} else {
vg->open_mode = 'w';
}
restore_user_env(&e);
return (vg_t) vg;
}
static int _lvm_vg_extend(vg_t vg, const char *device)
{
struct pvcreate_params pp;
if (vg_read_error(vg))
return -1;
if (!vg_check_write_mode(vg))
return -1;
if (!lock_vol(vg->cmd, VG_ORPHANS, LCK_VG_WRITE, NULL)) {
log_error("Can't get lock for orphan PVs");
return -1;
}
pvcreate_params_set_defaults(&pp);
if (!vg_extend(vg, 1, &device, &pp)) {
unlock_vg(vg->cmd, NULL, VG_ORPHANS);
return -1;
}
/*
* FIXME: Either commit to disk, or keep holding VG_ORPHANS and
* release in lvm_vg_close().
*/
unlock_vg(vg->cmd, NULL, VG_ORPHANS);
return 0;
}
int lvm_vg_extend(vg_t vg, const char *device)
{
int rc = 0;
struct saved_env e = store_user_env(vg->cmd);
rc = _lvm_vg_extend(vg, device);
restore_user_env(&e);
return rc;
}
int lvm_vg_reduce(vg_t vg, const char *device)
{
int rc = -1;
struct saved_env e = store_user_env(vg->cmd);
if (!vg_read_error(vg) && vg_check_write_mode(vg) && vg_reduce(vg, device))
rc = 0;
restore_user_env(&e);
return rc;
}
int lvm_vg_set_extent_size(vg_t vg, uint32_t new_size)
{
int rc = -1;
struct saved_env e = store_user_env(vg->cmd);
if (!vg_read_error(vg) && vg_check_write_mode(vg) &&
vg_set_extent_size(vg, new_size / SECTOR_SIZE))
rc = 0;
restore_user_env(&e);
return rc;
}
static int _lvm_vg_write(vg_t vg)
{
struct pv_list *pvl;
if (vg_read_error(vg))
return -1;
if (!vg_check_write_mode(vg))
return -1;
if (dm_list_empty(&vg->pvs)) {
if (!vg_remove(vg))
return -1;
return 0;
}
if (! dm_list_empty(&vg->removed_pvs)) {
if (!lock_vol(vg->cmd, VG_ORPHANS, LCK_VG_WRITE, NULL)) {
log_error("Can't get lock for orphan PVs");
return 0;
}
}
if (!archive(vg))
return -1;
/* Store VG on disk(s) */
if (!vg_write(vg) || !vg_commit(vg))
return -1;
if (! dm_list_empty(&vg->removed_pvs)) {
dm_list_iterate_items(pvl, &vg->removed_pvs) {
pv_write_orphan(vg->cmd, pvl->pv);
pv_set_fid(pvl->pv, NULL);
/* FIXME: do pvremove / label_remove()? */
}
dm_list_init(&vg->removed_pvs);
unlock_vg(vg->cmd, NULL, VG_ORPHANS);
}
return 0;
}
int lvm_vg_write(vg_t vg)
{
int rc;
struct saved_env e = store_user_env(vg->cmd);
rc = _lvm_vg_write(vg);
restore_user_env(&e);
return rc;
}
int lvm_vg_close(vg_t vg)
{
struct saved_env e = store_user_env(vg->cmd);
if (vg_read_error(vg) == FAILED_LOCKING)
release_vg(vg);
else if (!lvmcache_vgname_is_locked(vg->name))
release_vg(vg);
else
unlock_and_release_vg(vg->cmd, vg, vg->name);
restore_user_env(&e);
return 0;
}
int lvm_vg_remove(vg_t vg)
{
int rc = -1;
struct saved_env e = store_user_env(vg->cmd);
if (!vg_read_error(vg) && vg_check_write_mode(vg) && vg_remove_check(vg)) {
vg_remove_pvs(vg);
rc = 0;
}
restore_user_env(&e);
return rc;
}
static vg_t _lvm_vg_open(lvm_t libh, const char *vgname, const char *mode,
uint32_t flags)
{
uint32_t internal_flags = 0;
struct volume_group *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;
}
lvmcache_label_scan((struct cmd_context *)libh);
vg = vg_read((struct cmd_context *)libh, vgname, NULL, internal_flags, 0);
if (vg_read_error(vg)) {
/* FIXME: use log_errno either here in inside vg_read */
release_vg(vg);
return NULL;
}
/* FIXME: combine this with locking ? */
vg->open_mode = mode[0];
return (vg_t) vg;
}
vg_t lvm_vg_open(lvm_t libh, const char *vgname, const char *mode,
uint32_t flags)
{
vg_t rc;
struct saved_env e = store_user_env((struct cmd_context*)libh);
rc = _lvm_vg_open(libh, vgname, mode, flags);
restore_user_env(&e);
return rc;
}
static struct dm_list *_lvm_vg_list_pvs(vg_t vg)
{
struct dm_list *list;
pv_list_t *pvs;
struct pv_list *pvl;
if (dm_list_empty(&vg->pvs))
return NULL;
if (!(list = dm_pool_zalloc(vg->vgmem, sizeof(*list)))) {
log_errno(ENOMEM, "Memory allocation fail for dm_list.");
return NULL;
}
dm_list_init(list);
dm_list_iterate_items(pvl, &vg->pvs) {
if (!(pvs = dm_pool_zalloc(vg->vgmem, sizeof(*pvs)))) {
log_errno(ENOMEM,
"Memory allocation fail for lvm_pv_list.");
return NULL;
}
pvs->pv = pvl->pv;
dm_list_add(list, &pvs->list);
}
return list;
}
struct dm_list *lvm_vg_list_pvs(vg_t vg)
{
struct dm_list *rc;
struct saved_env e = store_user_env(vg->cmd);
rc = _lvm_vg_list_pvs(vg);
restore_user_env(&e);
return rc;
}
static struct dm_list *_lvm_vg_list_lvs(vg_t vg)
{
struct dm_list *list;
lv_list_t *lvs;
struct lv_list *lvl;
if (dm_list_empty(&vg->lvs))
return NULL;
if (!(list = dm_pool_zalloc(vg->vgmem, sizeof(*list)))) {
log_errno(ENOMEM, "Memory allocation fail for dm_list.");
return NULL;
}
dm_list_init(list);
dm_list_iterate_items(lvl, &vg->lvs) {
if (!(lvs = dm_pool_zalloc(vg->vgmem, sizeof(*lvs)))) {
log_errno(ENOMEM,
"Memory allocation fail for lvm_lv_list.");
return NULL;
}
lvs->lv = lvl->lv;
dm_list_add(list, &lvs->list);
}
return list;
}
struct dm_list *lvm_vg_list_lvs(vg_t vg)
{
struct dm_list *rc;
struct saved_env e = store_user_env(vg->cmd);
rc = _lvm_vg_list_lvs(vg);
restore_user_env(&e);
return rc;
}
struct dm_list *lvm_vg_get_tags(const vg_t vg)
{
struct dm_list *rc;
struct saved_env e = store_user_env(vg->cmd);
rc = tag_list_copy(vg->vgmem, &vg->tags);
restore_user_env(&e);
return rc;
}
uint64_t lvm_vg_get_seqno(const vg_t vg)
{
uint64_t rc;
struct saved_env e = store_user_env(vg->cmd);
rc = vg_seqno(vg);
restore_user_env(&e);
return rc;
}
uint64_t lvm_vg_is_clustered(const vg_t vg)
{
uint64_t rc;
struct saved_env e = store_user_env(vg->cmd);
rc = vg_is_clustered(vg);
restore_user_env(&e);
return rc;
}
uint64_t lvm_vg_is_exported(const vg_t vg)
{
uint64_t rc;
struct saved_env e = store_user_env(vg->cmd);
rc = vg_is_exported(vg);
restore_user_env(&e);
return rc;
}
uint64_t lvm_vg_is_partial(const vg_t vg)
{
uint64_t rc;
struct saved_env e = store_user_env(vg->cmd);
rc = (vg_missing_pv_count(vg) != 0);
restore_user_env(&e);
return rc;
}
/* FIXME: invalid handle? return INTMAX? */
uint64_t lvm_vg_get_size(const vg_t vg)
{
uint64_t rc;
struct saved_env e = store_user_env(vg->cmd);
rc = SECTOR_SIZE * vg_size(vg);
restore_user_env(&e);
return rc;
}
uint64_t lvm_vg_get_free_size(const vg_t vg)
{
uint64_t rc;
struct saved_env e = store_user_env(vg->cmd);
rc = SECTOR_SIZE * vg_free(vg);
restore_user_env(&e);
return rc;
}
uint64_t lvm_vg_get_extent_size(const vg_t vg)
{
uint64_t rc;
struct saved_env e = store_user_env(vg->cmd);
rc = SECTOR_SIZE * vg_extent_size(vg);
restore_user_env(&e);
return rc;
}
uint64_t lvm_vg_get_extent_count(const vg_t vg)
{
uint64_t rc;
struct saved_env e = store_user_env(vg->cmd);
rc = vg_extent_count(vg);
restore_user_env(&e);
return rc;
}
uint64_t lvm_vg_get_free_extent_count(const vg_t vg)
{
uint64_t rc;
struct saved_env e = store_user_env(vg->cmd);
rc = vg_free_count(vg);
restore_user_env(&e);
return rc;
}
uint64_t lvm_vg_get_pv_count(const vg_t vg)
{
uint64_t rc;
struct saved_env e = store_user_env(vg->cmd);
rc = vg_pv_count(vg);
restore_user_env(&e);
return rc;
}
uint64_t lvm_vg_get_max_pv(const vg_t vg)
{
uint64_t rc;
struct saved_env e = store_user_env(vg->cmd);
rc = vg_max_pv(vg);
restore_user_env(&e);
return rc;
}
uint64_t lvm_vg_get_max_lv(const vg_t vg)
{
uint64_t rc;
struct saved_env e = store_user_env(vg->cmd);
rc = vg_max_lv(vg);
restore_user_env(&e);
return rc;
}
const char *lvm_vg_get_uuid(const vg_t vg)
{
const char *rc;
struct saved_env e = store_user_env(vg->cmd);
rc = vg_uuid_dup(vg);
restore_user_env(&e);
return rc;
}
const char *lvm_vg_get_name(const vg_t vg)
{
const char *rc;
struct saved_env e = store_user_env(vg->cmd);
rc = dm_pool_strndup(vg->vgmem, vg->name, NAME_LEN+1);
restore_user_env(&e);
return rc;
}
struct lvm_property_value lvm_vg_get_property(const vg_t vg, const char *name)
{
struct lvm_property_value rc;
struct saved_env e = store_user_env(vg->cmd);
rc = get_property(NULL, vg, NULL, NULL, NULL, NULL, NULL, name);
restore_user_env(&e);
return rc;
}
int lvm_vg_set_property(const vg_t vg, const char *name,
struct lvm_property_value *value)
{
/* At this point it is unknown if all property set paths make the
* appropriate copy of the string. We will allocate a copy on the vg so
* that worst case we have two copies which will get freed when the vg gets
* released.
*/
int rc;
struct saved_env e = store_user_env(vg->cmd);
if (value->is_valid && value->is_string && value->value.string) {
value->value.string = dm_pool_strndup(vg->vgmem, value->value.string,
strlen(value->value.string) + 1);
}
rc = set_property(NULL, vg, NULL, NULL, NULL, name, value);
restore_user_env(&e);
return rc;
}
struct dm_list *lvm_list_vg_names(lvm_t libh)
{
struct dm_list *rc = NULL;
struct saved_env e = store_user_env((struct cmd_context *)libh);
if (lvmetad_vg_list_to_lvmcache((struct cmd_context *)libh)) {
rc = get_vgnames((struct cmd_context *)libh, 0);
}
restore_user_env(&e);
return rc;
}
struct dm_list *lvm_list_vg_uuids(lvm_t libh)
{
struct dm_list *rc = NULL;
struct saved_env e = store_user_env((struct cmd_context *)libh);
if (lvmetad_vg_list_to_lvmcache((struct cmd_context *)libh)) {
rc = get_vgids((struct cmd_context *)libh, 0);
}
restore_user_env(&e);
return rc;
}
/*
* FIXME: Elaborate on when to use, side-effects, .cache file, etc
*/
int lvm_scan(lvm_t libh)
{
int rc = 0;
struct saved_env e = store_user_env((struct cmd_context *)libh);
if (!lvmcache_label_scan((struct cmd_context *)libh))
rc = -1;
restore_user_env(&e);
return rc;
}
int lvm_lv_name_validate(const vg_t vg, const char *name)
{
int rc = -1;
name_error_t name_error;
int historical;
struct saved_env e = store_user_env(vg->cmd);
name_error = validate_name_detailed(name);
if (NAME_VALID == name_error) {
if (apply_lvname_restrictions(name)) {
if (!lv_name_is_used_in_vg(vg, name, &historical)) {
rc = 0;
} else {
log_errno(EINVAL, "%sLV name exists in VG",
historical ? "historical " : "");
}
}
} else {
display_name_error(name_error);
}
restore_user_env(&e);
return rc;
}
int lvm_vg_name_validate(lvm_t libh, const char *name)
{
int rc = -1;
struct cmd_context *cmd = (struct cmd_context *)libh;
struct saved_env e = store_user_env(cmd);
if (validate_new_vg_name(cmd, name))
rc = 0;
restore_user_env(&e);
return rc;
}

View File

@ -1,90 +0,0 @@
/*
* Copyright (C) 2009 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License v.2.1.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
#include <unistd.h>
#include <inttypes.h>
#include <assert.h>
#include "lvm2app.h"
int main(int argc, char *argv[])
{
char *vgname = NULL;
lvm_t handle;
vg_t vg;
lv_t lv;
lvm_str_list_t *sl;
pv_list_t *pvl;
lv_list_t *lvl;
struct dm_list *vgnames;
struct dm_list *vgids;
struct dm_list *pvlist;
struct dm_list *lvlist;
int added = 0;
int ret;
int i;
vgname = argv[1];
handle = lvm_init(NULL);
if (!handle) {
printf("lvm_init failed\n");
return -1;
}
vg = lvm_vg_create(handle, vgname);
for (i = 2; i < argc; i++) {
printf("adding %s to vg\n", argv[i]);
ret = lvm_vg_extend(vg, argv[i]);
if (ret) {
printf("Failed to add %s to vg\n", argv[i]);
goto out;
}
added++;
}
if (!added) {
printf("No PVs added, not writing VG.\n");
goto out;
}
printf("writing vg\n");
ret = lvm_vg_write(vg);
lvm_vg_close(vg);
sleep(1);
vg = lvm_vg_open(handle, vgname, "w", 0);
if (!vg) {
printf("vg open %s failed\n", vgname);
goto out;
}
lv = lvm_vg_create_lv_linear(vg, "lv0", 1024*1024);
if (!lv) {
printf("lv create failed\n");
goto out;
}
lvm_vg_close(vg);
out:
lvm_quit(handle);
return 0;
}

View File

@ -1,95 +0,0 @@
/*
* Copyright (C) 2009 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License v.2.1.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
#include <unistd.h>
#include <inttypes.h>
#include <assert.h>
#include "lvm2app.h"
int main(int argc, char *argv[])
{
char *vgname = NULL;
lvm_t handle;
vg_t vg;
lvm_str_list_t *sl;
pv_list_t *pvl;
lv_list_t *lvl;
struct dm_list *vgnames;
struct dm_list *vgids;
struct dm_list *pvlist;
struct dm_list *lvlist;
uint64_t val;
vgname = argv[1];
handle = lvm_init(NULL);
if (!handle) {
printf("lvm_init failed\n");
return -1;
}
vgnames = lvm_list_vg_names(handle);
dm_list_iterate_items(sl, vgnames)
printf("vg name %s\n", sl->str);
vgids = lvm_list_vg_uuids(handle);
dm_list_iterate_items(sl, vgids)
printf("vg uuid %s\n", sl->str);
if (!vgname) {
printf("No vg name arg\n");
goto out;
}
vg = lvm_vg_open(handle, vgname, "r", 0);
if (!vg) {
printf("vg open %s failed\n", vgname);
goto out;
}
val = lvm_vg_get_seqno(vg);
printf("vg seqno %llu\n", (unsigned long long)val);
pvlist = lvm_vg_list_pvs(vg);
dm_list_iterate_items(pvl, pvlist) {
printf("vg pv name %s\n", lvm_pv_get_name(pvl->pv));
val = lvm_pv_get_dev_size(pvl->pv);
printf("vg pv size %llu\n", (unsigned long long)val);
}
lvlist = lvm_vg_list_lvs(vg);
dm_list_iterate_items(lvl, lvlist) {
printf("vg lv name %s\n", lvm_lv_get_name(lvl->lv));
val = lvm_lv_get_size(lvl->lv);
printf("vg lv size %llu\n", (unsigned long long)val);
}
lvm_vg_close(vg);
out:
lvm_quit(handle);
return 0;
}

View File

@ -16,47 +16,14 @@ top_srcdir = @top_srcdir@
top_builddir = @top_builddir@ top_builddir = @top_builddir@
TARGETS = TARGETS =
ifeq ("@APPLIB@", "yes")
TARGETS += test
SOURCES = test.c
TARGETS += \
lvtest.t \
vglist.t \
percent.t \
pe_start.t \
thin_percent.t \
vgtest.t
SOURCES2 = \
lvtest.c \
vglist.c \
percent.c \
pe_start.c \
thin_percent.c \
vgtest.c
endif
PYTEST = python_lvm_unit.py PYTEST = python_lvm_unit.py
include $(top_builddir)/make.tmpl include $(top_builddir)/make.tmpl
DEFS += -D_REENTRANT DEFS += -D_REENTRANT
DEPLIBS += $(top_builddir)/liblvm/liblvm2app.so
LDFLAGS+=\
-L$(top_builddir)/liblvm \
-L$(top_builddir)/daemons/dmeventd
LIBS += @LVM2APP_LIB@ $(DMEVENT_LIBS)
%.t: %.o $(DEPLIBS)
$(CC) -o $@ $(<) $(CFLAGS) $(LDFLAGS) $(ELDFLAGS) $(LIBS)
all: all:
test -x $(PYTEST) || chmod 755 $(PYTEST) test -x $(PYTEST) || chmod 755 $(PYTEST)
test: $(OBJECTS) $(DEPLIBS)
$(CC) -o $@ $(OBJECTS) $(CFLAGS) $(LDFLAGS) $(ELDFLAGS) $(LIBS) $(READLINE_LIBS)
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
cd $(top_builddir) && $(SHELL) ./config.status test/api/Makefile cd $(top_builddir) && $(SHELL) ./config.status test/api/Makefile

View File

@ -1,64 +0,0 @@
/*
* Copyright (C) 2010 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License v.2.1.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#undef NDEBUG
#include "liblvm/lvm2app.h"
#include "assert.h"
#define err(args...) \
do { fprintf(stderr, args); goto bad; } while (0)
int main(int argc, char *argv[])
{
lvm_t handle;
vg_t vg;
lv_t lv;
int r = -1;
if (!(handle = lvm_init(NULL)))
return -1;
if (!(vg = lvm_vg_open(handle, argv[1], "w", 0)))
err("VG open %s failed.\n", argv[1]);
if (!(lv = lvm_lv_from_name(vg, "test")))
err("LV test not found.\n");
if (lvm_lv_deactivate(lv))
err("LV test deactivation failed.\n");
if (lvm_lv_activate(lv))
err("LV test activation failed.\n");
if (lvm_lv_activate(lv))
err("LV test repeated activation failed.\n");
if (lvm_lv_rename(lv, "test1"))
err("LV test rename to test1 failed.\n");
if (lvm_lv_rename(lv, "test2"))
err("LV test1 rename to test2 failed.\n");
if (lvm_lv_rename(lv, "test"))
err("LV test2 rename to test failed.\n");
if (lvm_vg_close(vg))
err("VG close failed.\n");
r = 0;
bad:
lvm_quit(handle);
return r;
}

View File

@ -1,47 +0,0 @@
/*
* Copyright (C) 2011 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License v.2.1.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#undef NDEBUG
#include "liblvm/lvm2app.h"
#include "assert.h"
int main(int argc, char *argv[])
{
lvm_t handle;
vg_t vg = NULL;
pv_t pv;
struct lvm_property_value v;
handle = lvm_init(NULL);
assert(handle);
vg = lvm_vg_create(handle, argv[1]);
assert(vg);
if (lvm_vg_extend(vg, argv[2]))
abort();
pv = lvm_pv_from_name(vg, argv[2]);
assert(pv);
v = lvm_pv_get_property(pv, "pe_start");
assert(v.is_valid);
fprintf(stderr, "pe_start = %d\n", (int)v.value.integer);
assert(v.value.integer == 2048 * 512);
lvm_vg_close(vg);
lvm_quit(handle);
return 0;
}

View File

@ -1,63 +0,0 @@
/*
* Copyright (C) 2010 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License v.2.1.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#undef NDEBUG
#include "liblvm/lvm2app.h"
#include "assert.h"
int main(int argc, char *argv[])
{
lvm_t handle;
vg_t vg = NULL;
lv_t lv;
struct lvm_property_value v;
struct lvm_property_value d;
handle = lvm_init(NULL);
assert(handle);
vg = lvm_vg_open(handle, argv[1], "r", 0);
assert(vg);
lv = lvm_lv_from_name(vg, "snap");
assert(lv);
v = lvm_lv_get_property(lv, "snap_percent");
assert(v.is_valid);
assert(v.value.integer == PERCENT_0);
lv = lvm_lv_from_name(vg, "mirr");
assert(lv);
v = lvm_lv_get_property(lv, "copy_percent");
assert(v.is_valid);
assert(v.value.integer == PERCENT_100);
lv = lvm_lv_from_name(vg, "snap2");
assert(lv);
v = lvm_lv_get_property(lv, "snap_percent");
assert(v.is_valid);
assert(v.value.integer == 50 * PERCENT_1);
d = lvm_lv_get_property(lv, "data_percent");
assert(d.is_valid);
assert(d.value.integer == v.value.integer);
lvm_vg_close(vg);
lvm_quit(handle);
return 0;
}

File diff suppressed because it is too large Load Diff

View File

@ -1,78 +0,0 @@
/*
* Copyright (C) 2012 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License v.2.1.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#undef NDEBUG
#include "liblvm/lvm2app.h"
#include "assert.h"
int main(int argc, char *argv[])
{
lvm_t handle;
vg_t vg;
lv_t lv;
struct lvm_property_value v;
struct dm_list *lvsegs;
struct lvm_lvseg_list *lvl;
handle = lvm_init(NULL);
assert(handle);
vg = lvm_vg_open(handle, argv[1], "r", 0);
assert(vg);
lv = lvm_lv_from_name(vg, "pool");
assert(lv);
lvsegs = lvm_lv_list_lvsegs(lv);
assert(lvsegs && (dm_list_size(lvsegs) == 1));
dm_list_iterate_items(lvl, lvsegs) {
v = lvm_lvseg_get_property(lvl->lvseg, "discards");
assert(v.is_valid && v.is_string);
assert(strcmp(v.value.string, "passdown") == 0);
}
v = lvm_lv_get_property(lv, "data_percent");
assert(v.is_valid);
assert(v.value.integer == 25 * PERCENT_1);
lv = lvm_lv_from_name(vg, "thin");
assert(lv);
v = lvm_lv_get_property(lv, "data_percent");
assert(v.is_valid);
assert(v.value.integer == 50 * PERCENT_1);
lv = lvm_lv_from_name(vg, "snap");
assert(lv);
v = lvm_lv_get_property(lv, "data_percent");
assert(v.is_valid);
assert(v.value.integer == 75 * PERCENT_1);
v = lvm_lv_get_property(lv, "snap_percent");
assert(v.is_valid);
assert(v.value.integer == (uint64_t) DM_PERCENT_INVALID);
v = lvm_lv_get_property(lv, "origin");
assert(v.is_valid);
assert(strcmp(v.value.string, "thin") == 0);
lvm_vg_close(vg);
lvm_quit(handle);
return 0;
}

View File

@ -1,73 +0,0 @@
/*
* Copyright (C) 2009 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License v.2.1.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
#include <unistd.h>
#include <inttypes.h>
#include <assert.h>
#include "liblvm/lvm2app.h"
lvm_t handle;
vg_t vg;
static void start(void) {
handle = lvm_init(NULL);
if (!handle) {
fprintf(stderr, "Unable to lvm_init\n");
abort();
}
}
static void done(int ok) {
if (handle && lvm_errno(handle)) {
fprintf(stderr, "LVM Error: %s\n", lvm_errmsg(handle));
ok = 0;
}
if (handle)
lvm_quit(handle);
if (!ok)
abort();
}
int main(int argc, char *argv[])
{
lvm_str_list_t *str;
int i = 0;
struct dm_list *vgnames;
struct dm_list *vgids;
if (argc != 3)
abort();
start();
vgnames = lvm_list_vg_names(handle);
dm_list_iterate_items(str, vgnames) {
assert(++i <= 1);
assert(!strcmp(str->str, argv[1]));
}
assert(i == 1);
done(1);
i = 0;
start();
vgids = lvm_list_vg_uuids(handle);
dm_list_iterate_items(str, vgids) {
assert(++i <= 1);
assert(!strcmp(str->str, argv[2]));
}
assert(i == 1);
done(1);
return 0;
}

View File

@ -1,164 +0,0 @@
/*
* Copyright (C) 2009 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License v.2.1.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/*
* Unit test case for vgcreate and related APIs.
* # gcc -g vgcreate.c -I../../liblvm -I../../include -L../../liblvm \
* -L../../libdm -ldevmapper -llvm2app
* # export LD_LIBRARY_PATH=`pwd`/../../libdm:`pwd`/../../liblvm
*/
#include <stdio.h>
#include <unistd.h>
#include <inttypes.h>
#include "liblvm/lvm2app.h"
lvm_t handle;
vg_t vg;
const char *vg_name;
#define MAX_DEVICES 16
const char *device[MAX_DEVICES];
uint64_t size = 4096;
#define vg_create(vg_name) \
printf("Creating VG %s\n", vg_name); \
vg = lvm_vg_create(handle, vg_name); \
if (!vg) { \
fprintf(stderr, "Error creating volume group %s\n", vg_name); \
goto bad; \
}
#define vg_extend(vg, dev) \
printf("Extending VG %s by %s\n", vg_name, dev); \
status = lvm_vg_extend(vg, dev); \
if (status) { \
fprintf(stderr, "Error extending volume group %s " \
"with device %s\n", vg_name, dev); \
goto bad; \
}
#define vg_commit(vg) \
printf("Committing VG %s to disk\n", vg_name); \
status = lvm_vg_write(vg); \
if (status) { \
fprintf(stderr, "Commit of volume group '%s' failed\n", \
lvm_vg_get_name(vg)); \
goto bad; \
}
#define vg_open(vg_name, mode) \
printf("Opening VG %s %s\n", vg_name, mode); \
vg = lvm_vg_open(handle, vg_name, mode, 0); \
if (!vg) { \
fprintf(stderr, "Error opening volume group %s\n", vg_name); \
goto bad; \
}
#define vg_close(vg) \
printf("Closing VG %s\n", vg_name); \
if (lvm_vg_close(vg)) { \
fprintf(stderr, "Error closing volume group %s\n", vg_name); \
goto bad; \
}
#define vg_reduce(vg, dev) \
printf("Reducing VG %s by %s\n", vg_name, dev); \
status = lvm_vg_reduce(vg, dev); \
if (status) { \
fprintf(stderr, "Error reducing volume group %s " \
"by device %s\n", vg_name, dev); \
goto bad; \
}
#define vg_remove(vg) \
printf("Removing VG %s from system\n", vg_name); \
status = lvm_vg_remove(vg); \
if (status) { \
fprintf(stderr, "Revmoval of volume group '%s' failed\n", \
vg_name); \
goto bad; \
}
static int init_vgtest(int argc, char *argv[])
{
int i;
if (argc < 4) {
fprintf(stderr, "Usage: %s <vgname> <pv1> <pv2> [... <pvN> ]",
argv[0]);
return -1;
}
vg_name = argv[1];
for(i=2; i<MAX_DEVICES && i < argc; i++) {
device[i-2] = argv[i];
}
return 0;
}
int main(int argc, char *argv[])
{
int status;
if (init_vgtest(argc, argv) < 0)
goto bad;
/* FIXME: make the below messages verbose-only and print PASS/FAIL*/
printf("Opening LVM\n");
handle = lvm_init(NULL);
if (!handle) {
fprintf(stderr, "Unable to lvm_init\n");
goto bad;
}
printf("Library version: %s\n", lvm_library_get_version());
vg_create(vg_name);
vg_extend(vg, device[0]);
printf("Setting VG %s extent_size to %"PRIu64"\n", vg_name, size);
status = lvm_vg_set_extent_size(vg, size);
if (status) {
fprintf(stderr, "Can not set physical extent "
"size '%"PRIu64"' for '%s'\n",
size, vg_name);
goto bad;
}
vg_commit(vg);
vg_close(vg);
vg_open(vg_name, "r");
vg_close(vg);
vg_open(vg_name, "w");
vg_extend(vg, device[1]);
vg_reduce(vg, device[0]);
vg_commit(vg);
vg_close(vg);
vg_open(vg_name, "w");
vg_extend(vg, device[0]);
vg_commit(vg);
vg_close(vg);
vg_open(vg_name, "w");
vg_remove(vg);
vg_commit(vg);
vg_close(vg);
lvm_quit(handle);
printf("liblvm vgcreate unit test PASS\n");
_exit(0);
bad:
printf("liblvm vgcreate unit test FAIL\n");
if (handle && lvm_errno(handle))
fprintf(stderr, "LVM Error: %s\n", lvm_errmsg(handle));
if (vg)
lvm_vg_close(vg);
if (handle)
lvm_quit(handle);
_exit(-1);
}