render / rpms / libvirt

Forked from rpms/libvirt 4 months ago
Clone
fbe740
From 314e0b35249ff662cb76d9b03f33aeb700c6a43a Mon Sep 17 00:00:00 2001
fbe740
Message-Id: <314e0b35249ff662cb76d9b03f33aeb700c6a43a@dist-git>
fbe740
From: Jonathon Jongsma <jjongsma@redhat.com>
fbe740
Date: Thu, 20 Feb 2020 10:52:26 -0600
fbe740
Subject: [PATCH] qemu: don't access vmdef within qemu_agent.c
fbe740
MIME-Version: 1.0
fbe740
Content-Type: text/plain; charset=UTF-8
fbe740
Content-Transfer-Encoding: 8bit
fbe740
fbe740
In order to avoid holding an agent job and a normal job at the same
fbe740
time, we want to avoid accessing the domain's definition while holding
fbe740
the agent job. To achieve this, qemuAgentGetFSInfo() only returns the
fbe740
raw information from the agent query to the caller. The caller can then
fbe740
release the agent job and then proceed to look up the disk alias from
fbe740
the vm definition. This necessitates moving a few helper functions to
fbe740
qemu_driver.c and exposing the agent data structure (qemuAgentFSInfo) in
fbe740
the header.
fbe740
fbe740
In addition, because the agent function no longer returns the looked-up
fbe740
disk alias, we can't test the alias within qemuagenttest.  Instead we
fbe740
simply test that we parse and return the raw agent data correctly.
fbe740
fbe740
Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
fbe740
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
fbe740
(cherry picked from commit 599ae372d8cf0923757c5a3792acb07dcf3e8802)
fbe740
Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
fbe740
https://bugzilla.redhat.com/show_bug.cgi?id=1759566
fbe740
Message-Id: <20200220165227.11491-5-jjongsma@redhat.com>
fbe740
Reviewed-by: Ján Tomko <jtomko@redhat.com>
fbe740
---
fbe740
 src/qemu/qemu_agent.c  | 219 +----------------------------------
fbe740
 src/qemu/qemu_agent.h  |  33 ++++--
fbe740
 src/qemu/qemu_driver.c | 255 ++++++++++++++++++++++++++++++++++++++---
fbe740
 tests/qemuagenttest.c  | 196 +++++--------------------------
fbe740
 4 files changed, 299 insertions(+), 404 deletions(-)
fbe740
fbe740
diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c
fbe740
index 4739faeed8..ef2d2c500b 100644
fbe740
--- a/src/qemu/qemu_agent.c
fbe740
+++ b/src/qemu/qemu_agent.c
fbe740
@@ -1844,30 +1844,6 @@ qemuAgentSetTime(qemuAgentPtr mon,
fbe740
     return ret;
fbe740
 }
fbe740
 
fbe740
-typedef struct _qemuAgentDiskInfo qemuAgentDiskInfo;
fbe740
-typedef qemuAgentDiskInfo *qemuAgentDiskInfoPtr;
fbe740
-struct _qemuAgentDiskInfo {
fbe740
-    char *serial;
fbe740
-    virPCIDeviceAddress pci_controller;
fbe740
-    char *bus_type;
fbe740
-    unsigned int bus;
fbe740
-    unsigned int target;
fbe740
-    unsigned int unit;
fbe740
-    char *devnode;
fbe740
-};
fbe740
-
fbe740
-typedef struct _qemuAgentFSInfo qemuAgentFSInfo;
fbe740
-typedef qemuAgentFSInfo *qemuAgentFSInfoPtr;
fbe740
-struct _qemuAgentFSInfo {
fbe740
-    char *mountpoint; /* path to mount point */
fbe740
-    char *name;       /* device name in the guest (e.g. "sda1") */
fbe740
-    char *fstype;     /* filesystem type */
fbe740
-    long long total_bytes;
fbe740
-    long long used_bytes;
fbe740
-    size_t ndisks;
fbe740
-    qemuAgentDiskInfoPtr *disks;
fbe740
-};
fbe740
-
fbe740
 static void
fbe740
 qemuAgentDiskInfoFree(qemuAgentDiskInfoPtr info)
fbe740
 {
fbe740
@@ -1880,7 +1856,7 @@ qemuAgentDiskInfoFree(qemuAgentDiskInfoPtr info)
fbe740
     VIR_FREE(info);
fbe740
 }
fbe740
 
fbe740
-static void
fbe740
+void
fbe740
 qemuAgentFSInfoFree(qemuAgentFSInfoPtr info)
fbe740
 {
fbe740
     size_t i;
fbe740
@@ -1899,47 +1875,6 @@ qemuAgentFSInfoFree(qemuAgentFSInfoPtr info)
fbe740
     VIR_FREE(info);
fbe740
 }
fbe740
 
fbe740
-static virDomainFSInfoPtr
fbe740
-qemuAgentFSInfoToPublic(qemuAgentFSInfoPtr agent,
fbe740
-                        virDomainDefPtr vmdef)
fbe740
-{
fbe740
-    virDomainFSInfoPtr ret = NULL;
fbe740
-    size_t i;
fbe740
-
fbe740
-    if (VIR_ALLOC(ret) < 0)
fbe740
-        goto error;
fbe740
-
fbe740
-    ret->mountpoint = g_strdup(agent->mountpoint);
fbe740
-    ret->name = g_strdup(agent->name);
fbe740
-    ret->fstype = g_strdup(agent->fstype);
fbe740
-
fbe740
-    if (agent->disks &&
fbe740
-        VIR_ALLOC_N(ret->devAlias, agent->ndisks) < 0)
fbe740
-        goto error;
fbe740
-
fbe740
-    ret->ndevAlias = agent->ndisks;
fbe740
-
fbe740
-    for (i = 0; i < ret->ndevAlias; i++) {
fbe740
-        qemuAgentDiskInfoPtr agentdisk = agent->disks[i];
fbe740
-        virDomainDiskDefPtr diskDef;
fbe740
-
fbe740
-        if (!(diskDef = virDomainDiskByAddress(vmdef,
fbe740
-                                               &agentdisk->pci_controller,
fbe740
-                                               agentdisk->bus,
fbe740
-                                               agentdisk->target,
fbe740
-                                               agentdisk->unit)))
fbe740
-            continue;
fbe740
-
fbe740
-        ret->devAlias[i] = g_strdup(diskDef->dst);
fbe740
-    }
fbe740
-
fbe740
-    return ret;
fbe740
-
fbe740
- error:
fbe740
-    virDomainFSInfoFree(ret);
fbe740
-    return NULL;
fbe740
-}
fbe740
-
fbe740
 static int
