From: Peter Krempa <[email protected]>

Blockjobs break when automatic disk locking is in use. Add an API to
query whether that's the case so that we can forbid blockjobs.

Signed-off-by: Peter Krempa <[email protected]>
---
 src/libvirt_private.syms          |  1 +
 src/locking/lock_driver.h         | 10 ++++++++++
 src/locking/lock_driver_lockd.c   |  9 +++++++++
 src/locking/lock_driver_sanlock.c |  9 +++++++++
 src/locking/lock_manager.c        | 10 ++++++++++
 src/locking/lock_manager.h        |  2 ++
 6 files changed, 41 insertions(+)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index be073ced43..38375109f8 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1838,6 +1838,7 @@ virLockManagerAddResource;
 virLockManagerFree;
 virLockManagerInquire;
 virLockManagerNew;
+virLockManagerPluginAutoDiskLeases;
 virLockManagerPluginGetName;
 virLockManagerPluginNew;
 virLockManagerPluginRef;
diff --git a/src/locking/lock_driver.h b/src/locking/lock_driver.h
index 087a918882..ded6090033 100644
--- a/src/locking/lock_driver.h
+++ b/src/locking/lock_driver.h
@@ -281,6 +281,14 @@ typedef int (*virLockDriverInquire)(virLockManager *man,
                                     unsigned int flags);


+/**
+ * virLockDriverAutoDiskLeases:
+ *
+ * Returns 'true' if automatic disk leases are in use.
+ */
+typedef bool (*virLockDriverAutoDiskLeases)(void);
+
+
 struct _virLockManager {
     virLockDriver *driver;
     void *privateData;
@@ -309,4 +317,6 @@ struct _virLockDriver {
     virLockDriverAcquire drvAcquire;
     virLockDriverRelease drvRelease;
     virLockDriverInquire drvInquire;
+
+    virLockDriverAutoDiskLeases drvAutoDiskLeases;
 };
diff --git a/src/locking/lock_driver_lockd.c b/src/locking/lock_driver_lockd.c
index 09149bded5..0a03eeeada 100644
--- a/src/locking/lock_driver_lockd.c
+++ b/src/locking/lock_driver_lockd.c
@@ -775,6 +775,13 @@ static int virLockManagerLockDaemonInquire(virLockManager 
*lock G_GNUC_UNUSED,
     return 0;
 }

+
+static bool virLockManagerLockDaemonAutoDiskLease(void)
+{
+    return driver->autoDiskLease;
+}
+
+
 virLockDriver virLockDriverImpl =
 {
     .version = VIR_LOCK_MANAGER_VERSION,
@@ -792,4 +799,6 @@ virLockDriver virLockDriverImpl =
     .drvRelease = virLockManagerLockDaemonRelease,

     .drvInquire = virLockManagerLockDaemonInquire,
+
+    .drvAutoDiskLeases = virLockManagerLockDaemonAutoDiskLease,
 };
diff --git a/src/locking/lock_driver_sanlock.c 
b/src/locking/lock_driver_sanlock.c
index a07f3652c1..2e4cfaf548 100644
--- a/src/locking/lock_driver_sanlock.c
+++ b/src/locking/lock_driver_sanlock.c
@@ -1098,6 +1098,13 @@ static int virLockManagerSanlockInquire(virLockManager 
*lock,
     return 0;
 }

+
+static bool virLockManagerSandlocAutoDiskLease(void)
+{
+    return sanlockDriver->autoDiskLease;
+}
+
+
 virLockDriver virLockDriverImpl =
 {
     .version = VIR_LOCK_MANAGER_VERSION,
@@ -1115,4 +1122,6 @@ virLockDriver virLockDriverImpl =
     .drvAcquire = virLockManagerSanlockAcquire,
     .drvRelease = virLockManagerSanlockRelease,
     .drvInquire = virLockManagerSanlockInquire,
+
+    .drvAutoDiskLeases = virLockManagerSandlocAutoDiskLease,
 };
diff --git a/src/locking/lock_manager.c b/src/locking/lock_manager.c
index 6f5a7efdbc..70b1c6c286 100644
--- a/src/locking/lock_manager.c
+++ b/src/locking/lock_manager.c
@@ -277,6 +277,16 @@ virLockDriver 
*virLockManagerPluginGetDriver(virLockManagerPlugin *plugin)
     return plugin->driver;
 }

+bool virLockManagerPluginAutoDiskLeases(virLockManagerPlugin *plugin)
+{
+    VIR_DEBUG("plugin=%p", plugin);
+
+    if (!plugin->driver->drvAutoDiskLeases())
+        return false;
+
+    return plugin->driver->drvAutoDiskLeases();
+}
+
 /**
  * virLockManagerNew:
  * @driver: the lock manager implementation to use
diff --git a/src/locking/lock_manager.h b/src/locking/lock_manager.h
index 774931f7d6..814a8cabde 100644
--- a/src/locking/lock_manager.h
+++ b/src/locking/lock_manager.h
@@ -38,6 +38,8 @@ bool virLockManagerPluginUsesState(virLockManagerPlugin 
*plugin);

 virLockDriver *virLockManagerPluginGetDriver(virLockManagerPlugin *plugin);

+bool virLockManagerPluginAutoDiskLeases(virLockManagerPlugin *plugin);
+
 virLockManager *virLockManagerNew(virLockDriver *driver,
                                     unsigned int type,
                                     size_t nparams,
-- 
2.54.0

Reply via email to