[PATCH 13/19] qemu: blockjob: Store 'jobflags' with block job data

Peter Krempa pkrempa at redhat.com
Fri Jan 31 14:31:17 UTC 2020


Add a variable which will store the contents of the 'flags' variable as
passed in by the individual block jobs. Since the flags may influence
behaviour of the jobs it's important to preserve it to the finalization
steps.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/qemu/qemu_blockjob.h                             | 3 +++
 src/qemu/qemu_domain.c                               | 7 +++++++
 tests/qemustatusxml2xmldata/backup-pull-in.xml       | 2 +-
 tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml | 8 ++++----
 4 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/src/qemu/qemu_blockjob.h b/src/qemu/qemu_blockjob.h
index 2f29e8209c..9e55382f15 100644
--- a/src/qemu/qemu_blockjob.h
+++ b/src/qemu/qemu_blockjob.h
@@ -129,6 +129,9 @@ struct _qemuBlockJobData {
     virStorageSourcePtr chain; /* Reference to the chain the job operates on. */
     virStorageSourcePtr mirrorChain; /* reference to 'mirror' part of the job */

+    unsigned int jobflags; /* per job flags */
+    bool jobflagsmissing; /* job flags were not stored */
+
     union {
         qemuBlockJobPullData pull;
         qemuBlockJobCommitData commit;
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 05a8d3de38..0c7a2641ea 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -2582,6 +2582,8 @@ qemuDomainObjPrivateXMLFormatBlockjobIterator(void *payload,
     virBufferEscapeString(&attrBuf, " newstate='%s'", newstate);
     if (job->brokentype != QEMU_BLOCKJOB_TYPE_NONE)
         virBufferEscapeString(&attrBuf, " brokentype='%s'", qemuBlockjobTypeToString(job->brokentype));
+    if (!job->jobflagsmissing)
+        virBufferAsprintf(&attrBuf, " jobflags='0x%x'", job->jobflags);
     virBufferEscapeString(&childBuf, "<errmsg>%s</errmsg>", job->errmsg);

     if (job->disk) {
@@ -3294,6 +3296,7 @@ qemuDomainObjPrivateXMLParseBlockjobData(virDomainObjPtr vm,
     int newstate = -1;
     bool invalidData = false;
     xmlNodePtr tmp;
+    unsigned long jobflags = 0;

     ctxt->node = node;

@@ -3333,6 +3336,9 @@ qemuDomainObjPrivateXMLParseBlockjobData(virDomainObjPtr vm,
         STRNEQ(mirror, "yes"))
         invalidData = true;

+    if (virXPathULongHex("string(./@jobflags)", ctxt, &jobflags) != 0)
+        job->jobflagsmissing = true;
+
     if (!disk && !invalidData) {
         if ((tmp = virXPathNode("./chains/disk", ctxt)) &&
             !(job->chain = qemuDomainObjPrivateXMLParseBlockjobChain(tmp, ctxt, xmlopt)))
@@ -3352,6 +3358,7 @@ qemuDomainObjPrivateXMLParseBlockjobData(virDomainObjPtr vm,

     job->state = state;
     job->newstate = newstate;
+    job->jobflags = jobflags;
     job->errmsg = virXPathString("string(./errmsg)", ctxt);
     job->invalidData = invalidData;
     job->disk = disk;
diff --git a/tests/qemustatusxml2xmldata/backup-pull-in.xml b/tests/qemustatusxml2xmldata/backup-pull-in.xml
index 3c69c41840..1db978a3ac 100644
--- a/tests/qemustatusxml2xmldata/backup-pull-in.xml
+++ b/tests/qemustatusxml2xmldata/backup-pull-in.xml
@@ -235,7 +235,7 @@
   <allowReboot value='yes'/>
   <nodename index='0'/>
   <blockjobs active='yes'>
-    <blockjob name='backup-vda-libvirt-3-format' type='backup' state='running'>
+    <blockjob name='backup-vda-libvirt-3-format' type='backup' state='running' jobflags='0x0'>
       <disk dst='vda'/>
       <bitmap name='bitmapname'/>
       <store type='file' format='qcow2'>
diff --git a/tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml b/tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml
index b5d62fd4ab..ca6d110179 100644
--- a/tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml
+++ b/tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml
@@ -261,19 +261,19 @@
         </source>
       </src>
     </blockjob>
-    <blockjob name='copy-vdd-libvirt-4321-format' type='copy' state='ready' shallownew='yes'>
+    <blockjob name='copy-vdd-libvirt-4321-format' type='copy' state='ready' jobflags='0x0' shallownew='yes'>
       <disk dst='vdd'/>
     </blockjob>
-    <blockjob name='commit-vdc-libvirt-9-format' type='commit' state='running'>
+    <blockjob name='commit-vdc-libvirt-9-format' type='commit' state='running' jobflags='0x0'>
       <disk dst='vdc'/>
       <base node='libvirt-11-format'/>
       <top node='libvirt-9-format'/>
       <topparent node='libvirt-2-format'/>
     </blockjob>
-    <blockjob name='drive-virtio-disk0' type='copy' state='ready'>
+    <blockjob name='drive-virtio-disk0' type='copy' state='ready' jobflags='0x0'>
       <disk dst='vda' mirror='yes'/>
     </blockjob>
-    <blockjob name='create-libvirt-1338-format' type='create' state='running'>
+    <blockjob name='create-libvirt-1338-format' type='create' state='running' jobflags='0xabcd'>
       <chains>
         <disk type='file' format='qcow2'>
           <source file='/create/src1.qcow2' index='1339'>
-- 
2.24.1




More information about the libvir-list mailing list