]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: blockjob: Store 'jobflags' with block job data
authorPeter Krempa <pkrempa@redhat.com>
Fri, 31 Jan 2020 12:00:29 +0000 (13:00 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 4 Feb 2020 12:45:33 +0000 (13:45 +0100)
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 them to the
finalization steps.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_blockjob.h
src/qemu/qemu_domain.c
tests/qemustatusxml2xmldata/backup-pull-in.xml
tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml

index 2f29e8209c14f847a372171b22a6eaba2384797b..9e55382f154508a82ce78700c02a57bafe20d564 100644 (file)
@@ -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;
index cb691ca0484a882b5e6dd7df930bd66c81761587..f29c47ad6b8378104f554ef325a4a4ce970f250f 100644 (file)
@@ -2546,6 +2546,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) {
@@ -3244,6 +3246,7 @@ qemuDomainObjPrivateXMLParseBlockjobData(virDomainObjPtr vm,
     int newstate = -1;
     bool invalidData = false;
     xmlNodePtr tmp;
+    unsigned long jobflags = 0;
 
     ctxt->node = node;
 
@@ -3283,6 +3286,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)))
@@ -3302,6 +3308,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;
index 3c69c418403fd20336aa2bf33642356b92dcbb93..1db978a3acc339ef02a8b2c5e833fe1cdd34cc73 100644 (file)
   <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'>
index b5d62fd4aba8b537e0c8a18ef581306f4636a016..ca6d1101797eb15679b5426ac9a5063c88cf07f9 100644 (file)
         </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'>