[libvirt] [PATCHv5 13/28] locking: Add APIs to lock individual image files

Peter Krempa pkrempa at redhat.com
Fri Jul 4 11:29:28 UTC 2014


Add helper APIs to manage individual image files rather than disks. To
simplify the addition some parts of the code were refactored in this
patch.
---
 src/libvirt_private.syms  |  2 ++
 src/locking/domain_lock.c | 65 ++++++++++++++++++++++++++++++-----------------
 src/locking/domain_lock.h |  8 ++++++
 3 files changed, 52 insertions(+), 23 deletions(-)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 0bc4853..064db9f 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -861,6 +861,8 @@ virRegisterStorageDriver;
 # locking/domain_lock.h
 virDomainLockDiskAttach;
 virDomainLockDiskDetach;
+virDomainLockImageAttach;
+virDomainLockImageDetach;
 virDomainLockLeaseAttach;
 virDomainLockLeaseDetach;
 virDomainLockProcessInquire;
diff --git a/src/locking/domain_lock.c b/src/locking/domain_lock.c
index 78acaa6..d7b681e 100644
--- a/src/locking/domain_lock.c
+++ b/src/locking/domain_lock.c
@@ -68,14 +68,13 @@ static int virDomainLockManagerAddLease(virLockManagerPtr lock,
 }


-static int virDomainLockManagerAddDisk(virLockManagerPtr lock,
-                                       virDomainDiskDefPtr disk)
+static int virDomainLockManagerAddImage(virLockManagerPtr lock,
+                                        virStorageSourcePtr src)
 {
     unsigned int diskFlags = 0;
-    const char *src = virDomainDiskGetSource(disk);
-    int type = virDomainDiskGetType(disk);
+    int type = virStorageSourceGetActualType(src);

-    if (!src)
+    if (!src->path)
         return 0;

     if (!(type == VIR_STORAGE_TYPE_BLOCK ||
@@ -83,24 +82,25 @@ static int virDomainLockManagerAddDisk(virLockManagerPtr lock,
           type == VIR_STORAGE_TYPE_DIR))
         return 0;

-    if (disk->src->readonly)
+    if (src->readonly)
         diskFlags |= VIR_LOCK_MANAGER_RESOURCE_READONLY;
-    if (disk->src->shared)
+    if (src->shared)
         diskFlags |= VIR_LOCK_MANAGER_RESOURCE_SHARED;

-    VIR_DEBUG("Add disk %s", src);
+    VIR_DEBUG("Add disk %s", src->path);
     if (virLockManagerAddResource(lock,
                                   VIR_LOCK_MANAGER_RESOURCE_TYPE_DISK,
-                                  src,
+                                  src->path,
                                   0,
                                   NULL,
                                   diskFlags) < 0) {
-        VIR_DEBUG("Failed add disk %s", src);
+        VIR_DEBUG("Failed add disk %s", src->path);
         return -1;
     }
     return 0;
 }

+
 static virLockManagerPtr virDomainLockManagerNew(virLockManagerPluginPtr plugin,
                                                  const char *uri,
                                                  virDomainObjPtr dom,
@@ -148,9 +148,12 @@ static virLockManagerPtr virDomainLockManagerNew(virLockManagerPluginPtr plugin,
                 goto error;

         VIR_DEBUG("Adding disks");
-        for (i = 0; i < dom->def->ndisks; i++)
-            if (virDomainLockManagerAddDisk(lock, dom->def->disks[i]) < 0)
+        for (i = 0; i < dom->def->ndisks; i++) {
+            virDomainDiskDefPtr disk = dom->def->disks[i];
+
+            if (virDomainLockManagerAddImage(lock, disk->src) < 0)
                 goto error;
+        }
     }

     return lock;
@@ -247,21 +250,20 @@ int virDomainLockProcessInquire(virLockManagerPluginPtr plugin,
 }


-int virDomainLockDiskAttach(virLockManagerPluginPtr plugin,
-                            const char *uri,
-                            virDomainObjPtr dom,
-                            virDomainDiskDefPtr disk)
+int virDomainLockImageAttach(virLockManagerPluginPtr plugin,
+                             const char *uri,
+                             virDomainObjPtr dom,
+                             virStorageSourcePtr src)
 {
     virLockManagerPtr lock;
     int ret = -1;

-    VIR_DEBUG("plugin=%p dom=%p disk=%p",
-              plugin, dom, disk);
+    VIR_DEBUG("plugin=%p dom=%p src=%p", plugin, dom, src);

     if (!(lock = virDomainLockManagerNew(plugin, uri, dom, false)))
         return -1;

-    if (virDomainLockManagerAddDisk(lock, disk) < 0)
+    if (virDomainLockManagerAddImage(lock, src) < 0)
         goto cleanup;

     if (virLockManagerAcquire(lock, NULL, 0,
@@ -276,20 +278,29 @@ int virDomainLockDiskAttach(virLockManagerPluginPtr plugin,
     return ret;
 }

-int virDomainLockDiskDetach(virLockManagerPluginPtr plugin,
+
+int virDomainLockDiskAttach(virLockManagerPluginPtr plugin,
+                            const char *uri,
                             virDomainObjPtr dom,
                             virDomainDiskDefPtr disk)
 {
+    return virDomainLockImageAttach(plugin, uri, dom, disk->src);
+}
+
+
+int virDomainLockImageDetach(virLockManagerPluginPtr plugin,
+                             virDomainObjPtr dom,
+                             virStorageSourcePtr src)
+{
     virLockManagerPtr lock;
     int ret = -1;

-    VIR_DEBUG("plugin=%p dom=%p disk=%p",
-              plugin, dom, disk);
+    VIR_DEBUG("plugin=%p dom=%p src=%p", plugin, dom, src);

     if (!(lock = virDomainLockManagerNew(plugin, NULL, dom, false)))
         return -1;

-    if (virDomainLockManagerAddDisk(lock, disk) < 0)
+    if (virDomainLockManagerAddImage(lock, src) < 0)
         goto cleanup;

     if (virLockManagerRelease(lock, NULL, 0) < 0)
@@ -304,6 +315,14 @@ int virDomainLockDiskDetach(virLockManagerPluginPtr plugin,
 }


+int virDomainLockDiskDetach(virLockManagerPluginPtr plugin,
+                            virDomainObjPtr dom,
+                            virDomainDiskDefPtr disk)
+{
+    return virDomainLockImageDetach(plugin, dom, disk->src);
+}
+
+
 int virDomainLockLeaseAttach(virLockManagerPluginPtr plugin,
                              const char *uri,
                              virDomainObjPtr dom,
diff --git a/src/locking/domain_lock.h b/src/locking/domain_lock.h
index a9b19c8..fb49102 100644
--- a/src/locking/domain_lock.h
+++ b/src/locking/domain_lock.h
@@ -50,6 +50,14 @@ int virDomainLockDiskDetach(virLockManagerPluginPtr plugin,
                             virDomainObjPtr dom,
                             virDomainDiskDefPtr disk);

+int virDomainLockImageAttach(virLockManagerPluginPtr plugin,
+                             const char *uri,
+                             virDomainObjPtr dom,
+                             virStorageSourcePtr src);
+int virDomainLockImageDetach(virLockManagerPluginPtr plugin,
+                             virDomainObjPtr dom,
+                             virStorageSourcePtr src);
+
 int virDomainLockLeaseAttach(virLockManagerPluginPtr plugin,
                              const char *uri,
                              virDomainObjPtr dom,
-- 
1.9.3




More information about the libvir-list mailing list