[libvirt] [PATCH] Add support for shared sanlock leases
Federico Simoncelli
fsimonce at redhat.com
Thu Jun 21 17:00:41 UTC 2012
On Thu, Jun 21, 2012 at 03:37:10PM +0100, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
>
> 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 at redhat.com>
> ---
> src/locking/lock_driver_sanlock.c | 38 +++++++++++--------------------
> src/locking/sanlock.conf | 7 ------
> src/locking/test_libvirt_sanlock.aug.in | 1 -
> 3 files changed, 13 insertions(+), 33 deletions(-)
>
> diff --git a/src/locking/lock_driver_sanlock.c b/src/locking/lock_driver_sanlock.c
> index 146aefd..16941c9 100644
> --- a/src/locking/lock_driver_sanlock.c
> +++ b/src/locking/lock_driver_sanlock.c
> @@ -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)
Just out of curiosity, you are using "!!" (both here and below) because
the compiler is complaining about the type?
> 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;
>
> diff --git a/src/locking/sanlock.conf b/src/locking/sanlock.conf
> index 19ab2b3..efc35ee 100644
> --- a/src/locking/sanlock.conf
> +++ b/src/locking/sanlock.conf
> @@ -52,10 +52,3 @@
> # 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
> diff --git a/src/locking/test_libvirt_sanlock.aug.in b/src/locking/test_libvirt_sanlock.aug.in
> index 1f05558..288f329 100644
> --- a/src/locking/test_libvirt_sanlock.aug.in
> +++ b/src/locking/test_libvirt_sanlock.aug.in
> @@ -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" }
> --
> 1.7.10.2
1 minor comment inline.
Looks good to me. Thanks!
ACK.
--
Federico
More information about the libvir-list
mailing list