
On Sat, Mar 01, 2014 at 02:29:01PM +0800, Chunyan Liu wrote:
Signed-off-by: Chunyan Liu <cyliu@suse.com> --- src/lxc/lxc_conf.h | 4 ---- src/lxc/lxc_driver.c | 17 +++++++++-------- src/lxc/lxc_hostdev.c | 49 ++++++++++++++++++++++++++++++++----------------- 3 files changed, 41 insertions(+), 29 deletions(-)
diff --git a/src/lxc/lxc_conf.h b/src/lxc/lxc_conf.h index e04dcdd..5be159b 100644 --- a/src/lxc/lxc_conf.h +++ b/src/lxc/lxc_conf.h @@ -93,10 +93,6 @@ struct _virLXCDriver { /* Immutable pointer, self-locking APIs */ virDomainObjListPtr domains;
- /* Immutable pointer. Requires lock to be held before - * calling APIs. */ - virUSBDeviceListPtr activeUsbHostdevs; - /* Immutable pointer, self-locking APIs */ virObjectEventStatePtr domainEventState;
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 10e0fbb..f67a236 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -71,6 +71,7 @@ #include "virstring.h" #include "viraccessapicheck.h" #include "viraccessapichecklxc.h" +#include "virhostdev.h"
#define VIR_FROM_THIS VIR_FROM_LXC
@@ -1557,9 +1558,6 @@ static int lxcStateInitialize(bool privileged, if (!(lxc_driver->securityManager = lxcSecurityInit(cfg))) goto cleanup;
- if ((lxc_driver->activeUsbHostdevs = virUSBDeviceListNew()) == NULL) - goto cleanup;
I think it would be desirable to call virHostdevManagerGetDefault() here and save the pointer to the mgr in lxc_driver->hostdevmgr. That avoids the later functions having to worry about failure of the virHostdevManagerGetDefault function
- if ((virLXCDriverGetCapabilities(lxc_driver, true)) == NULL) goto cleanup;
@@ -1674,7 +1672,6 @@ static int lxcStateCleanup(void)
virSysinfoDefFree(lxc_driver->hostsysinfo);
- virObjectUnref(lxc_driver->activeUsbHostdevs); virObjectUnref(lxc_driver->caps); virObjectUnref(lxc_driver->securityManager); virObjectUnref(lxc_driver->xmlopt); @@ -4688,7 +4685,7 @@ cleanup:
static int -lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver, +lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver ATTRIBUTE_UNUSED, virDomainObjPtr vm, virDomainDeviceDefPtr dev) { @@ -4697,6 +4694,7 @@ lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver, int idx, ret = -1; char *dst = NULL; virUSBDevicePtr usb = NULL; + virHostdevManagerPtr hostdev_mgr;
if ((idx = virDomainHostdevFind(vm->def, dev->data.hostdev, @@ -4733,9 +4731,12 @@ lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver, VIR_WARN("cannot deny device %s for domain %s", dst, vm->def->name);
- virObjectLock(driver->activeUsbHostdevs); - virUSBDeviceListDel(driver->activeUsbHostdevs, usb); - virObjectUnlock(driver->activeUsbHostdevs); + hostdev_mgr = virHostdevManagerGetDefault(); + if (hostdev_mgr == NULL) + goto cleanup; + virObjectLock(hostdev_mgr->activeUsbHostdevs); + virUSBDeviceListDel(hostdev_mgr->activeUsbHostdevs, usb); + virObjectUnlock(hostdev_mgr->activeUsbHostdevs);
Hmm, on second look, this 'goto cleanup' here is a problem - we've already done the detach at this point, so we can't tolerate failure. 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 :|