From 0c710a37ea265dc7dfa0ebcebf1e21e4c6b2ea21 Mon Sep 17 00:00:00 2001 From: Jim Fehlig Date: Wed, 24 Jan 2018 14:23:04 -0700 Subject: [PATCH] libxl: resume lock process after failed migration During migration, the lock process is paused in the perform phase but not resumed if there is a subsequent failure, leaving the locked resource unprotected. The perform phase itself can fail, in which case the lock process should be resumed before returning from perform. The finish phase could also fail on the destination host, in which case the migration is canceled in the confirm phase and the VM is resumed. The lock process needs to be resumed there as well. Signed-off-by: Jim Fehlig --- src/libxl/libxl_migration.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/libxl/libxl_migration.c b/src/libxl/libxl_migration.c index 228c8508c4..a7a578c729 100644 --- a/src/libxl/libxl_migration.c +++ b/src/libxl/libxl_migration.c @@ -1238,6 +1238,12 @@ libxlDomainMigrationPerform(libxlDriverPrivatePtr driver, ret = libxlDoMigrateSend(driver, vm, flags, sockfd); virObjectLock(vm); + if (ret < 0) + virDomainLockProcessResume(driver->lockManager, + "xen:///system", + vm, + priv->lockState); + cleanup: VIR_FORCE_CLOSE(sockfd); virURIFree(uri); @@ -1349,10 +1355,16 @@ libxlDomainMigrationConfirm(libxlDriverPrivatePtr driver, int cancelled) { libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); + libxlDomainObjPrivatePtr priv = vm->privateData; virObjectEventPtr event = NULL; int ret = -1; if (cancelled) { + /* Resume lock process that was paused in MigrationPerform */ + virDomainLockProcessResume(driver->lockManager, + "xen:///system", + vm, + priv->lockState); if (libxl_domain_resume(cfg->ctx, vm->def->id, 1, 0) == 0) { ret = 0; } else { -- 2.47.2