[PATCH RFC 04/12] qemu: hotplug: Support hot attach block disk along with throttle filters

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

 



From: Chun Feng Wu <wucf@xxxxxxxxxxxxx>

When attaching disk along with specified throttle groups, those groups will be chained up by parent node name, this change includes service side codes:
* Each filter references one throttle group by group name
* Each filter has a nodename, and those filters are chained up in sequence
* Filter nodename index is persistented in virDomainObj->privateData(qemuDomainObjPrivate)
* During hotplug, filter is created through QMP request("blockdev-add" with "driver":"throttle") to QEMU
* Finally, "device_add"(attach) QMP request is adjusted to set "drive" to be top filter nodename in chain.

Signed-off-by: Chun Feng Wu <wucf@xxxxxxxxxxxxx>
---
 src/qemu/qemu_block.c                         | 121 ++++++++++++++++++
 src/qemu/qemu_block.h                         |  53 ++++++++
 src/qemu/qemu_command.c                       |  61 +++++++++
 src/qemu/qemu_command.h                       |   6 +
 src/qemu/qemu_domain.c                        |  67 ++++++++++
 src/qemu/qemu_domain.h                        |  12 +-
 src/qemu/qemu_hotplug.c                       |  23 ++++
 .../qemustatusxml2xmldata/backup-pull-in.xml  |   1 +
 .../blockjob-blockdev-in.xml                  |   1 +
 .../blockjob-mirror-in.xml                    |   1 +
 .../migration-in-params-in.xml                |   1 +
 .../migration-out-nbd-bitmaps-in.xml          |   1 +
 .../migration-out-nbd-out.xml                 |   1 +
 .../migration-out-nbd-tls-out.xml             |   1 +
 .../migration-out-params-in.xml               |   1 +
 tests/qemustatusxml2xmldata/modern-in.xml     |   1 +
 tests/qemustatusxml2xmldata/upgrade-out.xml   |   1 +
 .../qemustatusxml2xmldata/vcpus-multi-in.xml  |   1 +
 18 files changed, 352 insertions(+), 2 deletions(-)

diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c
index 738b72d7ea..3c784d36ea 100644
--- a/src/qemu/qemu_block.c
+++ b/src/qemu/qemu_block.c
@@ -2738,6 +2738,127 @@ qemuBlockStorageSourceCreateDetectSize(GHashTable *blockNamedNodeData,
     return 0;
 }
 
