[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH 3/4] qemu: consolidate device modification functions



No functional change, but now adding support for persistent
modifications can be done at one point to affect 3 APIs.

* src/qemu/qemu_driver.c (qemuDomainModifyDeviceCallback): New
typedef.
(qemuDomainModifyDeviceFlags) New function.
(qemuDomainAttachDeviceFlags, qemuDomainUpdateDeviceFlags)
(qemuDomainDetachDeviceFlags): Use it.
---
 src/qemu/qemu_driver.c |  158 +++++++++--------------------------------------
 1 files changed, 31 insertions(+), 127 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index c1a5ebb..4f0a057 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3775,6 +3775,12 @@ cleanup:
     return ret;
 }

+typedef int (*qemuDomainModifyDeviceCallback) (virDomainPtr dom,
+                                               struct qemud_driver *driver,
+                                               virDomainObjPtr vm,
+                                               virDomainDeviceDefPtr dev,
+                                               virBitmapPtr qemuCaps,
+                                               bool force);

 /* Helper called on active vm while job condition is held */
 static int
@@ -4021,21 +4027,22 @@ cleanup:
     return ret;
 }

+/* Common boilerplate around modifying a device.  */
 static int
-qemuDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
-                            unsigned int flags)
+qemuDomainModifyDeviceFlags(virDomainPtr dom, const char *xml,
+                            unsigned int flags,
+                            qemuDomainModifyDeviceCallback cb)
 {
     struct qemud_driver *driver = dom->conn->privateData;
     virDomainObjPtr vm;
     virDomainDeviceDefPtr dev = NULL;
     virBitmapPtr qemuCaps = NULL;
     int ret = -1;
+    bool force = (flags & VIR_DOMAIN_DEVICE_MODIFY_FORCE) != 0;

-    virCheckFlags(VIR_DOMAIN_DEVICE_MODIFY_LIVE |
-                  VIR_DOMAIN_DEVICE_MODIFY_CONFIG, -1);
     if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) {
-        qemuReportError(VIR_ERR_OPERATION_INVALID,
-                        "%s", _("cannot modify the persistent configuration of a domain"));
+        qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                        _("cannot modify domain persistent configuration"));
         return -1;
     }

@@ -4054,7 +4061,7 @@ qemuDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,

     if (!virDomainObjIsActive(vm)) {
         qemuReportError(VIR_ERR_OPERATION_INVALID,
-                        "%s", _("cannot attach device on inactive domain"));
+                        "%s", _("cannot modify device on inactive domain"));
         goto endjob;
     }

@@ -4068,7 +4075,7 @@ qemuDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
                                    &qemuCaps) < 0)
         goto endjob;

