fail=1
fi])
if test "x$with_sanlock" != "xno" ; then
- AC_CHECK_LIB([sanlock], [sanlock_acquire],[
+ AC_CHECK_LIB([sanlock], [sanlock_restrict],[
SANLOCK_LIBS="$SANLOCK_LIBS -lsanlock"
with_sanlock=yes
],[
{
virLockManagerPtr lock = virDomainLockManagerNew(plugin, dom, true);
int ret;
+ int flags = VIR_LOCK_MANAGER_ACQUIRE_RESTRICT;
+
if (paused)
- ret = virLockManagerAcquire(lock, NULL, VIR_LOCK_MANAGER_ACQUIRE_REGISTER_ONLY);
- else
- ret = virLockManagerAcquire(lock, NULL, 0);
+ flags |= VIR_LOCK_MANAGER_ACQUIRE_REGISTER_ONLY;
+
+ ret = virLockManagerAcquire(lock, NULL, flags);
virLockManagerFree(lock);
typedef enum {
/* Don't acquire the resources, just register the object PID */
- VIR_LOCK_MANAGER_ACQUIRE_REGISTER_ONLY = (1 << 0)
+ VIR_LOCK_MANAGER_ACQUIRE_REGISTER_ONLY = (1 << 0),
+ /* Prevent further lock/unlock calls from this process */
+ VIR_LOCK_MANAGER_ACQUIRE_RESTRICT = (1 << 1),
} virLockManagerAcquireFlags;
enum {
int rv;
int i;
- virCheckFlags(VIR_LOCK_MANAGER_ACQUIRE_REGISTER_ONLY, -1);
+ virCheckFlags(VIR_LOCK_MANAGER_ACQUIRE_RESTRICT |
+ VIR_LOCK_MANAGER_ACQUIRE_REGISTER_ONLY, -1);
if (priv->res_count == 0 &&
priv->hasRWDisks) {
virSetInherit(sock, true) < 0)
goto error;
+ if (flags & VIR_LOCK_MANAGER_ACQUIRE_RESTRICT) {
+ if ((rv = sanlock_restrict(sock, SANLK_RESTRICT_ALL)) < 0) {
+ if (rv <= -200)
+ virLockError(VIR_ERR_INTERNAL_ERROR,
+ _("Failed to restrict process: error %d"), rv);
+ else
+ virReportSystemError(-rv, "%s",
+ _("Failed to restrict process"));
+ goto error;
+ }
+ }
+
VIR_DEBUG("Acquire completed fd=%d", sock);
if (res_free) {