fbe740
 qemuAgentGetFSInfoFillDisks(virJSONValuePtr jsondisks,
fbe740
                             qemuAgentFSInfoPtr fsinfo)
fbe740
@@ -2013,7 +1948,6 @@ qemuAgentGetFSInfoFillDisks(virJSONValuePtr jsondisks,
fbe740
         GET_DISK_ADDR(pci, &disk->pci_controller.bus, "bus");
fbe740
         GET_DISK_ADDR(pci, &disk->pci_controller.slot, "slot");
fbe740
         GET_DISK_ADDR(pci, &disk->pci_controller.function, "function");
fbe740
-
fbe740
 #undef GET_DISK_ADDR
fbe740
     }
fbe740
 
fbe740
@@ -2024,9 +1958,9 @@ qemuAgentGetFSInfoFillDisks(virJSONValuePtr jsondisks,
fbe740
  *          -2 when agent command is not supported by the agent
fbe740
  *          -1 otherwise
fbe740
  */
fbe740
-static int
fbe740
-qemuAgentGetFSInfoInternal(qemuAgentPtr mon,
fbe740
-                           qemuAgentFSInfoPtr **info)
fbe740
+int
fbe740
+qemuAgentGetFSInfo(qemuAgentPtr mon,
fbe740
+                   qemuAgentFSInfoPtr **info)
fbe740
 {
fbe740
     size_t i;
fbe740
     int ret = -1;
fbe740
@@ -2158,151 +2092,6 @@ qemuAgentGetFSInfoInternal(qemuAgentPtr mon,
fbe740
     return ret;
fbe740
 }
fbe740
 
fbe740
-/* Returns: 0 on success
fbe740
- *          -1 otherwise
fbe740
- */
fbe740
-int
fbe740
-qemuAgentGetFSInfo(qemuAgentPtr mon,
fbe740
-                   virDomainFSInfoPtr **info,
fbe740
-                   virDomainDefPtr vmdef)
fbe740
-{
fbe740
-    int ret = -1;
fbe740
-    qemuAgentFSInfoPtr *agentinfo = NULL;
fbe740
-    virDomainFSInfoPtr *info_ret = NULL;
fbe740
-    size_t i;
fbe740
-    int nfs;
fbe740
-
fbe740
-    nfs = qemuAgentGetFSInfoInternal(mon, &agentinfo);
fbe740
-    if (nfs < 0)
fbe740
-        return ret;
fbe740
-    if (VIR_ALLOC_N(info_ret, nfs) < 0)
fbe740
-        goto cleanup;
fbe740
-
fbe740
-    for (i = 0; i < nfs; i++) {
fbe740
-        if (!(info_ret[i] = qemuAgentFSInfoToPublic(agentinfo[i], vmdef)))
fbe740
-            goto cleanup;
fbe740
-    }
fbe740
-
fbe740
-    *info = g_steal_pointer(&info_ret);
fbe740
-    ret = nfs;
fbe740
-
fbe740
- cleanup:
fbe740
-    for (i = 0; i < nfs; i++) {
fbe740
-        qemuAgentFSInfoFree(agentinfo[i]);
fbe740
-        /* if there was an error, free any memory we've allocated for the
fbe740
-         * return value */
fbe740
-        if (info_ret)
fbe740
-            virDomainFSInfoFree(info_ret[i]);
fbe740
-    }
fbe740
-    VIR_FREE(agentinfo);
fbe740
-    VIR_FREE(info_ret);
fbe740
-    return ret;
fbe740
-}
fbe740
-
fbe740
-/* Returns: 0 on success
fbe740
- *          -2 when agent command is not supported by the agent
fbe740
- *          -1 otherwise
fbe740
- */
fbe740
-int
fbe740
-qemuAgentGetFSInfoParams(qemuAgentPtr mon,
fbe740
-                         virTypedParameterPtr *params,
fbe740
-                         int *nparams, int *maxparams,
fbe740
-                         virDomainDefPtr vmdef)
fbe740
-{
fbe740
-    int ret = -1;
fbe740
-    qemuAgentFSInfoPtr *fsinfo = NULL;
fbe740
-    size_t i, j;
fbe740
-    int nfs;
fbe740
-
fbe740
-    if ((nfs = qemuAgentGetFSInfoInternal(mon, &fsinfo)) < 0)
fbe740
-        return nfs;
fbe740
-
fbe740
-    if (virTypedParamsAddUInt(params, nparams, maxparams,
fbe740
-                              "fs.count", nfs) < 0)
fbe740
-        goto cleanup;
fbe740
-
fbe740
-    for (i = 0; i < nfs; i++) {
fbe740
-        char param_name[VIR_TYPED_PARAM_FIELD_LENGTH];
fbe740
-        g_snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
fbe740
-                   "fs.%zu.name", i);
fbe740
-        if (virTypedParamsAddString(params, nparams, maxparams,
fbe740
-                                    param_name, fsinfo[i]->name) < 0)
fbe740
-            goto cleanup;
fbe740
-        g_snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
fbe740
-                   "fs.%zu.mountpoint", i);
fbe740
-        if (virTypedParamsAddString(params, nparams, maxparams,
fbe740
-                                    param_name, fsinfo[i]->mountpoint) < 0)
fbe740
-            goto cleanup;
fbe740
-        g_snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
fbe740
-                   "fs.%zu.fstype", i);
fbe740
-        if (virTypedParamsAddString(params, nparams, maxparams,
fbe740
-                                    param_name, fsinfo[i]->fstype) < 0)
fbe740
-            goto cleanup;
fbe740
-
fbe740
-        /* disk usage values are not returned by older guest agents, so
fbe740
-         * only add the params if the value is set */
fbe740
-        g_snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
fbe740
-                   "fs.%zu.total-bytes", i);
fbe740
-        if (fsinfo[i]->total_bytes != -1 &&
fbe740
-            virTypedParamsAddULLong(params, nparams, maxparams,
fbe740
-                                    param_name, fsinfo[i]->total_bytes) < 0)
fbe740
-            goto cleanup;
fbe740
-
fbe740
-        g_snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
fbe740
-                   "fs.%zu.used-bytes", i);
fbe740
-        if (fsinfo[i]->used_bytes != -1 &&
fbe740
-            virTypedParamsAddULLong(params, nparams, maxparams,
fbe740
-                                    param_name, fsinfo[i]->used_bytes) < 0)
fbe740
-            goto cleanup;
fbe740
-
fbe740
-        g_snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
fbe740
-                   "fs.%zu.disk.count", i);
fbe740
-        if (virTypedParamsAddUInt(params, nparams, maxparams,
fbe740
-                                  param_name, fsinfo[i]->ndisks) < 0)
fbe740
-            goto cleanup;
fbe740
-        for (j = 0; j < fsinfo[i]->ndisks; j++) {
fbe740
-            virDomainDiskDefPtr diskdef = NULL;
fbe740
-            qemuAgentDiskInfoPtr d = fsinfo[i]->disks[j];
fbe740
-            /* match the disk to the target in the vm definition */
fbe740
-            diskdef = virDomainDiskByAddress(vmdef,
fbe740
-                                             &d->pci_controller,
fbe740
-                                             d->bus,
fbe740
-                                             d->target,
fbe740
-                                             d->unit);
fbe740
-            if (diskdef) {
fbe740
-                g_snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
fbe740
-                           "fs.%zu.disk.%zu.alias", i, j);
fbe740
-                if (diskdef->dst &&
fbe740
-                    virTypedParamsAddString(params, nparams, maxparams,
fbe740
-                                            param_name, diskdef->dst) < 0)
fbe740
-                    goto cleanup;
fbe740
-            }
fbe740
-
fbe740
-            g_snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
fbe740
-                       "fs.%zu.disk.%zu.serial", i, j);
fbe740
-            if (d->serial &&
fbe740
-                virTypedParamsAddString(params, nparams, maxparams,
fbe740
-                                        param_name, d->serial) < 0)
fbe740
-                goto cleanup;
fbe740
-
fbe740
-            g_snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
fbe740
-                       "fs.%zu.disk.%zu.device", i, j);
fbe740
-            if (d->devnode &&
fbe740
-                virTypedParamsAddString(params, nparams, maxparams,
fbe740
-                                        param_name, d->devnode) < 0)
fbe740
-                goto cleanup;
fbe740
-        }
fbe740
-    }
fbe740
-    ret = nfs;
fbe740
-
fbe740
- cleanup:
fbe740
-    for (i = 0; i < nfs; i++)
fbe740
-        qemuAgentFSInfoFree(fsinfo[i]);
fbe740
-    VIR_FREE(fsinfo);
fbe740
-
fbe740
-    return ret;
fbe740
-}
fbe740
-
fbe740
 /*
fbe740
  * qemuAgentGetInterfaces:
fbe740
  * @mon: Agent monitor
fbe740
diff --git a/src/qemu/qemu_agent.h b/src/qemu/qemu_agent.h
fbe740
index 85e436cf68..5656fe60ff 100644
fbe740
--- a/src/qemu/qemu_agent.h
fbe740
+++ b/src/qemu/qemu_agent.h
fbe740
@@ -65,19 +65,38 @@ typedef enum {
fbe740
     QEMU_AGENT_SHUTDOWN_LAST,
fbe740
 } qemuAgentShutdownMode;
fbe740
 
fbe740
+typedef struct _qemuAgentDiskInfo qemuAgentDiskInfo;
fbe740
+typedef qemuAgentDiskInfo *qemuAgentDiskInfoPtr;
fbe740
+struct _qemuAgentDiskInfo {
fbe740
+    char *serial;
fbe740
+    virPCIDeviceAddress pci_controller;
fbe740
+    char *bus_type;
fbe740
+    unsigned int bus;
fbe740
+    unsigned int target;
fbe740
+    unsigned int unit;
fbe740
+    char *devnode;
fbe740
+};
fbe740
+
fbe740
+typedef struct _qemuAgentFSInfo qemuAgentFSInfo;
fbe740
+typedef qemuAgentFSInfo *qemuAgentFSInfoPtr;
fbe740
+struct _qemuAgentFSInfo {
fbe740
+    char *mountpoint; /* path to mount point */
fbe740
+    char *name;       /* device name in the guest (e.g. "sda1") */
fbe740
+    char *fstype;     /* filesystem type */
fbe740
+    long long total_bytes;
fbe740
+    long long used_bytes;
fbe740
+    size_t ndisks;
fbe740
+    qemuAgentDiskInfoPtr *disks;
fbe740
+};
fbe740
+void qemuAgentFSInfoFree(qemuAgentFSInfoPtr info);
fbe740
+
fbe740
 int qemuAgentShutdown(qemuAgentPtr mon,
fbe740
                       qemuAgentShutdownMode mode);
