mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-22 04:25:18 +00:00
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 -----------------------------------------
This commit is contained in:
parent
43f8773c1f
commit
df1011ca8e
24
configure.ac
24
configure.ac
@ -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" ||
|
|||||||
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" ||
|
|||||||
[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
|
|||||||
%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
|
|||||||
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)
|
|||||||
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 = \
|
|||||||
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;
|
|||||||
virGetUserName;
|
virGetUserName;
|
||||||
virHexToBin;
|
virHexToBin;
|
||||||
virIndexToDiskName;
|
virIndexToDiskName;
|
||||||
|
virIsDevMapperDevice;
|
||||||
virKillProcess;
|
virKillProcess;
|
||||||
virMacAddrCompare;
|
virMacAddrCompare;
|
||||||
virParseMacAddr;
|
virParseMacAddr;
|
||||||
|
@ -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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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 @@
|
|||||||
#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,
|
|||||||
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,
|
|||||||
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 */
|
||||||
|
cmd = virCommandNewArgList(PARTED,
|
||||||
|
pool->def->source.devices[0].path,
|
||||||
|
"rm",
|
||||||
|
"--script",
|
||||||
|
part_num,
|
||||||
|
NULL);
|
||||||
|
if (virCommandRun(cmd, NULL) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
} else {
|
||||||
|
cmd = virCommandNewArgList(DMSETUP, "remove", "--force", devpath, NULL);
|
||||||
|
|
||||||
|
if (virCommandRun(cmd, NULL) < 0)
|
||||||
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* eg parted /dev/sda rm 2 */
|
|
||||||
const char *prog[] = {
|
|
||||||
PARTED,
|
|
||||||
pool->def->source.devices[0].path,
|
|
||||||
"rm",
|
|
||||||
"--script",
|
|
||||||
part_num,
|
|
||||||
NULL,
|
|
||||||
};
|
|
||||||
|
|
||||||
if (virRun(prog, NULL) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
rc = 0;
|
rc = 0;
|
||||||
cleanup:
|
cleanup:
|
||||||
VIR_FREE(devpath);
|
VIR_FREE(devpath);
|
||||||
|
virCommandFree(cmd);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
|||||||
|
|
||||||
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;
|
|||||||
|
|
||||||
char *virTimestamp(void);
|
char *virTimestamp(void);
|
||||||
|
|
||||||
|
bool virIsDevMapperDevice(const char *devname) ATTRIBUTE_NONNULL(1);
|
||||||
#endif /* __VIR_UTIL_H__ */
|
#endif /* __VIR_UTIL_H__ */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user