Change lxc driver to use hostdev common library instead of APIs in lxc_hostdev.[ch] Signed-off-by: Chunyan Liu <cyliu@xxxxxxxx> --- po/POTFILES.in | 1 - src/Makefile.am | 1 - src/lxc/lxc_conf.h | 4 - src/lxc/lxc_driver.c | 47 ++++--- src/lxc/lxc_hostdev.c | 416 ------------------------------------------------- src/lxc/lxc_hostdev.h | 43 ----- src/lxc/lxc_process.c | 24 +++- 7 files changed, 48 insertions(+), 488 deletions(-) delete mode 100644 src/lxc/lxc_hostdev.c delete mode 100644 src/lxc/lxc_hostdev.h diff --git a/po/POTFILES.in b/po/POTFILES.in index fcd3af9..f999445 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -62,7 +62,6 @@ src/locking/lock_manager.c src/locking/sanlock_helper.c src/lxc/lxc_cgroup.c src/lxc/lxc_fuse.c -src/lxc/lxc_hostdev.c src/lxc/lxc_container.c src/lxc/lxc_conf.c src/lxc/lxc_controller.c diff --git a/src/Makefile.am b/src/Makefile.am index 8b4a25c..96563dc 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -619,7 +619,6 @@ LXC_DRIVER_SOURCES = \ lxc/lxc_container.c lxc/lxc_container.h \ lxc/lxc_cgroup.c lxc/lxc_cgroup.h \ lxc/lxc_domain.c lxc/lxc_domain.h \ - lxc/lxc_hostdev.c lxc/lxc_hostdev.h \ lxc/lxc_monitor.c lxc/lxc_monitor.h \ lxc/lxc_process.c lxc/lxc_process.h \ lxc/lxc_fuse.c lxc/lxc_fuse.h \ diff --git a/src/lxc/lxc_conf.h b/src/lxc/lxc_conf.h index f6cbfc9..5940b16 100644 --- a/src/lxc/lxc_conf.h +++ b/src/lxc/lxc_conf.h @@ -92,10 +92,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 c499182..2824c96 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -70,6 +70,7 @@ #include "virstring.h" #include "viraccessapicheck.h" #include "viraccessapichecklxc.h" +#include "virhostdev.h" #define VIR_FROM_THIS VIR_FROM_LXC @@ -1417,9 +1418,6 @@ static int lxcStateInitialize(bool privileged, if (!(lxc_driver->securityManager = lxcSecurityInit(cfg))) goto cleanup; - if ((lxc_driver->activeUsbHostdevs = virUSBDeviceListNew()) == NULL) - goto cleanup; - if ((virLXCDriverGetCapabilities(lxc_driver, true)) == NULL) goto cleanup; @@ -1534,7 +1532,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); @@ -3172,6 +3169,7 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver, mode_t mode; bool created = false; virUSBDevicePtr usb = NULL; + virHostdevManagerPtr hostdev_mgr; if (virDomainHostdevFind(vm->def, def, NULL) >= 0) { virReportError(VIR_ERR_OPERATION_FAILED, "%s", @@ -3179,6 +3177,14 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver, return -1; } + hostdev_mgr = virHostdevManagerGetDefault(); + if (hostdev_mgr == NULL || + virHostdevPrepareUsbHostdevs(hostdev_mgr, + LXC_DRIVER_NAME, + vm->def->name, + &def, 1, 0) < 0) + return -1; + if (virAsprintf(&vroot, "/proc/%llu/root", (unsigned long long)priv->initpid) < 0) goto cleanup; @@ -3254,6 +3260,11 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver, ret = 0; cleanup: + virHostdevReAttachUsbHostdevs(hostdev_mgr, + LXC_DRIVER_NAME, + vm->def->name, + &def, + 1); virDomainAuditHostdev(vm, def, "attach", ret == 0); if (ret < 0 && created) unlink(dstfile); @@ -3716,8 +3727,7 @@ cleanup: static int -lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver, - virDomainObjPtr vm, +lxcDomainDetachDeviceHostdevUSBLive(virDomainObjPtr vm, virDomainDeviceDefPtr dev) { virLXCDomainObjPrivatePtr priv = vm->privateData; @@ -3726,6 +3736,7 @@ lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver, char *dst = NULL; char *vroot = NULL; virUSBDevicePtr usb = NULL; + virHostdevManagerPtr hostdev_mgr; if ((idx = virDomainHostdevFind(vm->def, dev->data.hostdev, @@ -3770,9 +3781,10 @@ 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) + virHostdevReAttachPciHostdevs(hostdev_mgr, LXC_DRIVER_NAME, + vm->def->name, &def, 1); virDomainHostdevRemove(vm->def, idx); virDomainHostdevDefFree(def); @@ -3906,13 +3918,12 @@ cleanup: static int -lxcDomainDetachDeviceHostdevSubsysLive(virLXCDriverPtr driver, - virDomainObjPtr vm, +lxcDomainDetachDeviceHostdevSubsysLive(virDomainObjPtr vm, virDomainDeviceDefPtr dev) { switch (dev->data.hostdev->source.subsys.type) { case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: - return lxcDomainDetachDeviceHostdevUSBLive(driver, vm, dev); + return lxcDomainDetachDeviceHostdevUSBLive(vm, dev); default: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, @@ -3944,8 +3955,7 @@ lxcDomainDetachDeviceHostdevCapsLive(virDomainObjPtr vm, static int -lxcDomainDetachDeviceHostdevLive(virLXCDriverPtr driver, - virDomainObjPtr vm, +lxcDomainDetachDeviceHostdevLive(virDomainObjPtr vm, virDomainDeviceDefPtr dev) { virLXCDomainObjPrivatePtr priv = vm->privateData; @@ -3958,7 +3968,7 @@ lxcDomainDetachDeviceHostdevLive(virLXCDriverPtr driver, switch (dev->data.hostdev->mode) { case VIR_DOMAIN_HOSTDEV_MODE_SUBSYS: - return lxcDomainDetachDeviceHostdevSubsysLive(driver, vm, dev); + return lxcDomainDetachDeviceHostdevSubsysLive(vm, dev); case VIR_DOMAIN_HOSTDEV_MODE_CAPABILITIES: return lxcDomainDetachDeviceHostdevCapsLive(vm, dev); @@ -3973,8 +3983,7 @@ lxcDomainDetachDeviceHostdevLive(virLXCDriverPtr driver, static int -lxcDomainDetachDeviceLive(virLXCDriverPtr driver, - virDomainObjPtr vm, +lxcDomainDetachDeviceLive(virDomainObjPtr vm, virDomainDeviceDefPtr dev) { int ret = -1; @@ -3989,7 +3998,7 @@ lxcDomainDetachDeviceLive(virLXCDriverPtr driver, break; case VIR_DOMAIN_DEVICE_HOSTDEV: - ret = lxcDomainDetachDeviceHostdevLive(driver, vm, dev); + ret = lxcDomainDetachDeviceHostdevLive(vm, dev); break; default: @@ -4322,7 +4331,7 @@ static int lxcDomainDetachDeviceFlags(virDomainPtr dom, if (virDomainDefCompatibleDevice(vm->def, dev_copy) < 0) goto cleanup; - if ((ret = lxcDomainDetachDeviceLive(driver, vm, dev_copy)) < 0) + if ((ret = lxcDomainDetachDeviceLive(vm, dev_copy)) < 0) goto cleanup; /* * update domain status forcibly because the domain status may be diff --git a/src/lxc/lxc_hostdev.c b/src/lxc/lxc_hostdev.c deleted file mode 100644 index 77ce965..0000000 --- a/src/lxc/lxc_hostdev.c +++ /dev/null @@ -1,416 +0,0 @@ -/* - * virLXC_hostdev.c: VIRLXC hostdev management - * - * Copyright (C) 2006-2007, 2009-2012 Red Hat, Inc. - * Copyright (C) 2006 Daniel P. Berrange - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see - * <http://www.gnu.org/licenses/>. - * - * Author: Daniel P. Berrange <berrange@xxxxxxxxxx> - */ - -#include <config.h> - -#include "lxc_hostdev.h" -#include "viralloc.h" -#include "virlog.h" -#include "virerror.h" - -#define VIR_FROM_THIS VIR_FROM_LXC - -int -virLXCUpdateActiveUsbHostdevs(virLXCDriverPtr driver, - virDomainDefPtr def) -{ - virDomainHostdevDefPtr hostdev = NULL; - size_t i; - - if (!def->nhostdevs) - return 0; - - for (i = 0; i < def->nhostdevs; i++) { - virUSBDevicePtr usb = NULL; - hostdev = def->hostdevs[i]; - - if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) - continue; - if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) - continue; - - usb = virUSBDeviceNew(hostdev->source.subsys.u.usb.bus, - hostdev->source.subsys.u.usb.device, - NULL); - if (!usb) { - VIR_WARN("Unable to reattach USB device %03d.%03d on domain %s", - hostdev->source.subsys.u.usb.bus, - hostdev->source.subsys.u.usb.device, - def->name); - continue; - } - - virUSBDeviceSetUsedBy(usb, "QEMU", def->name); - - virObjectLock(driver->activeUsbHostdevs); - if (virUSBDeviceListAdd(driver->activeUsbHostdevs, usb) < 0) { - virObjectUnlock(driver->activeUsbHostdevs); - virUSBDeviceFree(usb); - return -1; - } - virObjectUnlock(driver->activeUsbHostdevs); - } - - return 0; -} - - -int -virLXCPrepareHostdevUSBDevices(virLXCDriverPtr driver, - const char *name, - virUSBDeviceList *list) -{ - size_t i, j; - unsigned int count; - virUSBDevicePtr tmp; - - count = virUSBDeviceListCount(list); - - virObjectLock(driver->activeUsbHostdevs); - for (i = 0; i < count; i++) { - virUSBDevicePtr usb = virUSBDeviceListGet(list, i); - if ((tmp = virUSBDeviceListFind(driver->activeUsbHostdevs, usb))) { - const char *other_name = NULL; - const char *other_drvname = NULL; - virUSBDeviceGetUsedBy(tmp, &other_drvname, &other_name); - - if (other_name) - virReportError(VIR_ERR_OPERATION_INVALID, - _("USB device %s is in use by domain %s"), - virUSBDeviceGetName(tmp), other_name); - else - virReportError(VIR_ERR_OPERATION_INVALID, - _("USB device %s is already in use"), - virUSBDeviceGetName(tmp)); - goto error; - } - - virUSBDeviceSetUsedBy(usb, "QEMU", name); - VIR_DEBUG("Adding %03d.%03d dom=%s to activeUsbHostdevs", - virUSBDeviceGetBus(usb), virUSBDeviceGetDevno(usb), name); - /* - * The caller is responsible to steal these usb devices - * from the virUSBDeviceList that passed in on success, - * perform rollback on failure. - */ - if (virUSBDeviceListAdd(driver->activeUsbHostdevs, usb) < 0) - goto error; - } - virObjectUnlock(driver->activeUsbHostdevs); - return 0; - -error: - for (j = 0; j < i; j++) { - tmp = virUSBDeviceListGet(list, i); - virUSBDeviceListSteal(driver->activeUsbHostdevs, tmp); - } - virObjectUnlock(driver->activeUsbHostdevs); - return -1; -} - -int -virLXCFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev, - bool mandatory, - virUSBDevicePtr *usb) -{ - unsigned vendor = hostdev->source.subsys.u.usb.vendor; - unsigned product = hostdev->source.subsys.u.usb.product; - unsigned bus = hostdev->source.subsys.u.usb.bus; - unsigned device = hostdev->source.subsys.u.usb.device; - bool autoAddress = hostdev->source.subsys.u.usb.autoAddress; - int rc; - - *usb = NULL; - - if (vendor && bus) { - rc = virUSBDeviceFind(vendor, product, bus, device, - NULL, - autoAddress ? false : mandatory, - usb); - if (rc < 0) { - return -1; - } else if (!autoAddress) { - goto out; - } else { - VIR_INFO("USB device %x:%x could not be found at previous" - " address (bus:%u device:%u)", - vendor, product, bus, device); - } - } - - /* When vendor is specified, its USB address is either unspecified or the - * device could not be found at the USB device where it had been - * automatically found before. - */ - if (vendor) { - virUSBDeviceList *devs; - - rc = virUSBDeviceFindByVendor(vendor, product, - NULL, - mandatory, &devs); - if (rc < 0) - return -1; - - if (rc == 1) { - *usb = virUSBDeviceListGet(devs, 0); - virUSBDeviceListSteal(devs, *usb); - } - virObjectUnref(devs); - - if (rc == 0) { - goto out; - } else if (rc > 1) { - if (autoAddress) { - virReportError(VIR_ERR_OPERATION_FAILED, - _("Multiple USB devices for %x:%x were found," - " but none of them is at bus:%u device:%u"), - vendor, product, bus, device); - } else { - virReportError(VIR_ERR_OPERATION_FAILED, - _("Multiple USB devices for %x:%x, " - "use <address> to specify one"), - vendor, product); - } - return -1; - } - - hostdev->source.subsys.u.usb.bus = virUSBDeviceGetBus(*usb); - hostdev->source.subsys.u.usb.device = virUSBDeviceGetDevno(*usb); - hostdev->source.subsys.u.usb.autoAddress = true; - - if (autoAddress) { - VIR_INFO("USB device %x:%x found at bus:%u device:%u (moved" - " from bus:%u device:%u)", - vendor, product, - hostdev->source.subsys.u.usb.bus, - hostdev->source.subsys.u.usb.device, - bus, device); - } - } else if (!vendor && bus) { - if (virUSBDeviceFindByBus(bus, device, - NULL, - mandatory, usb) < 0) - return -1; - } - -out: - if (!*usb) - hostdev->missing = true; - return 0; -} - -static int -virLXCPrepareHostUSBDevices(virLXCDriverPtr driver, - virDomainDefPtr def) -{ - size_t i; - int ret = -1; - virUSBDeviceList *list; - virUSBDevicePtr tmp; - virDomainHostdevDefPtr *hostdevs = def->hostdevs; - int nhostdevs = def->nhostdevs; - - /* To prevent situation where USB device is assigned to two domains - * we need to keep a list of currently assigned USB devices. - * This is done in several loops which cannot be joined into one big - * loop. See virLXCPrepareHostdevPCIDevices() - */ - if (!(list = virUSBDeviceListNew())) - goto cleanup; - - /* Loop 1: build temporary list - */ - for (i = 0; i < nhostdevs; i++) { - virDomainHostdevDefPtr hostdev = hostdevs[i]; - bool required = true; - virUSBDevicePtr usb; - - if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) - continue; - if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) - continue; - - if (hostdev->startupPolicy == VIR_DOMAIN_STARTUP_POLICY_OPTIONAL) - required = false; - - if (virLXCFindHostdevUSBDevice(hostdev, required, &usb) < 0) - goto cleanup; - - if (usb && virUSBDeviceListAdd(list, usb) < 0) { - virUSBDeviceFree(usb); - goto cleanup; - } - } - - /* Mark devices in temporary list as used by @name - * and add them do driver list. However, if something goes - * wrong, perform rollback. - */ - if (virLXCPrepareHostdevUSBDevices(driver, def->name, list) < 0) - goto cleanup; - - /* Loop 2: Temporary list was successfully merged with - * driver list, so steal all items to avoid freeing them - * in cleanup label. - */ - while (virUSBDeviceListCount(list) > 0) { - tmp = virUSBDeviceListGet(list, 0); - virUSBDeviceListSteal(list, tmp); - } - - ret = 0; - -cleanup: - virObjectUnref(list); - return ret; -} - - -int virLXCPrepareHostDevices(virLXCDriverPtr driver, - virDomainDefPtr def) -{ - size_t i; - - if (!def->nhostdevs) - return 0; - - /* Sanity check for supported configurations only */ - for (i = 0; i < def->nhostdevs; i++) { - virDomainHostdevDefPtr dev = def->hostdevs[i]; - - switch (dev->mode) { - case VIR_DOMAIN_HOSTDEV_MODE_SUBSYS: - switch (dev->source.subsys.type) { - case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: - break; - default: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Unsupported hostdev type %s"), - virDomainHostdevSubsysTypeToString(dev->source.subsys.type)); - return -1; - } - break; - - case VIR_DOMAIN_HOSTDEV_MODE_CAPABILITIES: - switch (dev->source.subsys.type) { - case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_STORAGE: - case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_MISC: - case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_NET: - break; - default: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Unsupported hostdev type %s"), - virDomainHostdevSubsysTypeToString(dev->source.subsys.type)); - return -1; - } - break; - - - default: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Unsupported hostdev mode %s"), - virDomainHostdevModeTypeToString(dev->mode)); - return -1; - } - } - - if (virLXCPrepareHostUSBDevices(driver, def) < 0) - return -1; - - return 0; -} - - -static void -virLXCDomainReAttachHostUsbDevices(virLXCDriverPtr driver, - const char *name, - virDomainHostdevDefPtr *hostdevs, - int nhostdevs) -{ - size_t i; - - virObjectLock(driver->activeUsbHostdevs); - for (i = 0; i < nhostdevs; i++) { - virDomainHostdevDefPtr hostdev = hostdevs[i]; - virUSBDevicePtr usb, tmp; - const char *used_by = NULL; - const char *used_by_drvname = NULL; - - if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) - continue; - if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) - continue; - if (hostdev->missing) - continue; - - usb = virUSBDeviceNew(hostdev->source.subsys.u.usb.bus, - hostdev->source.subsys.u.usb.device, - NULL); - - if (!usb) { - VIR_WARN("Unable to reattach USB device %03d.%03d on domain %s", - hostdev->source.subsys.u.usb.bus, - hostdev->source.subsys.u.usb.device, - name); - continue; - } - - /* Delete only those USB devices which belongs - * to domain @name because virLXCProcessStart() might - * have failed because USB device is already taken. - * Therefore we want to steal only those devices from - * the list which were taken by @name */ - - tmp = virUSBDeviceListFind(driver->activeUsbHostdevs, usb); - virUSBDeviceFree(usb); - - if (!tmp) { - VIR_WARN("Unable to find device %03d.%03d " - "in list of active USB devices", - hostdev->source.subsys.u.usb.bus, - hostdev->source.subsys.u.usb.device); - continue; - } - - virUSBDeviceGetUsedBy(tmp, &used_by_drvname, &used_by); - if (STREQ_NULLABLE(used_by, name)) { - VIR_DEBUG("Removing %03d.%03d dom=%s from activeUsbHostdevs", - hostdev->source.subsys.u.usb.bus, - hostdev->source.subsys.u.usb.device, - name); - - virUSBDeviceListDel(driver->activeUsbHostdevs, tmp); - } - } - virObjectUnlock(driver->activeUsbHostdevs); -} - -void virLXCDomainReAttachHostDevices(virLXCDriverPtr driver, - virDomainDefPtr def) -{ - if (!def->nhostdevs) - return; - - virLXCDomainReAttachHostUsbDevices(driver, def->name, def->hostdevs, - def->nhostdevs); -} diff --git a/src/lxc/lxc_hostdev.h b/src/lxc/lxc_hostdev.h deleted file mode 100644 index 41bb178..0000000 --- a/src/lxc/lxc_hostdev.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * virLXC_hostdev.h: VIRLXC hostdev management - * - * Copyright (C) 2006-2007, 2009-2010 Red Hat, Inc. - * Copyright (C) 2006 Daniel P. Berrange - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see - * <http://www.gnu.org/licenses/>. - * - * Author: Daniel P. Berrange <berrange@xxxxxxxxxx> - */ - -#ifndef __LXC_HOSTDEV_H__ -# define __LXC_HOSTDEV_H__ - -# include "lxc_conf.h" -# include "domain_conf.h" - -int virLXCUpdateActiveUsbHostdevs(virLXCDriverPtr driver, - virDomainDefPtr def); -int virLXCFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev, - bool mandatory, - virUSBDevicePtr *usb); -int virLXCPrepareHostdevUSBDevices(virLXCDriverPtr driver, - const char *name, - virUSBDeviceListPtr list); -int virLXCPrepareHostDevices(virLXCDriverPtr driver, - virDomainDefPtr def); -void virLXCDomainReAttachHostDevices(virLXCDriverPtr driver, - virDomainDefPtr def); - -#endif /* __LXC_HOSTDEV_H__ */ diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c index cc9c1a2..0f6b671 100644 --- a/src/lxc/lxc_process.c +++ b/src/lxc/lxc_process.c @@ -45,7 +45,7 @@ #include "virerror.h" #include "virlog.h" #include "vircommand.h" -#include "lxc_hostdev.h" +#include "virhostdev.h" #include "virhook.h" #include "virstring.h" #include "viratomic.h" @@ -152,6 +152,7 @@ static void virLXCProcessCleanup(virLXCDriverPtr driver, virLXCDomainObjPrivatePtr priv = vm->privateData; virNetDevVPortProfilePtr vport = NULL; virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver); + virHostdevManagerPtr hostdev_mgr; VIR_DEBUG("Stopping VM name=%s pid=%d reason=%d", vm->def->name, (int)vm->pid, (int)reason); @@ -187,7 +188,12 @@ static void virLXCProcessCleanup(virLXCDriverPtr driver, if (virAtomicIntDecAndTest(&driver->nactive) && driver->inhibitCallback) driver->inhibitCallback(false, driver->inhibitOpaque); - virLXCDomainReAttachHostDevices(driver, vm->def); + hostdev_mgr = virHostdevManagerGetDefault(); + if (hostdev_mgr != NULL) + virHostdevReAttachDomainHostdevs(hostdev_mgr, + LXC_DRIVER_NAME, + vm->def, + VIR_SP_USB_HOSTDEV); for (i = 0; i < vm->def->nnets; i++) { virDomainNetDefPtr iface = vm->def->nets[i]; @@ -999,6 +1005,7 @@ int virLXCProcessStart(virConnectPtr conn, virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver); virCgroupPtr selfcgroup; int status; + virHostdevManagerPtr hostdev_mgr; if (virCgroupNewSelf(&selfcgroup) < 0) return -1; @@ -1084,7 +1091,12 @@ int virLXCProcessStart(virConnectPtr conn, /* Must be run before security labelling */ VIR_DEBUG("Preparing host devices"); - if (virLXCPrepareHostDevices(driver, vm->def) < 0) + hostdev_mgr = virHostdevManagerGetDefault(); + if (hostdev_mgr == NULL || + virHostdevPrepareDomainHostdevs(hostdev_mgr, + LXC_DRIVER_NAME, + vm->def, + VIR_SP_USB_HOSTDEV) < 0) goto cleanup; /* Here we open all the PTYs we need on the host OS side. @@ -1438,6 +1450,7 @@ virLXCProcessReconnectDomain(virDomainObjPtr vm, { virLXCDriverPtr driver = opaque; virLXCDomainObjPrivatePtr priv; + virHostdevManagerPtr hostdev_mgr; int ret = -1; virObjectLock(vm); @@ -1470,7 +1483,10 @@ virLXCProcessReconnectDomain(virDomainObjPtr vm, goto error; } - if (virLXCUpdateActiveUsbHostdevs(driver, vm->def) < 0) + hostdev_mgr = virHostdevManagerGetDefault(); + if (hostdev_mgr == NULL || + virHostdevUpdateActiveHostdevs(hostdev_mgr, LXC_DRIVER_NAME, + vm->def, VIR_SP_USB_HOSTDEV) < 0) goto error; if (virSecurityManagerReserveLabel(driver->securityManager, -- 1.6.0.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list