[libvirt] [PATCHv3 4/4] change lxc driver to use hostdev common library
Jim Fehlig
jfehlig at suse.com
Wed Aug 14 20:31:59 UTC 2013
cyliu at suse.com wrote:
> From: Chunyan Liu <cyliu at suse.com>
>
> Change lxc driver to use hostdev common library instead of its own APIs in
> lxc_hostdev.[ch]
>
> Signed-off-by: Chunyan Liu <cyliu at suse.com>
> ---
> po/POTFILES.in | 1 -
> src/Makefile.am | 1 -
> src/lxc/lxc_conf.h | 4 -
> src/lxc/lxc_driver.c | 45 +++---
> src/lxc/lxc_hostdev.c | 413 -------------------------------------------------
> src/lxc/lxc_hostdev.h | 43 -----
> src/lxc/lxc_process.c | 21 ++-
> 7 files changed, 43 insertions(+), 485 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 1124311..7186457 100644
> --- a/po/POTFILES.in
> +++ b/po/POTFILES.in
> @@ -61,7 +61,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 20fa84e..2509db3 100644
> --- a/src/Makefile.am
> +++ b/src/Makefile.am
> @@ -578,7 +578,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 a6208a2..05f2a80 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 */
> virDomainEventStatePtr domainEventState;
>
> diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
> index 9cb95ff..4f37619 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
>
> @@ -1418,9 +1419,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;
>
> @@ -1535,7 +1533,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);
> @@ -3214,6 +3211,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",
> @@ -3221,6 +3219,13 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver,
> return -1;
> }
>
> + hostdev_mgr = virHostdevManagerGetDefault();
> + if (virHostdevPrepareUsbHostdevs(hostdev_mgr,
> + LXC_DRIVER_NAME,
> + vm->def->name,
> + &def, 1, 0) < 0)
>
Parameter alignment.
> + goto cleanup;
> +
> if (virAsprintf(&vroot, "/proc/%llu/root",
> (unsigned long long)priv->initpid) < 0)
> goto cleanup;
> @@ -3296,6 +3301,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);
> @@ -3758,8 +3768,7 @@ cleanup:
>
>
> static int
> -lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver,
> - virDomainObjPtr vm,
> +lxcDomainDetachDeviceHostdevUSBLive(virDomainObjPtr vm,
> virDomainDeviceDefPtr dev)
> {
> virLXCDomainObjPrivatePtr priv = vm->privateData;
> @@ -3768,6 +3777,7 @@ lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver,
> char *dst = NULL;
> char *vroot;
> virUSBDevicePtr usb = NULL;
> + virHostdevManagerPtr hostdev_mgr;
>
> if ((idx = virDomainHostdevFind(vm->def,
> dev->data.hostdev,
> @@ -3812,9 +3822,9 @@ 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();
> + virHostdevReAttachPciHostdevs(hostdev_mgr, LXC_DRIVER_NAME,
> + vm->def->name, &def, 1);
>
> virDomainHostdevRemove(vm->def, idx);
> virDomainHostdevDefFree(def);
> @@ -3947,13 +3957,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,
> @@ -3985,8 +3994,7 @@ lxcDomainDetachDeviceHostdevCapsLive(virDomainObjPtr vm,
>
>
> static int
> -lxcDomainDetachDeviceHostdevLive(virLXCDriverPtr driver,
> - virDomainObjPtr vm,
> +lxcDomainDetachDeviceHostdevLive(virDomainObjPtr vm,
> virDomainDeviceDefPtr dev)
> {
> virLXCDomainObjPrivatePtr priv = vm->privateData;
> @@ -3999,7 +4007,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);
> @@ -4014,8 +4022,7 @@ lxcDomainDetachDeviceHostdevLive(virLXCDriverPtr driver,
>
>
> static int
> -lxcDomainDetachDeviceLive(virLXCDriverPtr driver,
> - virDomainObjPtr vm,
> +lxcDomainDetachDeviceLive(virDomainObjPtr vm,
> virDomainDeviceDefPtr dev)
> {
> int ret = -1;
> @@ -4030,7 +4037,7 @@ lxcDomainDetachDeviceLive(virLXCDriverPtr driver,
> break;
>
> case VIR_DOMAIN_DEVICE_HOSTDEV:
> - ret = lxcDomainDetachDeviceHostdevLive(driver, vm, dev);
> + ret = lxcDomainDetachDeviceHostdevLive(vm, dev);
> break;
>
> default:
> @@ -4363,7 +4370,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 3b371fc..0000000
> --- a/src/lxc/lxc_hostdev.c
> +++ /dev/null
> @@ -1,413 +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 at redhat.com>
> - */
> -
> -#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, 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 = virUSBDeviceGetUsedBy(tmp);
> -
> - 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, 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;
> -
> - 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;
> - }
> -
> - used_by = virUSBDeviceGetUsedBy(tmp);
> - 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 at redhat.com>
> - */
> -
> -#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 247e516..02509d9 100644
> --- a/src/lxc/lxc_process.c
> +++ b/src/lxc/lxc_process.c
> @@ -45,11 +45,11 @@
> #include "virerror.h"
> #include "virlog.h"
> #include "vircommand.h"
> -#include "lxc_hostdev.h"
> #include "virhook.h"
> #include "virstring.h"
> #include "viratomic.h"
> #include "virprocess.h"
> +#include "virhostdev.h"
>
> #define VIR_FROM_THIS VIR_FROM_LXC
>
> @@ -151,6 +151,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);
> @@ -186,7 +187,11 @@ static void virLXCProcessCleanup(virLXCDriverPtr driver,
> if (virAtomicIntDecAndTest(&driver->nactive) && driver->inhibitCallback)
> driver->inhibitCallback(false, driver->inhibitOpaque);
>
> - virLXCDomainReAttachHostDevices(driver, vm->def);
> + hostdev_mgr = virHostdevManagerGetDefault();
> + virHostdevReAttachDomainHostdevs(hostdev_mgr,
> + LXC_DRIVER_NAME,
> + vm->def,
> + VIR_SP_USB_HOSTDEV);
>
Parameter alignment.
>
> for (i = 0; i < vm->def->nnets; i++) {
> virDomainNetDefPtr iface = vm->def->nets[i];
> @@ -973,6 +978,7 @@ int virLXCProcessStart(virConnectPtr conn,
> virErrorPtr err = NULL;
> virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver);
> virCgroupPtr selfcgroup;
> + virHostdevManagerPtr hostdev_mgr;
>
> if (virCgroupNewSelf(&selfcgroup) < 0)
> return -1;
> @@ -1058,7 +1064,11 @@ 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 (virHostdevPrepareDomainHostdevs(hostdev_mgr,
> + LXC_DRIVER_NAME,
> + vm->def,
> + VIR_SP_USB_HOSTDEV) < 0)
>
Parameter alignment.
> goto cleanup;
>
> /* Here we open all the PTYs we need on the host OS side.
> @@ -1393,6 +1403,7 @@ virLXCProcessReconnectDomain(virDomainObjPtr vm,
> {
> virLXCDriverPtr driver = opaque;
> virLXCDomainObjPrivatePtr priv;
> + virHostdevManagerPtr hostdev_mgr;
> int ret = -1;
>
> virObjectLock(vm);
> @@ -1422,7 +1433,9 @@ virLXCProcessReconnectDomain(virDomainObjPtr vm,
> goto error;
> }
>
> - if (virLXCUpdateActiveUsbHostdevs(driver, vm->def) < 0)
> + hostdev_mgr = virHostdevManagerGetDefault();
> + if (virHostdevPrepareDomainHostdevs(hostdev_mgr, LXC_DRIVER_NAME,
> + vm->def, VIR_SP_USB_HOSTDEV) < 0)
>
Parameter alignment.
This patch looks rather straight-forward and similar to the changes you
made in the QEMU driver, but would be good to have another set of
libvirt dev eyes review it.
Regards,
Jim
> goto error;
>
> if (virSecurityManagerReserveLabel(driver->securityManager,
>
More information about the libvir-list
mailing list