[libvirt] [PATCH 12/13] util: storage: Store PR manager alias in the definition

Peter Krempa pkrempa at redhat.com
Mon May 14 10:45:45 UTC 2018


Rather than always re-generating the alias store it in the definition
and in the status XML.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/qemu/qemu_command.c                   | 23 +++------------------
 src/qemu/qemu_command.h                   |  3 +--
 src/qemu/qemu_domain.c                    | 16 +++++++++++++--
 src/qemu/qemu_hotplug.c                   | 34 ++++++++++---------------------
 src/util/virstoragefile.c                 |  1 +
 src/util/virstoragefile.h                 |  3 +++
 tests/qemustatusxml2xmldata/modern-in.xml |  4 ++++
 7 files changed, 37 insertions(+), 47 deletions(-)

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index c38dde5a60..84d7d51c7c 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -9669,7 +9669,6 @@ qemuBuildPanicCommandLine(virCommandPtr cmd,
  * qemuBuildPRManagerInfoProps:
  * @disk: disk definition
  * @propsret: Returns JSON object containing properties of the pr-manager-helper object
- * @aliasret: alias of the pr-manager-helper object
  *
  * Build the JSON properties for the pr-manager object.
  *
@@ -9678,32 +9677,19 @@ qemuBuildPanicCommandLine(virCommandPtr cmd,
  */
 int
 qemuBuildPRManagerInfoProps(const virDomainDiskDef *disk,
-                            virJSONValuePtr *propsret,
-                            char **aliasret)
+                            virJSONValuePtr *propsret)
 {
-    char *alias = NULL;
     int ret = -1;

     *propsret = NULL;
-    *aliasret = NULL;
-
-    if (virStoragePRDefIsManaged(disk->src->pr)) {
-        if (VIR_STRDUP(alias, qemuDomainGetManagedPRAlias()) < 0)
-            goto cleanup;
-    } else {
-        if (!(alias = qemuDomainGetUnmanagedPRAlias(disk->info.alias)))
-            goto cleanup;
-    }

     if (virJSONValueObjectCreate(propsret,
                                  "s:path", disk->src->pr->path,
                                  NULL) < 0)
         goto cleanup;

-    VIR_STEAL_PTR(*aliasret, alias);
     ret = 0;
  cleanup:
-    VIR_FREE(alias);
     return ret;
 }

@@ -9715,7 +9701,6 @@ qemuBuildMasterPRCommandLine(virCommandPtr cmd,
     size_t i;
     bool managedAdded = false;
     virJSONValuePtr props = NULL;
-    char *alias = NULL;
     char *tmp = NULL;
     int ret = -1;

@@ -9732,14 +9717,13 @@ qemuBuildMasterPRCommandLine(virCommandPtr cmd,
             managedAdded = true;
         }

-        if (qemuBuildPRManagerInfoProps(disk, &props, &alias) < 0)
+        if (qemuBuildPRManagerInfoProps(disk, &props) < 0)
             goto cleanup;

         if (!(tmp = virQEMUBuildObjectCommandlineFromJSON("pr-manager-helper",
-                                                          alias,
+                                                          disk->src->pr->mgralias,
                                                           props)))
             goto cleanup;
-        VIR_FREE(alias);
         virJSONValueFree(props);
         props = NULL;

@@ -9749,7 +9733,6 @@ qemuBuildMasterPRCommandLine(virCommandPtr cmd,

     ret = 0;
  cleanup:
-    VIR_FREE(alias);
     virJSONValueFree(props);
     return ret;
 }
diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h
index 621592cd79..28bc33558b 100644
--- a/src/qemu/qemu_command.h
+++ b/src/qemu/qemu_command.h
@@ -56,8 +56,7 @@ virCommandPtr qemuBuildCommandLine(virQEMUDriverPtr driver,

 /* Generate the object properties for pr-manager */
 int qemuBuildPRManagerInfoProps(const virDomainDiskDef *disk,
-                                virJSONValuePtr *propsret,
-                                char **alias);
+                                virJSONValuePtr *propsret);

 /* Generate the object properties for a secret */
 int qemuBuildSecretInfoProps(qemuDomainSecretInfoPtr secinfo,
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 92217e66fe..1572ce5c2d 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -1941,6 +1941,9 @@ qemuStorageSourcePrivateDataParse(xmlXPathContextPtr ctxt,
     src->nodestorage = virXPathString("string(./nodenames/nodename[@type='storage']/@name)", ctxt);
     src->nodeformat = virXPathString("string(./nodenames/nodename[@type='format']/@name)", ctxt);

+    if (src->pr)
+        src->pr->mgralias = virXPathString("string(./reservations/@mgralias)", ctxt);
+
     if (virStorageSourcePrivateDataParseRelPath(ctxt, src) < 0)
         return -1;

@@ -1961,6 +1964,9 @@ qemuStorageSourcePrivateDataFormat(virStorageSourcePtr src,
         virBufferAddLit(buf, "</nodenames>\n");
     }

+    if (src->pr)
+        virBufferAsprintf(buf, "<reservations mgralias='%s'/>\n", src->pr->mgralias);
+
     if (virStorageSourcePrivateDataFormatRelPath(src, buf) < 0)
         return -1;

@@ -11932,7 +11938,8 @@ qemuDomainPrepareDiskCachemode(virDomainDiskDefPtr disk)

 static int
 qemuDomainPrepareStorageSourcePR(virStorageSourcePtr src,
-                                 qemuDomainObjPrivatePtr priv)
+                                 qemuDomainObjPrivatePtr priv,
+                                 const char *parentalias)
 {
     if (!src->pr)
         return 0;
@@ -11940,6 +11947,11 @@ qemuDomainPrepareStorageSourcePR(virStorageSourcePtr src,
     if (virStoragePRDefIsManaged(src->pr)) {
         if (!(src->pr->path = qemuDomainGetManagedPRSocketPath(priv)))
             return -1;
+        if (VIR_STRDUP(src->pr->mgralias, qemuDomainGetManagedPRAlias()) < 0)
+            return -1;
+    } else {
+        if (!(src->pr->mgralias = qemuDomainGetUnmanagedPRAlias(parentalias)))
+            return -1;
     }

     return 0;
@@ -11962,7 +11974,7 @@ qemuDomainPrepareDiskSource(virDomainDiskDefPtr disk,
     if (qemuDomainPrepareDiskSourceChain(disk, NULL, cfg, priv->qemuCaps) < 0)
         return -1;

-    if (qemuDomainPrepareStorageSourcePR(disk->src, priv) < 0)
+    if (qemuDomainPrepareStorageSourcePR(disk->src, priv, disk->info.alias) < 0)
         return -1;

     return 0;
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 6557711ec1..9481123c19 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -387,13 +387,11 @@ qemuDomainMaybeStartPRDaemon(virDomainObjPtr vm,
 static int
 qemuMaybeBuildPRManagerInfoProps(virDomainObjPtr vm,
                                  const virDomainDiskDef *disk,
-                                 virJSONValuePtr *propsret,
-                                 char **aliasret)
+                                 virJSONValuePtr *propsret)
 {
     qemuDomainObjPrivatePtr priv = vm->privateData;

     *propsret = NULL;
-    *aliasret = NULL;

     if (!disk->src->pr)
         return 0;
@@ -404,7 +402,7 @@ qemuMaybeBuildPRManagerInfoProps(virDomainObjPtr vm,
         return 0;
     }

-    return qemuBuildPRManagerInfoProps(disk, propsret, aliasret);
+    return qemuBuildPRManagerInfoProps(disk, propsret);
 }


@@ -425,7 +423,6 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver,
     char *devstr = NULL;
     char *drivestr = NULL;
     char *drivealias = NULL;
-    char *prmgrAlias = NULL;
     bool driveAdded = false;
     bool secobjAdded = false;
     bool encobjAdded = false;
@@ -462,7 +459,7 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver,
     if (encinfo && qemuBuildSecretInfoProps(encinfo, &encobjProps) < 0)
         goto error;

-    if (qemuMaybeBuildPRManagerInfoProps(vm, disk, &prmgrProps, &prmgrAlias) < 0)
+    if (qemuMaybeBuildPRManagerInfoProps(vm, disk, &prmgrProps) < 0)
         goto error;

     /* Start daemon only after prmgrProps is built. Otherwise
@@ -511,7 +508,8 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver,
     }

     if (prmgrProps) {
-        rv = qemuMonitorAddObject(priv->mon, "pr-manager-helper", prmgrAlias,
+        rv = qemuMonitorAddObject(priv->mon, "pr-manager-helper",
+                                  disk->src->pr->mgralias,
                                   prmgrProps);
         prmgrProps = NULL; /* qemuMonitorAddObject consumes */
         if (rv < 0)
@@ -541,7 +539,6 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver,
     virJSONValueFree(encobjProps);
     virJSONValueFree(secobjProps);
     qemuDomainSecretDiskDestroy(disk);
-    VIR_FREE(prmgrAlias);
     VIR_FREE(drivealias);
     VIR_FREE(drivestr);
     VIR_FREE(devstr);
@@ -559,7 +556,7 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver,
     if (encobjAdded)
         ignore_value(qemuMonitorDelObject(priv->mon, encinfo->s.aes.alias));
     if (prmgrAdded)
-        ignore_value(qemuMonitorDelObject(priv->mon, prmgrAlias));
+        ignore_value(qemuMonitorDelObject(priv->mon, disk->src->pr->mgralias));
     if (qemuDomainObjExitMonitor(driver, vm) < 0)
         ret = -2;
     virErrorRestore(&orig_err);
@@ -3832,22 +3829,18 @@ static bool qemuIsMultiFunctionDevice(virDomainDefPtr def,
 static int
 qemuDomainDiskNeedRemovePR(virDomainObjPtr vm,
                            virDomainDiskDefPtr disk,
-                           char **aliasret,
                            bool *stopDaemon)
 {
     qemuDomainObjPrivatePtr priv = vm->privateData;
     size_t i;

-    *aliasret = NULL;
     *stopDaemon = false;

     if (!disk->src->pr)
         return 0;

-    if (!virStoragePRDefIsManaged(disk->src->pr)) {
-        *aliasret = qemuDomainGetUnmanagedPRAlias(disk->info.alias);
-        return *aliasret ? 0 : -1;
-    }
+    if (!virStoragePRDefIsManaged(disk->src->pr))
+        return 0;

     for (i = 0; i < vm->def->ndisks; i++) {
         const virDomainDiskDef *domainDisk = vm->def->disks[i];
@@ -3862,9 +3855,6 @@ qemuDomainDiskNeedRemovePR(virDomainObjPtr vm,
     if (i != vm->def->ndisks)
         return 0;

-    if (VIR_STRDUP(*aliasret, qemuDomainGetManagedPRAlias()) < 0)
-        return -1;
-
     if (priv->prDaemonRunning)
         *stopDaemon = true;

@@ -3885,7 +3875,6 @@ qemuDomainRemoveDiskDevice(virQEMUDriverPtr driver,
     char *drivestr;
     char *objAlias = NULL;
     char *encAlias = NULL;
-    char *prmgrAlias = NULL;
     bool stopPRDaemon = false;

     VIR_DEBUG("Removing disk %s from domain %p %s",
@@ -3924,7 +3913,7 @@ qemuDomainRemoveDiskDevice(virQEMUDriverPtr driver,
         }
     }

-    if (qemuDomainDiskNeedRemovePR(vm, disk, &prmgrAlias, &stopPRDaemon) < 0)
+    if (qemuDomainDiskNeedRemovePR(vm, disk, &stopPRDaemon) < 0)
         return -1;

     qemuDomainObjEnterMonitor(driver, vm);
@@ -3943,9 +3932,8 @@ qemuDomainRemoveDiskDevice(virQEMUDriverPtr driver,
     VIR_FREE(encAlias);

     /* If it fails, then so be it - it was a best shot */
-    if (prmgrAlias)
-        ignore_value(qemuMonitorDelObject(priv->mon, prmgrAlias));
-    VIR_FREE(prmgrAlias);
+    if (disk->src->pr)
+        ignore_value(qemuMonitorDelObject(priv->mon, disk->src->pr->mgralias));

     if (disk->src->haveTLS)
         ignore_value(qemuMonitorDelObject(priv->mon, disk->src->tlsAlias));
diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
index dbbe758f30..54de2c1c30 100644
--- a/src/util/virstoragefile.c
+++ b/src/util/virstoragefile.c
@@ -1899,6 +1899,7 @@ virStoragePRDefFree(virStoragePRDefPtr prd)
         return;

     VIR_FREE(prd->path);
+    VIR_FREE(prd->mgralias);
     VIR_FREE(prd);
 }

diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h
index 3a90c60fa5..1631c4cf66 100644
--- a/src/util/virstoragefile.h
+++ b/src/util/virstoragefile.h
@@ -221,6 +221,9 @@ typedef virStoragePRDef *virStoragePRDefPtr;
 struct _virStoragePRDef {
     int managed; /* enum virTristateBool */
     char *path;
+
+    /* manager object alias */
+    char *mgralias;
 };

 typedef struct _virStorageDriverData virStorageDriverData;
diff --git a/tests/qemustatusxml2xmldata/modern-in.xml b/tests/qemustatusxml2xmldata/modern-in.xml
index d57e1f605f..d63fcf79f1 100644
--- a/tests/qemustatusxml2xmldata/modern-in.xml
+++ b/tests/qemustatusxml2xmldata/modern-in.xml
@@ -308,11 +308,15 @@
         <backingStore type='file' index='1'>
           <format type='qcow2'/>
           <source file='/var/lib/libvirt/images/base.qcow2'>
+            <reservations managed='yes'>
+              <source type='unix' path='/somepath/ux.sck' mode='client'/>
+            </reservations>
             <privateData>
               <nodenames>
                 <nodename type='storage' name='test-storage'/>
                 <nodename type='format' name='test-format'/>
               </nodenames>
+              <reservations mgralias='test-alias'/>
               <relPath>base.qcow2</relPath>
             </privateData>
           </source>
-- 
2.16.2




More information about the libvir-list mailing list