[libvirt] [PATCH RFC 37/40] qemu: blockjob: Track internal data for 'backup' blockjob

Eric Blake eblake at redhat.com
Thu Nov 7 23:29:00 UTC 2019


On 10/18/19 11:11 AM, Peter Krempa wrote:
> A backup blockjob needs to be able to notify the parent backup job as
> well as track all data to be able to clean up the bitmap and blockdev
> used for the backup.
> 
> Add the data structure, job allocation function and status XML formatter
> and parser.
> 
> Signed-off-by: Peter Krempa <pkrempa at redhat.com>
> ---

> +++ b/src/qemu/qemu_domain.c
> @@ -2564,6 +2564,16 @@ qemuDomainObjPrivateXMLFormatBlockjobIterator(void *payload,
>               break;
> 
>           case QEMU_BLOCKJOB_TYPE_BACKUP:
> +            virBufferEscapeString(&childBuf, "<bitmap name='%s'/>\n", job->data.backup.bitmap);
> +            virBufferAsprintf(&childBuf, "<backup id='%d'/>\n", job->data.backup.jobid);
> +            if (job->data.backup.store &&
> +                qemuDomainObjPrivateXMLFormatBlockjobFormatSource(&childBuf,
> +                                                                  "store",
> +                                                                  job->data.backup.store,
> +                                                                  data->xmlopt,
> +                                                                  false) < 0)

output of <store> is optional...

> +                return -1;
> +
>           case QEMU_BLOCKJOB_TYPE_NONE:
>           case QEMU_BLOCKJOB_TYPE_INTERNAL:
>           case QEMU_BLOCKJOB_TYPE_LAST:
> @@ -3174,6 +3184,17 @@ qemuDomainObjPrivateXMLParseBlockjobDataSpecific(qemuBlockJobDataPtr job,
>               break;
> 
>           case QEMU_BLOCKJOB_TYPE_BACKUP:
> +            if (!(job->data.backup.bitmap =  virXPathString("string(./bitmap/@name)", ctxt)))
> +                goto broken;
> +
> +            if (virXPathInt("string(./backup/@id)", ctxt, &job->data.backup.jobid) < 0)
> +                goto broken;
> +
> +            if (!(tmp = virXPathNode("./store", ctxt)) ||
> +                !(job->data.backup.store = qemuDomainObjPrivateXMLParseBlockjobChain(tmp, ctxt, xmlopt)))
> +                goto broken;

... so shouldn't this be:

if ((tmp = ...) &&
     !(store = ...))

so we don't goto broken when it is not present?

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org




More information about the libvir-list mailing list