[libvirt] [PATCH 6/6] qemu: blockjob: Fix locking of block copy/active block commit

Peter Krempa pkrempa at redhat.com
Fri Dec 16 16:24:58 UTC 2016


For the blockjobs, where libvirt is able to track the state internally
we can fix locking of images we can remove the appropriate locks.

Also when doing a pivoting operation we should not acquire the lock on
any of those images since both are actually locked already.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1302168
---
 src/qemu/qemu_blockjob.c | 26 ++++++++++++++++----------
 src/qemu/qemu_driver.c   |  4 +---
 2 files changed, 17 insertions(+), 13 deletions(-)

diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c
index 83a5a3f7c..4ada4cd27 100644
--- a/src/qemu/qemu_blockjob.c
+++ b/src/qemu/qemu_blockjob.c
@@ -33,6 +33,7 @@
 #include "virstoragefile.h"
 #include "virthread.h"
 #include "virtime.h"
+#include "locking/domain_lock.h"

 #define VIR_FROM_THIS VIR_FROM_QEMU

@@ -139,17 +140,19 @@ qemuBlockJobEventProcess(virQEMUDriverPtr driver,
                 }
             }

-            /* XXX We want to revoke security labels and disk
-             * lease, as well as audit that revocation, before
-             * dropping the original source.  But it gets tricky
-             * if both source and mirror share common backing
-             * files (we want to only revoke the non-shared
-             * portion of the chain); so for now, we leak the
-             * access to the original.  */
+            /* XXX We want to revoke security labels as well as audit that
+             * revocation, before dropping the original source.  But it gets
+             * tricky if both source and mirror share common backing files (we
+             * want to only revoke the non-shared portion of the chain); so for
+             * now, we leak the access to the original.  */
+            virDomainLockImageDetach(driver->lockManager, vm, disk->src);
             virStorageSourceFree(disk->src);
             disk->src = disk->mirror;
         } else {
-            virStorageSourceFree(disk->mirror);
+            if (disk->mirror) {
+                virDomainLockImageDetach(driver->lockManager, vm, disk->mirror);
+                virStorageSourceFree(disk->mirror);
+            }
         }

         /* Recompute the cached backing chain to match our
@@ -172,8 +175,11 @@ qemuBlockJobEventProcess(virQEMUDriverPtr driver,

     case VIR_DOMAIN_BLOCK_JOB_FAILED:
     case VIR_DOMAIN_BLOCK_JOB_CANCELED:
-        virStorageSourceFree(disk->mirror);
-        disk->mirror = NULL;
+        if (disk->mirror) {
+            virDomainLockImageDetach(driver->lockManager, vm, disk->mirror);
+            virStorageSourceFree(disk->mirror);
+            disk->mirror = NULL;
+        }
         disk->mirrorState = VIR_DOMAIN_DISK_MIRROR_STATE_NONE;
         disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_UNKNOWN;
         save = true;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 13da035c2..dcb010e9a 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -16206,9 +16206,7 @@ qemuDomainBlockPivot(virQEMUDriverPtr driver,

         if (disk->mirror->format &&
             disk->mirror->format != VIR_STORAGE_FILE_RAW &&
-            (virDomainLockDiskAttach(driver->lockManager, cfg->uri, vm,
-                                     disk) < 0 ||
-             qemuDomainNamespaceSetupDisk(driver, vm, disk) < 0 ||
+            (qemuDomainNamespaceSetupDisk(driver, vm, disk) < 0 ||
              qemuSetupDiskCgroup(vm, disk) < 0 ||
              qemuSecuritySetDiskLabel(driver, vm, disk) < 0))
             goto cleanup;
-- 
2.11.0




More information about the libvir-list mailing list