From: "Daniel P. Berrange" <berrange(a)redhat.com>
The virDomainDeviceInfoIsSet API was only checking if an
address or alias was set in the struct. Thus if only a
rom bar setting / filename, boot index, or USB master
value was set, they could be accidentally dropped when
formatting XML
---
src/conf/domain_conf.c | 15 +++++++++++----
src/conf/domain_conf.h | 4 ++++
2 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 54ac1db..e43d76d 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1904,14 +1904,21 @@ int virDomainDevicePCIAddressIsValid(virDomainDevicePCIAddressPtr
addr)
}
-static int
+static bool
virDomainDeviceInfoIsSet(virDomainDeviceInfoPtr info, unsigned int flags)
{
if (info->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
- return 1;
+ return true;
if (info->alias && !(flags & VIR_DOMAIN_XML_INACTIVE))
- return 1;
- return 0;
+ return true;
+ if (info->mastertype != VIR_DOMAIN_CONTROLLER_MASTER_NONE)
+ return true;
+ if ((info->rombar != VIR_DOMAIN_PCI_ROMBAR_DEFAULT) ||
+ info->romfile)
+ return true;
+ if (info->bootIndex)
+ return true;
+ return false;
}
void virDomainDeviceInfoClear(virDomainDeviceInfoPtr info)
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 6648a17..1597212 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -253,6 +253,10 @@ struct _virDomainDeviceUSBMaster {
typedef struct _virDomainDeviceInfo virDomainDeviceInfo;
typedef virDomainDeviceInfo *virDomainDeviceInfoPtr;
struct _virDomainDeviceInfo {
+ /* If adding to this struct, ensure that
+ * virDomainDeviceInfoIsSet() is updated
+ * to consider the new fields
+ */
char *alias;
int type;
union {
--
1.7.10.1