From: "Daniel P. Berrange" <berrange@xxxxxxxxxx> 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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list