diff options
author | Jiri Denemark <jdenemar@redhat.com> | 2013-12-20 15:08:06 +0100 |
---|---|---|
committer | Eric Blake <eblake@redhat.com> | 2014-01-15 11:01:56 -0700 |
commit | a5987e23d5ff7a79a5c382b964ce3132c593e36d (patch) | |
tree | 9265e9f1fa0330dbc2b7c5912c797b83d7efa511 | |
parent | da2d96d12521a20305d0ea3190539e1c4b367d75 (diff) | |
download | libvirt-a5987e23d5ff7a79a5c382b964ce3132c593e36d.tar.gz |
qemu: Fix job usage in qemuDomainBlockCopy
Every API that is going to begin a job should do that before fetching
data from vm->def.
(cherry picked from commit ff5f30b6bfa317f2a4c33f69289baf4e887eb048)
Conflicts:
src/qemu/qemu_driver.c - context
-rw-r--r-- | src/qemu/qemu_driver.c | 26 |
1 files changed, 11 insertions, 15 deletions
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 59e1c2f5b2..a603d5fbf7 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -13414,7 +13414,7 @@ qemuDomainBlockCopy(virDomainPtr dom, const char *path, virDomainObjPtr vm; qemuDomainObjPrivatePtr priv; char *device = NULL; - virDomainDiskDefPtr disk; + virDomainDiskDefPtr disk = NULL; int ret = -1; int idx; struct stat st; @@ -13431,10 +13431,14 @@ qemuDomainBlockCopy(virDomainPtr dom, const char *path, goto cleanup; priv = vm->privateData; cfg = virQEMUDriverGetConfig(driver); + + if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0) + goto cleanup; + if (!virDomainObjIsActive(vm)) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("domain is not running")); - goto cleanup; + goto endjob; } if (qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_DEVICES) && virCgroupForDomain(driver->cgroup, vm->def->name, &cgroup, 0) < 0) { @@ -13446,21 +13450,21 @@ qemuDomainBlockCopy(virDomainPtr dom, const char *path, device = qemuDiskPathToAlias(vm, path, &idx); if (!device) { - goto cleanup; + goto endjob; } disk = vm->def->disks[idx]; if (disk->mirror) { virReportError(VIR_ERR_BLOCK_COPY_ACTIVE, _("disk '%s' already in active block copy job"), disk->dst); - goto cleanup; + goto endjob; } if (!(virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DRIVE_MIRROR) && virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKJOB_ASYNC))) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("block copy is not supported with this QEMU binary")); - goto cleanup; + goto endjob; } if (vm->persistent) { /* XXX if qemu ever lets us start a new domain with mirroring @@ -13469,17 +13473,9 @@ qemuDomainBlockCopy(virDomainPtr dom, const char *path, * this on persistent domains. */ virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("domain is not transient")); - goto cleanup; - } - - if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0) - goto cleanup; - - if (!virDomainObjIsActive(vm)) { - virReportError(VIR_ERR_OPERATION_INVALID, "%s", - _("domain is not running")); goto endjob; } + if (qemuDomainDetermineDiskChain(driver, disk, false) < 0) goto endjob; @@ -13571,7 +13567,7 @@ qemuDomainBlockCopy(virDomainPtr dom, const char *path, endjob: if (need_unlink && unlink(dest)) VIR_WARN("unable to unlink just-created %s", dest); - if (ret < 0) + if (ret < 0 && disk) disk->mirrorFormat = VIR_STORAGE_FILE_NONE; VIR_FREE(mirror); if (qemuDomainObjEndJob(driver, vm) == 0) { |