fbe740
 
fbe740
 int qemuAgentFSFreeze(qemuAgentPtr mon,
fbe740
                       const char **mountpoints, unsigned int nmountpoints);
fbe740
 int qemuAgentFSThaw(qemuAgentPtr mon);
fbe740
-int qemuAgentGetFSInfo(qemuAgentPtr mon, virDomainFSInfoPtr **info,
fbe740
-                       virDomainDefPtr vmdef);
fbe740
-
fbe740
-int qemuAgentGetFSInfoParams(qemuAgentPtr mon,
fbe740
-                             virTypedParameterPtr *params,
fbe740
-                             int *nparams, int *maxparams,
fbe740
-                             virDomainDefPtr vmdef);
fbe740
+int qemuAgentGetFSInfo(qemuAgentPtr mon, qemuAgentFSInfoPtr **info);
fbe740
 
fbe740
 int qemuAgentSuspend(qemuAgentPtr mon,
fbe740
                      unsigned int target);
fbe740
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
fbe740
index 69e4f7264b..ac3a7ad282 100644
fbe740
--- a/src/qemu/qemu_driver.c
fbe740
+++ b/src/qemu/qemu_driver.c
fbe740
@@ -21839,6 +21839,111 @@ qemuNodeAllocPages(virConnectPtr conn,
fbe740
                                 startCell, cellCount, add);
fbe740
 }
fbe740
 
