Change lxc driver to use hostdev common library instead of APIs in
lxc_hostdev.[ch]
Signed-off-by: Chunyan Liu <cyliu(a)suse.com>
---
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 9e71db3..94017c6 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 5712055..b5839f3 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -616,7 +616,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 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 687046e..6f3a30f 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
@@ -1525,9 +1526,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;
@@ -1642,7 +1640,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);
@@ -3892,6 +3889,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",
@@ -3899,6 +3897,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;
@@ -3974,6 +3980,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);
@@ -4436,8 +4447,7 @@ cleanup:
static int
-lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver,
- virDomainObjPtr vm,
+lxcDomainDetachDeviceHostdevUSBLive(virDomainObjPtr vm,
virDomainDeviceDefPtr dev)
{
virLXCDomainObjPrivatePtr priv = vm->privateData;
@@ -4446,6 +4456,7 @@ lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver,
char *dst = NULL;
char *vroot = NULL;
virUSBDevicePtr usb = NULL;
+ virHostdevManagerPtr hostdev_mgr;
if ((idx = virDomainHostdevFind(vm->def,
dev->data.hostdev,
@@ -4490,9 +4501,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);
@@ -4626,13 +4638,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,
@@ -4664,8 +4675,7 @@ lxcDomainDetachDeviceHostdevCapsLive(virDomainObjPtr vm,
static int
-lxcDomainDetachDeviceHostdevLive(virLXCDriverPtr driver,
- virDomainObjPtr vm,
+lxcDomainDetachDeviceHostdevLive(virDomainObjPtr vm,
virDomainDeviceDefPtr dev)
{
virLXCDomainObjPrivatePtr priv = vm->privateData;
@@ -4678,7 +4688,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);
@@ -4693,8 +4703,7 @@ lxcDomainDetachDeviceHostdevLive(virLXCDriverPtr driver,
static int
-lxcDomainDetachDeviceLive(virLXCDriverPtr driver,
- virDomainObjPtr vm,
+lxcDomainDetachDeviceLive(virDomainObjPtr vm,
virDomainDeviceDefPtr dev)
{
int ret = -1;
@@ -4709,7 +4718,7 @@ lxcDomainDetachDeviceLive(virLXCDriverPtr driver,
break;
case VIR_DOMAIN_DEVICE_HOSTDEV:
- ret = lxcDomainDetachDeviceHostdevLive(driver, vm, dev);
+ ret = lxcDomainDetachDeviceHostdevLive(vm, dev);
break;
default:
@@ -5042,7 +5051,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(a)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, "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(a)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 ed729f6..0afbddd 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"
@@ -150,6 +150,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);
@@ -185,7 +186,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];
@@ -997,6 +1003,7 @@ int virLXCProcessStart(virConnectPtr conn,
virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver);
virCgroupPtr selfcgroup;
int status;
+ virHostdevManagerPtr hostdev_mgr;
if (virCgroupNewSelf(&selfcgroup) < 0)
return -1;
@@ -1082,7 +1089,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.
@@ -1435,6 +1447,7 @@ virLXCProcessReconnectDomain(virDomainObjPtr vm,
{
virLXCDriverPtr driver = opaque;
virLXCDomainObjPrivatePtr priv;
+ virHostdevManagerPtr hostdev_mgr;
int ret = -1;
virObjectLock(vm);
@@ -1467,7 +1480,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