]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
locking: Add support for lock failure action
authorJiri Denemark <jdenemar@redhat.com>
Tue, 18 Sep 2012 11:40:13 +0000 (13:40 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Thu, 11 Oct 2012 12:41:42 +0000 (14:41 +0200)
src/Makefile.am
src/locking/domain_lock.c
src/locking/lock_driver.h
src/locking/lock_driver_nop.c
src/locking/lock_driver_sanlock.c
src/locking/lock_manager.c
src/locking/lock_manager.h

index 34bc75c48e573060e624c753eafe2eab682de055..0aefc024eed202c06aca848a98b2af0f10e485f9 100644 (file)
@@ -1502,7 +1502,7 @@ lockdriverdir = $(libdir)/libvirt/lock-driver
 lockdriver_LTLIBRARIES = sanlock.la
 
 sanlock_la_SOURCES = $(LOCK_DRIVER_SANLOCK_SOURCES)
-sanlock_la_CFLAGS = $(AM_CFLAGS)
+sanlock_la_CFLAGS = -I$(top_srcdir)/src/conf $(AM_CFLAGS)
 sanlock_la_LDFLAGS = -module -avoid-version
 sanlock_la_LIBADD = -lsanlock_client \
                ../gnulib/lib/libgnu.la
index 9d6fd6a6e88f738d6ddb4d7e53bd1548825fd652..1e3da5fa5a4e96377855055bd411b6961a141f79 100644 (file)
@@ -175,7 +175,8 @@ int virDomainLockProcessStart(virLockManagerPluginPtr plugin,
     if (paused)
         flags |= VIR_LOCK_MANAGER_ACQUIRE_REGISTER_ONLY;
 
-    ret = virLockManagerAcquire(lock, NULL, flags, fd);
+    ret = virLockManagerAcquire(lock, NULL, flags,
+                                dom->def->onLockFailure, fd);
 
     virLockManagerFree(lock);
 
@@ -215,7 +216,7 @@ int virDomainLockProcessResume(virLockManagerPluginPtr plugin,
     if (!(lock = virDomainLockManagerNew(plugin, uri, dom, true)))
         return -1;
 
-    ret = virLockManagerAcquire(lock, state, 0, NULL);
+    ret = virLockManagerAcquire(lock, state, 0, dom->def->onLockFailure, NULL);
     virLockManagerFree(lock);
 
     return ret;
@@ -258,7 +259,8 @@ int virDomainLockDiskAttach(virLockManagerPluginPtr plugin,
     if (virDomainLockManagerAddDisk(lock, disk) < 0)
         goto cleanup;
 
-    if (virLockManagerAcquire(lock, NULL, 0, NULL) < 0)
+    if (virLockManagerAcquire(lock, NULL, 0,
+                              dom->def->onLockFailure, NULL) < 0)
         goto cleanup;
 
     ret = 0;
@@ -314,7 +316,8 @@ int virDomainLockLeaseAttach(virLockManagerPluginPtr plugin,
     if (virDomainLockManagerAddLease(lock, lease) < 0)
         goto cleanup;
 
-    if (virLockManagerAcquire(lock, NULL, 0, NULL) < 0)
+    if (virLockManagerAcquire(lock, NULL, 0,
+                              dom->def->onLockFailure, NULL) < 0)
         goto cleanup;
 
     ret = 0;
index 8fe7ceb5765126515bc56f8878ddd371111e4692..e8ee226c54b63d291a2d6816ba7cf7f514ba7ce1 100644 (file)
@@ -23,6 +23,7 @@
 # define __VIR_PLUGINS_LOCK_DRIVER_H__
 
 # include "internal.h"
+# include "domain_conf.h"
 
 typedef struct _virLockManager virLockManager;
 typedef virLockManager *virLockManagerPtr;
@@ -218,12 +219,13 @@ typedef int (*virLockDriverAddResource)(virLockManagerPtr man,
  * @manager: the lock manager context
  * @state: the current lock state
  * @flags: optional flags, currently unused
+ * @action: action to take when lock is lost
  * @fd: optional return the leaked FD
  *
  * Start managing resources for the object. This
  * must be called from the PID that represents the
  * object to be managed. If the lock is lost at any
- * time, the PID will be killed off by the lock manager.
+ * time, the specified action will be taken.
  * The optional state contains information about the
  * locks previously held for the object.
  *
@@ -237,6 +239,7 @@ typedef int (*virLockDriverAddResource)(virLockManagerPtr man,
 typedef int (*virLockDriverAcquire)(virLockManagerPtr man,
                                     const char *state,
                                     unsigned int flags,
+                                    virDomainLockFailureAction action,
                                     int *fd);
 
 /**
index 7f6cdcad13d279684cf94b524cc64979e9f0bbd4..c9ab806f0dfccdc13f93280118e9f745cf91674e 100644 (file)
@@ -69,6 +69,7 @@ static int virLockManagerNopAddResource(virLockManagerPtr lock ATTRIBUTE_UNUSED,
 static int virLockManagerNopAcquire(virLockManagerPtr lock ATTRIBUTE_UNUSED,
                                     const char *state ATTRIBUTE_UNUSED,
                                     unsigned int flags_unused ATTRIBUTE_UNUSED,
+                                    virDomainLockFailureAction action ATTRIBUTE_UNUSED,
                                     int *fd ATTRIBUTE_UNUSED)
 {
     return 0;
index 113fd479c767583724c9f9185d3d42e427dfc3d6..8c0ac8c6367b58249353b87d5d9c4f5fe664499a 100644 (file)
@@ -686,6 +686,7 @@ static int virLockManagerSanlockAddResource(virLockManagerPtr lock,
 static int virLockManagerSanlockAcquire(virLockManagerPtr lock,
                                         const char *state,
                                         unsigned int flags,
+                                        virDomainLockFailureAction action ATTRIBUTE_UNUSED,
                                         int *fd)
 {
     virLockManagerSanlockPrivatePtr priv = lock->privateData;
index 23126c9dbf773370b48f25ca057436567ded69ce..423997b5eab6a107b34a70e5452a880e6f8cc3bb 100644 (file)
@@ -347,17 +347,18 @@ int virLockManagerAddResource(virLockManagerPtr lock,
 int virLockManagerAcquire(virLockManagerPtr lock,
                           const char *state,
                           unsigned int flags,
+                          virDomainLockFailureAction action,
                           int *fd)
 {
-    VIR_DEBUG("lock=%p state='%s' flags=%x fd=%p",
-              lock, NULLSTR(state), flags, fd);
+    VIR_DEBUG("lock=%p state='%s' flags=%x action=%d fd=%p",
+              lock, NULLSTR(state), flags, action, fd);
 
     CHECK_MANAGER(drvAcquire, -1);
 
     if (fd)
         *fd = -1;
 
-    return lock->driver->drvAcquire(lock, state, flags, fd);
+    return lock->driver->drvAcquire(lock, state, flags, action, fd);
 }
 
 
index d955ee080e342a5875e7447c8c5135bd5b2fca4c..4fee12d6743b115173da2c0531981d70a8f817a2 100644 (file)
@@ -56,6 +56,7 @@ int virLockManagerAddResource(virLockManagerPtr manager,
 int virLockManagerAcquire(virLockManagerPtr manager,
                           const char *state,
                           unsigned int flags,
+                          virDomainLockFailureAction action,
                           int *fd);
 int virLockManagerRelease(virLockManagerPtr manager,
                           char **state,