[libvirt] [PATCH v12 09/11] change lxc driver to use hostdev common library

Chunyan Liu cyliu at suse.com
Mon Feb 17 06:32:11 UTC 2014


Change lxc driver to use hostdev common library instead of 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  |   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 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, "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 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 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




More information about the libvir-list mailing list