Marek Marczykowski-Górecki wrote:
This implement handling of <domain name=''/> parameter
introduced in
previous patch.
Lookup on domain name (to get domain ID) requires libxlDriverPrivate
object, so it must be passed down to libxlMakeDisk and libxlMakeNet from
top level callers.
Changes in v2:
- rebase on 1.0.6+
- fix indentation
- make libxl_name_to_domid switch more defensive
Signed-off-by: Marek Marczykowski-Górecki <marmarek(a)invisiblethingslab.com>
---
src/libxl/libxl_conf.c | 76 +++++++++++++++++++++++++++++++++++++++++++-----
src/libxl/libxl_conf.h | 4 +--
src/libxl/libxl_driver.c | 51 +++++++++++++++++++-------------
3 files changed, 101 insertions(+), 30 deletions(-)
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index b9cb61e..623956e 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -441,7 +441,9 @@ error:
}
int
-libxlMakeDisk(virDomainDiskDefPtr l_disk, libxl_device_disk *x_disk)
+libxlMakeDisk(libxlDriverPrivatePtr driver,
After looking at this again, I wonder if it is better to just pass the
libxl_ctx to libxlMakeDisk and libxlMakeNic. All the callers already
have a libxl_ctx, making for a much smaller patch. What do you think?
Regards,
Jim
+ virDomainDiskDefPtr l_disk,
+ libxl_device_disk *x_disk)
{
if (VIR_STRDUP(x_disk->pdev_path, l_disk->src) < 0)
return -1;
@@ -509,11 +511,39 @@ libxlMakeDisk(virDomainDiskDefPtr l_disk, libxl_device_disk
*x_disk)
return -1;
}
+ if (l_disk->domain_name) {
+ uint32_t domid;
+ /* Do not use virDomainObjListFindByName as it causes deadlock here -
+ * we already have lock on this domain object, but
+ * virDomainObjListFindByName will try to take it again.
+ */
+ switch (libxl_name_to_domid(driver->ctx, l_disk->domain_name, &domid))
{
+ case 0:
+ x_disk->backend_domid = domid;
+ break;
+ case ERROR_INVAL:
+ virReportError(VIR_ERR_XML_DETAIL,
+ _("Backend domain '%s' does not exists for disk
'%s'"),
+ l_disk->domain_name, l_disk->dst);
+ return -1;
+ case ERROR_NOMEM:
+ virReportOOMError();
+ return -1;
+ default:
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Failed to get ID of domain '%s'"),
+ l_disk->domain_name);
+ return -1;
+ }
+ }
+
return 0;
}
static int
-libxlMakeDiskList(virDomainDefPtr def, libxl_domain_config *d_config)
+libxlMakeDiskList(libxlDriverPrivatePtr driver,
+ virDomainDefPtr def,
+ libxl_domain_config *d_config)
{
virDomainDiskDefPtr *l_disks = def->disks;
int ndisks = def->ndisks;
@@ -526,7 +556,7 @@ libxlMakeDiskList(virDomainDefPtr def, libxl_domain_config
*d_config)
}
for (i = 0; i < ndisks; i++) {
- if (libxlMakeDisk(l_disks[i], &x_disks[i]) < 0)
+ if (libxlMakeDisk(driver, l_disks[i], &x_disks[i]) < 0)
goto error;
}
@@ -543,7 +573,9 @@ error:
}
int
-libxlMakeNic(virDomainNetDefPtr l_nic, libxl_device_nic *x_nic)
+libxlMakeNic(libxlDriverPrivatePtr driver,
+ virDomainNetDefPtr l_nic,
+ libxl_device_nic *x_nic)
{
/* TODO: Where is mtu stored?
*
@@ -579,11 +611,39 @@ libxlMakeNic(virDomainNetDefPtr l_nic, libxl_device_nic *x_nic)
return -1;
}
+ if (l_nic->domain_name) {
+ uint32_t domid;
+ /* Do not use virDomainObjListFindByName as it causes deadlock here -
+ * we already have lock on this domain object, but
+ * virDomainObjListFindByName will try to take it again.
+ */
+ switch (libxl_name_to_domid(driver->ctx, l_nic->domain_name, &domid))
{
+ case 0:
+ x_nic->backend_domid = domid;
+ break;
+ case ERROR_INVAL:
+ virReportError(VIR_ERR_XML_DETAIL,
+ _("Backend domain '%s' does not exists for nic
'%s'"),
+ l_nic->domain_name, l_nic->ifname);
+ return -1;
+ case ERROR_NOMEM:
+ virReportOOMError();
+ return -1;
+ default:
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Failed to get ID of domain '%s'"),
+ l_nic->domain_name);
+ return -1;
+ }
+ }
+
return 0;
}
static int
-libxlMakeNicList(virDomainDefPtr def, libxl_domain_config *d_config)
+libxlMakeNicList(libxlDriverPrivatePtr driver,
+ virDomainDefPtr def,
+ libxl_domain_config *d_config)
{
virDomainNetDefPtr *l_nics = def->nets;
int nnics = def->nnets;
@@ -598,7 +658,7 @@ libxlMakeNicList(virDomainDefPtr def, libxl_domain_config
*d_config)
for (i = 0; i < nnics; i++) {
x_nics[i].devid = i;
- if (libxlMakeNic(l_nics[i], &x_nics[i]))
+ if (libxlMakeNic(driver, l_nics[i], &x_nics[i]))
goto error;
}
@@ -756,11 +816,11 @@ libxlBuildDomainConfig(libxlDriverPrivatePtr driver,
return -1;
}
- if (libxlMakeDiskList(def, d_config) < 0) {
+ if (libxlMakeDiskList(driver, def, d_config) < 0) {
return -1;
}
- if (libxlMakeNicList(def, d_config) < 0) {
+ if (libxlMakeNicList(driver, def, d_config) < 0) {
return -1;
}
diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h
index e8fb9c4..33126f3 100644
--- a/src/libxl/libxl_conf.h
+++ b/src/libxl/libxl_conf.h
@@ -115,9 +115,9 @@ virCapsPtr
libxlMakeCapabilities(libxl_ctx *ctx);
int
-libxlMakeDisk(virDomainDiskDefPtr l_dev, libxl_device_disk *x_dev);
+libxlMakeDisk(libxlDriverPrivatePtr driver, virDomainDiskDefPtr l_dev, libxl_device_disk
*x_dev);
int
-libxlMakeNic(virDomainNetDefPtr l_nic, libxl_device_nic *x_nic);
+libxlMakeNic(libxlDriverPrivatePtr driver, virDomainNetDefPtr l_nic, libxl_device_nic
*x_nic);
int
libxlMakeVfb(libxlDriverPrivatePtr driver,
virDomainGraphicsDefPtr l_vfb, libxl_device_vfb *x_vfb);
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index 0a0690d..df31001 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -3233,8 +3233,10 @@ libxlDomainUndefine(virDomainPtr dom)
}
static int
-libxlDomainChangeEjectableMedia(libxlDomainObjPrivatePtr priv,
- virDomainObjPtr vm, virDomainDiskDefPtr disk)
+libxlDomainChangeEjectableMedia(libxlDriverPrivatePtr driver,
+ libxlDomainObjPrivatePtr priv,
+ virDomainObjPtr vm,
+ virDomainDiskDefPtr disk)
{
virDomainDiskDefPtr origdisk = NULL;
libxl_device_disk x_disk;
@@ -3263,7 +3265,7 @@ libxlDomainChangeEjectableMedia(libxlDomainObjPrivatePtr priv,
return -1;
}
- if (libxlMakeDisk(disk, &x_disk) < 0)
+ if (libxlMakeDisk(driver, disk, &x_disk) < 0)
goto cleanup;
if ((ret = libxl_cdrom_insert(priv->ctx, vm->def->id, &x_disk, NULL))
< 0) {
@@ -3288,8 +3290,10 @@ cleanup:
}
static int
-libxlDomainAttachDeviceDiskLive(libxlDomainObjPrivatePtr priv,
- virDomainObjPtr vm, virDomainDeviceDefPtr dev)
+libxlDomainAttachDeviceDiskLive(libxlDriverPrivatePtr driver,
+ libxlDomainObjPrivatePtr priv,
+ virDomainObjPtr vm,
+ virDomainDeviceDefPtr dev)
{
virDomainDiskDefPtr l_disk = dev->data.disk;
libxl_device_disk x_disk;
@@ -3297,7 +3301,7 @@ libxlDomainAttachDeviceDiskLive(libxlDomainObjPrivatePtr priv,
switch (l_disk->device) {
case VIR_DOMAIN_DISK_DEVICE_CDROM:
- ret = libxlDomainChangeEjectableMedia(priv, vm, l_disk);
+ ret = libxlDomainChangeEjectableMedia(driver, priv, vm, l_disk);
break;
case VIR_DOMAIN_DISK_DEVICE_DISK:
if (l_disk->bus == VIR_DOMAIN_DISK_BUS_XEN) {
@@ -3318,7 +3322,7 @@ libxlDomainAttachDeviceDiskLive(libxlDomainObjPrivatePtr priv,
goto cleanup;
}
- if (libxlMakeDisk(l_disk, &x_disk) < 0)
+ if (libxlMakeDisk(driver, l_disk, &x_disk) < 0)
goto cleanup;
if ((ret = libxl_device_disk_add(priv->ctx, vm->def->id,
@@ -3349,8 +3353,10 @@ cleanup:
}
static int
-libxlDomainDetachDeviceDiskLive(libxlDomainObjPrivatePtr priv,
- virDomainObjPtr vm, virDomainDeviceDefPtr dev)
+libxlDomainDetachDeviceDiskLive(libxlDriverPrivatePtr driver,
+ libxlDomainObjPrivatePtr priv,
+ virDomainObjPtr vm,
+ virDomainDeviceDefPtr dev)
{
virDomainDiskDefPtr l_disk = NULL;
libxl_device_disk x_disk;
@@ -3371,7 +3377,7 @@ libxlDomainDetachDeviceDiskLive(libxlDomainObjPrivatePtr priv,
l_disk = vm->def->disks[i];
- if (libxlMakeDisk(l_disk, &x_disk) < 0)
+ if (libxlMakeDisk(driver, l_disk, &x_disk) < 0)
goto cleanup;
if ((ret = libxl_device_disk_remove(priv->ctx, vm->def->id,
@@ -3403,14 +3409,15 @@ cleanup:
}
static int
-libxlDomainAttachDeviceLive(libxlDomainObjPrivatePtr priv, virDomainObjPtr vm,
+libxlDomainAttachDeviceLive(libxlDriverPrivatePtr driver,
+ libxlDomainObjPrivatePtr priv, virDomainObjPtr vm,
virDomainDeviceDefPtr dev)
{
int ret = -1;
switch (dev->type) {
case VIR_DOMAIN_DEVICE_DISK:
- ret = libxlDomainAttachDeviceDiskLive(priv, vm, dev);
+ ret = libxlDomainAttachDeviceDiskLive(driver, priv, vm, dev);
if (!ret)
dev->data.disk = NULL;
break;
@@ -3455,14 +3462,16 @@ libxlDomainAttachDeviceConfig(virDomainDefPtr vmdef,
virDomainDeviceDefPtr dev)
}
static int
-libxlDomainDetachDeviceLive(libxlDomainObjPrivatePtr priv, virDomainObjPtr vm,
+libxlDomainDetachDeviceLive(libxlDriverPrivatePtr driver,
+ libxlDomainObjPrivatePtr priv,
+ virDomainObjPtr vm,
virDomainDeviceDefPtr dev)
{
int ret = -1;
switch (dev->type) {
case VIR_DOMAIN_DEVICE_DISK:
- ret = libxlDomainDetachDeviceDiskLive(priv, vm, dev);
+ ret = libxlDomainDetachDeviceDiskLive(driver, priv, vm, dev);
break;
default:
@@ -3502,8 +3511,10 @@ libxlDomainDetachDeviceConfig(virDomainDefPtr vmdef,
virDomainDeviceDefPtr dev)
}
static int
-libxlDomainUpdateDeviceLive(libxlDomainObjPrivatePtr priv,
- virDomainObjPtr vm, virDomainDeviceDefPtr dev)
+libxlDomainUpdateDeviceLive(libxlDriverPrivatePtr driver,
+ libxlDomainObjPrivatePtr priv,
+ virDomainObjPtr vm,
+ virDomainDeviceDefPtr dev)
{
virDomainDiskDefPtr disk;
int ret = -1;
@@ -3513,7 +3524,7 @@ libxlDomainUpdateDeviceLive(libxlDomainObjPrivatePtr priv,
disk = dev->data.disk;
switch (disk->device) {
case VIR_DOMAIN_DISK_DEVICE_CDROM:
- ret = libxlDomainChangeEjectableMedia(priv, vm, disk);
+ ret = libxlDomainChangeEjectableMedia(driver, priv, vm, disk);
if (ret == 0)
dev->data.disk = NULL;
break;
@@ -3650,7 +3661,7 @@ libxlDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
VIR_DOMAIN_XML_INACTIVE)))
goto cleanup;
- if ((ret = libxlDomainAttachDeviceLive(priv, vm, dev)) < 0)
+ if ((ret = libxlDomainAttachDeviceLive(driver, priv, vm, dev)) < 0)
goto cleanup;
/*
@@ -3755,7 +3766,7 @@ libxlDomainDetachDeviceFlags(virDomainPtr dom, const char *xml,
VIR_DOMAIN_XML_INACTIVE)))
goto cleanup;
- if ((ret = libxlDomainDetachDeviceLive(priv, vm, dev)) < 0)
+ if ((ret = libxlDomainDetachDeviceLive(driver, priv, vm, dev)) < 0)
goto cleanup;
/*
@@ -3860,7 +3871,7 @@ libxlDomainUpdateDeviceFlags(virDomainPtr dom, const char *xml,
VIR_DOMAIN_XML_INACTIVE)))
goto cleanup;
- if ((ret = libxlDomainUpdateDeviceLive(priv, vm, dev)) < 0)
+ if ((ret = libxlDomainUpdateDeviceLive(driver, priv, vm, dev)) < 0)
goto cleanup;
/*