File 64370c4b-libxl-MigrateBegin.patch of Package libvirt.8367

commit 64370c4b81f04ca73c195854966c6740e01483f2
Author: Jim Fehlig <jfehlig@suse.com>
Date:   Mon Mar 12 11:51:43 2018 -0600

    libxl: MigrateBegin: Dont call EndAPI in helper function
    
    The libxlDomainMigrateBegin3Params API locks and ref counts the associated
    virDomainObj but relies on the helper function libxlDomainMigrationBegin
    to unref/unlock the object. libxlDomainMigrationBegin is also used by
    libxlDomainMigratePerform3Params for p2p migration, but in that case the
    lock/ref and unref/unlock are properly handled in the API entry point. So
    p2p migrations suffer a double unref/unlock in the Perform API.
    
    Remove the unref/unlock (virDomainObjEndAPI) from libxlDomainMigrationBegin
    and adjust libxlDomainMigrateBegin3Params to properly unref/unlock
    the virDomainObj on success and error paths.
    
    Signed-off-by: Jim Fehlig <jfehlig@suse.com>
    Reviewed-by: John Ferlan <jferlan@redhat.com>

Index: libvirt-4.0.0/src/libxl/libxl_driver.c
===================================================================
--- libvirt-4.0.0.orig/src/libxl/libxl_driver.c
+++ libvirt-4.0.0/src/libxl/libxl_driver.c
@@ -5878,6 +5878,7 @@ libxlDomainMigrateBegin3Params(virDomain
 {
     const char *xmlin = NULL;
     virDomainObjPtr vm = NULL;
+    char *xmlout = NULL;
 
 #ifdef LIBXL_HAVE_NO_SUSPEND_RESUME
     virReportUnsupportedError();
@@ -5897,25 +5898,26 @@ libxlDomainMigrateBegin3Params(virDomain
         return NULL;
 
     if (STREQ_NULLABLE(vm->def->name, "Domain-0")) {
-            virReportError(VIR_ERR_OPERATION_INVALID, "%s",
-                           _("Domain-0 cannot be migrated"));
-            return NULL;
+        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                       _("Domain-0 cannot be migrated"));
+        goto cleanup;
     }
 
-    if (virDomainMigrateBegin3ParamsEnsureACL(domain->conn, vm->def) < 0) {
-        virObjectUnlock(vm);
-        return NULL;
-    }
+    if (virDomainMigrateBegin3ParamsEnsureACL(domain->conn, vm->def) < 0)
+        goto cleanup;
 
     if (!virDomainObjIsActive(vm)) {
         virReportError(VIR_ERR_OPERATION_INVALID,
                        "%s", _("domain is not running"));
-        virObjectUnlock(vm);
-        return NULL;
+        goto cleanup;
     }
 
-    return libxlDomainMigrationBegin(domain->conn, vm, xmlin,
-                                     cookieout, cookieoutlen);
+    xmlout = libxlDomainMigrationBegin(domain->conn, vm, xmlin,
+                                       cookieout, cookieoutlen);
+
+ cleanup:
+    virDomainObjEndAPI(&vm);
+    return xmlout;
 }
 
 static int
Index: libvirt-4.0.0/src/libxl/libxl_migration.c
===================================================================
--- libvirt-4.0.0.orig/src/libxl/libxl_migration.c
+++ libvirt-4.0.0/src/libxl/libxl_migration.c
@@ -443,7 +443,6 @@ libxlDomainMigrationBegin(virConnectPtr
 
  cleanup:
     libxlMigrationCookieFree(mig);
-    virDomainObjEndAPI(&vm);
     virDomainDefFree(tmpdef);
     virObjectUnref(cfg);
     return xml;