fbe740
+static int
fbe740
+qemuDomainGetFSInfoAgent(virQEMUDriverPtr driver,
fbe740
+                         virDomainObjPtr vm,
fbe740
+                         qemuAgentFSInfoPtr **info)
fbe740
+{
fbe740
+    int ret = -1;
fbe740
+    qemuAgentPtr agent;
fbe740
+
fbe740
+    if (qemuDomainObjBeginAgentJob(driver, vm,
fbe740
+                                   QEMU_AGENT_JOB_QUERY) < 0)
fbe740
+        return ret;
fbe740
+
fbe740
+    if (virDomainObjCheckActive(vm) < 0)
fbe740
+        goto endjob;
fbe740
+
fbe740
+    if (!qemuDomainAgentAvailable(vm, true))
fbe740
+        goto endjob;
fbe740
+
fbe740
+    agent = qemuDomainObjEnterAgent(vm);
fbe740
+    ret = qemuAgentGetFSInfo(agent, info);
fbe740
+    qemuDomainObjExitAgent(vm, agent);
fbe740
+
fbe740
+ endjob:
fbe740
+    qemuDomainObjEndAgentJob(vm);
fbe740
+    return ret;
fbe740
+}
fbe740
+
fbe740
+static virDomainFSInfoPtr
fbe740
+qemuAgentFSInfoToPublic(qemuAgentFSInfoPtr agent,
fbe740
+                        virDomainDefPtr vmdef)
fbe740
+{
fbe740
+    virDomainFSInfoPtr ret = NULL;
fbe740
+    size_t i;
fbe740
+
fbe740
+    if (VIR_ALLOC(ret) < 0)
fbe740
+        goto error;
fbe740
+
fbe740
+    ret->mountpoint = g_strdup(agent->mountpoint);
fbe740
+    ret->name = g_strdup(agent->name);
fbe740
+    ret->fstype = g_strdup(agent->fstype);
fbe740
+
fbe740
+    if (agent->disks &&
fbe740
+        VIR_ALLOC_N(ret->devAlias, agent->ndisks) < 0)
fbe740
+        goto error;
fbe740
+
fbe740
+    ret->ndevAlias = agent->ndisks;
fbe740
+
fbe740
+    for (i = 0; i < ret->ndevAlias; i++) {
fbe740
+        qemuAgentDiskInfoPtr agentdisk = agent->disks[i];
fbe740
+        virDomainDiskDefPtr diskDef;
fbe740
+
fbe740
+        if (!(diskDef = virDomainDiskByAddress(vmdef,
fbe740
+                                               &agentdisk->pci_controller,
fbe740
+                                               agentdisk->bus,
fbe740
+                                               agentdisk->target,
fbe740
+                                               agentdisk->unit)))
fbe740
+            continue;
fbe740
+
fbe740
+        ret->devAlias[i] = g_strdup(diskDef->dst);
fbe740
+    }
fbe740
+
fbe740
+    return ret;
fbe740
+
fbe740
+ error:
fbe740
+    virDomainFSInfoFree(ret);
fbe740
+    return NULL;
fbe740
+}
fbe740
+
fbe740
+/* Returns: 0 on success
fbe740
+ *          -1 otherwise
fbe740
+ */
fbe740
+static int
fbe740
+virDomainFSInfoFormat(qemuAgentFSInfoPtr *agentinfo,
fbe740
+                      int nagentinfo,
fbe740
+                      virDomainDefPtr vmdef,
fbe740
+                      virDomainFSInfoPtr **info)
fbe740
+{
fbe740
+    int ret = -1;
fbe740
+    virDomainFSInfoPtr *info_ret = NULL;
fbe740
+    size_t i;
fbe740
+
fbe740
+    if (nagentinfo < 0)
fbe740
+        return ret;
fbe740
+    if (VIR_ALLOC_N(info_ret, nagentinfo) < 0)
fbe740
+        goto cleanup;
fbe740
+
fbe740
+    for (i = 0; i < nagentinfo; i++) {
fbe740
+        if (!(info_ret[i] = qemuAgentFSInfoToPublic(agentinfo[i], vmdef)))
fbe740
+            goto cleanup;
fbe740
+    }
fbe740
+
fbe740
+    *info = g_steal_pointer(&info_ret);
fbe740
+    ret = nagentinfo;
fbe740
+
fbe740
+ cleanup:
fbe740
+    for (i = 0; i < nagentinfo; i++) {
fbe740
+        qemuAgentFSInfoFree(agentinfo[i]);
fbe740
+        /* if there was an error, free any memory we've allocated for the
fbe740
+         * return value */
fbe740
+        if (info_ret)
fbe740
+            virDomainFSInfoFree(info_ret[i]);
fbe740
+    }
fbe740
+    VIR_FREE(info_ret);
fbe740
+    return ret;
fbe740
+}
fbe740
 
fbe740
 static int
