2011-01-31 10:47:03 +00:00
|
|
|
/*
|
|
|
|
* qemu_migration.h: QEMU migration handling
|
|
|
|
*
|
qemu: completely rework reference counting
There is one problem that causes various errors in the daemon. When
domain is waiting for a job, it is unlocked while waiting on the
condition. However, if that domain is for example transient and being
removed in another API (e.g. cancelling incoming migration), it get's
unref'd. If the first call, that was waiting, fails to get the job, it
unref's the domain object, and because it was the last reference, it
causes clearing of the whole domain object. However, when finishing the
call, the domain must be unlocked, but there is no way for the API to
know whether it was cleaned or not (unless there is some ugly temporary
variable, but let's scratch that).
The root cause is that our APIs don't ref the objects they are using and
all use the implicit reference that the object has when it is in the
domain list. That reference can be removed when the API is waiting for
a job. And because each domain doesn't do its ref'ing, it results in
the ugly checking of the return value of virObjectUnref() that we have
everywhere.
This patch changes qemuDomObjFromDomain() to ref the domain (using
virDomainObjListFindByUUIDRef()) and adds qemuDomObjEndAPI() which
should be the only function in which the return value of
virObjectUnref() is checked. This makes all reference counting
deterministic and makes the code a bit clearer.
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
2014-12-04 13:41:36 +00:00
|
|
|
* Copyright (C) 2006-2011, 2014 Red Hat, Inc.
|
2011-01-31 10:47:03 +00:00
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
2012-09-20 22:30:55 +00:00
|
|
|
* License along with this library. If not, see
|
2012-07-21 10:06:23 +00:00
|
|
|
* <http://www.gnu.org/licenses/>.
|
2011-01-31 10:47:03 +00:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __QEMU_MIGRATION_H__
|
|
|
|
# define __QEMU_MIGRATION_H__
|
|
|
|
|
|
|
|
# include "qemu_conf.h"
|
2011-07-19 00:27:30 +00:00
|
|
|
# include "qemu_domain.h"
|
2011-01-31 10:47:03 +00:00
|
|
|
|
2016-04-14 10:33:48 +00:00
|
|
|
typedef struct _qemuMigrationCompression qemuMigrationCompression;
|
|
|
|
typedef qemuMigrationCompression *qemuMigrationCompressionPtr;
|
|
|
|
|
2011-07-14 21:46:49 +00:00
|
|
|
/* All supported qemu migration flags. */
|
|
|
|
# define QEMU_MIGRATION_FLAGS \
|
|
|
|
(VIR_MIGRATE_LIVE | \
|
|
|
|
VIR_MIGRATE_PEER2PEER | \
|
|
|
|
VIR_MIGRATE_TUNNELLED | \
|
|
|
|
VIR_MIGRATE_PERSIST_DEST | \
|
|
|
|
VIR_MIGRATE_UNDEFINE_SOURCE | \
|
|
|
|
VIR_MIGRATE_PAUSED | \
|
|
|
|
VIR_MIGRATE_NON_SHARED_DISK | \
|
2011-07-19 00:27:32 +00:00
|
|
|
VIR_MIGRATE_NON_SHARED_INC | \
|
2012-02-21 12:20:06 +00:00
|
|
|
VIR_MIGRATE_CHANGE_PROTECTION | \
|
2012-11-21 08:28:49 +00:00
|
|
|
VIR_MIGRATE_UNSAFE | \
|
2013-01-14 11:45:20 +00:00
|
|
|
VIR_MIGRATE_OFFLINE | \
|
2013-06-12 14:11:21 +00:00
|
|
|
VIR_MIGRATE_COMPRESSED | \
|
2014-02-06 23:44:36 +00:00
|
|
|
VIR_MIGRATE_ABORT_ON_ERROR | \
|
2014-01-13 06:28:12 +00:00
|
|
|
VIR_MIGRATE_AUTO_CONVERGE | \
|
2014-12-01 15:59:55 +00:00
|
|
|
VIR_MIGRATE_RDMA_PIN_ALL | \
|
|
|
|
VIR_MIGRATE_POSTCOPY)
|
2011-01-31 10:47:03 +00:00
|
|
|
|
2013-06-25 13:49:21 +00:00
|
|
|
/* All supported migration parameters and their types. */
|
2015-06-15 22:42:10 +00:00
|
|
|
# define QEMU_MIGRATION_PARAMETERS \
|
|
|
|
VIR_MIGRATE_PARAM_URI, VIR_TYPED_PARAM_STRING, \
|
|
|
|
VIR_MIGRATE_PARAM_DEST_NAME, VIR_TYPED_PARAM_STRING, \
|
|
|
|
VIR_MIGRATE_PARAM_DEST_XML, VIR_TYPED_PARAM_STRING, \
|
|
|
|
VIR_MIGRATE_PARAM_BANDWIDTH, VIR_TYPED_PARAM_ULLONG, \
|
|
|
|
VIR_MIGRATE_PARAM_GRAPHICS_URI, VIR_TYPED_PARAM_STRING, \
|
|
|
|
VIR_MIGRATE_PARAM_LISTEN_ADDRESS, VIR_TYPED_PARAM_STRING, \
|
|
|
|
VIR_MIGRATE_PARAM_MIGRATE_DISKS, VIR_TYPED_PARAM_STRING | \
|
|
|
|
VIR_TYPED_PARAM_MULTIPLE, \
|
2016-03-17 14:58:48 +00:00
|
|
|
VIR_MIGRATE_PARAM_DISKS_PORT, VIR_TYPED_PARAM_INT, \
|
2016-04-14 10:33:48 +00:00
|
|
|
VIR_MIGRATE_PARAM_COMPRESSION, VIR_TYPED_PARAM_STRING | \
|
|
|
|
VIR_TYPED_PARAM_MULTIPLE, \
|
2016-04-14 10:33:51 +00:00
|
|
|
VIR_MIGRATE_PARAM_COMPRESSION_MT_LEVEL, VIR_TYPED_PARAM_INT, \
|
|
|
|
VIR_MIGRATE_PARAM_COMPRESSION_MT_THREADS, VIR_TYPED_PARAM_INT, \
|
|
|
|
VIR_MIGRATE_PARAM_COMPRESSION_MT_DTHREADS, VIR_TYPED_PARAM_INT, \
|
|
|
|
VIR_MIGRATE_PARAM_COMPRESSION_XBZRLE_CACHE, VIR_TYPED_PARAM_ULLONG, \
|
2016-03-17 16:31:45 +00:00
|
|
|
VIR_MIGRATE_PARAM_PERSIST_XML, VIR_TYPED_PARAM_STRING, \
|
2013-06-25 13:49:21 +00:00
|
|
|
NULL
|
|
|
|
|
|
|
|
|
2014-06-15 16:32:56 +00:00
|
|
|
typedef enum {
|
2011-07-19 00:27:30 +00:00
|
|
|
QEMU_MIGRATION_PHASE_NONE = 0,
|
|
|
|
QEMU_MIGRATION_PHASE_PERFORM2,
|
|
|
|
QEMU_MIGRATION_PHASE_BEGIN3,
|
|
|
|
QEMU_MIGRATION_PHASE_PERFORM3,
|
|
|
|
QEMU_MIGRATION_PHASE_PERFORM3_DONE,
|
|
|
|
QEMU_MIGRATION_PHASE_CONFIRM3_CANCELLED,
|
|
|
|
QEMU_MIGRATION_PHASE_CONFIRM3,
|
|
|
|
QEMU_MIGRATION_PHASE_PREPARE,
|
|
|
|
QEMU_MIGRATION_PHASE_FINISH2,
|
|
|
|
QEMU_MIGRATION_PHASE_FINISH3,
|
|
|
|
|
|
|
|
QEMU_MIGRATION_PHASE_LAST
|
2014-06-15 16:32:56 +00:00
|
|
|
} qemuMigrationJobPhase;
|
2011-07-19 00:27:30 +00:00
|
|
|
VIR_ENUM_DECL(qemuMigrationJobPhase)
|
|
|
|
|
2016-04-14 10:33:48 +00:00
|
|
|
typedef enum {
|
|
|
|
QEMU_MIGRATION_COMPRESS_XBZRLE = 0,
|
|
|
|
QEMU_MIGRATION_COMPRESS_MT,
|
|
|
|
|
|
|
|
QEMU_MIGRATION_COMPRESS_LAST
|
|
|
|
} qemuMigrationCompressMethod;
|
|
|
|
VIR_ENUM_DECL(qemuMigrationCompressMethod)
|
|
|
|
|
|
|
|
struct _qemuMigrationCompression {
|
|
|
|
unsigned long long methods;
|
2016-04-14 10:33:51 +00:00
|
|
|
|
|
|
|
qemuMonitorMigrationCompression params;
|
|
|
|
|
|
|
|
bool xbzrle_cache_set;
|
|
|
|
unsigned long long xbzrle_cache;
|
2016-04-14 10:33:48 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
qemuMigrationCompressionPtr
|
|
|
|
qemuMigrationCompressionParse(virTypedParameterPtr params,
|
|
|
|
int nparams,
|
|
|
|
unsigned long flags);
|
|
|
|
int qemuMigrationCompressionDump(qemuMigrationCompressionPtr compression,
|
|
|
|
virTypedParameterPtr *params,
|
|
|
|
int *nparams,
|
|
|
|
int *maxparams,
|
|
|
|
unsigned long *flags);
|
|
|
|
|
2012-11-28 16:43:10 +00:00
|
|
|
int qemuMigrationJobStart(virQEMUDriverPtr driver,
|
2011-07-19 00:27:30 +00:00
|
|
|
virDomainObjPtr vm,
|
2014-06-15 16:32:56 +00:00
|
|
|
qemuDomainAsyncJob job)
|
2011-07-19 00:27:30 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
|
2012-11-28 16:43:10 +00:00
|
|
|
void qemuMigrationJobSetPhase(virQEMUDriverPtr driver,
|
2011-07-19 00:27:30 +00:00
|
|
|
virDomainObjPtr vm,
|
2014-06-15 16:32:56 +00:00
|
|
|
qemuMigrationJobPhase phase)
|
2011-07-19 00:27:30 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
2012-11-28 16:43:10 +00:00
|
|
|
void qemuMigrationJobStartPhase(virQEMUDriverPtr driver,
|
2011-07-19 00:27:30 +00:00
|
|
|
virDomainObjPtr vm,
|
2014-06-15 16:32:56 +00:00
|
|
|
qemuMigrationJobPhase phase)
|
2011-07-19 00:27:30 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
qemu: completely rework reference counting
There is one problem that causes various errors in the daemon. When
domain is waiting for a job, it is unlocked while waiting on the
condition. However, if that domain is for example transient and being
removed in another API (e.g. cancelling incoming migration), it get's
unref'd. If the first call, that was waiting, fails to get the job, it
unref's the domain object, and because it was the last reference, it
causes clearing of the whole domain object. However, when finishing the
call, the domain must be unlocked, but there is no way for the API to
know whether it was cleaned or not (unless there is some ugly temporary
variable, but let's scratch that).
The root cause is that our APIs don't ref the objects they are using and
all use the implicit reference that the object has when it is in the
domain list. That reference can be removed when the API is waiting for
a job. And because each domain doesn't do its ref'ing, it results in
the ugly checking of the return value of virObjectUnref() that we have
everywhere.
This patch changes qemuDomObjFromDomain() to ref the domain (using
virDomainObjListFindByUUIDRef()) and adds qemuDomObjEndAPI() which
should be the only function in which the return value of
virObjectUnref() is checked. This makes all reference counting
deterministic and makes the code a bit clearer.
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
2014-12-04 13:41:36 +00:00
|
|
|
void qemuMigrationJobContinue(virDomainObjPtr obj)
|
|
|
|
ATTRIBUTE_NONNULL(1);
|
2011-07-19 00:27:30 +00:00
|
|
|
bool qemuMigrationJobIsActive(virDomainObjPtr vm,
|
2014-06-15 16:32:56 +00:00
|
|
|
qemuDomainAsyncJob job)
|
2011-07-19 00:27:30 +00:00
|
|
|
ATTRIBUTE_NONNULL(1);
|
qemu: completely rework reference counting
There is one problem that causes various errors in the daemon. When
domain is waiting for a job, it is unlocked while waiting on the
condition. However, if that domain is for example transient and being
removed in another API (e.g. cancelling incoming migration), it get's
unref'd. If the first call, that was waiting, fails to get the job, it
unref's the domain object, and because it was the last reference, it
causes clearing of the whole domain object. However, when finishing the
call, the domain must be unlocked, but there is no way for the API to
know whether it was cleaned or not (unless there is some ugly temporary
variable, but let's scratch that).
The root cause is that our APIs don't ref the objects they are using and
all use the implicit reference that the object has when it is in the
domain list. That reference can be removed when the API is waiting for
a job. And because each domain doesn't do its ref'ing, it results in
the ugly checking of the return value of virObjectUnref() that we have
everywhere.
This patch changes qemuDomObjFromDomain() to ref the domain (using
virDomainObjListFindByUUIDRef()) and adds qemuDomObjEndAPI() which
should be the only function in which the return value of
virObjectUnref() is checked. This makes all reference counting
deterministic and makes the code a bit clearer.
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
2014-12-04 13:41:36 +00:00
|
|
|
void qemuMigrationJobFinish(virQEMUDriverPtr driver, virDomainObjPtr obj)
|
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
2011-07-19 00:27:30 +00:00
|
|
|
|
2012-11-28 16:43:10 +00:00
|
|
|
int qemuMigrationSetOffline(virQEMUDriverPtr driver,
|
2011-01-31 10:47:03 +00:00
|
|
|
virDomainObjPtr vm);
|
|
|
|
|
2013-06-25 07:44:14 +00:00
|
|
|
char *qemuMigrationBegin(virConnectPtr conn,
|
2011-02-03 11:09:28 +00:00
|
|
|
virDomainObjPtr vm,
|
2011-05-18 09:26:30 +00:00
|
|
|
const char *xmlin,
|
2011-10-14 19:24:18 +00:00
|
|
|
const char *dname,
|
2011-02-03 11:09:28 +00:00
|
|
|
char **cookieout,
|
2012-02-21 12:20:06 +00:00
|
|
|
int *cookieoutlen,
|
2015-06-15 22:42:10 +00:00
|
|
|
size_t nmigrate_disks,
|
|
|
|
const char **migrate_disks,
|
2012-02-21 12:20:06 +00:00
|
|
|
unsigned long flags);
|
2011-02-03 11:09:28 +00:00
|
|
|
|
2013-06-25 12:38:05 +00:00
|
|
|
virDomainDefPtr qemuMigrationPrepareDef(virQEMUDriverPtr driver,
|
|
|
|
const char *dom_xml,
|
2013-09-03 13:17:03 +00:00
|
|
|
const char *dname,
|
|
|
|
char **origname);
|
2013-06-25 12:38:05 +00:00
|
|
|
|
2012-11-28 16:43:10 +00:00
|
|
|
int qemuMigrationPrepareTunnel(virQEMUDriverPtr driver,
|
2011-01-31 10:47:03 +00:00
|
|
|
virConnectPtr dconn,
|
2011-01-24 18:06:16 +00:00
|
|
|
const char *cookiein,
|
|
|
|
int cookieinlen,
|
|
|
|
char **cookieout,
|
|
|
|
int *cookieoutlen,
|
2011-01-31 10:47:03 +00:00
|
|
|
virStreamPtr st,
|
2013-06-07 12:12:28 +00:00
|
|
|
virDomainDefPtr *def,
|
2013-09-03 13:17:03 +00:00
|
|
|
const char *origname,
|
2012-11-21 08:28:49 +00:00
|
|
|
unsigned long flags);
|
2011-01-31 10:47:03 +00:00
|
|
|
|
2012-11-28 16:43:10 +00:00
|
|
|
int qemuMigrationPrepareDirect(virQEMUDriverPtr driver,
|
2011-01-31 10:47:03 +00:00
|
|
|
virConnectPtr dconn,
|
2011-01-24 18:06:16 +00:00
|
|
|
const char *cookiein,
|
|
|
|
int cookieinlen,
|
|
|
|
char **cookieout,
|
|
|
|
int *cookieoutlen,
|
2011-01-31 10:47:03 +00:00
|
|
|
const char *uri_in,
|
|
|
|
char **uri_out,
|
2013-06-07 12:12:28 +00:00
|
|
|
virDomainDefPtr *def,
|
2013-09-03 13:17:03 +00:00
|
|
|
const char *origname,
|
2013-10-08 12:41:44 +00:00
|
|
|
const char *listenAddress,
|
2015-06-15 22:42:10 +00:00
|
|
|
size_t nmigrate_disks,
|
|
|
|
const char **migrate_disks,
|
2016-03-17 14:58:48 +00:00
|
|
|
int nbdPort,
|
2016-04-14 10:33:48 +00:00
|
|
|
qemuMigrationCompressionPtr compression,
|
2012-11-21 08:28:49 +00:00
|
|
|
unsigned long flags);
|
2011-01-31 10:47:03 +00:00
|
|
|
|
2012-11-28 16:43:10 +00:00
|
|
|
int qemuMigrationPerform(virQEMUDriverPtr driver,
|
2011-01-31 10:47:03 +00:00
|
|
|
virConnectPtr conn,
|
|
|
|
virDomainObjPtr vm,
|
2011-05-18 09:26:30 +00:00
|
|
|
const char *xmlin,
|
2016-03-17 16:31:45 +00:00
|
|
|
const char *persist_xml,
|
Add a second URI parameter to virDomainMigratePerform3 method
The virDomainMigratePerform3 currently has a single URI parameter
whose meaning varies. It is either
- A QEMU migration URI (normal migration)
- A libvirtd connection URI (peer2peer migration)
Unfortunately when using peer2peer migration, without also
using tunnelled migration, it is possible that both URIs are
required.
This adds a second URI parameter to the virDomainMigratePerform3
method, to cope with this scenario. Each parameter how has a fixed
meaning.
NB, there is no way to actually take advantage of this yet,
since virDomainMigrate/virDomainMigrateToURI do not have any
way to provide the 2 separate URIs
* daemon/remote.c, src/remote/remote_driver.c,
src/remote/remote_protocol.x, src/remote_protocol-structs: Add
the second URI parameter to perform3 message
* src/driver.h, src/libvirt.c, src/libvirt_internal.h: Add
the second URI parameter to Perform3 method
* src/libvirt_internal.h, src/qemu/qemu_migration.c,
src/qemu/qemu_migration.h: Update to handle URIs correctly
2011-05-18 13:18:53 +00:00
|
|
|
const char *dconnuri,
|
2011-01-31 10:47:03 +00:00
|
|
|
const char *uri,
|
2013-06-18 10:17:18 +00:00
|
|
|
const char *graphicsuri,
|
2013-10-08 12:41:44 +00:00
|
|
|
const char *listenAddress,
|
2015-06-15 22:42:10 +00:00
|
|
|
size_t nmigrate_disks,
|
|
|
|
const char **migrate_disks,
|
2016-03-17 14:58:48 +00:00
|
|
|
int nbdPort,
|
2016-04-14 10:33:48 +00:00
|
|
|
qemuMigrationCompressionPtr compression,
|
2011-01-24 18:06:16 +00:00
|
|
|
const char *cookiein,
|
|
|
|
int cookieinlen,
|
|
|
|
char **cookieout,
|
|
|
|
int *cookieoutlen,
|
2011-01-31 10:47:03 +00:00
|
|
|
unsigned long flags,
|
|
|
|
const char *dname,
|
2011-02-03 11:09:28 +00:00
|
|
|
unsigned long resource,
|
2011-05-23 12:50:11 +00:00
|
|
|
bool v3proto);
|
2011-01-31 10:47:03 +00:00
|
|
|
|
2012-11-28 16:43:10 +00:00
|
|
|
virDomainPtr qemuMigrationFinish(virQEMUDriverPtr driver,
|
2011-01-31 10:47:03 +00:00
|
|
|
virConnectPtr dconn,
|
|
|
|
virDomainObjPtr vm,
|
2011-01-24 18:06:16 +00:00
|
|
|
const char *cookiein,
|
|
|
|
int cookieinlen,
|
|
|
|
char **cookieout,
|
|
|
|
int *cookieoutlen,
|
2011-01-31 10:47:03 +00:00
|
|
|
unsigned long flags,
|
2011-05-23 12:50:11 +00:00
|
|
|
int retcode,
|
|
|
|
bool v3proto);
|
2011-01-31 10:47:03 +00:00
|
|
|
|
2013-06-25 12:55:10 +00:00
|
|
|
int qemuMigrationConfirm(virConnectPtr conn,
|
2011-02-03 11:09:28 +00:00
|
|
|
virDomainObjPtr vm,
|
|
|
|
const char *cookiein,
|
|
|
|
int cookieinlen,
|
|
|
|
unsigned int flags,
|
2013-06-25 12:55:10 +00:00
|
|
|
int cancelled);
|
2011-02-03 11:09:28 +00:00
|
|
|
|
2012-12-07 10:59:24 +00:00
|
|
|
bool qemuMigrationIsAllowed(virQEMUDriverPtr driver, virDomainObjPtr vm,
|
2015-10-06 14:24:48 +00:00
|
|
|
bool remote, unsigned int flags);
|
2011-01-31 10:47:03 +00:00
|
|
|
|
2016-02-15 16:17:02 +00:00
|
|
|
int qemuMigrationToFile(virQEMUDriverPtr driver,
|
|
|
|
virDomainObjPtr vm,
|
|
|
|
int fd,
|
2011-03-10 00:35:13 +00:00
|
|
|
const char *compressor,
|
2014-06-15 16:32:56 +00:00
|
|
|
qemuDomainAsyncJob asyncJob)
|
2016-02-15 16:17:02 +00:00
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
|
2011-03-10 00:35:13 +00:00
|
|
|
|
2015-05-19 15:28:25 +00:00
|
|
|
int qemuMigrationCancel(virQEMUDriverPtr driver,
|
|
|
|
virDomainObjPtr vm);
|
|
|
|
|
2015-05-26 12:37:30 +00:00
|
|
|
int qemuMigrationFetchJobStatus(virQEMUDriverPtr driver,
|
|
|
|
virDomainObjPtr vm,
|
|
|
|
qemuDomainAsyncJob asyncJob,
|
|
|
|
qemuDomainJobInfoPtr jobInfo);
|
|
|
|
|
2015-07-02 06:26:48 +00:00
|
|
|
int qemuMigrationErrorInit(virQEMUDriverPtr driver);
|
|
|
|
void qemuMigrationErrorSave(virQEMUDriverPtr driver,
|
|
|
|
const char *name,
|
|
|
|
virErrorPtr err);
|
|
|
|
void qemuMigrationErrorReport(virQEMUDriverPtr driver,
|
|
|
|
const char *name);
|
|
|
|
|
2015-10-20 13:48:33 +00:00
|
|
|
int qemuMigrationCheckIncoming(virQEMUCapsPtr qemuCaps,
|
|
|
|
const char *migrateFrom);
|
|
|
|
|
|
|
|
char *qemuMigrationIncomingURI(const char *migrateFrom,
|
|
|
|
int migrateFd);
|
|
|
|
|
2015-11-11 17:02:23 +00:00
|
|
|
int qemuMigrationRunIncoming(virQEMUDriverPtr driver,
|
|
|
|
virDomainObjPtr vm,
|
|
|
|
const char *uri,
|
|
|
|
qemuDomainAsyncJob asyncJob);
|
|
|
|
|
2016-01-13 15:29:58 +00:00
|
|
|
void qemuMigrationPostcopyFailed(virQEMUDriverPtr driver,
|
|
|
|
virDomainObjPtr vm);
|
|
|
|
|
2011-01-31 10:47:03 +00:00
|
|
|
#endif /* __QEMU_MIGRATION_H__ */
|