This is a stub internal API just for now. Its purpose
in life is to start NBD server and feed it with all
domain disks. When adding a disk to NBD server, it
is addressed via its alias (id= param on qemu command line).
---
src/qemu/qemu_driver.c | 8 +++---
src/qemu/qemu_migration.c | 59 +++++++++++++++++++++++++++++++++++---------
src/qemu/qemu_migration.h | 6 +++-
3 files changed, 55 insertions(+), 18 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index e099c5c..dfb6f9f 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -9698,7 +9698,7 @@ qemuDomainMigratePrepareTunnel(virConnectPtr dconn,
ret = qemuMigrationPrepareTunnel(driver, dconn,
NULL, 0, NULL, NULL, /* No cookies in v2 */
- st, dname, dom_xml);
+ st, dname, dom_xml, flags);
cleanup:
qemuDriverUnlock(driver);
@@ -9758,7 +9758,7 @@ qemuDomainMigratePrepare2(virConnectPtr dconn,
ret = qemuMigrationPrepareDirect(driver, dconn,
NULL, 0, NULL, NULL, /* No cookies */
uri_in, uri_out,
- dname, dom_xml);
+ dname, dom_xml, flags);
cleanup:
qemuDriverUnlock(driver);
@@ -9995,7 +9995,7 @@ qemuDomainMigratePrepare3(virConnectPtr dconn,
cookiein, cookieinlen,
cookieout, cookieoutlen,
uri_in, uri_out,
- dname, dom_xml);
+ dname, dom_xml, flags);
cleanup:
qemuDriverUnlock(driver);
@@ -10040,7 +10040,7 @@ qemuDomainMigratePrepareTunnel3(virConnectPtr dconn,
ret = qemuMigrationPrepareTunnel(driver, dconn,
cookiein, cookieinlen,
cookieout, cookieoutlen,
- st, dname, dom_xml);
+ st, dname, dom_xml, flags);
qemuDriverUnlock(driver);
cleanup:
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 8c1e873..d785e75 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -1078,6 +1078,29 @@ error:
return NULL;
}
+/**
+ * qemuMigrationStartNBDServer:
+ * @driver: qemu driver
+ * @vm: domain
+ * @nbdPort: which port is NBD server listening to
+ *
+ * Starts NBD server. This is a newer method to copy
+ * storage during migration than using 'blk' and 'inc'
+ * arguments in 'migrate' monitor command.
+ * Error is reported here.
+ *
+ * Returns 0 on success, -1 otherwise.
+ */
+static int
+qemuMigrationStartNBDServer(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,
+ virDomainObjPtr vm ATTRIBUTE_UNUSED,
+ int *nbdPort ATTRIBUTE_UNUSED)
+{
+ /* do nothing for now */
+ return 0;
+}
+
+
/* Validate whether the domain is safe to migrate. If vm is NULL,
* then this is being run in the v2 Prepare stage on the destination
* (where we only have the target xml); if vm is provided, then this
@@ -1584,7 +1607,8 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
const char *dname,
const char *dom_xml,
const char *migrateFrom,
- virStreamPtr st)
+ virStreamPtr st,
+ unsigned long flags)
{
virDomainDefPtr def = NULL;
virDomainObjPtr vm = NULL;
@@ -1728,9 +1752,17 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
VIR_DEBUG("Received no lockstate");
}
- /* dummy place holder for real work */
- nbdPort = 0;
- cookie_flags |= QEMU_MIGRATION_COOKIE_NBD;
+ if ((flags & VIR_MIGRATE_NON_SHARED_INC ||
+ flags & VIR_MIGRATE_NON_SHARED_DISK) &&
+ mig->nbd && qemuCapsGet(priv->caps, QEMU_CAPS_NBD_SERVER)) {
+ /* both source and destination qemus support nbd-server-*
+ * commands and user requested disk copy. Use the new ones */
+ if (qemuMigrationStartNBDServer(driver, vm, &nbdPort) < 0) {
+ /* error already reported */
+ goto endjob;
+ }
+ cookie_flags |= QEMU_MIGRATION_COOKIE_NBD;
+ }
if (qemuMigrationBakeCookie(mig, driver, vm, nbdPort,
cookieout, cookieoutlen, cookie_flags) < 0) {
@@ -1800,21 +1832,23 @@ qemuMigrationPrepareTunnel(virQEMUDriverPtr driver,
int *cookieoutlen,
virStreamPtr st,
const char *dname,
- const char *dom_xml)
+ const char *dom_xml,
+ unsigned long flags)
{
int ret;
VIR_DEBUG("driver=%p, dconn=%p, cookiein=%s, cookieinlen=%d, "
- "cookieout=%p, cookieoutlen=%p, st=%p, dname=%s, dom_xml=%s",
+ "cookieout=%p, cookieoutlen=%p, st=%p, dname=%s, dom_xml=%s "
+ "flags=%lx",
driver, dconn, NULLSTR(cookiein), cookieinlen,
- cookieout, cookieoutlen, st, NULLSTR(dname), dom_xml);
+ cookieout, cookieoutlen, st, NULLSTR(dname), dom_xml, flags);
/* QEMU will be started with -incoming stdio (which qemu_command might
* convert to exec:cat or fd:n)
*/
ret = qemuMigrationPrepareAny(driver, dconn, cookiein, cookieinlen,
cookieout, cookieoutlen, dname, dom_xml,
- "stdio", st);
+ "stdio", st, flags);
return ret;
}
@@ -1829,7 +1863,8 @@ qemuMigrationPrepareDirect(virQEMUDriverPtr driver,
const char *uri_in,
char **uri_out,
const char *dname,
- const char *dom_xml)
+ const char *dom_xml,
+ unsigned long flags)
{
static int port = 0;
int this_port;
@@ -1840,10 +1875,10 @@ qemuMigrationPrepareDirect(virQEMUDriverPtr driver,
VIR_DEBUG("driver=%p, dconn=%p, cookiein=%s, cookieinlen=%d, "
"cookieout=%p, cookieoutlen=%p, uri_in=%s, uri_out=%p, "
- "dname=%s, dom_xml=%s",
+ "dname=%s, dom_xml=%s flags=%lx",
driver, dconn, NULLSTR(cookiein), cookieinlen,
cookieout, cookieoutlen, NULLSTR(uri_in), uri_out,
- NULLSTR(dname), dom_xml);
+ NULLSTR(dname), dom_xml, flags);
/* The URI passed in may be NULL or a string "tcp://somehostname:port".
*
@@ -1925,7 +1960,7 @@ qemuMigrationPrepareDirect(virQEMUDriverPtr driver,
ret = qemuMigrationPrepareAny(driver, dconn, cookiein, cookieinlen,
cookieout, cookieoutlen, dname, dom_xml,
- migrateFrom, NULL);
+ migrateFrom, NULL, flags);
cleanup:
VIR_FREE(hostname);
if (ret != 0)
diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
index 62e39a0..c961866 100644
--- a/src/qemu/qemu_migration.h
+++ b/src/qemu/qemu_migration.h
@@ -97,7 +97,8 @@ int qemuMigrationPrepareTunnel(virQEMUDriverPtr driver,
int *cookieoutlen,
virStreamPtr st,
const char *dname,
- const char *dom_xml);
+ const char *dom_xml,
+ unsigned long flags);
int qemuMigrationPrepareDirect(virQEMUDriverPtr driver,
virConnectPtr dconn,
@@ -108,7 +109,8 @@ int qemuMigrationPrepareDirect(virQEMUDriverPtr driver,
const char *uri_in,
char **uri_out,
const char *dname,
- const char *dom_xml);
+ const char *dom_xml,
+ unsigned long flags);
int qemuMigrationPerform(virQEMUDriverPtr driver,
virConnectPtr conn,
--
1.7.8.6