File libvirt.libxl-Add-support-for-block-dmmd-drbd-npiv-scripts.patch of Package libvirt
From: "jfehlig@suse.com" <jfehlig@suse.com>
Date: Thu, 18 Feb 2016 16:49:00 +0000
Subject: libxl: Add support for block-{dmmd,drbd,npiv} scripts
libxl: set script field of libxl_device_disk
Add a hack to the libvirt libxl driver to set
libxl_device_disk->script when the disk configuration starts
with some well-known Xen external block scripts: dmmd, drbd,
and npiv.
For more details, see bsc#954872 and FATE#319810
---
src/libxl/libxl_conf.c | 23 ++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -1051,24 +1051,43 @@ libxlDiskSetDiscard(libxl_device_disk *x_disk, virDomainDiskDiscard discard)
case VIR_DOMAIN_DISK_DISCARD_DEFAULT:
case VIR_DOMAIN_DISK_DISCARD_LAST:
break;
case VIR_DOMAIN_DISK_DISCARD_UNMAP:
libxl_defbool_set(&x_disk->discard_enable, true);
break;
case VIR_DOMAIN_DISK_DISCARD_IGNORE:
libxl_defbool_set(&x_disk->discard_enable, false);
break;
}
}
+static void
+libxlDiskSetScript(libxl_device_disk *x_disk, const char *disk_spec)
+{
+ const char *p = NULL;
+
+ if (disk_spec == NULL)
+ return;
+
+ if (STRPREFIX(disk_spec, "dmmd:"))
+ p = "block-dmmd";
+ else if (STRPREFIX(disk_spec, "drbd:"))
+ p = "block-drbd";
+ else if (STRPREFIX(disk_spec, "npiv:"))
+ p = "block-npiv";
+
+ if (p)
+ x_disk->script = g_strdup("block-dmmd");
+}
+
static char *
libxlMakeNetworkDiskSrcStr(virStorageSource *src,
const char *username,
const char *secret)
{
g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
size_t i;
switch (src->protocol) {
case VIR_STORAGE_NET_PROTOCOL_NBD:
case VIR_STORAGE_NET_PROTOCOL_HTTP:
case VIR_STORAGE_NET_PROTOCOL_HTTPS:
@@ -1167,38 +1186,39 @@ libxlMakeNetworkDiskSrc(virStorageSource *src, char **srcstr)
*srcstr = libxlMakeNetworkDiskSrcStr(src, username, base64secret);
virSecureEraseString(base64secret);
if (!*srcstr)
return -1;
return 0;
}
int
libxlMakeDisk(virDomainDiskDef *l_disk, libxl_device_disk *x_disk)
{
+ const char *src = virDomainDiskGetSource(l_disk);
const char *driver = virDomainDiskGetDriver(l_disk);
int format = virDomainDiskGetFormat(l_disk);
virStorageType actual_type = virStorageSourceGetActualType(l_disk->src);
if (actual_type == VIR_STORAGE_TYPE_NETWORK) {
if (STRNEQ_NULLABLE(driver, "qemu")) {
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
_("only the 'qemu' driver can be used with network disks"));
return -1;
}
if (libxlMakeNetworkDiskSrc(l_disk->src, &x_disk->pdev_path) < 0)
return -1;
} else {
- x_disk->pdev_path = g_strdup(virDomainDiskGetSource(l_disk));
+ x_disk->pdev_path = g_strdup(src);
}
x_disk->vdev = g_strdup(l_disk->dst);
if (driver) {
if (STREQ(driver, "tap") || STREQ(driver, "tap2")) {
switch (format) {
case VIR_STORAGE_FILE_QCOW:
x_disk->format = LIBXL_DISK_FORMAT_QCOW;
x_disk->backend = LIBXL_DISK_BACKEND_QDISK;
break;
case VIR_STORAGE_FILE_QCOW2:
@@ -1281,24 +1301,25 @@ libxlMakeDisk(virDomainDiskDef *l_disk, libxl_device_disk *x_disk)
* xl-disk-configuration.txt in the xen documentation and let
* libxl pick a suitable backend.
*/
x_disk->format = LIBXL_DISK_FORMAT_RAW;
x_disk->backend = LIBXL_DISK_BACKEND_UNKNOWN;
}
/* XXX is this right? */
x_disk->removable = 1;
x_disk->readwrite = !l_disk->src->readonly;
x_disk->is_cdrom = l_disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM ? 1 : 0;
libxlDiskSetDiscard(x_disk, l_disk->discard);
+ libxlDiskSetScript(x_disk, src);
/* An empty CDROM must have the empty format, otherwise libxl fails. */
if (x_disk->is_cdrom && !x_disk->pdev_path)
x_disk->format = LIBXL_DISK_FORMAT_EMPTY;
if (l_disk->transient) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("libxenlight does not support transient disks"));
return -1;
}
x_disk->backend_domname = g_strdup(l_disk->domain_name);
return 0;