summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiri Denemark <jdenemar@redhat.com>2013-12-20 15:08:06 +0100
committerEric Blake <eblake@redhat.com>2014-01-15 11:01:56 -0700
commita5987e23d5ff7a79a5c382b964ce3132c593e36d (patch)
tree9265e9f1fa0330dbc2b7c5912c797b83d7efa511
parentda2d96d12521a20305d0ea3190539e1c4b367d75 (diff)
downloadlibvirt-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.c26
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) {