]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: blockjob: Refuse to register blockjob if disk already has one
authorPeter Krempa <pkrempa@redhat.com>
Sat, 14 Sep 2019 07:40:29 +0000 (09:40 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 16 Sep 2019 09:50:28 +0000 (11:50 +0200)
Most code paths prevent starting a blockjob if we already have one but
the job registering function does not do this check. While this isn't a
problem for regular cases we had a bad test case where we registered two
jobs for a single disk which leaked one of the jobs. Prevent this in the
registering function until we allow having multiple jobs per disk.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
ACKed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
src/qemu/qemu_blockjob.c

index a991309ee71934201cf4775a0f7bf9c93e840e29..80d0269128d14e05d45eb96a8acaa1b714a17920 100644 (file)
@@ -143,6 +143,12 @@ qemuBlockJobRegister(qemuBlockJobDataPtr job,
 {
     qemuDomainObjPrivatePtr priv = vm->privateData;
 
+    if (disk && QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("disk '%s' has a blockjob assigned"), disk->dst);
+        return -1;
+    }
+
     if (virHashAddEntry(priv->blockjobs, job->name, virObjectRef(job)) < 0) {
         virObjectUnref(job);
         return -1;