fbe740
 qemuDomainGetFSInfo(virDomainPtr dom,
fbe740
@@ -21847,8 +21952,9 @@ qemuDomainGetFSInfo(virDomainPtr dom,
fbe740
 {
fbe740
     virQEMUDriverPtr driver = dom->conn->privateData;
fbe740
     virDomainObjPtr vm;
fbe740
-    qemuAgentPtr agent;
fbe740
+    qemuAgentFSInfoPtr *agentinfo = NULL;
fbe740
     int ret = -1;
fbe740
+    int nfs;
fbe740
 
fbe740
     virCheckFlags(0, ret);
fbe740
 
fbe740
@@ -21858,25 +21964,22 @@ qemuDomainGetFSInfo(virDomainPtr dom,
fbe740
     if (virDomainGetFSInfoEnsureACL(dom->conn, vm->def) < 0)
fbe740
         goto cleanup;
fbe740
 
fbe740
-    if (qemuDomainObjBeginJobWithAgent(driver, vm,
fbe740
-                                       QEMU_JOB_QUERY,
fbe740
-                                       QEMU_AGENT_JOB_QUERY) < 0)
fbe740
+    if ((nfs = qemuDomainGetFSInfoAgent(driver, vm, &agentinfo)) < 0)
fbe740
+        goto cleanup;
fbe740
+
fbe740
+    if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0)
fbe740
         goto cleanup;
fbe740
 
fbe740
     if (virDomainObjCheckActive(vm) < 0)
fbe740
         goto endjob;
fbe740
 
fbe740
-    if (!qemuDomainAgentAvailable(vm, true))
fbe740
-        goto endjob;
fbe740
-
fbe740
-    agent = qemuDomainObjEnterAgent(vm);
fbe740
-    ret = qemuAgentGetFSInfo(agent, info, vm->def);
fbe740
-    qemuDomainObjExitAgent(vm, agent);
fbe740
+    ret = virDomainFSInfoFormat(agentinfo, nfs, vm->def, info);
fbe740
 
fbe740
  endjob:
fbe740
-    qemuDomainObjEndJobWithAgent(driver, vm);
fbe740
+    qemuDomainObjEndJob(driver, vm);
fbe740
 
fbe740
  cleanup:
fbe740
+    g_free(agentinfo);
fbe740
     virDomainObjEndAPI(&vm;;
fbe740
     return ret;
fbe740
 }
fbe740
@@ -22882,6 +22985,103 @@ qemuDomainGetGuestInfoCheckSupport(unsigned int *types)
fbe740
     *types = *types & supportedGuestInfoTypes;
fbe740
 }
fbe740
 
fbe740
+/* Returns: 0 on success
fbe740
+ *          -1 otherwise
fbe740
+ */
fbe740
+static int
fbe740
+qemuAgentFSInfoFormatParams(qemuAgentFSInfoPtr *fsinfo,
fbe740
+                            int nfs,
fbe740
+                            virDomainDefPtr vmdef,
fbe740
+                            virTypedParameterPtr *params,
fbe740
+                            int *nparams, int *maxparams)
fbe740
+{
fbe740
+    int ret = -1;
fbe740
+    size_t i, j;
fbe740
+
fbe740
+    /* FIXME: get disk target */
fbe740
+
fbe740
+    if (virTypedParamsAddUInt(params, nparams, maxparams,
fbe740
+                              "fs.count", nfs) < 0)
fbe740
+        goto cleanup;
fbe740
+
fbe740
+    for (i = 0; i < nfs; i++) {
fbe740
+        char param_name[VIR_TYPED_PARAM_FIELD_LENGTH];
fbe740
+        g_snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
fbe740
+                   "fs.%zu.name", i);
fbe740
+        if (virTypedParamsAddString(params, nparams, maxparams,
fbe740
+                                    param_name, fsinfo[i]->name) < 0)
fbe740
+            goto cleanup;
fbe740
+        g_snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
fbe740
+                   "fs.%zu.mountpoint", i);
fbe740
+        if (virTypedParamsAddString(params, nparams, maxparams,
fbe740
+                                    param_name, fsinfo[i]->mountpoint) < 0)
fbe740
+            goto cleanup;
fbe740
+        g_snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
fbe740
+                   "fs.%zu.fstype", i);
fbe740
+        if (virTypedParamsAddString(params, nparams, maxparams,
fbe740
+                                    param_name, fsinfo[i]->fstype) < 0)
fbe740
+            goto cleanup;
fbe740
+
fbe740
+        /* disk usage values are not returned by older guest agents, so
fbe740
+         * only add the params if the value is set */
fbe740
+        g_snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
fbe740
+                   "fs.%zu.total-bytes", i);
fbe740
+        if (fsinfo[i]->total_bytes != -1 &&
fbe740
+            virTypedParamsAddULLong(params, nparams, maxparams,
fbe740
+                                    param_name, fsinfo[i]->total_bytes) < 0)
fbe740
+            goto cleanup;
fbe740
+
fbe740
+        g_snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
fbe740
+                   "fs.%zu.used-bytes", i);
fbe740
+        if (fsinfo[i]->used_bytes != -1 &&
fbe740
+            virTypedParamsAddULLong(params, nparams, maxparams,
fbe740
+                                    param_name, fsinfo[i]->used_bytes) < 0)
fbe740
+            goto cleanup;
fbe740
+
fbe740
+        g_snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
fbe740
+                   "fs.%zu.disk.count", i);
fbe740
+        if (virTypedParamsAddUInt(params, nparams, maxparams,
fbe740
+                                  param_name, fsinfo[i]->ndisks) < 0)
fbe740
+            goto cleanup;
fbe740
+        for (j = 0; j < fsinfo[i]->ndisks; j++) {
fbe740
+            virDomainDiskDefPtr diskdef = NULL;
fbe740
+            qemuAgentDiskInfoPtr d = fsinfo[i]->disks[j];
fbe740
+            /* match the disk to the target in the vm definition */
fbe740
+            diskdef = virDomainDiskByAddress(vmdef,
fbe740
+                                             &d->pci_controller,
fbe740
+                                             d->bus,
fbe740
+                                             d->target,
fbe740
+                                             d->unit);
fbe740
+            if (diskdef) {
fbe740
+                g_snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
fbe740
+                           "fs.%zu.disk.%zu.alias", i, j);
fbe740
+                if (diskdef->dst &&
fbe740
+                    virTypedParamsAddString(params, nparams, maxparams,
fbe740
+                                            param_name, diskdef->dst) < 0)
fbe740
+                    goto cleanup;
fbe740
+            }
fbe740
+
fbe740
+            g_snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
fbe740
+                       "fs.%zu.disk.%zu.serial", i, j);
fbe740
+            if (d->serial &&
fbe740
+                virTypedParamsAddString(params, nparams, maxparams,
fbe740
+                                        param_name, d->serial) < 0)
fbe740
+                goto cleanup;
fbe740
+
fbe740
+            g_snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
fbe740
+                       "fs.%zu.disk.%zu.device", i, j);
fbe740
+            if (d->devnode &&
fbe740
+                virTypedParamsAddString(params, nparams, maxparams,
fbe740
+                                        param_name, d->devnode) < 0)
fbe740
+                goto cleanup;
fbe740
+        }
fbe740
+    }
fbe740
+    ret = nfs;
fbe740
+
fbe740
+ cleanup:
fbe740
+    return ret;
fbe740
+}
fbe740
+
fbe740
 static int
