On Tue, Jan 19, 2016 at 04:36:06PM +0100, Andrea Bolognani wrote: > This function mirrors reattachPCIDevices(). > > The handling of active and inactive devices is updated and made more > explicit, which means virHostdevPreparePCIDevices() has to be > updated as well. > --- > src/util/virhostdev.c | 125 ++++++++++++++++++++++++++++++-------------------- > 1 file changed, 76 insertions(+), 49 deletions(-) > > diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c > index 74c43f2..2d219dd 100644 > --- a/src/util/virhostdev.c > +++ b/src/util/virhostdev.c > @@ -593,6 +593,56 @@ reattachPCIDevices(virHostdevManagerPtr mgr, > return ret; > } > > +/** > + * detachPCIDevices: Please keep a virHostdev prefix on this method, and also on the one added in the earlier patch. All methods should be prefixed to match the filename, even if they're static > + * @mgr: hostdev manager > + * @pcidevs: PCI devices to be detached > + * @skipUnmanaged: whether to skip unmanaged devices > + * > + * Detach PCI devices from the host. > + * > + * The PCI related parts of @mgr (inactivePCIHostdevs, activePCIHostdevs) > + * must have been locked beforehand using virObjectLock(). > + * > + * Returns: 0 on success, <0 on failure > + */ > +static int > +detachPCIDevices(virHostdevManagerPtr mgr, > + virPCIDeviceListPtr pcidevs, > + bool skipUnmanaged) > +{ > + size_t i; > + int ret = -1; > + > + for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) { > + virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i); > + > + /* Skip unmanaged devices if asked to do so */ > + if (!virPCIDeviceGetManaged(dev) && skipUnmanaged) { > + VIR_DEBUG("Not detaching unmanaged PCI device %s", > + virPCIDeviceGetName(dev)); > + continue; > + } > + > + VIR_DEBUG("Detaching managed PCI device %s", > + virPCIDeviceGetName(dev)); > + if (virPCIDeviceDetach(dev, > + mgr->activePCIHostdevs, > + mgr->inactivePCIHostdevs) < 0) { > + virErrorPtr err = virGetLastError(); > + VIR_ERROR(_("Failed to detach PCI device: %s"), > + err ? err->message : _("unknown error")); > + virResetError(err); > + goto out; > + } > + } > + > + ret = 0; > + > + out: > + return ret; > +} Again the body of the for() loop should really be a separate method that you can call passing in a single PCI device, to avoid later code where you have to stuff a single device into a list. Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list