提交 543e013a 编写于 作者: D Daniel P. Berrange

Don't force dconn to be NULL in virDomainMigrate

The code for tunnelled migration wierdly required the app to pass
a  NULL 'dconn' parameter, only to have to use virConnectOpen
itself shortly thereafter to get a 'dconn' object. Remove this
bogus check & require the app to always pas 'dconn' as before

* src/libvirt.c: Require 'dconn' for virDomainMigrate calls again
  and remove call to virConnectOpen
上级 f6c66d01
......@@ -3058,35 +3058,12 @@ virDomainMigrateVersion2 (virDomainPtr domain,
*/
static virDomainPtr
virDomainMigrateTunnelled(virDomainPtr domain,
virConnectPtr dconn,
unsigned long flags,
const char *dname,
const char *uri,
unsigned long bandwidth)
{
virConnectPtr dconn;
virDomainPtr ddomain = NULL;
if (uri == NULL) {
/* if you are doing a secure migration, you *must* also pass a uri */
virLibConnError(domain->conn, VIR_ERR_INVALID_ARG,
_("requested TUNNELLED migration, but no URI passed"));
return NULL;
}
if (domain->conn->flags & VIR_CONNECT_RO) {
virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
return NULL;
}
/* FIXME: do we even need this check? In theory, V1 of the protocol
* should be able to do tunnelled migration as well
*/
if (!VIR_DRV_SUPPORTS_FEATURE(domain->conn->driver, domain->conn,
VIR_DRV_FEATURE_MIGRATION_V2)) {
virLibConnError(domain->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
return NULL;
}
/* Perform the migration. The driver isn't supposed to return
* until the migration is complete.
*/
......@@ -3094,18 +3071,7 @@ virDomainMigrateTunnelled(virDomainPtr domain,
(domain, NULL, 0, uri, flags, dname, bandwidth) == -1)
return NULL;
dconn = virConnectOpen(uri);
if (dconn == NULL)
/* FIXME: this is pretty crappy; as far as we know, the migration has
* now succeeded, but we can't connect back to the other side
*/
return NULL;
ddomain = virDomainLookupByName(dconn, dname ? dname : domain->name);
virConnectClose(dconn);
return ddomain;
return virDomainLookupByName(dconn, dname ? dname : domain->name);
}
/**
......@@ -3182,32 +3148,29 @@ virDomainMigrate (virDomainPtr domain,
goto error;
}
/* Now checkout the destination */
if (!VIR_IS_CONNECT(dconn)) {
virLibConnError(domain->conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
goto error;
}
if (dconn->flags & VIR_CONNECT_RO) {
/* NB, deliberately report error against source object, not dest */
virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
goto error;
}
if (flags & VIR_MIGRATE_TUNNELLED) {
/* tunnelled migration is more or less a completely different migration
* protocol. dconn has to be NULL, uri has to be set, and the flow
* of logic is completely different. Hence, here we split off from
* the main migration flow and use a separate function.
*/
if (dconn != NULL) {
virLibConnError(domain->conn, VIR_ERR_INVALID_ARG,
_("requested TUNNELLED migration, but non-NULL dconn"));
goto error;
char *dstURI = NULL;
if (uri == NULL) {
dstURI = virConnectGetURI(dconn);
if (!uri)
return NULL;
}
ddomain = virDomainMigrateTunnelled(domain, flags, dname, uri, bandwidth);
}
else {
/* Now checkout the destination */
if (!VIR_IS_CONNECT(dconn)) {
virLibConnError(domain->conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
goto error;
}
if (dconn->flags & VIR_CONNECT_RO) {
/* NB, deliberately report error against source object, not dest */
virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
goto error;
}
ddomain = virDomainMigrateTunnelled(domain, dconn, flags, dname, uri ? uri : dstURI, bandwidth);
VIR_FREE(dstURI);
} else {
/* Check that migration is supported by both drivers. */
if (VIR_DRV_SUPPORTS_FEATURE(domain->conn->driver, domain->conn,
VIR_DRV_FEATURE_MIGRATION_V1) &&
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册