fbe740
 qemuDomainGetGuestInfo(virDomainPtr dom,
fbe740
                        unsigned int types,
fbe740
@@ -22897,6 +23097,9 @@ qemuDomainGetGuestInfo(virDomainPtr dom,
fbe740
     g_autofree char *hostname = NULL;
fbe740
     unsigned int supportedTypes = types;
fbe740
     int rc;
fbe740
+    int nfs = 0;
fbe740
+    qemuAgentFSInfoPtr *agentfsinfo = NULL;
fbe740
+    size_t i;
fbe740
 
fbe740
     virCheckFlags(0, -1);
fbe740
     qemuDomainGetGuestInfoCheckSupport(&supportedTypes);
fbe740
@@ -22907,13 +23110,12 @@ qemuDomainGetGuestInfo(virDomainPtr dom,
fbe740
     if (virDomainGetGuestInfoEnsureACL(dom->conn, vm->def) < 0)
fbe740
         goto cleanup;
fbe740
 
fbe740
-    if (qemuDomainObjBeginJobWithAgent(driver, vm,
fbe740
-                                       QEMU_JOB_QUERY,
fbe740
-                                       QEMU_AGENT_JOB_QUERY) < 0)
fbe740
+    if (qemuDomainObjBeginAgentJob(driver, vm,
fbe740
+                                   QEMU_AGENT_JOB_QUERY) < 0)
fbe740
         goto cleanup;
fbe740
 
fbe740
     if (!qemuDomainAgentAvailable(vm, true))
fbe740
-        goto endjob;
fbe740
+        goto endagentjob;
fbe740
 
fbe740
     agent = qemuDomainObjEnterAgent(vm);
fbe740
 
fbe740
@@ -22948,7 +23150,7 @@ qemuDomainGetGuestInfo(virDomainPtr dom,
fbe740
         }
fbe740
     }
fbe740
     if (supportedTypes & VIR_DOMAIN_GUEST_INFO_FILESYSTEM) {
fbe740
-        rc = qemuAgentGetFSInfoParams(agent, params, nparams, &maxparams, vm->def);
fbe740
+        rc = nfs = qemuAgentGetFSInfo(agent, &agentfsinfo);
fbe740
         if (rc < 0 && !(rc == -2 && types == 0))
fbe740
             goto exitagent;
fbe740
     }
fbe740
@@ -22958,10 +23160,29 @@ qemuDomainGetGuestInfo(virDomainPtr dom,
fbe740
  exitagent:
fbe740
     qemuDomainObjExitAgent(vm, agent);
fbe740
 
fbe740
+ endagentjob:
fbe740
+    qemuDomainObjEndAgentJob(vm);
fbe740
+
fbe740
+    if (nfs > 0) {
fbe740
+        if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0)
fbe740
+            goto cleanup;
fbe740
+
fbe740
+        if (virDomainObjCheckActive(vm) < 0)
fbe740
+            goto endjob;
fbe740
+
fbe740
+        /* we need to convert the agent fsinfo struct to parameters and match
fbe740
+         * it to the vm disk target */
fbe740
+        qemuAgentFSInfoFormatParams(agentfsinfo, nfs, vm->def, params, nparams, &maxparams);
fbe740
+
fbe740
  endjob:
fbe740
-    qemuDomainObjEndJobWithAgent(driver, vm);
fbe740
+        qemuDomainObjEndJob(driver, vm);
fbe740
+    }
fbe740
 
fbe740
  cleanup:
fbe740
+    for (i = 0; i < nfs; i++)
fbe740
+        qemuAgentFSInfoFree(agentfsinfo[i]);
fbe740
+    VIR_FREE(agentfsinfo);
fbe740
+
fbe740
     virDomainObjEndAPI(&vm;;
fbe740
     return ret;
fbe740
 }
fbe740
diff --git a/tests/qemuagenttest.c b/tests/qemuagenttest.c
fbe740
index 644dc9d08b..a45ce4f44a 100644
fbe740
--- a/tests/qemuagenttest.c
fbe740
+++ b/tests/qemuagenttest.c
fbe740
@@ -247,14 +247,14 @@ testQemuAgentGetFSInfo(const void *data)
fbe740
     virDomainXMLOptionPtr xmlopt = (virDomainXMLOptionPtr)data;
fbe740
     qemuMonitorTestPtr test = NULL;
fbe740
     virDomainDefPtr def = NULL;
fbe740
-    virDomainFSInfoPtr *info = NULL;
fbe740
+    qemuAgentFSInfoPtr *info = NULL;
fbe740
     int ret = -1, ninfo = 0, i;
fbe740
 
fbe740
     if (testQemuAgentGetFSInfoCommon(xmlopt, &test, &def) < 0)
fbe740
         goto cleanup;
fbe740
 
fbe740
     if ((ninfo = qemuAgentGetFSInfo(qemuMonitorTestGetAgent(test),
fbe740
-                                    &info, def)) < 0)
fbe740
+                                    &info)) < 0)
fbe740
         goto cleanup;
fbe740
 
fbe740
     if (ninfo != 3) {
fbe740
@@ -266,35 +266,48 @@ testQemuAgentGetFSInfo(const void *data)
fbe740
     if (STRNEQ(info[2]->name, "sda1") ||
fbe740
         STRNEQ(info[2]->mountpoint, "/") ||
fbe740
         STRNEQ(info[2]->fstype, "ext4") ||
fbe740
-        info[2]->ndevAlias != 1 ||
fbe740
-        !info[2]->devAlias || !info[2]->devAlias[0] ||
fbe740
-        STRNEQ(info[2]->devAlias[0], "hdc")) {
fbe740
+        info[2]->ndisks != 1 ||
fbe740
+        !info[2]->disks || !info[2]->disks[0]) {
fbe740
         virReportError(VIR_ERR_INTERNAL_ERROR,
fbe740
-            "unexpected filesystems information returned for sda1 (%s,%s)",
fbe740
-            info[2]->name, info[2]->devAlias ? info[2]->devAlias[0] : "null");
fbe740
+            "unexpected filesystems information returned for sda1 (%s)",
fbe740
+            info[2]->name);
fbe740
         ret = -1;
fbe740
         goto cleanup;
fbe740
     }