-    ret = qemuDomainAttachDeviceLive(dom, driver, vm, dev, qemuCaps, false);
+    ret = (cb)(dom, driver, vm, dev, qemuCaps, force);

     /* update domain status forcibly because the domain status may be changed
      * even if we attach the device failed. For example, a new controller may
@@ -4090,6 +4097,17 @@ cleanup:
     return ret;
 }

+
+static int
+qemuDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
+                            unsigned int flags)
+{
+    virCheckFlags(VIR_DOMAIN_DEVICE_MODIFY_LIVE |
+                  VIR_DOMAIN_DEVICE_MODIFY_CONFIG, -1);
+    return qemuDomainModifyDeviceFlags(dom, xml, flags,
+                                       qemuDomainAttachDeviceLive);
+}
+
 static int
 qemuDomainAttachDevice(virDomainPtr dom, const char *xml)
 {
@@ -4102,69 +4120,11 @@ static int
 qemuDomainUpdateDeviceFlags(virDomainPtr dom, const char *xml,
                             unsigned int flags)
 {
-    struct qemud_driver *driver = dom->conn->privateData;
-    virDomainObjPtr vm;
-    virDomainDeviceDefPtr dev = NULL;
-    virBitmapPtr qemuCaps = NULL;
-    int ret = -1;
-    bool force = (flags & VIR_DOMAIN_DEVICE_MODIFY_FORCE) != 0;
-
-    virCheckFlags(VIR_DOMAIN_DEVICE_MODIFY_CURRENT |
-                  VIR_DOMAIN_DEVICE_MODIFY_LIVE |
+    virCheckFlags(VIR_DOMAIN_DEVICE_MODIFY_LIVE |
                   VIR_DOMAIN_DEVICE_MODIFY_CONFIG |
                   VIR_DOMAIN_DEVICE_MODIFY_FORCE, -1);
-
-    if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) {
-        qemuReportError(VIR_ERR_OPERATION_INVALID,
-                        "%s", _("cannot modify the persistent configuration of a domain"));
-        return -1;
-    }
-
-    qemuDriverLock(driver);
-    vm = virDomainFindByUUID(&driver->domains, dom->uuid);
-    if (!vm) {
-        char uuidstr[VIR_UUID_STRING_BUFLEN];
-        virUUIDFormat(dom->uuid, uuidstr);
-        qemuReportError(VIR_ERR_NO_DOMAIN,
-                        _("no domain with matching uuid '%s'"), uuidstr);
-        goto cleanup;
-    }
-
-    if (qemuDomainObjBeginJobWithDriver(driver, vm) < 0)
-        goto cleanup;
-
-    if (!virDomainObjIsActive(vm)) {
-        qemuReportError(VIR_ERR_OPERATION_INVALID,
-                        "%s", _("cannot attach device on inactive domain"));
-        goto endjob;
-    }
-
-    dev = virDomainDeviceDefParse(driver->caps, vm->def, xml,
-                                  VIR_DOMAIN_XML_INACTIVE);
-    if (dev == NULL)
-        goto endjob;
-
-    if (qemuCapsExtractVersionInfo(vm->def->emulator, vm->def->os.arch,
-                                   NULL,
-                                   &qemuCaps) < 0)
-        goto endjob;
-
-    ret = qemuDomainUpdateDeviceLive(dom, driver, vm, dev, qemuCaps, force);
-
-    if (!ret && virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
-        ret = -1;
-
-endjob:
-    if (qemuDomainObjEndJob(vm) == 0)
-        vm = NULL;
-
-cleanup:
-    qemuCapsFree(qemuCaps);
-    virDomainDeviceDefFree(dev);
-    if (vm)
-        virDomainObjUnlock(vm);
-    qemuDriverUnlock(driver);
-    return ret;
+    return qemuDomainModifyDeviceFlags(dom, xml, flags,
+                                       qemuDomainUpdateDeviceLive);
 }


@@ -4172,66 +4132,10 @@ static int
 qemuDomainDetachDeviceFlags(virDomainPtr dom, const char *xml,
                             unsigned int flags)
 {
-    struct qemud_driver *driver = dom->conn->privateData;
-    virDomainObjPtr vm;
-    virBitmapPtr qemuCaps = NULL;
-    virDomainDeviceDefPtr dev = NULL;
-    int ret = -1;
-
     virCheckFlags(VIR_DOMAIN_DEVICE_MODIFY_LIVE |
                   VIR_DOMAIN_DEVICE_MODIFY_CONFIG, -1);
-    if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) {
-        qemuReportError(VIR_ERR_OPERATION_INVALID,
-                        "%s", _("cannot modify the persistent configuration of a domain"));
-        return -1;
-    }
-
-
-    qemuDriverLock(driver);
-    vm = virDomainFindByUUID(&driver->domains, dom->uuid);
-    if (!vm) {
-        char uuidstr[VIR_UUID_STRING_BUFLEN];
-        virUUIDFormat(dom->uuid, uuidstr);
-        qemuReportError(VIR_ERR_NO_DOMAIN,
-                        _("no domain with matching uuid '%s'"), uuidstr);
-        goto cleanup;
-    }
-
-    if (qemuDomainObjBeginJobWithDriver(driver, vm) < 0)
-        goto cleanup;
-
-    if (!virDomainObjIsActive(vm)) {
-        qemuReportError(VIR_ERR_OPERATION_INVALID,
-                        "%s", _("cannot detach device on inactive domain"));
-        goto endjob;
-    }
-
-    dev = virDomainDeviceDefParse(driver->caps, vm->def, xml,
-                                  VIR_DOMAIN_XML_INACTIVE);
-    if (dev == NULL)
-        goto endjob;
-
-    if (qemuCapsExtractVersionInfo(vm->def->emulator, vm->def->os.arch,
-                                   NULL,
-                                   &qemuCaps) < 0)
-        goto endjob;
-
-    ret = qemuDomainDetachDeviceLive(dom, driver, vm, dev, qemuCaps, false);
-
-    if (!ret && virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
-        ret = -1;
-
-endjob:
-    if (qemuDomainObjEndJob(vm) == 0)
-        vm = NULL;
-
-cleanup:
-    qemuCapsFree(qemuCaps);
-    virDomainDeviceDefFree(dev);
-    if (vm)
-        virDomainObjUnlock(vm);
-    qemuDriverUnlock(driver);
-    return ret;
+    return qemuDomainModifyDeviceFlags(dom, xml, flags,
+                                       qemuDomainDetachDeviceLive);
 }

 static int
-- 
1.7.4.2


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]