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_migration.c | 46 +++++++++++++++++++++++++++++++++++++++-------
1 file changed, 39 insertions(+), 7 deletions(-)
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 7d61ec7..81a48a4 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
@@ -1790,9 +1813,17 @@ done:
else
cookieFlags = QEMU_MIGRATION_COOKIE_GRAPHICS;
- /* dummy place holder for real work */
- nbdPort = 0;
- cookieFlags |= 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;
+ }
+ cookieFlags |= QEMU_MIGRATION_COOKIE_NBD;
+ }
if (qemuMigrationBakeCookie(mig, driver, vm, nbdPort,
cookieout, cookieoutlen, cookieFlags) < 0) {
@@ -1870,9 +1901,10 @@ qemuMigrationPrepareTunnel(virQEMUDriverPtr driver,
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)
@@ -1906,10 +1938,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".
*
--
1.8.0.2