提交 df1011ca 编写于 作者: O Osier Yang

storage: Allow to delete device mapper disk partition

The name convention of device mapper disk is different, and 'parted'
can't be used to delete a device mapper disk partition. e.g.

Name                 Path
-----------------------------------------
3600a0b80005ad1d7000093604cae912fp1 /dev/mapper/3600a0b80005ad1d7000093604cae912fp1

Error: Expecting a partition number.

This patch introduces 'dmsetup' to fix it.

Changes:
  - New function "virIsDevMapperDevice" in "src/utils/utils.c"
  - remove "is_dm_device" in "src/storage/parthelper.c", use
    "virIsDevMapperDevice" instead.
  - Requires "device-mapper" for 'with-storage-disk" in "libvirt.spec.in"
  - Check "dmsetup" in 'configure.ac' for "with-storage-disk"
  - Changes on "src/Makefile.am" to link against libdevmapper
  - New entry for "virIsDevMapperDevice" in "src/libvirt_private.syms"

Changes from v1 to v3:
  - s/virIsDeviceMapperDevice/virIsDevMapperDevice/g
  - replace "virRun" with "virCommand"
  - sort the list of util functions in "libvirt_private.syms"
  - ATTRIBUTE_NONNULL(1) for virIsDevMapperDevice declaration.

e.g.

Name                 Path
-----------------------------------------
3600a0b80005ad1d7000093604cae912fp1 /dev/mapper/3600a0b80005ad1d7000093604cae912fp1

Vol /dev/mapper/3600a0b80005ad1d7000093604cae912fp1 deleted