fbe740
     if (STRNEQ(info[1]->name, "dm-1") ||
fbe740
         STRNEQ(info[1]->mountpoint, "/opt") ||
fbe740
         STRNEQ(info[1]->fstype, "vfat") ||
fbe740
-        info[1]->ndevAlias != 2 ||
fbe740
-        !info[1]->devAlias || !info[1]->devAlias[0] || !info[1]->devAlias[1] ||
fbe740
-        STRNEQ(info[1]->devAlias[0], "vda") ||
fbe740
-        STRNEQ(info[1]->devAlias[1], "vdb")) {
fbe740
+        info[1]->ndisks != 2 ||
fbe740
+        !info[1]->disks || !info[1]->disks[0] || !info[1]->disks[1] ||
fbe740
+        STRNEQ(info[1]->disks[0]->bus_type, "virtio") ||
fbe740
+        info[1]->disks[0]->bus != 0 ||
fbe740
+        info[1]->disks[0]->target != 0 ||
fbe740
+        info[1]->disks[0]->unit != 0 ||
fbe740
+        info[1]->disks[0]->pci_controller.domain != 0 ||
fbe740
+        info[1]->disks[0]->pci_controller.bus != 0 ||
fbe740
+        info[1]->disks[0]->pci_controller.slot != 6 ||
fbe740
+        info[1]->disks[0]->pci_controller.function != 0 ||
fbe740
+        STRNEQ(info[1]->disks[1]->bus_type, "virtio") ||
fbe740
+        info[1]->disks[1]->bus != 0 ||
fbe740
+        info[1]->disks[1]->target != 0 ||
fbe740
+        info[1]->disks[1]->unit != 0 ||
fbe740
+        info[1]->disks[1]->pci_controller.domain != 0 ||
fbe740
+        info[1]->disks[1]->pci_controller.bus != 0 ||
fbe740
+        info[1]->disks[1]->pci_controller.slot != 7 ||
fbe740
+        info[1]->disks[1]->pci_controller.function != 0) {
fbe740
         virReportError(VIR_ERR_INTERNAL_ERROR,
fbe740
-            "unexpected filesystems information returned for dm-1 (%s,%s)",
fbe740
-            info[0]->name, info[0]->devAlias ? info[0]->devAlias[0] : "null");
fbe740
+            "unexpected filesystems information returned for dm-1 (%s)",
fbe740
+            info[0]->name);
fbe740
         ret = -1;
fbe740
         goto cleanup;
fbe740
     }
fbe740
     if (STRNEQ(info[0]->name, "sdb1") ||
fbe740
         STRNEQ(info[0]->mountpoint, "/mnt/disk") ||
fbe740
         STRNEQ(info[0]->fstype, "xfs") ||
fbe740
-        info[0]->ndevAlias != 0 || info[0]->devAlias) {
fbe740
+        info[0]->ndisks != 0 || info[0]->disks) {
fbe740
         virReportError(VIR_ERR_INTERNAL_ERROR,
fbe740
-            "unexpected filesystems information returned for sdb1 (%s,%s)",
fbe740
-            info[0]->name, info[0]->devAlias ? info[0]->devAlias[0] : "null");
fbe740
+            "unexpected filesystems information returned for sdb1 (%s)",
fbe740
+            info[0]->name);
fbe740
         ret = -1;
fbe740
         goto cleanup;
fbe740
     }
fbe740
@@ -313,7 +326,7 @@ testQemuAgentGetFSInfo(const void *data)
fbe740
                                "}") < 0)
fbe740
         goto cleanup;
fbe740
 
fbe740
-    if (qemuAgentGetFSInfo(qemuMonitorTestGetAgent(test), &info, def) != -1) {
fbe740
+    if (qemuAgentGetFSInfo(qemuMonitorTestGetAgent(test), &info) >= 0) {
fbe740
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
fbe740
                        "agent get-fsinfo command should have failed");
fbe740
         goto cleanup;
fbe740
@@ -323,159 +336,13 @@ testQemuAgentGetFSInfo(const void *data)
fbe740
 
fbe740
  cleanup:
fbe740
     for (i = 0; i < ninfo; i++)
fbe740
-        virDomainFSInfoFree(info[i]);
fbe740
+        qemuAgentFSInfoFree(info[i]);
fbe740
     VIR_FREE(info);
fbe740
     virDomainDefFree(def);
fbe740
     qemuMonitorTestFree(test);
fbe740
     return ret;
fbe740
 }
fbe740
 
