]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
locking: Add APIs to lock individual image files
authorPeter Krempa <pkrempa@redhat.com>
Mon, 23 Jun 2014 13:16:46 +0000 (15:16 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 9 Jul 2014 08:38:56 +0000 (10:38 +0200)
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
src/locking/domain_lock.c
src/locking/domain_lock.h

index b0dfcfba13b27306e6643299468780bcb3064512..16eb5d3351bdb628877be61d52b0672786c5fb76 100644 (file)
@@ -862,6 +862,8 @@ virRegisterStorageDriver;
 # locking/domain_lock.h
 virDomainLockDiskAttach;
 virDomainLockDiskDetach;
+virDomainLockImageAttach;
+virDomainLockImageDetach;
 virDomainLockLeaseAttach;
 virDomainLockLeaseDetach;
 virDomainLockProcessInquire;
index 78acaa60614156fe65874a5698bb086c3f026120..d7b681e74e9c6b35e6a893e43f4771bf35578225 100644 (file)
@@ -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,
index a9b19c865d30e7864de7930fae17c412dfc61718..fb4910230c5d57283aa525a787b1756bf6ff7b42 100644 (file)
@@ -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,