+void
+qemuBlockThrottleFilterSetNodename(virDomainThrottleFilterDef *filter,
+                                   char *nodename)
+{
+    g_free(filter->nodename);
+    filter->nodename = nodename;
+}
+
+const char *
+qemuBlockThrottleFilterGetNodename(virDomainThrottleFilterDef *filter)
+{
+    return filter->nodename;
+}
+
+/**
+ * qemuBlockThrottleFilterGetProps:
+ * @filter: throttle filter
+ * @parentNodeName: parent nodename of @filter
+ *
+ * Build "arguments" part of "blockdev-add" QMP cmd.
+ * e.g. {"execute":"blockdev-add", "arguments":{"driver":"throttle",
+ * "node-name":"libvirt-2-filter",  "throttle-group":"limits0",
+ * "file": "libvirt-1-format"}}
+ */
+virJSONValue *
+qemuBlockThrottleFilterGetProps(virDomainThrottleFilterDef *filter,
+                                const char *parentNodeName)
+{
+    g_autoptr(virJSONValue) props = NULL;
+
+    if (virJSONValueObjectAdd(&props,
+                              "s:driver", "throttle",
+                              "s:node-name", qemuBlockThrottleFilterGetNodename(filter),
+                              "s:throttle-group", filter->group_name,
+                              "s:file", parentNodeName,
+                              NULL) < 0)
+        return 0;
+
+    return g_steal_pointer(&props);
+}
+
+void
+qemuBlockThrottleFilterAttachDataFree(qemuBlockThrottleFilterAttachData *data)
+{
+    if (!data)
+        return;
+
+    virJSONValueFree(data->filterProps);
+    g_free(data);
+}
+
+qemuBlockThrottleFilterAttachData *
+qemuBlockThrottleFilterAttachPrepareBlockdev(virDomainThrottleFilterDef *filter,
+                                            const char *parentNodeName)
+{
+    g_autoptr(qemuBlockThrottleFilterAttachData) data = NULL;
+
+    data = g_new0(qemuBlockThrottleFilterAttachData, 1);
+
+    if (!(data->filterProps = qemuBlockThrottleFilterGetProps(filter, parentNodeName)))
+        return NULL;
+
+    data->filterNodeName = qemuBlockThrottleFilterGetNodename(filter);
+    data->filterAttached = true;
+
+    return g_steal_pointer(&data);
+}
+
+void
+qemuBlockThrottleFilterAttachRollback(qemuMonitor *mon,
+                                     qemuBlockThrottleFilterAttachData *data)
+{
+    virErrorPtr orig_err;
+
+    virErrorPreserveLast(&orig_err);
+
+    if (data->filterAttached)
+        ignore_value(qemuMonitorBlockdevDel(mon, data->filterNodeName));
+
+    virErrorRestore(&orig_err);
+}
+
+void
+qemuBlockThrottleFilterChainDataFree(qemuBlockThrottleFilterChainData *data)
+{
+    size_t i;
+
+    if (!data)
+        return;
+
+    for (i = 0; i < data->nfilterdata; i++)
+        qemuBlockThrottleFilterAttachDataFree(data->filterdata[i]);
+
+    g_free(data->filterdata);
+    g_free(data);
+}
+
+int
+qemuBlockThrottleFilterChainAttach(qemuMonitor *mon,
+                                  qemuBlockThrottleFilterChainData *data)
+{
+    size_t i;
+
+    for (i = 0; i < data->nfilterdata; i++) {
+        if (qemuMonitorBlockdevAdd(mon, &data->filterdata[i]->filterProps) < 0)
+            return -1;
+        data->filterdata[i]->filterAttached = true;
+    }
+
+    return 0;
+}
+
+void
+qemuBlockThrottleFilterChainDetach(qemuMonitor *mon,
+                                  qemuBlockThrottleFilterChainData *data)
+{
+    size_t i;
+
+    for (i = data->nfilterdata; i > 0; i--)
+        qemuBlockThrottleFilterAttachRollback(mon, data->filterdata[i-1]);
+}
 
 int
 qemuBlockRemoveImageMetadata(virQEMUDriver *driver,
diff --git a/src/qemu/qemu_block.h b/src/qemu/qemu_block.h
index f9e961d85d..66bf7a97c3 100644
--- a/src/qemu/qemu_block.h
+++ b/src/qemu/qemu_block.h
@@ -214,6 +214,59 @@ qemuBlockStorageSourceCreateDetectSize(GHashTable *blockNamedNodeData,
                                        virStorageSource *src,
                                        virStorageSource *templ);
 
+void
+qemuBlockThrottleFilterSetNodename(virDomainThrottleFilterDef *filter,
+                                   char *nodename);
+
+const char *
+qemuBlockThrottleFilterGetNodename(virDomainThrottleFilterDef *filter);
+
+virJSONValue *
+qemuBlockThrottleFilterGetProps(virDomainThrottleFilterDef *filter,
+                                const char *parentNodeName);
+
+typedef struct qemuBlockThrottleFilterAttachData qemuBlockThrottleFilterAttachData;
+struct qemuBlockThrottleFilterAttachData {
+    virJSONValue *filterProps;
+    const char *filterNodeName;
+    bool filterAttached;
+};
+
+qemuBlockThrottleFilterAttachData *
+qemuBlockThrottleFilterAttachPrepareBlockdev(virDomainThrottleFilterDef *throttlefilter,
+                                            const char *parentNodeName);
+
+void
+qemuBlockThrottleFilterAttachDataFree(qemuBlockThrottleFilterAttachData *data);
+
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuBlockThrottleFilterAttachData,
+                        qemuBlockThrottleFilterAttachDataFree);
+
+void
+qemuBlockThrottleFilterAttachRollback(qemuMonitor *mon,
+                                     qemuBlockThrottleFilterAttachData *data);
+
+struct _qemuBlockThrottleFilterChainData {
+    qemuBlockThrottleFilterAttachData **filterdata;
+    size_t nfilterdata;
+};
+
+typedef struct _qemuBlockThrottleFilterChainData qemuBlockThrottleFilterChainData;
+
+void
+qemuBlockThrottleFilterChainDataFree(qemuBlockThrottleFilterChainData *data);
+
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuBlockThrottleFilterChainData,
+                        qemuBlockThrottleFilterChainDataFree);
+
+int
+qemuBlockThrottleFilterChainAttach(qemuMonitor *mon,
+                                  qemuBlockThrottleFilterChainData *data);
+
+void
+qemuBlockThrottleFilterChainDetach(qemuMonitor *mon,
+                                  qemuBlockThrottleFilterChainData *data);
+
 int
 qemuBlockRemoveImageMetadata(virQEMUDriver *driver,
                              virDomainObj *vm,
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 9d4563861f..278b706616 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -1576,6 +1576,12 @@ qemuDiskConfigBlkdeviotuneEnabled(const virDomainDiskDef *disk)
            virDomainBlockIoTuneInfoHasAny(&disk->blkdeviotune);
 }
 
