[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC PATCH 1/2] migration: Allow the migrate command to wor
From: |
zhanghailiang |
Subject: |
[Qemu-devel] [RFC PATCH 1/2] migration: Allow the migrate command to work on file:urls |
Date: |
Thu, 21 Jul 2016 13:05:59 +0800 |
Usage:
(qemu) migrate file:/path/to/vm_statefile
Signed-off-by: zhanghailiang <address@hidden>
Signed-off-by: Benoit Canet <address@hidden>
---
include/migration/migration.h | 2 ++
migration/fd.c | 34 ++++++++++++++++++++++++++++------
migration/migration.c | 2 ++
migration/trace-events | 1 +
4 files changed, 33 insertions(+), 6 deletions(-)
diff --git a/include/migration/migration.h b/include/migration/migration.h
index 3c96623..cc2e4f6 100644
--- a/include/migration/migration.h
+++ b/include/migration/migration.h
@@ -221,6 +221,8 @@ void fd_start_incoming_migration(const char *path, Error
**errp);
void fd_start_outgoing_migration(MigrationState *s, const char *fdname, Error
**errp);
+void file_start_outgoing_migration(MigrationState *s, const char *filename,
Error **errp);
+
void rdma_start_outgoing_migration(void *opaque, const char *host_port, Error
**errp);
void rdma_start_incoming_migration(const char *host_port, Error **errp);
diff --git a/migration/fd.c b/migration/fd.c
index 84a10fd..fa5df67 100644
--- a/migration/fd.c
+++ b/migration/fd.c
@@ -23,15 +23,11 @@
#include "trace.h"
-void fd_start_outgoing_migration(MigrationState *s, const char *fdname, Error
**errp)
+static void fd_start_outgoing_migration_core(MigrationState *s, int fd,
+ Error **errp)
{
QIOChannel *ioc;
- int fd = monitor_get_fd(cur_mon, fdname, errp);
- if (fd == -1) {
- return;
- }
- trace_migration_fd_outgoing(fd);
ioc = qio_channel_new_fd(fd, errp);
if (!ioc) {
close(fd);
@@ -42,6 +38,32 @@ void fd_start_outgoing_migration(MigrationState *s, const
char *fdname, Error **
object_unref(OBJECT(ioc));
}
+void fd_start_outgoing_migration(MigrationState *s, const char *fdname, Error
**errp)
+{
+ int fd = monitor_get_fd(cur_mon, fdname, errp);
+ if (fd == -1) {
+ return;
+ }
+
+ trace_migration_fd_outgoing(fd);
+ fd_start_outgoing_migration_core(s, fd, errp);
+}
+
+void file_start_outgoing_migration(MigrationState *s, const char *filename,
+ Error **errp)
+{
+ int fd;
+
+ fd = qemu_open(filename, O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR);
+ if (fd < 0) {
+ error_setg_errno(errp, errno, "Failed to open file: %s", filename);
+ return;
+ }
+
+ trace_migration_file_outgoing(filename);
+ fd_start_outgoing_migration_core(s, fd, errp);
+}
+
static gboolean fd_accept_incoming_migration(QIOChannel *ioc,
GIOCondition condition,
gpointer opaque)
diff --git a/migration/migration.c b/migration/migration.c
index c4e0193..097adba 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -1109,6 +1109,8 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk,
unix_start_outgoing_migration(s, p, &local_err);
} else if (strstart(uri, "fd:", &p)) {
fd_start_outgoing_migration(s, p, &local_err);
+ } else if (strstart(uri, "file:", &p)) {
+ file_start_outgoing_migration(s, p, &local_err);
} else {
error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "uri",
"a valid migration protocol");
diff --git a/migration/trace-events b/migration/trace-events
index 8568dab..4fca64c 100644
--- a/migration/trace-events
+++ b/migration/trace-events
@@ -194,6 +194,7 @@ migration_exec_incoming(const char *cmd) "cmd=%s"
# migration/fd.c
migration_fd_outgoing(int fd) "fd=%d"
migration_fd_incoming(int fd) "fd=%d"
+migration_file_outgoing(const char *filename) "file=%s"
# migration/socket.c
migration_socket_incoming_accepted(void) ""
--
1.8.3.1