在 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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list