[PATCH libvirt v1] conf: verify for duplicate hostdevs

Shalini Chellathurai Saroja shalini at linux.ibm.com
Thu Jul 1 08:31:54 UTC 2021


On 6/30/21 4:49 PM, Michal Prívozník wrote:
> On 6/18/21 12:46 PM, Shalini Chellathurai Saroja wrote:
>> It is possible to define/edit(in shut off state) a domain XML with
>> same hostdev device repeated more than once, as shown below. This
>> behavior is not expected. So, this patch fixes it.
>>
>> vser1:
>> <domain type='kvm'>
>> [...]
>>    <devices>
>>   [...]
>>      <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-ccw'>
>>        <source>
>>          <address uuid='8e782fea-e5f4-45fa-a0f9-024cf66e5009'/>
>>        </source>
>>        <address type='ccw' cssid='0xfe' ssid='0x0' devno='0x0005'/>
>>      </hostdev>
>>      <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-ccw'>
>>        <source>
>>          <address uuid='8e782fea-e5f4-45fa-a0f9-024cf66e5009'/>
>>        </source>
>>        <address type='ccw' cssid='0xfe' ssid='0x0' devno='0x0006'/>
>>      </hostdev>
>> [...]
>>    </devices>
>> </domain>
>>
>> $ virsh define vser1
>> Domain 'vser1' defined from vser1
>>
>> Signed-off-by: Shalini Chellathurai Saroja <shalini at linux.ibm.com>
>> Reviewed-by: Bjoern Walk <bwalk at linux.ibm.com>
>> Reviewed-by: Boris Fiuczynski <fiuczy at linux.ibm.com>
>> ---
>>   src/conf/domain_conf.c                        |  2 +-
>>   src/conf/domain_conf.h                        |  2 +
>>   src/conf/domain_validate.c                    | 21 ++++++++++
>>   src/libvirt_private.syms                      |  1 +
>>   .../hostdev-mdev-duplicate.err                |  1 +
>>   .../hostdev-mdev-duplicate.xml                | 41 +++++++++++++++++++
>>   .../hostdev-pci-duplicate.err                 |  1 +
>>   .../hostdev-pci-duplicate.xml                 | 40 ++++++++++++++++++
>>   .../hostdev-scsi-duplicate.err                |  1 +
>>   .../hostdev-scsi-duplicate.xml                | 40 ++++++++++++++++++
>>   .../hostdev-usb-duplicate.err                 |  1 +
>>   .../hostdev-usb-duplicate.xml                 | 40 ++++++++++++++++++
>>   tests/qemuxml2argvtest.c                      |  8 ++++
>>   13 files changed, 198 insertions(+), 1 deletion(-)
>>   create mode 100644 tests/qemuxml2argvdata/hostdev-mdev-duplicate.err
>>   create mode 100644 tests/qemuxml2argvdata/hostdev-mdev-duplicate.xml
>>   create mode 100644 tests/qemuxml2argvdata/hostdev-pci-duplicate.err
>>   create mode 100644 tests/qemuxml2argvdata/hostdev-pci-duplicate.xml
>>   create mode 100644 tests/qemuxml2argvdata/hostdev-scsi-duplicate.err
>>   create mode 100644 tests/qemuxml2argvdata/hostdev-scsi-duplicate.xml
>>   create mode 100644 tests/qemuxml2argvdata/hostdev-usb-duplicate.err
>>   create mode 100644 tests/qemuxml2argvdata/hostdev-usb-duplicate.xml
>>
>> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>> index f65509d8..5746f69e 100644
>> --- a/src/conf/domain_conf.c
>> +++ b/src/conf/domain_conf.c
>> @@ -15369,7 +15369,7 @@ virDomainHostdevMatchCaps(virDomainHostdevDef *a,
>>   }
>>   
>>   
>> -static int
>> +int
>>   virDomainHostdevMatch(virDomainHostdevDef *a,
>>                         virDomainHostdevDef *b)
>>   {
>> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
>> index f706c498..4d9d499b 100644
>> --- a/src/conf/domain_conf.h
>> +++ b/src/conf/domain_conf.h
>> @@ -3590,6 +3590,8 @@ virDomainHostdevDef *
>>   virDomainHostdevRemove(virDomainDef *def, size_t i);
>>   int virDomainHostdevFind(virDomainDef *def, virDomainHostdevDef *match,
>>                            virDomainHostdevDef **found);
>> +int virDomainHostdevMatch(virDomainHostdevDef *a,
>> +                          virDomainHostdevDef *b);
>>   
>>   virDomainGraphicsListenDef *
>>   virDomainGraphicsGetListen(virDomainGraphicsDef *def, size_t i);
>> diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c
>> index 2124d25d..df2ab473 100644
>> --- a/src/conf/domain_validate.c
>> +++ b/src/conf/domain_validate.c
>> @@ -1068,7 +1068,25 @@ virDomainDefDuplicateDiskInfoValidate(const virDomainDef *def)
>>       return 0;
>>   }
>>   
>> +static int
>> +virDomainDefDuplicateHostdevInfoValidate(const virDomainDef *def)
>> +{
>> +    size_t i;
>> +    size_t j;
>>   
>> +    for (i = 0; i < def->nhostdevs; i++) {
>> +        for (j = i + 1; j < def->nhostdevs; j++) {
>> +            if (virDomainHostdevMatch(def->hostdevs[i],
>> +                                      def->hostdevs[j])) {
>> +                virReportError(VIR_ERR_XML_ERROR, "%s",
>> +                    _("Hostdev already exists in the domain configuration"));
>> +                return -1;
>> +            }
>> +        }
>> +    }
>> +
>> +    return 0;
> So this forbids duplicated hostdevs. While there are some devices that
> definitely can not be assigned twice (e.g. PCI devices), I'm not so sure
> about some other types (e.g. iSCSI or scsi-host). But one can also argue
> that such use case is broken. So let's do the following, I'll merge it
> tomorrow, after the release so that we give users the longest window
> possible to complain.
>
> Reviewed-by: Michal Privoznik <mprivozn at redhat.com>
ok, thank you Michal.
>
> Michal
>
-- 
Kind regards
Shalini Chellathurai Saroja
Linux on Z and Virtualization Development
Vorsitzende des Aufsichtsrats: Gregor Pillen
Geschäftsführung: Dirk Wittkopp
Sitz der Gesellschaft: Böblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294





More information about the libvir-list mailing list