[libvirt PATCH 8/9] qemu_driver: report guest disk informations

marcandre.lureau at redhat.com marcandre.lureau at redhat.com
Fri Nov 20 18:09:47 UTC 2020


From: Marc-André Lureau <marcandre.lureau at redhat.com>

Signed-off-by: Marc-André Lureau <marcandre.lureau at redhat.com>
---
 src/qemu/qemu_driver.c | 99 ++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 96 insertions(+), 3 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index a8760f82b1..8d3e09da69 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -19820,7 +19820,8 @@ static const unsigned int qemuDomainGetGuestInfoSupportedTypes =
     VIR_DOMAIN_GUEST_INFO_OS |
     VIR_DOMAIN_GUEST_INFO_TIMEZONE |
     VIR_DOMAIN_GUEST_INFO_HOSTNAME |
-    VIR_DOMAIN_GUEST_INFO_FILESYSTEM;
+    VIR_DOMAIN_GUEST_INFO_FILESYSTEM |
+    VIR_DOMAIN_GUEST_INFO_DISKS;
 
 static int
 qemuDomainGetGuestInfoCheckSupport(unsigned int types,
@@ -19843,6 +19844,80 @@ qemuDomainGetGuestInfoCheckSupport(unsigned int types,
     return 0;
 }
 
+
+static void
+qemuAgentDiskInfoFormatParams(qemuAgentDiskInfoPtr *info,
+                              int ndisks,
+                              virDomainDefPtr vmdef,
+                              virTypedParameterPtr *params,
+                              int *nparams, int *maxparams)
+{
+    size_t i, j, ndeps;
+
+    if (virTypedParamsAddUInt(params, nparams, maxparams,
+                              "disks.count", ndisks) < 0)
+        return;
+
+    for (i = 0; i < ndisks; i++) {
+        char param_name[VIR_TYPED_PARAM_FIELD_LENGTH];
+
+        g_snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
+                   "disks.%zu.name", i);
+        if (virTypedParamsAddString(params, nparams, maxparams,
+                                    param_name, info[i]->name) < 0)
+            return;
+
+        g_snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
+                   "disks.%zu.partition", i);
+        if (virTypedParamsAddBoolean(params, nparams, maxparams,
+                                     param_name, info[i]->partition) < 0)
+            return;
+
+        ndeps = g_strv_length(info[i]->dependencies);
+        g_snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
+                   "disks.%zu.dependencies.count", i);
+        if (ndeps &&
+            virTypedParamsAddUInt(params, nparams, maxparams,
+                                  param_name, ndeps) < 0)
+            return;
+        for (j = 0; j < ndeps; j++) {
+            g_snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
+                       "disks.%zu.dependencies.%zu.name", i, j);
+            if (virTypedParamsAddString(params, nparams, maxparams,
+                                        param_name, info[i]->dependencies[j]) < 0)
+                return;
+        }
+
+        if (info[i]->address) {
+            virDomainDiskDefPtr diskdef = NULL;
+
+            /* match the disk to the target in the vm definition */
+            diskdef = virDomainDiskByAddress(vmdef,
+                                             &info[i]->address->pci_controller,
+                                             info[i]->address->bus,
+                                             info[i]->address->target,
+                                             info[i]->address->unit);
+            if (diskdef) {
+                g_snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
+                           "disks.%zu.alias", i);
+                if (diskdef->dst &&
+                    virTypedParamsAddString(params, nparams, maxparams,
+                                            param_name, diskdef->dst) < 0)
+                    return;
+            }
+        }
+
+        if (info[i]->alias) {
+            g_snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
+                       "disks.%zu.guest_alias", i);
+            if (virTypedParamsAddString(params, nparams, maxparams,
+                                        param_name, info[i]->alias) < 0)
+                return;
+        }
+    }
+}
+
+
 static void
 qemuAgentFSInfoFormatParams(qemuAgentFSInfoPtr *fsinfo,
                             int nfs,
@@ -19951,6 +20026,8 @@ qemuDomainGetGuestInfo(virDomainPtr dom,
     int rc;
     size_t nfs = 0;
     qemuAgentFSInfoPtr *agentfsinfo = NULL;
+    size_t ndisks = 0;
+    qemuAgentDiskInfoPtr *agentdiskinfo = NULL;
     size_t i;
 
     virCheckFlags(0, -1);
@@ -20007,6 +20084,15 @@ qemuDomainGetGuestInfo(virDomainPtr dom,
         }
     }
 
+    if (supportedTypes & VIR_DOMAIN_GUEST_INFO_DISKS) {
+        rc = qemuAgentGetDisks(agent, &agentdiskinfo, report_unsupported);
+        if (rc == -1) {
+            goto exitagent;
+        } else if (rc >= 0) {
+            ndisks = rc;
+        }
+    }
+
     ret = 0;
 
  exitagent:
@@ -20015,7 +20101,7 @@ qemuDomainGetGuestInfo(virDomainPtr dom,
  endagentjob:
     qemuDomainObjEndAgentJob(vm);
 
-    if (nfs > 0) {
+    if (nfs > 0 || ndisks > 0) {
         if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0)
             goto cleanup;
 
@@ -20024,7 +20110,11 @@ qemuDomainGetGuestInfo(virDomainPtr dom,
 
         /* we need to convert the agent fsinfo struct to parameters and match
          * it to the vm disk target */
-        qemuAgentFSInfoFormatParams(agentfsinfo, nfs, vm->def, params, nparams, &maxparams);
+        if (nfs)
+            qemuAgentFSInfoFormatParams(agentfsinfo, nfs, vm->def, params, nparams, &maxparams);
+
+        if (ndisks > 0)
+            qemuAgentDiskInfoFormatParams(agentdiskinfo, ndisks, vm->def, params, nparams, &maxparams);
 
  endjob:
         qemuDomainObjEndJob(driver, vm);
@@ -20034,6 +20124,9 @@ qemuDomainGetGuestInfo(virDomainPtr dom,
     for (i = 0; i < nfs; i++)
         qemuAgentFSInfoFree(agentfsinfo[i]);
     g_free(agentfsinfo);
+    for (i = 0; i < ndisks; i++)
+        qemuAgentDiskInfoFree(agentdiskinfo[i]);
+    g_free(agentdiskinfo);
 
     virDomainObjEndAPI(&vm);
     return ret;
-- 
2.29.0




More information about the libvir-list mailing list