+bool
+qemuDiskConfigThrottleFilterChainEnabled(const virDomainDiskDef *disk)
+{
+    return disk->nthrottlefilters > 0;
+}
+
 
 /**
  * qemuDiskBusIsSD:
@@ -1936,6 +1942,10 @@ qemuBuildDiskDeviceProps(const virDomainDef *def,
     } else {
         if (qemuDomainDiskGetBackendAlias(disk, &drive) < 0)
             return NULL;
+        /* make sure device drive points to top throttle filter */
+        if (qemuDiskConfigThrottleFilterChainEnabled(disk)) {
+            drive = g_strdup(disk->throttlefilters[disk->nthrottlefilters-1]->nodename);
+        }
     }
 
     /* bootindex for floppies is configured via the fdc controller */
@@ -11025,6 +11035,57 @@ qemuBuildStorageSourceChainAttachPrepareBlockdevOne(qemuBlockStorageSourceChainD
     return 0;
 }
 
+/**
+ * qemuBuildThrottleFilterChainAttachPrepareBlockdevOne:
+ * @data: filter chain data, which consists of array of filters and size of such array
+ * @throttlefilter: new filter to be added into filter array
+ * @parentNodeName: parent nodename for this new throttlefilter, which is used to build "blockdev-add" QMP request
+ *
+ * Build filter node chain to provide more flexibility for block disk I/O limits
+ */
+static int
+qemuBuildThrottleFilterChainAttachPrepareBlockdevOne(qemuBlockThrottleFilterChainData *data,
+                                                    virDomainThrottleFilterDef *throttlefilter,
+                                                    const char *parentNodeName)
+{
+    g_autoptr(qemuBlockThrottleFilterAttachData) elem = NULL;
+
+    if (!(elem = qemuBlockThrottleFilterAttachPrepareBlockdev(throttlefilter, parentNodeName)))
+        return -1;
+
+    VIR_APPEND_ELEMENT(data->filterdata, data->nfilterdata, elem);
+    return 0;
+}
+
+/**
+ * qemuBuildThrottleFilterChainAttachPrepareBlockdev:
+ * @disk: domain disk
+ *
+ * Build filter node chain to provide more flexibility for block disk I/O limits
+ */
+qemuBlockThrottleFilterChainData *
+qemuBuildThrottleFilterChainAttachPrepareBlockdev(virDomainDiskDef *disk)
+{
+    g_autoptr(qemuBlockThrottleFilterChainData) data = NULL;
+    size_t i;
+    const char * parentNodeName = NULL;
+    g_autofree char *tmp_nodename = NULL;
+
+    data = g_new0(qemuBlockThrottleFilterChainData, 1);
+    /* get starting parentNodename, e.g. libvirt-1-format */
+    parentNodeName = qemuBlockStorageSourceGetEffectiveNodename(disk->src);
+    //build filterdata, which contains all filters info and sequence info through parentNodeName
+    for (i = 0; i < disk->nthrottlefilters; i++) {
+        tmp_nodename = g_strdup(parentNodeName);
+        if (qemuBuildThrottleFilterChainAttachPrepareBlockdevOne(data, disk->throttlefilters[i], tmp_nodename) < 0)
+            return NULL;
+        parentNodeName = disk->throttlefilters[i]->nodename;
+    }
+
+    return g_steal_pointer(&data);
+}
+
+
 
 /**
  * qemuBuildStorageSourceChainAttachPrepareBlockdev:
diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h
index 341ec43f9a..e2dee47906 100644
--- a/src/qemu/qemu_command.h
+++ b/src/qemu/qemu_command.h
@@ -116,6 +116,12 @@ qemuBlockStorageSourceChainData *
 qemuBuildStorageSourceChainAttachPrepareBlockdevTop(virStorageSource *top,
                                                     virStorageSource *backingStore);
 
+qemuBlockThrottleFilterChainData *
+qemuBuildThrottleFilterChainAttachPrepareBlockdev(virDomainDiskDef *disk);
+
+bool
+qemuDiskConfigThrottleFilterChainEnabled(const virDomainDiskDef *disk);
+
 virJSONValue *
 qemuBuildDiskDeviceProps(const virDomainDef *def,
                          virDomainDiskDef *disk,
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 7d1c1430ab..c2f5d17c15 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -683,6 +683,17 @@ qemuDomainStorageIDNew(qemuDomainObjPrivate *priv)
     return ++priv->nodenameindex;
 }
 
+/**
+ * qemuDomainThrottleFilterIDNew:
+ * @priv: qemu VM private data object.
+ *
+ * Generate a new unique id for throttle filter object. Useful for node name generation.
+ */
+static unsigned int
+qemuDomainThrottleFilterIDNew(qemuDomainObjPrivate *priv)
+{
+    return ++priv->filternodenameindex;
+}
 
 /**
  * qemuDomainStorageIDReset:
@@ -697,6 +708,20 @@ qemuDomainStorageIDReset(qemuDomainObjPrivate *priv)
     priv->nodenameindex = 0;
 }
 
+/**
+ * qemuDomainThrottleFilterIDReset:
+ * @priv: qemu VM private data object.
+ *
+ * Resets the data for the node name generator. The node names need to be unique
+ * for a single instance, so can be reset on VM shutdown.
+ */
+static void
+qemuDomainThrottleFilterIDReset(qemuDomainObjPrivate *priv)
+{
+    priv->filternodenameindex = 0;
+}
+
+
 
 /**
  * qemuDomainFDSetIDNew:
@@ -1853,6 +1878,8 @@ qemuDomainObjPrivateDataClear(qemuDomainObjPrivate *priv)
     /* reset node name allocator */
     qemuDomainStorageIDReset(priv);
 
