Encapsulate the MigrationChannelList parsing in a new
migrate_channels_parse() located at channel.c.
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
migration/channel.c | 54 +++++++++++++++++++++++++++++++++++++++++++
migration/channel.h | 5 ++++
migration/migration.c | 50 +++++++++++----------------------------
3 files changed, 73 insertions(+), 36 deletions(-)
diff --git a/migration/channel.c b/migration/channel.c
index ba9aa1c58b..8b43c3d983 100644
--- a/migration/channel.c
+++ b/migration/channel.c
@@ -11,6 +11,7 @@
*/
#include "qemu/osdep.h"
+#include "qemu/cutils.h"
#include "channel.h"
#include "exec.h"
#include "fd.h"
@@ -20,7 +21,9 @@
#include "migration.h"
#include "multifd.h"
#include "options.h"
+#include "qapi/clone-visitor.h"
#include "qapi/qapi-types-migration.h"
+#include "qapi/qapi-visit-migration.h"
#include "qapi/error.h"
#include "qemu-file.h"
#include "qemu/yank.h"
@@ -314,3 +317,54 @@ int migration_channel_read_peek(QIOChannel *ioc,
return 0;
}
+
+bool migrate_channels_parse(MigrationChannelList *channels,
+ MigrationChannel **main_channelp,
+ MigrationChannel **cpr_channelp,
+ Error **errp)
+{
+ MigrationChannel *channelv[MIGRATION_CHANNEL_TYPE__MAX] = { NULL };
+ bool single_channel;
+
+ if (cpr_channelp) {
+ single_channel = false;
+ } else {
+ single_channel = true;
+ }
+
+ for ( ; channels; channels = channels->next) {
+ MigrationChannelType type;
+
+ type = channels->value->channel_type;
+ if (channelv[type]) {
+ error_setg(errp, "Channel list has more than one %s entry",
+ MigrationChannelType_str(type));
+ return false;
+ }
+ channelv[type] = channels->value;
+
+ if (single_channel) {
+ if (channels->next) {
+ error_setg(errp, "Channel list must have only one entry, "
+ "for type 'main'");
+ return false;
+ }
+ break;
+ }
+ }
+
+ if (cpr_channelp) {
+ *cpr_channelp = QAPI_CLONE(MigrationChannel,
+ channelv[MIGRATION_CHANNEL_TYPE_CPR]);
+ }
+
+ *main_channelp = QAPI_CLONE(MigrationChannel,
+ channelv[MIGRATION_CHANNEL_TYPE_MAIN]);
+
+ if (!(*main_channelp)->addr) {
+ error_setg(errp, "Channel list has no main entry");
+ return false;
+ }
+
+ return true;
+}
diff --git a/migration/channel.h b/migration/channel.h
index 86934fee38..b3276550b7 100644
--- a/migration/channel.h
+++ b/migration/channel.h
@@ -51,4 +51,9 @@ static inline bool migration_connect_incoming(MigrationAddress *addr,
{
return migration_connect(addr, false, errp);
}
+
+bool migrate_channels_parse(MigrationChannelList *channels,
+ MigrationChannel **main_channelp,
+ MigrationChannel **cpr_channelp,
+ Error **errp);
#endif
diff --git a/migration/migration.c b/migration/migration.c
index c11cd4ebf6..6064f1e5ea 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -741,8 +741,7 @@ static void qemu_setup_incoming_migration(const char *uri, bool has_channels,
MigrationChannelList *channels,
Error **errp)
{
- g_autoptr(MigrationChannel) channel = NULL;
- MigrationAddress *addr = NULL;
+ g_autoptr(MigrationChannel) main_ch = NULL;
MigrationIncomingState *mis = migration_incoming_get_current();
/*
@@ -754,25 +753,20 @@ static void qemu_setup_incoming_migration(const char *uri, bool has_channels,
}
if (channels) {
- /* To verify that Migrate channel list has only item */
- if (channels->next) {
- error_setg(errp, "Channel list must have only one entry, "
- "for type 'main'");
+ if (!migrate_channels_parse(channels, &main_ch, NULL, errp)) {
return;
}
- addr = channels->value->addr;
}
if (uri) {
/* caller uses the old URI syntax */
- if (!migrate_uri_parse(uri, &channel, errp)) {
+ if (!migrate_uri_parse(uri, &main_ch, errp)) {
return;
}
- addr = channel->addr;
}
/* transport mechanism not suitable for migration? */
- if (!migration_transport_compatible(addr, errp)) {
+ if (!migration_transport_compatible(main_ch->addr, errp)) {
return;
}
@@ -784,7 +778,7 @@ static void qemu_setup_incoming_migration(const char *uri, bool has_channels,
return;
}
- migration_connect_incoming(addr, errp);
+ migration_connect_incoming(main_ch->addr, errp);
/* Close cpr socket to tell source that we are listening */
cpr_state_close();
@@ -2127,10 +2121,8 @@ void qmp_migrate(const char *uri, bool has_channels,
MigrationChannelList *channels, bool has_detach, bool detach,
bool has_resume, bool resume, Error **errp)
{
- g_autoptr(MigrationChannel) channel = NULL;
- MigrationAddress *addr = NULL;
- MigrationChannel *channelv[MIGRATION_CHANNEL_TYPE__MAX] = { NULL };
- MigrationChannel *cpr_channel = NULL;
+ g_autoptr(MigrationChannel) main_ch = NULL;
+ g_autoptr(MigrationChannel) cpr_ch = NULL;
/*
* Having preliminary checks for uri and channel
@@ -2141,38 +2133,24 @@ void qmp_migrate(const char *uri, bool has_channels,
}
if (channels) {
- for ( ; channels; channels = channels->next) {
- MigrationChannelType type = channels->value->channel_type;
-
- if (channelv[type]) {
- error_setg(errp, "Channel list has more than one %s entry",
- MigrationChannelType_str(type));
- return;
- }
- channelv[type] = channels->value;
- }
- cpr_channel = channelv[MIGRATION_CHANNEL_TYPE_CPR];
- addr = channelv[MIGRATION_CHANNEL_TYPE_MAIN]->addr;
- if (!addr) {
- error_setg(errp, "Channel list has no main entry");
+ if (!migrate_channels_parse(channels, &main_ch, &cpr_ch, errp)) {
return;
}
}
if (uri) {
/* caller uses the old URI syntax */
- if (!migrate_uri_parse(uri, &channel, errp)) {
+ if (!migrate_uri_parse(uri, &main_ch, errp)) {
return;
}
- addr = channel->addr;
}
/* transport mechanism not suitable for migration? */
- if (!migration_transport_compatible(addr, errp)) {
+ if (!migration_transport_compatible(main_ch->addr, errp)) {
return;
}
- if (migrate_mode() == MIG_MODE_CPR_TRANSFER && !cpr_channel) {
+ if (migrate_mode() == MIG_MODE_CPR_TRANSFER && !cpr_ch) {
error_setg(errp, "missing 'cpr' migration channel");
return;
}
@@ -2189,7 +2167,7 @@ void qmp_migrate(const char *uri, bool has_channels,
*/
Error *local_err = NULL;
- if (!cpr_state_save(cpr_channel, &local_err)) {
+ if (!cpr_state_save(cpr_ch, &local_err)) {
goto out;
}
@@ -2205,10 +2183,10 @@ void qmp_migrate(const char *uri, bool has_channels,
*/
if (migrate_mode() == MIG_MODE_CPR_TRANSFER) {
migrate_hup_add(cpr_state_ioc(), (GSourceFunc)qmp_migrate_finish_cb,
- QAPI_CLONE(MigrationAddress, addr));
+ QAPI_CLONE(MigrationAddress, main_ch->addr));
} else {
- qmp_migrate_finish(addr, &local_err);
+ qmp_migrate_finish(main_ch->addr, &local_err);
}
out:
--
2.51.0