]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Add support for shared sanlock leases
authorDaniel P. Berrange <berrange@redhat.com>
Thu, 21 Jun 2012 14:34:46 +0000 (15:34 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Mon, 25 Jun 2012 09:17:56 +0000 (10:17 +0100)
A sanlock lease can be marked as shared (rather
than exclusive)  using SANLK_RES_SHARED flag. This
adds support for that flag and ensures that in auto
disk mode, any shared disks use shared leases. This
also makes any read-only disks be completely
ignored.

These changes remove the need for the option

  ignore_readonly_and_shared_disks

so that is removed

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
src/locking/lock_driver_sanlock.c
src/locking/sanlock.conf
src/locking/test_libvirt_sanlock.aug.in

index 146aefd6489b7bad73bccf8a77e59c7f9a499e59..16941c90cb3940ad1f652d6370a9207ffe525309 100644 (file)
@@ -65,7 +65,6 @@ struct _virLockManagerSanlockDriver {
     bool requireLeaseForDisks;
     int hostID;
     bool autoDiskLease;
-    bool ignoreReadonlyShared;
     char *autoDiskLeasePath;
 };
 
@@ -115,10 +114,6 @@ static int virLockManagerSanlockLoadConfig(const char *configFile)
     CHECK_TYPE("auto_disk_leases", VIR_CONF_LONG);
     if (p) driver->autoDiskLease = p->l;
 
-    p = virConfGetValue(conf, "ignore_readonly_and_shared_disks");
-    CHECK_TYPE("ignore_readonly_and_shared_disks", VIR_CONF_LONG);
-    if (p) driver->ignoreReadonlyShared = p->l;
-
     p = virConfGetValue(conf, "disk_lease_dir");
     CHECK_TYPE("disk_lease_dir", VIR_CONF_STRING);
     if (p && p->str) {
@@ -428,7 +423,8 @@ static int virLockManagerSanlockDiskLeaseName(const char *path,
 static int virLockManagerSanlockAddLease(virLockManagerPtr lock,
                                          const char *name,
                                          size_t nparams,
-                                         virLockManagerParamPtr params)
+                                         virLockManagerParamPtr params,
+                                         bool shared)
 {
     virLockManagerSanlockPrivatePtr priv = lock->privateData;
     int ret = -1;
@@ -440,6 +436,7 @@ static int virLockManagerSanlockAddLease(virLockManagerPtr lock,
         goto cleanup;
     }
 
+    res->flags = shared ? SANLK_RES_SHARED : 0;
     res->num_disks = 1;
     if (!virStrcpy(res->name, name, SANLK_NAME_LEN)) {
         virLockError(VIR_ERR_INTERNAL_ERROR,
@@ -485,7 +482,8 @@ cleanup:
 static int virLockManagerSanlockAddDisk(virLockManagerPtr lock,
                                         const char *name,
                                         size_t nparams,
-                                        virLockManagerParamPtr params ATTRIBUTE_UNUSED)
+                                        virLockManagerParamPtr params ATTRIBUTE_UNUSED,
+                                        bool shared)
 {
     virLockManagerSanlockPrivatePtr priv = lock->privateData;
     int ret = -1;
@@ -503,6 +501,7 @@ static int virLockManagerSanlockAddDisk(virLockManagerPtr lock,
         goto cleanup;
     }
 
+    res->flags = shared ? SANLK_RES_SHARED : 0;
     res->num_disks = 1;
     if (virLockManagerSanlockDiskLeaseName(name, res->name, SANLK_NAME_LEN) < 0)
         goto cleanup;
@@ -630,27 +629,15 @@ static int virLockManagerSanlockAddResource(virLockManagerPtr lock,
         return -1;
     }
 
-    if ((flags & (VIR_LOCK_MANAGER_RESOURCE_READONLY |
-                  VIR_LOCK_MANAGER_RESOURCE_SHARED)) &&
-        driver->ignoreReadonlyShared) {
-            return 0;
-    }
-
-    if (flags & VIR_LOCK_MANAGER_RESOURCE_READONLY) {
-        virLockError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                     _("Readonly leases are not supported"));
-        return -1;
-    }
-    if (flags & VIR_LOCK_MANAGER_RESOURCE_SHARED) {
-        virLockError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                     _("Shareable leases are not supported"));
-        return -1;
-    }
+    /* Treat R/O resources as a no-op lock request */
+    if (flags & VIR_LOCK_MANAGER_RESOURCE_READONLY)
+        return 0;
 
     switch (type) {
     case VIR_LOCK_MANAGER_RESOURCE_TYPE_DISK:
         if (driver->autoDiskLease) {
-            if (virLockManagerSanlockAddDisk(lock, name, nparams, params) < 0)
+            if (virLockManagerSanlockAddDisk(lock, name, nparams, params,
+                                             !!(flags & VIR_LOCK_MANAGER_RESOURCE_SHARED)) < 0)
                 return -1;
 
             if (virLockManagerSanlockCreateLease(priv->res_args[priv->res_count-1]) < 0)
@@ -664,7 +651,8 @@ static int virLockManagerSanlockAddResource(virLockManagerPtr lock,
         break;
 
     case VIR_LOCK_MANAGER_RESOURCE_TYPE_LEASE:
-        if (virLockManagerSanlockAddLease(lock, name, nparams, params) < 0)
+        if (virLockManagerSanlockAddLease(lock, name, nparams, params,
+                                          !!(flags & VIR_LOCK_MANAGER_RESOURCE_SHARED)) < 0)
             return -1;
         break;
 
index 19ab2b31887d36c83791ed98148f656bc7fe9479..efc35ee7285f9e9865532b27a2d78366f7246b2a 100644 (file)
 # to enabled, otherwise it defaults to disabled.
 #
 #require_lease_for_disks = 1
-
-#
-# Enable this flag to have sanlock ignore readonly and shared disks.
-# If disabled, then this rejects attempts to share resources until
-# sanlock gains support for shared locks.
-#
-#ignore_readonly_and_shared_disks = 1
index 1f055589424ebad3df20d64aa22a0039fad444b7..288f32995306c6ba9666c6db2ac580660d13b192 100644 (file)
@@ -6,4 +6,3 @@ module Test_libvirt_sanlock =
 { "disk_lease_dir" = "/var/lib/libvirt/sanlock" }
 { "host_id" = "1" }
 { "require_lease_for_disks" = "1" }
-{ "ignore_readonly_and_shared_disks" = "1" }