From: Peter Krempa <pkrempa@redhat.com> 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 <pkrempa@redhat.com> --- 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