在 2012-11-27二的 19:50 +0100,Michal Privoznik写道:
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 d4cafcc..493fbb9 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -9625,7 +9625,7 @@ qemudDomainMigratePrepareTunnel(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);
@@ -9685,7 +9685,7 @@ qemudDomainMigratePrepare2(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);
@@ -9922,7 +9922,7 @@ qemuDomainMigratePrepare3(virConnectPtr dconn,
cookiein, cookieinlen,
cookieout, cookieoutlen,
uri_in, uri_out,
- dname, dom_xml);
+ dname, dom_xml, flags);
cleanup:
qemuDriverUnlock(driver);
@@ -9967,7 +9967,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 cd59eda..7e86c33 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -1074,6 +1074,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(struct qemud_driver *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
@@ -1575,7 +1598,8 @@ qemuMigrationPrepareAny(struct qemud_driver *driver,
const char *dname,
const char *dom_xml,
const char *migrateFrom,
- virStreamPtr st)
+ virStreamPtr st,
+ unsigned long flags)
{
virDomainDefPtr def = NULL;
virDomainObjPtr vm = NULL;
@@ -1719,9 +1743,17 @@ qemuMigrationPrepareAny(struct qemud_driver *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) {
so, nbdPort is generated by qemuMigrationNextPort() (08/11) not by
cookie element 'nbd/port' (02/11), as a result, seems the previous
cookie baking is rather needless.
+ /* error already reported */
+ goto endjob;
+ }
+ cookie_flags |= QEMU_MIGRATION_COOKIE_NBD;
+ }
if (qemuMigrationBakeCookie(mig, driver, vm, nbdPort,
cookieout, cookieoutlen, cookie_flags) < 0) {
@@ -1791,21 +1823,23 @@ qemuMigrationPrepareTunnel(struct qemud_driver *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;
}
@@ -1820,7 +1854,8 @@ qemuMigrationPrepareDirect(struct qemud_driver *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;
@@ -1831,10 +1866,10 @@ qemuMigrationPrepareDirect(struct qemud_driver *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".
*
@@ -1916,7 +1951,7 @@ qemuMigrationPrepareDirect(struct qemud_driver *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 7a2269a..8e411ef 100644
--- a/src/qemu/qemu_migration.h
+++ b/src/qemu/qemu_migration.h
@@ -97,7 +97,8 @@ int qemuMigrationPrepareTunnel(struct qemud_driver *driver,
int *cookieoutlen,
virStreamPtr st,
const char *dname,
- const char *dom_xml);
+ const char *dom_xml,
+ unsigned long flags);
int qemuMigrationPrepareDirect(struct qemud_driver *driver,
virConnectPtr dconn,
@@ -108,7 +109,8 @@ int qemuMigrationPrepareDirect(struct qemud_driver *driver,
const char *uri_in,
char **uri_out,
const char *dname,
- const char *dom_xml);
+ const char *dom_xml,
+ unsigned long flags);
int qemuMigrationPerform(struct qemud_driver *driver,
virConnectPtr conn,
--
regards!
li guang
linux kernel team at FNST, china
thinking with brain but heart
living with heart but brain