fbe740
-static int
fbe740
-testQemuAgentGetFSInfoParams(const void *data)
fbe740
-{
fbe740
-    virDomainXMLOptionPtr xmlopt = (virDomainXMLOptionPtr)data;
fbe740
-    qemuMonitorTestPtr test = NULL;
fbe740
-    virDomainDefPtr def = NULL;
fbe740
-    virTypedParameterPtr params = NULL;
fbe740
-    int nparams = 0, maxparams = 0;
fbe740
-    int ret = -1;
fbe740
-    unsigned int count;
fbe740
-    const char *name, *mountpoint, *fstype, *alias, *serial;
fbe740
-    unsigned int diskcount;
fbe740
-    unsigned long long bytesused, bytestotal;
fbe740
-    const char *alias2;
fbe740
-
fbe740
-    if (testQemuAgentGetFSInfoCommon(xmlopt, &test, &def) < 0)
fbe740
-        goto cleanup;
fbe740
-
fbe740
-    if (qemuAgentGetFSInfoParams(qemuMonitorTestGetAgent(test),
fbe740
-                                 &params, &nparams, &maxparams, def) < 0) {
fbe740
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
fbe740
-                       "Failed to execute qemuAgentGetFSInfoParams()");
fbe740
-        goto cleanup;
fbe740
-    }
fbe740
-
fbe740
-    if (virTypedParamsGetUInt(params, nparams, "fs.count", &count) < 0) {
fbe740
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
fbe740
-                       "expected filesystem count");
fbe740
-        goto cleanup;
fbe740
-    }
fbe740
-
fbe740
-    if (count != 3) {
fbe740
-        virReportError(VIR_ERR_INTERNAL_ERROR,
fbe740
-                       "expected 3 filesystems information, got %d", count);
fbe740
-        goto cleanup;
fbe740
-    }
fbe740
-
fbe740
-    if (virTypedParamsGetString(params, nparams, "fs.2.name", &name) < 0 ||
fbe740
-        virTypedParamsGetString(params, nparams, "fs.2.mountpoint", &mountpoint) < 0 ||
fbe740
-        virTypedParamsGetString(params, nparams, "fs.2.fstype", &fstype) < 0 ||
fbe740
-        virTypedParamsGetULLong(params, nparams, "fs.2.used-bytes", &bytesused) <= 0 ||
fbe740
-        virTypedParamsGetULLong(params, nparams, "fs.2.total-bytes", &bytestotal) <= 0 ||
fbe740
-        virTypedParamsGetUInt(params, nparams, "fs.2.disk.count", &diskcount) < 0 ||
fbe740
-        virTypedParamsGetString(params, nparams, "fs.2.disk.0.alias", &alias) < 0 ||
fbe740
-        virTypedParamsGetString(params, nparams, "fs.2.disk.0.serial", &serial) < 0) {
fbe740
-        virReportError(VIR_ERR_INTERNAL_ERROR,
fbe740
-            "Missing an expected parameter for sda1 (%s,%s)",
fbe740
-            name, alias);
fbe740
-        goto cleanup;
fbe740
-    }
fbe740
-
fbe740
-    if (STRNEQ(name, "sda1") ||
fbe740
-        STRNEQ(mountpoint, "/") ||
fbe740
-        STRNEQ(fstype, "ext4") ||
fbe740
-        bytesused != 229019648 ||
fbe740
-        bytestotal != 952840192 ||
fbe740
-        diskcount != 1 ||
fbe740
-        STRNEQ(alias, "hdc") ||
fbe740
-        STRNEQ(serial, "ARBITRARYSTRING")) {
fbe740
-        virReportError(VIR_ERR_INTERNAL_ERROR,
fbe740
-            "unexpected filesystems information returned for sda1 (%s,%s)",
fbe740
-            name, alias);
fbe740
-        goto cleanup;
fbe740
-    }
fbe740
-
fbe740
-    if (virTypedParamsGetString(params, nparams, "fs.1.name", &name) < 0 ||
fbe740
-        virTypedParamsGetString(params, nparams, "fs.1.mountpoint", &mountpoint) < 0 ||
fbe740
-        virTypedParamsGetString(params, nparams, "fs.1.fstype", &fstype) < 0 ||
fbe740
-        virTypedParamsGetULLong(params, nparams, "fs.1.used-bytes", &bytesused) == 1 ||
fbe740
-        virTypedParamsGetULLong(params, nparams, "fs.1.total-bytes", &bytestotal) == 1 ||
fbe740
-        virTypedParamsGetUInt(params, nparams, "fs.1.disk.count", &diskcount) < 0 ||
fbe740
-        virTypedParamsGetString(params, nparams, "fs.1.disk.0.alias", &alias) < 0 ||
fbe740
-        virTypedParamsGetString(params, nparams, "fs.1.disk.1.alias", &alias2) < 0) {
fbe740
-        virReportError(VIR_ERR_INTERNAL_ERROR,
fbe740
-            "Incorrect parameters for dm-1 (%s,%s)",
fbe740
-            name, alias);
fbe740
-        goto cleanup;
fbe740
-    }
fbe740
-    if (STRNEQ(name, "dm-1") ||
fbe740
-        STRNEQ(mountpoint, "/opt") ||
fbe740
-        STRNEQ(fstype, "vfat") ||
fbe740
-        diskcount != 2 ||
fbe740
-        STRNEQ(alias, "vda") ||
fbe740
-        STRNEQ(alias2, "vdb")) {
fbe740
-        virReportError(VIR_ERR_INTERNAL_ERROR,
fbe740
-            "unexpected filesystems information returned for dm-1 (%s,%s)",
fbe740
-            name, alias);
fbe740
-        goto cleanup;
fbe740
-    }
fbe740
-
fbe740
-    alias = NULL;
fbe740
-    if (virTypedParamsGetString(params, nparams, "fs.0.name", &name) < 0 ||
fbe740
-        virTypedParamsGetString(params, nparams, "fs.0.mountpoint", &mountpoint) < 0 ||
fbe740
-        virTypedParamsGetString(params, nparams, "fs.0.fstype", &fstype) < 0 ||
fbe740
-        virTypedParamsGetULLong(params, nparams, "fs.0.used-bytes", &bytesused) == 1 ||
fbe740
-        virTypedParamsGetULLong(params, nparams, "fs.0.total-bytes", &bytestotal) == 1 ||
fbe740
-        virTypedParamsGetUInt(params, nparams, "fs.0.disk.count", &diskcount) < 0 ||
fbe740
-        virTypedParamsGetString(params, nparams, "fs.0.disk.0.alias", &alias) == 1) {
fbe740
-        virReportError(VIR_ERR_INTERNAL_ERROR,
fbe740
-            "Incorrect parameters for sdb1 (%s,%s)",
fbe740
-            name, alias);
fbe740
-        goto cleanup;
fbe740
-    }
fbe740
-
fbe740
-    if (STRNEQ(name, "sdb1") ||
fbe740
-        STRNEQ(mountpoint, "/mnt/disk") ||
fbe740
-        STRNEQ(fstype, "xfs") ||
fbe740
-        diskcount != 0 ||
fbe740
-        alias != NULL) {
fbe740
-        virReportError(VIR_ERR_INTERNAL_ERROR,
fbe740
-            "unexpected filesystems information returned for sdb1 (%s,%s)",
fbe740
-            name, alias);
fbe740
-        goto cleanup;
fbe740
-    }
fbe740
-
fbe740
-    if (qemuMonitorTestAddAgentSyncResponse(test) < 0)
fbe740
-        goto cleanup;
fbe740
-
fbe740
-    if (qemuMonitorTestAddItem(test, "guest-get-fsinfo",
fbe740
-                               "{\"error\":"
fbe740
-                               "    {\"class\":\"CommandDisabled\","
fbe740
-                               "     \"desc\":\"The command guest-get-fsinfo "
fbe740
-                                               "has been disabled for "
fbe740
-                                               "this instance\","
fbe740
-                               "     \"data\":{\"name\":\"guest-get-fsinfo\"}"
fbe740
-                               "    }"
fbe740
-                               "}") < 0)
fbe740
-        goto cleanup;
fbe740
-
fbe740
-    if (qemuAgentGetFSInfoParams(qemuMonitorTestGetAgent(test), &params,
fbe740
-                                 &nparams, &maxparams, def) != -2) {
fbe740
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
fbe740
-                       "agent get-fsinfo command should have failed");
fbe740
-        goto cleanup;
fbe740
-    }
fbe740
-
fbe740
-    ret = 0;
fbe740
-
fbe740
- cleanup:
fbe740
-    virTypedParamsFree(params, nparams);
fbe740
-    virDomainDefFree(def);
fbe740
-    qemuMonitorTestFree(test);
fbe740
-    return ret;
fbe740
-}
fbe740
-
fbe740
-
fbe740
 static int
fbe740
 testQemuAgentSuspend(const void *data)
fbe740
 {
fbe740
@@ -1438,7 +1305,6 @@ mymain(void)
fbe740
     DO_TEST(FSFreeze);
fbe740
     DO_TEST(FSThaw);
fbe740
     DO_TEST(FSTrim);
fbe740
-    DO_TEST(GetFSInfoParams);
fbe740
     DO_TEST(GetFSInfo);
fbe740
     DO_TEST(Suspend);
fbe740
     DO_TEST(Shutdown);
fbe740
-- 
fbe740
2.25.0
fbe740