In order to allow for a virDomainHostdevDef that uses the
virDomainDeviceInfo of a "higher level" device (such as a
virDomainNetDef), this patch changes the virDomainDeviceInfo in the
HostdevDef into a virDomainDeviceInfoPtr. Rather than adding checks
all over the code to check for a null info, we just guarantee that it
is always valid. The new function virDomainHostdevDefAlloc() allocates
a virDomainDeviceInfo and plugs it in, and virDomainHostdevDefFree()
makes sure it is freed.
There were 4 places allocating virDomainHostdevDefs, all of them
parsers of one sort or another, and those have all had their
VIR_ALLOC(hostdev) changed to virDomainHostdevDefAlloc(). Other than
that, and the new functions, all the rest of the changes are just
mechanical removals of "&" or changing "." to "->".
---
src/conf/domain_conf.c | 48 +++++++++++++++++++++++++++++++++------------
src/conf/domain_conf.h | 3 +-
src/libvirt_private.syms | 1 +
src/qemu/qemu_command.c | 45 +++++++++++++++++++-----------------------
src/qemu/qemu_hotplug.c | 28 +++++++++++++-------------
src/xenxs/xen_sxpr.c | 4 +-
src/xenxs/xen_xm.c | 4 +-
7 files changed, 76 insertions(+), 57 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 85a2058..137fb73 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -780,6 +780,15 @@ bool virDomainObjTaint(virDomainObjPtr obj,
return true;
}
+static void
+virDomainDeviceInfoFree(virDomainDeviceInfoPtr info)
+{
+ if (info) {
+ virDomainDeviceInfoClear(info);
+ VIR_FREE(info);
+ }
+}
+
static void
virDomainGraphicsAuthDefClear(virDomainGraphicsAuthDefPtr def)
@@ -1288,12 +1297,27 @@ void virDomainVideoDefFree(virDomainVideoDefPtr def)
VIR_FREE(def);
}
+virDomainHostdevDefPtr virDomainHostdevDefAlloc(void)
+{
+ virDomainHostdevDefPtr def = NULL;
+
+ if (VIR_ALLOC(def) < 0) {
+ virReportOOMError();
+ return NULL;
+ }
+ if (VIR_ALLOC(def->info) < 0) {
+ VIR_FREE(def);
+ return NULL;
+ }
+ return def;
+}
+
void virDomainHostdevDefFree(virDomainHostdevDefPtr def)
{
if (!def)
return;
- virDomainDeviceInfoClear(&def->info);
+ virDomainDeviceInfoFree(def->info);
VIR_FREE(def);
}
@@ -1857,7 +1881,7 @@ int virDomainDeviceInfoIterate(virDomainDefPtr def,
if (cb(def, &def->sounds[i]->info, opaque) < 0)
return -1;
for (i = 0; i < def->nhostdevs ; i++)
- if (cb(def, &def->hostdevs[i]->info, opaque) < 0)
+ if (cb(def, def->hostdevs[i]->info, opaque) < 0)
return -1;
for (i = 0; i < def->nvideos ; i++)
if (cb(def, &def->videos[i]->info, opaque) < 0)
@@ -6262,14 +6286,14 @@ virDomainHostdevSubsysPciDefParseXML(const xmlNodePtr node,
char *devaddr = virXMLPropString(cur, "devaddr");
if (devaddr &&
virDomainParseLegacyDeviceAddress(devaddr,
- &def->info.addr.pci) < 0)
{
+ &def->info->addr.pci)
< 0) {
virDomainReportError(VIR_ERR_INTERNAL_ERROR,
_("Unable to parse devaddr parameter
'%s'"),
devaddr);
VIR_FREE(devaddr);
goto out;
}
- def->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
+ def->info->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
} else if ((flags & VIR_DOMAIN_XML_INTERNAL_PCI_ORIG_STATES) &&
xmlStrEqual(cur->name, BAD_CAST "origstates")) {
virDomainHostdevOrigStatesPtr states = &def->origstates;
@@ -6300,10 +6324,8 @@ virDomainHostdevDefParseXML(const xmlNodePtr node,
virDomainHostdevDefPtr def;
char *mode, *type = NULL, *managed = NULL;
- if (VIR_ALLOC(def) < 0) {
- virReportOOMError();
+ if (!(def = virDomainHostdevDefAlloc()))
return NULL;
- }
mode = virXMLPropString(node, "mode");
if (mode) {
@@ -6366,8 +6388,8 @@ virDomainHostdevDefParseXML(const xmlNodePtr node,
cur = cur->next;
}
- if (def->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) {
- if (virDomainDeviceInfoParseXML(node, bootMap, &def->info,
+ if (def->info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) {
+ if (virDomainDeviceInfoParseXML(node, bootMap, def->info,
flags | VIR_DOMAIN_XML_INTERNAL_ALLOW_BOOT
| VIR_DOMAIN_XML_INTERNAL_ALLOW_ROM) < 0)
goto error;
@@ -6376,8 +6398,8 @@ virDomainHostdevDefParseXML(const xmlNodePtr node,
if (def->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) {
switch (def->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
- if (def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
- def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
+ if (def->info->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
+ def->info->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("PCI host devices must use 'pci'
address type"));
goto error;
@@ -8927,7 +8949,7 @@ static bool
virDomainHostdevDefCheckABIStability(virDomainHostdevDefPtr src,
}
}
- if (!virDomainDeviceInfoCheckABIStability(&src->info, &dst->info))
+ if (!virDomainDeviceInfoCheckABIStability(src->info, dst->info))
goto cleanup;
identical = true;
@@ -11463,7 +11485,7 @@ virDomainHostdevDefFormat(virBufferPtr buf,
virBufferAddLit(buf, " </source>\n");
- if (virDomainDeviceInfoFormat(buf, &def->info,
+ if (virDomainDeviceInfoFormat(buf, def->info,
flags | VIR_DOMAIN_XML_INTERNAL_ALLOW_BOOT
| VIR_DOMAIN_XML_INTERNAL_ALLOW_ROM) < 0)
return -1;
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 9c8792a..1f7f25a 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1128,8 +1128,8 @@ struct _virDomainHostdevDef {
int dummy;
} caps;
} source;
- virDomainDeviceInfo info; /* Guest address */
virDomainHostdevOrigStates origstates;
+ virDomainDeviceInfoPtr info; /* Guest address */
};
enum virDomainRedirdevBus {
@@ -1740,6 +1740,7 @@ void virDomainSoundDefFree(virDomainSoundDefPtr def);
void virDomainMemballoonDefFree(virDomainMemballoonDefPtr def);
void virDomainWatchdogDefFree(virDomainWatchdogDefPtr def);
void virDomainVideoDefFree(virDomainVideoDefPtr def);
+virDomainHostdevDefPtr virDomainHostdevDefAlloc(void);
void virDomainHostdevDefFree(virDomainHostdevDefPtr def);
void virDomainHubDefFree(virDomainHubDefPtr def);
void virDomainRedirdevDefFree(virDomainRedirdevDefPtr def);
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 9e3573f..dc55f7b 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -350,6 +350,7 @@ virDomainGraphicsSpiceZlibCompressionTypeFromString;
virDomainGraphicsSpiceZlibCompressionTypeToString;
virDomainGraphicsTypeFromString;
virDomainGraphicsTypeToString;
+virDomainHostdevDefAlloc;
virDomainHostdevDefFree;
virDomainHostdevModeTypeToString;
virDomainHostdevSubsysTypeToString;
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 5a34504..dffb6d4 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -535,7 +535,7 @@ qemuAssignDeviceHostdevAlias(virDomainDefPtr def,
virDomainHostdevDefPtr hostdev
idx = 0;
for (i = 0 ; i < def->nhostdevs ; i++) {
int thisidx;
- if ((thisidx = qemuDomainDeviceAliasIndex(&def->hostdevs[i]->info,
"hostdev")) < 0) {
+ if ((thisidx = qemuDomainDeviceAliasIndex(def->hostdevs[i]->info,
"hostdev")) < 0) {
qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Unable to determine device index for hostdev
device"));
return -1;
@@ -545,7 +545,7 @@ qemuAssignDeviceHostdevAlias(virDomainDefPtr def,
virDomainHostdevDefPtr hostdev
}
}
- if (virAsprintf(&hostdev->info.alias, "hostdev%d", idx) < 0) {
+ if (virAsprintf(&hostdev->info->alias, "hostdev%d", idx) < 0)
{
virReportOOMError();
return -1;
}
@@ -1384,13 +1384,13 @@ qemuAssignDevicePCISlots(virDomainDefPtr def,
qemuDomainPCIAddressSetPtr addrs)
/* Host PCI devices */
for (i = 0; i < def->nhostdevs ; i++) {
- if (def->hostdevs[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
+ if (def->hostdevs[i]->info->type !=
VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
continue;
if (def->hostdevs[i]->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS ||
def->hostdevs[i]->source.subsys.type !=
VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
continue;
- if (qemuDomainPCIAddressSetNextAddr(addrs, &def->hostdevs[i]->info)
< 0)
+ if (qemuDomainPCIAddressSetNextAddr(addrs, def->hostdevs[i]->info) < 0)
goto error;
}
@@ -2863,14 +2863,14 @@ qemuBuildPCIHostdevDevStr(virDomainHostdevDefPtr dev, const char
*configfd,
dev->source.subsys.u.pci.bus,
dev->source.subsys.u.pci.slot,
dev->source.subsys.u.pci.function);
- virBufferAsprintf(&buf, ",id=%s", dev->info.alias);
+ virBufferAsprintf(&buf, ",id=%s", dev->info->alias);
if (configfd && *configfd)
virBufferAsprintf(&buf, ",configfd=%s", configfd);
- if (dev->info.bootIndex)
- virBufferAsprintf(&buf, ",bootindex=%d", dev->info.bootIndex);
- if (qemuBuildDeviceAddressStr(&buf, &dev->info, qemuCaps) < 0)
+ if (dev->info->bootIndex)
+ virBufferAsprintf(&buf, ",bootindex=%d",
dev->info->bootIndex);
+ if (qemuBuildDeviceAddressStr(&buf, dev->info, qemuCaps) < 0)
goto error;
- if (qemuBuildRomStr(&buf, &dev->info, qemuCaps) < 0)
+ if (qemuBuildRomStr(&buf, dev->info, qemuCaps) < 0)
goto error;
if (virBufferError(&buf)) {
@@ -2956,9 +2956,9 @@ qemuBuildUSBHostdevDevStr(virDomainHostdevDefPtr dev,
virBufferAsprintf(&buf, "usb-host,hostbus=%d,hostaddr=%d,id=%s",
dev->source.subsys.u.usb.bus,
dev->source.subsys.u.usb.device,
- dev->info.alias);
+ dev->info->alias);
- if (qemuBuildDeviceAddressStr(&buf, &dev->info, qemuCaps) < 0)
+ if (qemuBuildDeviceAddressStr(&buf, dev->info, qemuCaps) < 0)
goto error;
if (virBufferError(&buf)) {
@@ -5575,7 +5575,7 @@ qemuBuildCommandLine(virConnectPtr conn,
virDomainHostdevDefPtr hostdev = def->hostdevs[i];
char *devstr;
- if (hostdev->info.bootIndex) {
+ if (hostdev->info->bootIndex) {
if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS ||
hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) {
qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
@@ -6527,15 +6527,17 @@ cleanup:
static virDomainHostdevDefPtr
qemuParseCommandLinePCI(const char *val)
{
- virDomainHostdevDefPtr def = NULL;
int bus = 0, slot = 0, func = 0;
const char *start;
char *end;
+ virDomainHostdevDefPtr def = virDomainHostdevDefAlloc();
+
+ if (!def)
+ goto cleanup;
if (!STRPREFIX(val, "host=")) {
qemuReportError(VIR_ERR_INTERNAL_ERROR,
_("unknown PCI device syntax '%s'"), val);
- VIR_FREE(def);
goto cleanup;
}
@@ -6561,11 +6563,6 @@ qemuParseCommandLinePCI(const char *val)
goto cleanup;
}
- if (VIR_ALLOC(def) < 0) {
- virReportOOMError();
- goto cleanup;
- }
-
def->mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS;
def->managed = 1;
def->source.subsys.type = VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI;
@@ -6584,11 +6581,14 @@ cleanup:
static virDomainHostdevDefPtr
qemuParseCommandLineUSB(const char *val)
{
- virDomainHostdevDefPtr def = NULL;
+ virDomainHostdevDefPtr def = virDomainHostdevDefAlloc();
int first = 0, second = 0;
const char *start;
char *end;
+ if (!def)
+ goto cleanup;
+
if (!STRPREFIX(val, "host:")) {
qemuReportError(VIR_ERR_INTERNAL_ERROR,
_("unknown USB device syntax '%s'"), val);
@@ -6627,11 +6627,6 @@ qemuParseCommandLineUSB(const char *val)
}
}
- if (VIR_ALLOC(def) < 0) {
- virReportOOMError();
- goto cleanup;
- }
-
def->mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS;
def->managed = 0;
def->source.subsys.type = VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB;
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 3dd7c0a..b55052a 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -917,14 +917,14 @@ int qemuDomainAttachHostPciDevice(struct qemud_driver *driver,
if (qemuCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
if (qemuAssignDeviceHostdevAlias(vm->def, hostdev, -1) < 0)
goto error;
- if (qemuDomainPCIAddressEnsureAddr(priv->pciaddrs, &hostdev->info) <
0)
+ if (qemuDomainPCIAddressEnsureAddr(priv->pciaddrs, hostdev->info) < 0)
goto error;
releaseaddr = true;
if (qemuCapsGet(priv->qemuCaps, QEMU_CAPS_PCI_CONFIGFD)) {
configfd = qemuOpenPCIConfig(hostdev);
if (configfd >= 0) {
if (virAsprintf(&configfd_name, "fd-%s",
- hostdev->info.alias) < 0) {
+ hostdev->info->alias) < 0) {
virReportOOMError();
goto error;
}
@@ -946,7 +946,7 @@ int qemuDomainAttachHostPciDevice(struct qemud_driver *driver,
configfd, configfd_name);
qemuDomainObjExitMonitorWithDriver(driver, vm);
} else {
- virDomainDevicePCIAddress guestAddr = hostdev->info.addr.pci;
+ virDomainDevicePCIAddress guestAddr = hostdev->info->addr.pci;
qemuDomainObjEnterMonitorWithDriver(driver, vm);
ret = qemuMonitorAddPCIHostDevice(priv->mon,
@@ -954,8 +954,8 @@ int qemuDomainAttachHostPciDevice(struct qemud_driver *driver,
&guestAddr);
qemuDomainObjExitMonitorWithDriver(driver, vm);
- hostdev->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
- memcpy(&hostdev->info.addr.pci, &guestAddr, sizeof(guestAddr));
+ hostdev->info->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
+ memcpy(&hostdev->info->addr.pci, &guestAddr, sizeof(guestAddr));
}
virDomainAuditHostdev(vm, hostdev, "attach", ret == 0);
if (ret < 0)
@@ -971,10 +971,10 @@ int qemuDomainAttachHostPciDevice(struct qemud_driver *driver,
error:
if (qemuCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE) &&
- (hostdev->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) &&
+ (hostdev->info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) &&
releaseaddr &&
qemuDomainPCIAddressReleaseSlot(priv->pciaddrs,
- hostdev->info.addr.pci.slot) < 0)
+ hostdev->info->addr.pci.slot) < 0)
VIR_WARN("Unable to release PCI address on host device");
qemuDomainReAttachHostdevDevices(driver, vm->def->name, &hostdev, 1);
@@ -2016,14 +2016,14 @@ qemuDomainDetachHostPciDevice(struct qemud_driver *driver,
return -1;
}
- if (qemuIsMultiFunctionDevice(vm->def, &detach->info)) {
+ if (qemuIsMultiFunctionDevice(vm->def, detach->info)) {
qemuReportError(VIR_ERR_OPERATION_FAILED,
_("cannot hot unplug multifunction PCI device: %s"),
dev->data.disk->dst);
return -1;
}
- if (!virDomainDeviceAddressIsValid(&detach->info,
+ if (!virDomainDeviceAddressIsValid(detach->info,
VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI)) {
qemuReportError(VIR_ERR_OPERATION_FAILED,
"%s", _("device cannot be detached without a PCI
address"));
@@ -2032,9 +2032,9 @@ qemuDomainDetachHostPciDevice(struct qemud_driver *driver,
qemuDomainObjEnterMonitorWithDriver(driver, vm);
if (qemuCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
- ret = qemuMonitorDelDevice(priv->mon, detach->info.alias);
+ ret = qemuMonitorDelDevice(priv->mon, detach->info->alias);
} else {
- ret = qemuMonitorRemovePCIDevice(priv->mon, &detach->info.addr.pci);
+ ret = qemuMonitorRemovePCIDevice(priv->mon,
&detach->info->addr.pci);
}
qemuDomainObjExitMonitorWithDriver(driver, vm);
virDomainAuditHostdev(vm, detach, "detach", ret == 0);
@@ -2060,7 +2060,7 @@ qemuDomainDetachHostPciDevice(struct qemud_driver *driver,
if (qemuCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE) &&
qemuDomainPCIAddressReleaseSlot(priv->pciaddrs,
- detach->info.addr.pci.slot) < 0)
+ detach->info->addr.pci.slot) < 0)
VIR_WARN("Unable to release PCI address on host device");
if (vm->def->nhostdevs > 1) {
@@ -2129,7 +2129,7 @@ qemuDomainDetachHostUsbDevice(struct qemud_driver *driver,
return -1;
}
- if (!detach->info.alias) {
+ if (!detach->info->alias) {
qemuReportError(VIR_ERR_OPERATION_FAILED,
"%s", _("device cannot be detached without a
device alias"));
return -1;
@@ -2142,7 +2142,7 @@ qemuDomainDetachHostUsbDevice(struct qemud_driver *driver,
}
qemuDomainObjEnterMonitorWithDriver(driver, vm);
- ret = qemuMonitorDelDevice(priv->mon, detach->info.alias);
+ ret = qemuMonitorDelDevice(priv->mon, detach->info->alias);
qemuDomainObjExitMonitorWithDriver(driver, vm);
virDomainAuditHostdev(vm, detach, "detach", ret == 0);
if (ret < 0)
diff --git a/src/xenxs/xen_sxpr.c b/src/xenxs/xen_sxpr.c
index f8390ea..81fc0af 100644
--- a/src/xenxs/xen_sxpr.c
+++ b/src/xenxs/xen_sxpr.c
@@ -1076,8 +1076,8 @@ xenParseSxprPCI(virDomainDefPtr def,
goto error;
}
- if (VIR_ALLOC(dev) < 0)
- goto no_memory;
+ if (!(dev = virDomainHostdevDefAlloc()))
+ goto error;
dev->mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS;
dev->managed = 0;
diff --git a/src/xenxs/xen_xm.c b/src/xenxs/xen_xm.c
index e580a3e..6e72aea 100644
--- a/src/xenxs/xen_xm.c
+++ b/src/xenxs/xen_xm.c
@@ -815,8 +815,8 @@ xenParseXM(virConfPtr conf, int xendConfigVersion,
if (virStrToLong_i(func, NULL, 16, &funcID) < 0)
goto skippci;
- if (VIR_ALLOC(hostdev) < 0)
- goto no_memory;
+ if (!(hostdev = virDomainHostdevDefAlloc()))
+ goto cleanup;
hostdev->managed = 0;
hostdev->source.subsys.type = VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI;
--
1.7.7.6