From: "Daniel P. Berrange" <berrange@xxxxxxxxxx> Move the code for matching hostdev instances out of virDomainHostdevFind and into virDomainHostdevMatch method, which in turn calls out to other helper methods depending on the type of hostdev. Signed-off-by: Daniel P. Berrange <berrange@xxxxxxxxxx> --- src/conf/domain_conf.c | 108 +++++++++++++++++++++++++++++-------------------- 1 file changed, 65 insertions(+), 43 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index ed31431..dd0e841 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -7830,6 +7830,69 @@ virDomainHostdevRemove(virDomainDefPtr def, size_t i) return hostdev; } + +static int +virDomainHostdevMatchSubsysUSB(virDomainHostdevDefPtr a, + virDomainHostdevDefPtr b) +{ + if (b->source.subsys.u.usb.bus && b->source.subsys.u.usb.device) { + /* specified by bus location on host */ + if (a->source.subsys.u.usb.bus == b->source.subsys.u.usb.bus && + a->source.subsys.u.usb.device == b->source.subsys.u.usb.device) + return 1; + } else { + /* specified by product & vendor id */ + if (a->source.subsys.u.usb.product == b->source.subsys.u.usb.product && + a->source.subsys.u.usb.vendor == b->source.subsys.u.usb.vendor) + return 1; + } + return 0; +} + +static int +virDomainHostdevMatchSubsysPCI(virDomainHostdevDefPtr a, + virDomainHostdevDefPtr b) +{ + if (a->source.subsys.u.pci.domain == b->source.subsys.u.pci.domain && + a->source.subsys.u.pci.bus == b->source.subsys.u.pci.bus && + a->source.subsys.u.pci.slot == b->source.subsys.u.pci.slot && + a->source.subsys.u.pci.function == b->source.subsys.u.pci.function) + return 1; + return 0; +} + + +static int +virDomainHostdevMatchSubsys(virDomainHostdevDefPtr a, + virDomainHostdevDefPtr b) +{ + if (a->source.subsys.type != b->source.subsys.type) + return 0; + + switch (a->source.subsys.type) { + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: + return virDomainHostdevMatchSubsysPCI(a, b); + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: + return virDomainHostdevMatchSubsysUSB(a, b); + } + return 0; +} + + +static int +virDomainHostdevMatch(virDomainHostdevDefPtr a, + virDomainHostdevDefPtr b) +{ + if (a->mode != b->mode) + return 0; + + switch (a->mode) { + case VIR_DOMAIN_HOSTDEV_MODE_SUBSYS: + return virDomainHostdevMatchSubsys(a, b); + } + return 0; +} + /* Find an entry in hostdevs that matches the source spec in * @match. return pointer to the entry in @found (if found is * non-NULL). Returns index (within hostdevs) of matched entry, or -1 @@ -7841,58 +7904,17 @@ virDomainHostdevFind(virDomainDefPtr def, virDomainHostdevDefPtr *found) { virDomainHostdevDefPtr local_found; - virDomainHostdevSubsysPtr m_subsys = &match->source.subsys; int i; if (!found) found = &local_found; *found = NULL; - /* There is no code that uses _MODE_CAPABILITIES, and nothing to - * compare if it did, so don't allow it. - */ - if (match->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) - return -1; - for (i = 0 ; i < def->nhostdevs ; i++) { - virDomainHostdevDefPtr compare = def->hostdevs[i]; - virDomainHostdevSubsysPtr c_subsys = &compare->source.subsys; - - if (compare->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS || - c_subsys->type != m_subsys->type) { - continue; - } - - switch (m_subsys->type) - { - case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: - if (c_subsys->u.pci.domain == m_subsys->u.pci.domain && - c_subsys->u.pci.bus == m_subsys->u.pci.bus && - c_subsys->u.pci.slot == m_subsys->u.pci.slot && - c_subsys->u.pci.function == m_subsys->u.pci.function) { - *found = compare; - } - break; - case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: - if (m_subsys->u.usb.bus && m_subsys->u.usb.device) { - /* specified by bus location on host */ - if (c_subsys->u.usb.bus == m_subsys->u.usb.bus && - c_subsys->u.usb.device == m_subsys->u.usb.device) { - *found = compare; - } - } else { - /* specified by product & vendor id */ - if (c_subsys->u.usb.product == m_subsys->u.usb.product && - c_subsys->u.usb.vendor == m_subsys->u.usb.vendor) { - *found = compare; - } - } - break; - default: + if (virDomainHostdevMatch(match, def->hostdevs[i])) { + *found = def->hostdevs[i]; break; } - if (*found) - break; } return *found ? i : -1; } -- 1.8.0.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list