[libvirt] [PATCH 09/10] qemu: hotplug: qemu: hotplug: Use storage chain helpers in qemuDomainChangeMediaBlockdev

Peter Krempa pkrempa at redhat.com
Mon Jun 24 15:38:54 UTC 2019


As this conversion removes the last use of qemuHotplugDiskSource*
functions we can remove all of them now.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/qemu/qemu_hotplug.c | 188 ++--------------------------------------
 1 file changed, 7 insertions(+), 181 deletions(-)

diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 1b1d2ba5ce..a1296d55d4 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -417,177 +417,6 @@ qemuHotplugRemoveManagedPR(virQEMUDriverPtr driver,
 }


-struct _qemuHotplugDiskSourceData {
-    qemuBlockStorageSourceAttachDataPtr *backends;
-    size_t nbackends;
-};
-typedef struct _qemuHotplugDiskSourceData qemuHotplugDiskSourceData;
-typedef qemuHotplugDiskSourceData *qemuHotplugDiskSourceDataPtr;
-
-
-static void
-qemuHotplugDiskSourceDataFree(qemuHotplugDiskSourceDataPtr data)
-{
-    size_t i;
-
-    if (!data)
-        return;
-
-    for (i = 0; i < data->nbackends; i++)
-        qemuBlockStorageSourceAttachDataFree(data->backends[i]);
-
-    VIR_FREE(data->backends);
-    VIR_FREE(data);
-}
-
-
-static qemuHotplugDiskSourceDataPtr
-qemuHotplugDiskSourceRemovePrepare(virDomainDiskDefPtr disk,
-                                   virStorageSourcePtr src,
-                                   virQEMUCapsPtr qemuCaps)
-{
-    VIR_AUTOPTR(qemuBlockStorageSourceAttachData) backend = NULL;
-    qemuHotplugDiskSourceDataPtr data = NULL;
-    qemuHotplugDiskSourceDataPtr ret = NULL;
-    char *drivealias = NULL;
-    virStorageSourcePtr n;
-
-    if (VIR_ALLOC(data) < 0)
-        return NULL;
-
-    if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV)) {
-        for (n = src; virStorageSourceIsBacking(n); n = n->backingStore) {
-            if (!(backend = qemuBlockStorageSourceDetachPrepare(n, NULL)))
-                goto cleanup;
-
-            if (VIR_APPEND_ELEMENT(data->backends, data->nbackends, backend) < 0)
-                goto cleanup;
-        }
-    } else {
-        if (!(drivealias = qemuAliasDiskDriveFromDisk(disk)))
-            goto cleanup;
-
-        if (!(backend = qemuBlockStorageSourceDetachPrepare(src, drivealias)))
-            goto cleanup;
-
-        if (VIR_APPEND_ELEMENT(data->backends, data->nbackends, backend) < 0)
-            goto cleanup;
-    }
-
-    VIR_STEAL_PTR(ret, data);
-
- cleanup:
-    qemuHotplugDiskSourceDataFree(data);
-    return ret;
-}
-
-
-/**
- * qemuHotplugDiskSourceAttachPrepare:
- * @disk: disk to generate attachment data for
- * @src: disk source to prepare attachment
- * @qemuCaps: capabilities of the qemu process
- *
- * Prepares and returns qemuHotplugDiskSourceData structure filled with all data
- * which will fully attach the source backend of the disk to a given VM.
- */
-static qemuHotplugDiskSourceDataPtr
-qemuHotplugDiskSourceAttachPrepare(virDomainDiskDefPtr disk,
-                                   virStorageSourcePtr src,
-                                   virQEMUCapsPtr qemuCaps)
-{
-    VIR_AUTOPTR(qemuBlockStorageSourceAttachData) backend = NULL;
-    qemuHotplugDiskSourceDataPtr data;
-    qemuHotplugDiskSourceDataPtr ret = NULL;
-    virStorageSourcePtr savesrc = NULL;
-    virStorageSourcePtr n;
-
-    if (VIR_ALLOC(data) < 0)
-        return NULL;
-
-    if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV)) {
-        for (n = src; virStorageSourceIsBacking(n); n = n->backingStore) {
-            if (!(backend = qemuBlockStorageSourceAttachPrepareBlockdev(n)))
-                goto cleanup;
-
-            if (qemuBuildStorageSourceAttachPrepareCommon(n, backend, qemuCaps) < 0)
-                goto cleanup;
-
-            if (VIR_APPEND_ELEMENT(data->backends, data->nbackends, backend) < 0)
-                goto cleanup;
-        }
-    } else {
-        VIR_STEAL_PTR(savesrc, disk->src);
-        disk->src = src;
-
-        if (!(backend = qemuBuildStorageSourceAttachPrepareDrive(disk, qemuCaps)))
-            goto cleanup;
-
-        VIR_STEAL_PTR(disk->src, savesrc);
-
-        if (qemuBuildStorageSourceAttachPrepareCommon(src, backend, qemuCaps) < 0)
-            goto cleanup;
-
-        if (VIR_APPEND_ELEMENT(data->backends, data->nbackends, backend) < 0)
-            goto cleanup;
-    }
-
-    VIR_STEAL_PTR(ret, data);
-
- cleanup:
-    if (savesrc)
-        VIR_STEAL_PTR(disk->src, savesrc);
-
-    qemuHotplugDiskSourceDataFree(data);
-    return ret;
-}
-
-
-/**
- * qemuHotplugDiskSourceAttach:
- * @mon: monitor object
- * @data: disk backend data object describing what to remove
- *
- * Attach a disk source backend with all relevant pieces. Caller must enter the
- * monitor context for @mon.
- */
-static int
-qemuHotplugDiskSourceAttach(qemuMonitorPtr mon,
-                            qemuHotplugDiskSourceDataPtr data)
-{
-    size_t i;
-
-    for (i = data->nbackends; i > 0; i--) {
-        if (qemuBlockStorageSourceAttachApply(mon, data->backends[i - 1]) < 0)
-            return -1;
-    }
-
-
-    return 0;
-}
-
-
-/**
- * qemuHotplugDiskSourceRemove:
- * @mon: monitor object
- * @data: disk backend data object describing what to remove
- *
- * Remove a disk source backend with all relevant pieces. This function
- * preserves the error which was set prior to calling it. Caller must enter the
- * monitor context for @mon.
- */
-static void
-qemuHotplugDiskSourceRemove(qemuMonitorPtr mon,
-                            qemuHotplugDiskSourceDataPtr data)
-
-{
-    size_t i;
-
-    for (i = 0; i < data->nbackends; i++)
-        qemuBlockStorageSourceAttachRollback(mon, data->backends[i]);
-}
-
-
 /**
  * qemuDomainChangeMediaBlockdev:
  * @driver: qemu driver structure
@@ -614,20 +443,19 @@ qemuDomainChangeMediaBlockdev(virQEMUDriverPtr driver,
 {
     qemuDomainObjPrivatePtr priv = vm->privateData;
     qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
-    qemuHotplugDiskSourceDataPtr newbackend = NULL;
-    qemuHotplugDiskSourceDataPtr oldbackend = NULL;
+    VIR_AUTOPTR(qemuBlockStorageSourceChainData) newbackend = NULL;
+    VIR_AUTOPTR(qemuBlockStorageSourceChainData) oldbackend = NULL;
     char *nodename = NULL;
     int rc;
     int ret = -1;

     if (!virStorageSourceIsEmpty(oldsrc) &&
-        !(oldbackend = qemuHotplugDiskSourceRemovePrepare(disk, oldsrc,
-                                                          priv->qemuCaps)))
+        !(oldbackend = qemuBlockStorageSourceChainDetachPrepareBlockdev(oldsrc)))
         goto cleanup;

     if (!virStorageSourceIsEmpty(newsrc)) {
-        if (!(newbackend = qemuHotplugDiskSourceAttachPrepare(disk, newsrc,
-                                                              priv->qemuCaps)))
+        if (!(newbackend = qemuBuildStorageSourceChainAttachPrepareBlockdev(newsrc,
+                                                                            priv->qemuCaps)))
             goto cleanup;

         if (qemuDomainDiskGetBackendAlias(disk, priv->qemuCaps, &nodename) < 0)
@@ -649,11 +477,11 @@ qemuDomainChangeMediaBlockdev(virQEMUDriverPtr driver,
     rc = qemuMonitorBlockdevMediumRemove(priv->mon, diskPriv->qomName);

     if (rc == 0 && oldbackend)
-        qemuHotplugDiskSourceRemove(priv->mon, oldbackend);
+        qemuBlockStorageSourceChainDetach(priv->mon, oldbackend);

     if (newbackend && nodename) {
         if (rc == 0)
-            rc = qemuHotplugDiskSourceAttach(priv->mon, newbackend);
+            rc = qemuBlockStorageSourceChainAttach(priv->mon, newbackend);

         if (rc == 0)
             rc = qemuMonitorBlockdevMediumInsert(priv->mon, diskPriv->qomName,
@@ -669,8 +497,6 @@ qemuDomainChangeMediaBlockdev(virQEMUDriverPtr driver,
     ret = 0;

  cleanup:
-    qemuHotplugDiskSourceDataFree(newbackend);
-    qemuHotplugDiskSourceDataFree(oldbackend);
     VIR_FREE(nodename);
     return ret;
 }
-- 
2.21.0




More information about the libvir-list mailing list