[libvirt PATCH 02/30] qemu_block: extract block commit code to separate function

Peter Krempa pkrempa at redhat.com
Tue Dec 13 09:09:52 UTC 2022


On Thu, Dec 08, 2022 at 14:30:38 +0100, Pavel Hrdina wrote:
> Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
> ---
>  src/qemu/qemu_block.c  | 179 +++++++++++++++++++++++++++++++++++++++++
>  src/qemu/qemu_block.h  |   9 +++
>  src/qemu/qemu_driver.c | 162 +------------------------------------
>  3 files changed, 189 insertions(+), 161 deletions(-)
> 
> diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c
> index 8a6f601b29..4cca7555f3 100644
> --- a/src/qemu/qemu_block.c
> +++ b/src/qemu/qemu_block.c
> @@ -3196,3 +3196,182 @@ qemuBlockExportAddNBD(virDomainObj *vm,

[...]

> +    if (rc < 0)
> +        goto error;
> +
> +    if (mirror) {
> +        disk->mirror = g_steal_pointer(&mirror);
> +        disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_ACTIVE_COMMIT;
> +    }
> +    qemuBlockJobStarted(job, vm);

[1]

> +
> +    return 0;
> +
> + error:
> +    if (clean_access) {
> +        virErrorPtr orig_err;
> +        virErrorPreserveLast(&orig_err);
> +        /* Revert access to read-only, if possible.  */
> +        qemuDomainStorageSourceAccessAllow(driver, vm, baseSource,
> +                                           true, false, false);
> +        if (top_parent && top_parent != disk->src)
> +            qemuDomainStorageSourceAccessAllow(driver, vm, top_parent,
> +                                               true, false, false);
> +
> +        virErrorRestore(&orig_err);
> +    }
> +    qemuBlockJobStartupFinalize(vm, job);

[2]

> +
> +    return -1;
> +}

[...]


> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index d509582719..2f05da3d8c 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c

[...]

> -
> -    ret = qemuMonitorBlockCommit(priv->mon,
> -                                 qemuDomainDiskGetTopNodename(disk),
> -                                 job->name,
> -                                 topSource->nodeformat,
> -                                 baseSource->nodeformat,
> -                                 backingPath, speed);
> -
> -    qemuDomainObjExitMonitor(vm);
> -
> -    if (ret < 0)
> -        goto endjob;
> -
> -    if (mirror) {
> -        disk->mirror = g_steal_pointer(&mirror);
> -        disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_ACTIVE_COMMIT;
> -    }
> -    qemuBlockJobStarted(job, vm);
> +    ret = qemuBlockCommit(vm, disk, baseSource, topSource, top_parent, bandwidth, flags);
>  
>   endjob:
> -    if (ret < 0 && clean_access) {
> -        virErrorPtr orig_err;
> -        virErrorPreserveLast(&orig_err);
> -        /* Revert access to read-only, if possible.  */
> -        qemuDomainStorageSourceAccessAllow(driver, vm, baseSource,
> -                                           true, false, false);
> -        if (top_parent && top_parent != disk->src)
> -            qemuDomainStorageSourceAccessAllow(driver, vm, top_parent,
> -                                               true, false, false);
> -
> -        virErrorRestore(&orig_err);
> -    }
> -    qemuBlockJobStartupFinalize(vm, job);

So before this patch qemuBlockJobStartupFinalize() gets called both on
error and success code paths. After this patch [1] the success code path
doesn't call it any more, just the error code path [2].

Thus the reference to 'job' is leaked in the new code.

The new function must also call qemuBlockJobStartupFinalize() in both
cases.


More information about the libvir-list mailing list