+    qemuDomainThrottleFilterIDReset(priv);
+
     qemuDomainFDSetIDReset(priv);
 
     priv->dbusDaemonRunning = false;
@@ -2649,6 +2676,8 @@ qemuDomainObjPrivateXMLFormat(virBuffer *buf,
 
     virBufferAsprintf(buf, "<nodename index='%llu'/>\n", priv->nodenameindex);
 
+    virBufferAsprintf(buf, "<filternodename index='%llu'/>\n", priv->filternodenameindex);
+
     virBufferAsprintf(buf, "<fdset index='%u'/>\n", priv->fdsetindex);
 
     if (priv->memPrealloc)
@@ -3376,6 +3405,7 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt,
         return -1;
 
     qemuDomainStorageIDReset(priv);
+    qemuDomainThrottleFilterIDReset(priv);
     if (virXPathULongLong("string(./nodename/@index)", ctxt,
                           &priv->nodenameindex) == -2) {
         virReportError(VIR_ERR_XML_ERROR, "%s",
@@ -3383,6 +3413,13 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt,
         return -1;
     }
 
+    if (virXPathULongLong("string(./filternodename/@index)", ctxt,
+                          &priv->filternodenameindex) == -2) {
+        virReportError(VIR_ERR_XML_ERROR, "%s",
+                       _("failed to parse filter node name index"));
+        return -1;
+    }
+
     if (virXPathUInt("string(./fdset/@index)", ctxt, &priv->fdsetindex) == 0)
         priv->fdsetindexParsed = true;
 
@@ -11345,6 +11382,30 @@ qemuDomainPrepareStorageSourceBlockdevNodename(virDomainDiskDef *disk,
     return 0;
 }
 
+int
+qemuDomainPrepareThrottleFilterBlockdevNodename(virDomainThrottleFilterDef *filter,
+                                               const char *nodenameprefix)
+{
+    char *nodename = g_strdup_printf("%s-filter", nodenameprefix);
+
+    qemuBlockThrottleFilterSetNodename(filter, nodename);
+
+    return 0;
+}
+
+int
+qemuDomainPrepareThrottleFilterBlockdev(virDomainThrottleFilterDef *filter,
+                                        qemuDomainObjPrivate *priv)
+{
+    g_autofree char *nodenameprefix = NULL;
+
+    filter->id = qemuDomainThrottleFilterIDNew(priv);
+
+    nodenameprefix = g_strdup_printf("libvirt-%u", filter->id);
+
+    return qemuDomainPrepareThrottleFilterBlockdevNodename(filter,  nodenameprefix);
+}
+
 
 int
 qemuDomainPrepareStorageSourceBlockdev(virDomainDiskDef *disk,
@@ -11369,6 +11430,7 @@ qemuDomainPrepareDiskSourceBlockdev(virDomainDiskDef *disk,
 {
     qemuDomainDiskPrivate *diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
     virStorageSource *n;
+    size_t i;
 
     if (disk->copy_on_read == VIR_TRISTATE_SWITCH_ON &&
         !diskPriv->nodeCopyOnRead)
@@ -11379,6 +11441,11 @@ qemuDomainPrepareDiskSourceBlockdev(virDomainDiskDef *disk,
             return -1;
     }
 
+    for (i = 0; i < disk->nthrottlefilters; i++) {
+        if (qemuDomainPrepareThrottleFilterBlockdev(disk->throttlefilters[i], priv) < 0)
+            return -1;
+    }
+
     return 0;
 }
 
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 6343383bf7..ce5f5dfb6e 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -204,6 +204,9 @@ struct _qemuDomainObjPrivate {
     /* counter for generating node names for qemu disks */
     unsigned long long nodenameindex;
 
+    /* counter for generating node names for throttle filters */
+    unsigned long long filternodenameindex;
+
     /* counter for generating IDs of fdsets */
     unsigned int fdsetindex;
     bool fdsetindexParsed;
@@ -772,6 +775,13 @@ int qemuDomainPrepareStorageSourceBlockdev(virDomainDiskDef *disk,
                                            qemuDomainObjPrivate *priv,
                                            virQEMUDriverConfig *cfg);
 
+int qemuDomainPrepareThrottleFilterBlockdev(virDomainThrottleFilterDef *filter,
+                                            qemuDomainObjPrivate *priv);
+int
+qemuDomainPrepareThrottleFilterBlockdevNodename(virDomainThrottleFilterDef *filter,
+                                               const char *nodenameprefix);
+virDomainThrottleGroupDef *qemuDomainThrottleGroupByName(virDomainDef *def, const char *name);
+
 void qemuDomainCleanupAdd(virDomainObj *vm,
                           qemuDomainCleanupCallback cb);
 void qemuDomainCleanupRemove(virDomainObj *vm,
@@ -880,8 +890,6 @@ int qemuDomainSetPrivatePaths(virQEMUDriver *driver,
 
 virDomainDiskDef *qemuDomainDiskByName(virDomainDef *def, const char *name);
 
-virDomainThrottleGroupDef *qemuDomainThrottleGroupByName(virDomainDef *def, const char *name);
-
 char *qemuDomainGetMasterKeyFilePath(const char *libDir);
 
 int qemuDomainMasterKeyReadFile(qemuDomainObjPrivate *priv);
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 62dc879ed4..491d8b03ea 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -656,6 +656,7 @@ qemuDomainAttachDiskGeneric(virDomainObj *vm,
                             virDomainAsyncJob asyncJob)
 {
     g_autoptr(qemuBlockStorageSourceChainData) data = NULL;
+    g_autoptr(qemuBlockThrottleFilterChainData) filterData = NULL;
     qemuDomainObjPrivate *priv = vm->privateData;
     g_autoptr(virJSONValue) devprops = NULL;
     bool extensionDeviceAttached = false;
@@ -693,6 +694,18 @@ qemuDomainAttachDiskGeneric(virDomainObj *vm,
 
         if (rc < 0)
             goto rollback;
+        /* Setup throttling filter chain
+        * add additional "blockdev-add"(throttle filter) between "blockdev-add" (qemuBlockStorageSourceChainAttach) and "device_add" (qemuDomainAttachExtensionDevice)
+        */
+        if ((filterData = qemuBuildThrottleFilterChainAttachPrepareBlockdev(disk))) {
+            if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) < 0)
+                return -1;
+            /* QMP requests("blockdev-add" with "driver":"throttle") to QEMU */
+            rc = qemuBlockThrottleFilterChainAttach(priv->mon, filterData);
+            qemuDomainObjExitMonitor(vm);
+            if (rc < 0)
+                goto rollback;
+        }
 
         if (disk->transient) {
             g_autoptr(qemuBlockStorageSourceAttachData) backend = NULL;
@@ -765,6 +778,8 @@ qemuDomainAttachDiskGeneric(virDomainObj *vm,
     if (extensionDeviceAttached)
         ignore_value(qemuDomainDetachExtensionDevice(priv->mon, &disk->info));
 
+    qemuBlockThrottleFilterChainDetach(priv->mon, filterData);
+
     qemuBlockStorageSourceChainDetach(priv->mon, data);
 
     qemuDomainObjExitMonitor(vm);
@@ -4504,6 +4519,7 @@ qemuDomainRemoveDiskDevice(virQEMUDriver *driver,
 {
     qemuDomainDiskPrivate *diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
     g_autoptr(qemuBlockStorageSourceChainData) diskBackend = NULL;
+    g_autoptr(qemuBlockThrottleFilterChainData) filterData = NULL;
     size_t i;
     qemuDomainObjPrivate *priv = vm->privateData;
     int ret = -1;
@@ -4542,6 +4558,13 @@ qemuDomainRemoveDiskDevice(virQEMUDriver *driver,
         }
     }
 
+    qemuDomainObjEnterMonitor(vm);
+    /* QMP request("blockdev-del") to QEMU to delete throttle filter*/
+    if ((filterData = qemuBuildThrottleFilterChainAttachPrepareBlockdev(disk))) {
+        qemuBlockThrottleFilterChainDetach(priv->mon, filterData);
+    }
+    qemuDomainObjExitMonitor(vm);
+
     qemuDomainObjEnterMonitor(vm);
 
     if (diskBackend)
diff --git a/tests/qemustatusxml2xmldata/backup-pull-in.xml b/tests/qemustatusxml2xmldata/backup-pull-in.xml
index e7fdc6c478..0a7b8bc7ee 100644
--- a/tests/qemustatusxml2xmldata/backup-pull-in.xml
+++ b/tests/qemustatusxml2xmldata/backup-pull-in.xml
@@ -234,6 +234,7 @@
   <chardevStdioLogd/>
   <allowReboot value='yes'/>
   <nodename index='0'/>
+  <filternodename index='0'/>
   <fdset index='0'/>
   <blockjobs active='yes'>
     <blockjob name='backup-vda-libvirt-3-format' type='backup' state='running' jobflags='0x0'>
diff --git a/tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml b/tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml
index 380ef053d2..c29bbaca81 100644
--- a/tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml
+++ b/tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml
@@ -233,6 +233,7 @@
   <chardevStdioLogd/>
   <allowReboot value='yes'/>
   <nodename index='0'/>
+  <filternodename index='0'/>
   <fdset index='0'/>
   <blockjobs active='yes'>
     <blockjob name='broken-test' type='broken' state='ready' brokentype='commit'/>
diff --git a/tests/qemustatusxml2xmldata/blockjob-mirror-in.xml b/tests/qemustatusxml2xmldata/blockjob-mirror-in.xml
index 1bcdeffcb8..0e0f52fecf 100644
--- a/tests/qemustatusxml2xmldata/blockjob-mirror-in.xml
+++ b/tests/qemustatusxml2xmldata/blockjob-mirror-in.xml
@@ -23,6 +23,7 @@
   <channelTargetDir path='/var/lib/libvirt/qemu/channel/target'/>
   <allowReboot value='yes'/>
   <nodename index='0'/>
+  <filternodename index='0'/>
   <fdset index='0'/>
   <blockjobs active='yes'/>
   <agentTimeout>-2</agentTimeout>
diff --git a/tests/qemustatusxml2xmldata/migration-in-params-in.xml b/tests/qemustatusxml2xmldata/migration-in-params-in.xml
index 03773a089b..5510c139f8 100644
--- a/tests/qemustatusxml2xmldata/migration-in-params-in.xml
+++ b/tests/qemustatusxml2xmldata/migration-in-params-in.xml
@@ -257,6 +257,7 @@
   <chardevStdioLogd/>
   <allowReboot value='yes'/>
   <nodename index='0'/>
+  <filternodename index='0'/>
   <fdset index='0'/>
   <blockjobs active='no'/>
   <agentTimeout>-2</agentTimeout>
diff --git a/tests/qemustatusxml2xmldata/migration-out-nbd-bitmaps-in.xml b/tests/qemustatusxml2xmldata/migration-out-nbd-bitmaps-in.xml
index 4ee44ffbd4..cd38bf3e30 100644
--- a/tests/qemustatusxml2xmldata/migration-out-nbd-bitmaps-in.xml
+++ b/tests/qemustatusxml2xmldata/migration-out-nbd-bitmaps-in.xml
@@ -343,6 +343,7 @@
   <rememberOwner/>
   <allowReboot value='yes'/>
   <nodename index='3'/>
+  <filternodename index='3'/>
   <fdset index='0'/>
   <blockjobs active='yes'>
     <blockjob name='drive-virtio-disk0' type='copy' state='ready' jobflags='0x0'>
diff --git a/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml b/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml
index de92146eaa..0d8cb8be6a 100644
--- a/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml
+++ b/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml
@@ -260,6 +260,7 @@
   <chardevStdioLogd/>
   <allowReboot value='yes'/>
   <nodename index='0'/>
+  <filternodename index='0'/>
   <fdset index='0'/>
   <blockjobs active='no'/>
   <agentTimeout>-2</agentTimeout>
diff --git a/tests/qemustatusxml2xmldata/migration-out-nbd-tls-out.xml b/tests/qemustatusxml2xmldata/migration-out-nbd-tls-out.xml
index 6bdd128259..75b019cb23 100644
--- a/tests/qemustatusxml2xmldata/migration-out-nbd-tls-out.xml
+++ b/tests/qemustatusxml2xmldata/migration-out-nbd-tls-out.xml
@@ -289,6 +289,7 @@
   <chardevStdioLogd/>
   <allowReboot value='yes'/>
   <nodename index='0'/>
+  <filternodename index='0'/>
   <fdset index='0'/>
   <blockjobs active='no'/>
   <agentTimeout>-2</agentTimeout>
diff --git a/tests/qemustatusxml2xmldata/migration-out-params-in.xml b/tests/qemustatusxml2xmldata/migration-out-params-in.xml
index 24ee86e4c0..1e786953e7 100644
--- a/tests/qemustatusxml2xmldata/migration-out-params-in.xml
+++ b/tests/qemustatusxml2xmldata/migration-out-params-in.xml
@@ -271,6 +271,7 @@
   <chardevStdioLogd/>
   <allowReboot value='yes'/>
   <nodename index='0'/>
+  <filternodename index='0'/>
   <fdset index='0'/>
   <blockjobs active='no'/>
   <agentTimeout>-2</agentTimeout>
diff --git a/tests/qemustatusxml2xmldata/modern-in.xml b/tests/qemustatusxml2xmldata/modern-in.xml
index f0f5df84ab..84240595ff 100644
--- a/tests/qemustatusxml2xmldata/modern-in.xml
+++ b/tests/qemustatusxml2xmldata/modern-in.xml
@@ -261,6 +261,7 @@
   <chardevStdioLogd/>
   <allowReboot value='yes'/>
   <nodename index='123'/>
+  <filternodename index='123'/>
   <fdset index='321'/>
   <blockjobs active='no'/>
   <agentTimeout>-2</agentTimeout>
diff --git a/tests/qemustatusxml2xmldata/upgrade-out.xml b/tests/qemustatusxml2xmldata/upgrade-out.xml
index e663b3dbb5..2f33166579 100644
--- a/tests/qemustatusxml2xmldata/upgrade-out.xml
+++ b/tests/qemustatusxml2xmldata/upgrade-out.xml
@@ -259,6 +259,7 @@
   <chardevStdioLogd/>
   <allowReboot value='yes'/>
   <nodename index='0'/>
+  <filternodename index='0'/>
   <fdset index='0'/>
   <blockjobs active='no'/>
   <agentTimeout>-2</agentTimeout>
diff --git a/tests/qemustatusxml2xmldata/vcpus-multi-in.xml b/tests/qemustatusxml2xmldata/vcpus-multi-in.xml
index fa6a6a99f4..b07a04a840 100644
--- a/tests/qemustatusxml2xmldata/vcpus-multi-in.xml
+++ b/tests/qemustatusxml2xmldata/vcpus-multi-in.xml
@@ -309,6 +309,7 @@
   <channelTargetDir path='/var/lib/libvirt/qemu/channel/target'/>
   <allowReboot value='yes'/>
   <nodename index='0'/>
+  <filternodename index='0'/>
   <fdset index='0'/>
   <blockjobs active='no'/>
   <agentTimeout>-2</agentTimeout>
-- 
2.34.1
_______________________________________________
Devel mailing list -- devel@xxxxxxxxxxxxxxxxx
To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxx




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux