[libvirt] [PATCH] qemu: save config after pivot only if domain is persistent

Peter Krempa pkrempa at redhat.com
Mon Jan 4 15:18:10 UTC 2016


On Thu, Dec 31, 2015 at 16:42:52 +1100, Michael Chapman wrote:
> When pivoting after a completed block job, only save the domain's
> persistent configuration if the domain is actually marked persistent.
> 
> This commit also refactors the logic surrounding the copying of the new
> disk definition into vm->newDef to avoid a NULL pointer dereference if
> virStorageSourceCopy were to fail to allocate memory.

This commit is fixing two separate things in one commit, which is not
really good practice. Please repost this as two patches.



> 
> Signed-off-by: Michael Chapman <mike at very.puzzling.org>
> ---
>  src/qemu/qemu_blockjob.c | 34 ++++++++++++++--------------------
>  1 file changed, 14 insertions(+), 20 deletions(-)
> 
> diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c
> index 1d5b7ce..ae936a2 100644
> --- a/src/qemu/qemu_blockjob.c
> +++ b/src/qemu/qemu_blockjob.c
> @@ -116,26 +116,20 @@ qemuBlockJobEventProcess(virQEMUDriverPtr driver,
>      switch ((virConnectDomainEventBlockJobStatus) status) {
>      case VIR_DOMAIN_BLOCK_JOB_COMPLETED:
>          if (disk->mirrorState == VIR_DOMAIN_DISK_MIRROR_STATE_PIVOT) {
> -            if (vm->newDef) {
> -                virStorageSourcePtr copy = NULL;
> -
> -                if ((persistDisk = virDomainDiskByName(vm->newDef,
> -                                                       disk->dst, false))) {
> -                    copy = virStorageSourceCopy(disk->mirror, false);
> -                    if (virStorageSourceInitChainElement(copy,
> -                                                         persistDisk->src,
> -                                                         true) < 0) {
> -                        VIR_WARN("Unable to update persistent definition "
> -                                 "on vm %s after block job",
> -                                 vm->def->name);
> -                        virStorageSourceFree(copy);
> -                        copy = NULL;
> -                        persistDisk = NULL;
> -                    }
> -                }
> -                if (copy) {
> +            if (vm->newDef &&
> +                (persistDisk = virDomainDiskByName(vm->newDef, disk->dst, false))) {
> +                virStorageSourcePtr copy = virStorageSourceCopy(disk->mirror, false);
> +                if (copy && virStorageSourceInitChainElement(copy,
> +                                                             persistDisk->src,
> +                                                             true) == 0) {a

The new code will result in a line exceeding 80 cols. Since it's not
very long, it's acceptable though.

>                      virStorageSourceFree(persistDisk->src);
>                      persistDisk->src = copy;
> +                } else {
> +                    VIR_WARN("Unable to update persistent definition "
> +                             "on vm %s after block job",
> +                             vm->def->name);
> +                    virStorageSourceFree(copy);
> +                    persistDisk = NULL;
>                  }
>              }
>  
> @@ -188,8 +182,8 @@ qemuBlockJobEventProcess(virQEMUDriverPtr driver,
>          if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0)
>              VIR_WARN("Unable to save status on vm %s after block job",
>                       vm->def->name);
> -        if (persistDisk && virDomainSaveConfig(cfg->configDir,
> -                                               vm->newDef) < 0)
> +        if (vm->persistent && persistDisk &&

I'm not quite sure how this would happen. If there isn't a persistent
configuration, how did we get to having the persistDisk object?

If this happened in some way, the problem then is that vm->newDef was
not freed or is present in any way so we should fix the origin and not
this symptom.

> +            virDomainSaveConfig(cfg->configDir, vm->newDef) < 0)
>              VIR_WARN("Unable to update persistent definition on vm %s "
>                       "after block job", vm->def->name);
>      }

Peter
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20160104/a837ae0d/attachment-0001.sig>


More information about the libvir-list mailing list