Name                 Path
-----------------------------------------
上级 43f8773c
...@@ -1725,12 +1725,19 @@ LIBPARTED_LIBS= ...@@ -1725,12 +1725,19 @@ LIBPARTED_LIBS=
if test "$with_storage_disk" = "yes" || if test "$with_storage_disk" = "yes" ||
test "$with_storage_disk" = "check"; then test "$with_storage_disk" = "check"; then
AC_PATH_PROG([PARTED], [parted], [], [$PATH:/sbin:/usr/sbin]) AC_PATH_PROG([PARTED], [parted], [], [$PATH:/sbin:/usr/sbin])
AC_PATH_PROG([DMSETUP], [dmsetup], [], [$PATH:/sbin:/usr/sbin])
if test -z "$PARTED" ; then if test -z "$PARTED" ; then
PARTED_FOUND=no PARTED_FOUND=no
else else
PARTED_FOUND=yes PARTED_FOUND=yes
fi fi
if test -z "$DMSETUP" ; then
DMSETUP_FOUND=no
else
DMSETUP_FOUND=yes
fi
if test "$PARTED_FOUND" = "yes" && test "x$PKG_CONFIG" != "x" ; then if test "$PARTED_FOUND" = "yes" && test "x$PKG_CONFIG" != "x" ; then
PKG_CHECK_MODULES([LIBPARTED], [libparted >= $PARTED_REQUIRED], [], PKG_CHECK_MODULES([LIBPARTED], [libparted >= $PARTED_REQUIRED], [],
[PARTED_FOUND=no]) [PARTED_FOUND=no])
...@@ -1748,14 +1755,17 @@ if test "$with_storage_disk" = "yes" || ...@@ -1748,14 +1755,17 @@ if test "$with_storage_disk" = "yes" ||
CFLAGS="$save_CFLAGS" CFLAGS="$save_CFLAGS"
fi fi
if test "$PARTED_FOUND" = "no" ; then if test "$with_storage_disk" = "yes" &&
if test "$with_storage_disk" = "yes" ; then test "$PARTED_FOUND:$DMSETUP_FOUND" != "yes:yes"; then
AC_MSG_ERROR([We need parted for disk storage driver]) AC_MSG_ERROR([Need both parted and dmsetup for disk storage driver])
else fi
if test "$with_storage_disk" = "check"; then
if test "$PARTED_FOUND:$DMSETUP_FOUND" != "yes:yes"; then
with_storage_disk=no with_storage_disk=no
else
with_storage_disk=yes
fi fi
else
with_storage_disk=yes
fi fi
if test "$with_storage_disk" = "yes"; then if test "$with_storage_disk" = "yes"; then
...@@ -1763,6 +1773,8 @@ if test "$with_storage_disk" = "yes" || ...@@ -1763,6 +1773,8 @@ if test "$with_storage_disk" = "yes" ||
[whether Disk backend for storage driver is enabled]) [whether Disk backend for storage driver is enabled])
AC_DEFINE_UNQUOTED([PARTED],["$PARTED"], AC_DEFINE_UNQUOTED([PARTED],["$PARTED"],
[Location or name of the parted program]) [Location or name of the parted program])
AC_DEFINE_UNQUOTED([DMSETUP],["$DMSETUP"],
[Location or name of the dmsetup program])
fi fi
fi fi
AM_CONDITIONAL([WITH_STORAGE_DISK], [test "$with_storage_disk" = "yes"]) AM_CONDITIONAL([WITH_STORAGE_DISK], [test "$with_storage_disk" = "yes"])
......
...@@ -279,6 +279,7 @@ Requires: iscsi-initiator-utils ...@@ -279,6 +279,7 @@ Requires: iscsi-initiator-utils
%if %{with_storage_disk} %if %{with_storage_disk}
# For disk driver # For disk driver
Requires: parted Requires: parted
Requires: device-mapper
%endif %endif
%if %{with_storage_mpath} %if %{with_storage_mpath}
# For multipath support # For multipath support
......
...@@ -437,9 +437,9 @@ libvirt_la_BUILT_LIBADD = libvirt_util.la ...@@ -437,9 +437,9 @@ libvirt_la_BUILT_LIBADD = libvirt_util.la
libvirt_util_la_SOURCES = \ libvirt_util_la_SOURCES = \
$(UTIL_SOURCES) $(UTIL_SOURCES)
libvirt_util_la_CFLAGS = $(CAPNG_CFLAGS) $(YAJL_CFLAGS) $(LIBNL_CFLAGS) \ libvirt_util_la_CFLAGS = $(CAPNG_CFLAGS) $(YAJL_CFLAGS) $(LIBNL_CFLAGS) \
$(AM_CFLAGS) $(AUDIT_CFLAGS) $(AM_CFLAGS) $(AUDIT_CFLAGS) $(DEVMAPPER_CFLAGS)
libvirt_util_la_LIBADD = $(CAPNG_LIBS) $(YAJL_LIBS) $(LIBNL_LIBS) \ libvirt_util_la_LIBADD = $(CAPNG_LIBS) $(YAJL_LIBS) $(LIBNL_LIBS) \
$(LIB_PTHREAD) $(AUDIT_LIBS) $(LIB_PTHREAD) $(AUDIT_LIBS) $(DEVMAPPER_LIBS)
noinst_LTLIBRARIES += libvirt_conf.la noinst_LTLIBRARIES += libvirt_conf.la
...@@ -1154,7 +1154,6 @@ libvirt_parthelper_SOURCES = $(STORAGE_HELPER_DISK_SOURCES) ...@@ -1154,7 +1154,6 @@ libvirt_parthelper_SOURCES = $(STORAGE_HELPER_DISK_SOURCES)
libvirt_parthelper_LDFLAGS = $(WARN_LDFLAGS) $(AM_LDFLAGS) libvirt_parthelper_LDFLAGS = $(WARN_LDFLAGS) $(AM_LDFLAGS)
libvirt_parthelper_LDADD = \ libvirt_parthelper_LDADD = \
$(LIBPARTED_LIBS) \ $(LIBPARTED_LIBS) \
$(DEVMAPPER_LIBS) \
libvirt_util.la \ libvirt_util.la \
../gnulib/lib/libgnu.la ../gnulib/lib/libgnu.la
...@@ -1179,7 +1178,8 @@ libvirt_lxc_SOURCES = \ ...@@ -1179,7 +1178,8 @@ libvirt_lxc_SOURCES = \
libvirt_lxc_LDFLAGS = $(WARN_CFLAGS) $(AM_LDFLAGS) libvirt_lxc_LDFLAGS = $(WARN_CFLAGS) $(AM_LDFLAGS)
libvirt_lxc_LDADD = $(CAPNG_LIBS) $(YAJL_LIBS) \ libvirt_lxc_LDADD = $(CAPNG_LIBS) $(YAJL_LIBS) \
$(LIBXML_LIBS) $(NUMACTL_LIBS) $(LIB_PTHREAD) \ $(LIBXML_LIBS) $(NUMACTL_LIBS) $(LIB_PTHREAD) \
$(LIBNL_LIBS) $(AUDIT_LIBS) ../gnulib/lib/libgnu.la $(LIBNL_LIBS) $(AUDIT_LIBS) $(DEVMAPPER_LIBS) \
../gnulib/lib/libgnu.la
libvirt_lxc_CFLAGS = \ libvirt_lxc_CFLAGS = \
$(LIBPARTED_CFLAGS) \ $(LIBPARTED_CFLAGS) \
$(NUMACTL_CFLAGS) \ $(NUMACTL_CFLAGS) \
......
...@@ -884,6 +884,7 @@ virGetUserID; ...@@ -884,6 +884,7 @@ virGetUserID;
virGetUserName; virGetUserName;
virHexToBin; virHexToBin;
virIndexToDiskName; virIndexToDiskName;
virIsDevMapperDevice;
virKillProcess; virKillProcess;
virMacAddrCompare; virMacAddrCompare;
virParseMacAddr; virParseMacAddr;
......
...@@ -59,18 +59,6 @@ enum diskCommand { ...@@ -59,18 +59,6 @@ enum diskCommand {
DISK_GEOMETRY DISK_GEOMETRY
}; };
static int
is_dm_device(const char *devname)
{
struct stat buf;
if (devname && !stat(devname, &buf) && dm_is_dm_major(major(buf.st_rdev))) {
return 1;
}
return 0;
}
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
PedDevice *dev; PedDevice *dev;
...@@ -96,7 +84,7 @@ int main(int argc, char **argv) ...@@ -96,7 +84,7 @@ int main(int argc, char **argv)
} }
path = argv[1]; path = argv[1];
if (is_dm_device(path)) { if (virIsDevMapperDevice(path)) {
partsep = "p"; partsep = "p";
canonical_path = strdup(path); canonical_path = strdup(path);
if (canonical_path == NULL) { if (canonical_path == NULL) {
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include "storage_backend_disk.h" #include "storage_backend_disk.h"
#include "util.h" #include "util.h"
#include "memory.h" #include "memory.h"
#include "command.h"
#include "configmake.h" #include "configmake.h"
#define VIR_FROM_THIS VIR_FROM_STORAGE #define VIR_FROM_THIS VIR_FROM_STORAGE
...@@ -647,6 +648,8 @@ virStorageBackendDiskDeleteVol(virConnectPtr conn ATTRIBUTE_UNUSED, ...@@ -647,6 +648,8 @@ virStorageBackendDiskDeleteVol(virConnectPtr conn ATTRIBUTE_UNUSED,
char *part_num = NULL; char *part_num = NULL;
char *devpath = NULL; char *devpath = NULL;
char *devname, *srcname; char *devname, *srcname;
virCommandPtr cmd = NULL;
bool isDevMapperDevice;
int rc = -1; int rc = -1;
if (virFileResolveLink(vol->target.path, &devpath) < 0) { if (virFileResolveLink(vol->target.path, &devpath) < 0) {
...@@ -660,38 +663,45 @@ virStorageBackendDiskDeleteVol(virConnectPtr conn ATTRIBUTE_UNUSED, ...@@ -660,38 +663,45 @@ virStorageBackendDiskDeleteVol(virConnectPtr conn ATTRIBUTE_UNUSED,
srcname = basename(pool->def->source.devices[0].path); srcname = basename(pool->def->source.devices[0].path);
DEBUG("devname=%s, srcname=%s", devname, srcname); DEBUG("devname=%s, srcname=%s", devname, srcname);
if (!STRPREFIX(devname, srcname)) { isDevMapperDevice = virIsDevMapperDevice(devpath);
if (!isDevMapperDevice && !STRPREFIX(devname, srcname)) {
virStorageReportError(VIR_ERR_INTERNAL_ERROR, virStorageReportError(VIR_ERR_INTERNAL_ERROR,
_("Volume path '%s' did not start with parent " _("Volume path '%s' did not start with parent "
"pool source device name."), devname); "pool source device name."), devname);
goto cleanup; goto cleanup;
} }
part_num = devname + strlen(srcname); if (!isDevMapperDevice) {
part_num = devname + strlen(srcname);
if (*part_num == 0) { if (*part_num == 0) {
virStorageReportError(VIR_ERR_INTERNAL_ERROR, virStorageReportError(VIR_ERR_INTERNAL_ERROR,
_("cannot parse partition number from target " _("cannot parse partition number from target "
"'%s'"), devname); "'%s'"), devname);
goto cleanup; goto cleanup;
} }
/* eg parted /dev/sda rm 2 */ /* eg parted /dev/sda rm 2 */
const char *prog[] = { cmd = virCommandNewArgList(PARTED,
PARTED, pool->def->source.devices[0].path,
pool->def->source.devices[0].path, "rm",
"rm", "--script",
"--script", part_num,
part_num, NULL);
NULL, if (virCommandRun(cmd, NULL) < 0)
}; goto cleanup;
} else {
cmd = virCommandNewArgList(DMSETUP, "remove", "--force", devpath, NULL);
if (virRun(prog, NULL) < 0) if (virCommandRun(cmd, NULL) < 0)
goto cleanup; goto cleanup;
}
rc = 0; rc = 0;
cleanup: cleanup:
VIR_FREE(devpath); VIR_FREE(devpath);
virCommandFree(cmd);
return rc; return rc;
} }
......
...@@ -45,6 +45,7 @@ ...@@ -45,6 +45,7 @@
#include <string.h> #include <string.h>
#include <signal.h> #include <signal.h>
#include <termios.h> #include <termios.h>
#include <libdevmapper.h>
#include "c-ctype.h" #include "c-ctype.h"
#ifdef HAVE_PATHS_H #ifdef HAVE_PATHS_H
...@@ -3123,3 +3124,16 @@ virTimestamp(void) ...@@ -3123,3 +3124,16 @@ virTimestamp(void)
return timestamp; return timestamp;
} }
bool
virIsDevMapperDevice(const char *devname)
{
struct stat buf;
if (!stat(devname, &buf) &&
S_ISBLK(buf.st_mode) &&
dm_is_dm_major(major(buf.st_rdev)))
return true;
return false;
}
...@@ -296,4 +296,5 @@ int virBuildPathInternal(char **path, ...) ATTRIBUTE_SENTINEL; ...@@ -296,4 +296,5 @@ int virBuildPathInternal(char **path, ...) ATTRIBUTE_SENTINEL;
char *virTimestamp(void); char *virTimestamp(void);
bool virIsDevMapperDevice(const char *devname) ATTRIBUTE_NONNULL(1);
#endif /* __VIR_UTIL_H__ */ #endif /* __VIR_UTIL_H__ */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册