qemu: blockjob: Store list of bitmaps disabled prior to commit

Starting a commit job will require disabling bitmaps in the base image
so that they are not dirtied by the commit job. We need to store a list
of the bitmaps so that we can later re-enable them.

Add a field and status XML handling code as well as a test.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Peter Krempa 2020-02-25 07:28:44 +01:00
parent 38d0dd08d6
commit 41de7230ab
3 changed files with 32 additions and 0 deletions

View File

@ -88,6 +88,8 @@ struct _qemuBlockJobCommitData {
virStorageSourcePtr top;
virStorageSourcePtr base;
bool deleteCommittedImages;
char **disabledBitmapsBase; /* a NULL-terminated list of bitmap names which
were disabled in @base for the commit job */
};

View File

@ -2611,6 +2611,9 @@ static void
qemuDomainPrivateBlockJobFormatCommit(qemuBlockJobDataPtr job,
virBufferPtr buf)
{
g_auto(virBuffer) disabledBitmapsBuf = VIR_BUFFER_INIT_CHILD(buf);
char **bitmaps = job->data.commit.disabledBitmapsBase;
if (job->data.commit.base)
virBufferAsprintf(buf, "<base node='%s'/>\n", job->data.commit.base->nodeformat);
@ -2622,6 +2625,11 @@ qemuDomainPrivateBlockJobFormatCommit(qemuBlockJobDataPtr job,
if (job->data.commit.deleteCommittedImages)
virBufferAddLit(buf, "<deleteCommittedImages/>\n");
while (bitmaps && *bitmaps)
virBufferEscapeString(&disabledBitmapsBuf, "<bitmap name='%s'/>\n", *(bitmaps++));
virXMLFormatElement(buf, "disabledBaseBitmaps", NULL, &disabledBitmapsBuf);
}
@ -3234,6 +3242,9 @@ static int
qemuDomainObjPrivateXMLParseBlockjobDataCommit(qemuBlockJobDataPtr job,
xmlXPathContextPtr ctxt)
{
g_autofree xmlNodePtr *nodes = NULL;
ssize_t nnodes;
if (job->type == QEMU_BLOCKJOB_TYPE_COMMIT) {
qemuDomainObjPrivateXMLParseBlockjobNodename(job,
"string(./topparent/@node)",
@ -3260,6 +3271,21 @@ qemuDomainObjPrivateXMLParseBlockjobDataCommit(qemuBlockJobDataPtr job,
!job->data.commit.base)
return -1;
if ((nnodes = virXPathNodeSet("./disabledBaseBitmaps/bitmap", ctxt, &nodes)) > 0) {
size_t i;
job->data.commit.disabledBitmapsBase = g_new0(char *, nnodes + 1);
for (i = 0; i < nnodes; i++) {
char *tmp;
if (!(tmp = virXMLPropString(nodes[i], "name")))
return -1;
job->data.commit.disabledBitmapsBase[i] = g_steal_pointer(&tmp);
}
}
return 0;
}

View File

@ -243,6 +243,10 @@
<base node='libvirt-19-format'/>
<top node='libvirt-17-format'/>
<deleteCommittedImages/>
<disabledBaseBitmaps>
<bitmap name='test'/>
<bitmap name='test1'/>
</disabledBaseBitmaps>
</blockjob>
<blockjob name='create-libvirt-1337-storage' type='create' state='running'>
<create mode='storage'/>