diff options
Diffstat (limited to 'migration/fd.c')
-rw-r--r-- | migration/fd.c | 75 |
1 files changed, 29 insertions, 46 deletions
diff --git a/migration/fd.c b/migration/fd.c index 3d788bb297..60a75b81e0 100644 --- a/migration/fd.c +++ b/migration/fd.c @@ -1,10 +1,11 @@ /* * QEMU live migration via generic fd * - * Copyright Red Hat, Inc. 2009 + * Copyright Red Hat, Inc. 2009-2016 * * Authors: * Chris Lalancette <clalance@redhat.com> + * Daniel P. Berrange <berrange@redhat.com> * * This work is licensed under the terms of the GNU GPL, version 2. See * the COPYING file in the top-level directory. @@ -16,75 +17,57 @@ #include "qemu/osdep.h" #include "qapi/error.h" #include "qemu-common.h" -#include "qemu/main-loop.h" -#include "qemu/sockets.h" #include "migration/migration.h" #include "monitor/monitor.h" -#include "migration/qemu-file.h" -#include "block/block.h" +#include "io/channel-util.h" +#include "trace.h" -//#define DEBUG_MIGRATION_FD - -#ifdef DEBUG_MIGRATION_FD -#define DPRINTF(fmt, ...) \ - do { printf("migration-fd: " fmt, ## __VA_ARGS__); } while (0) -#else -#define DPRINTF(fmt, ...) \ - do { } while (0) -#endif - -static bool fd_is_socket(int fd) -{ - struct stat stat; - int ret = fstat(fd, &stat); - if (ret == -1) { - /* When in doubt say no */ - return false; - } - return S_ISSOCK(stat.st_mode); -} void fd_start_outgoing_migration(MigrationState *s, const char *fdname, Error **errp) { + QIOChannel *ioc; int fd = monitor_get_fd(cur_mon, fdname, errp); if (fd == -1) { return; } - if (fd_is_socket(fd)) { - s->to_dst_file = qemu_fopen_socket(fd, "wb"); - } else { - s->to_dst_file = qemu_fdopen(fd, "wb"); + trace_migration_fd_outgoing(fd); + ioc = qio_channel_new_fd(fd, errp); + if (!ioc) { + close(fd); + return; } - migrate_fd_connect(s); + migration_set_outgoing_channel(s, ioc); + object_unref(OBJECT(ioc)); } -static void fd_accept_incoming_migration(void *opaque) +static gboolean fd_accept_incoming_migration(QIOChannel *ioc, + GIOCondition condition, + gpointer opaque) { - QEMUFile *f = opaque; - - qemu_set_fd_handler(qemu_get_fd(f), NULL, NULL, NULL); - process_incoming_migration(f); + migration_set_incoming_channel(migrate_get_current(), ioc); + object_unref(OBJECT(ioc)); + return FALSE; /* unregister */ } void fd_start_incoming_migration(const char *infd, Error **errp) { + QIOChannel *ioc; int fd; - QEMUFile *f; - - DPRINTF("Attempting to start an incoming migration via fd\n"); fd = strtol(infd, NULL, 0); - if (fd_is_socket(fd)) { - f = qemu_fopen_socket(fd, "rb"); - } else { - f = qemu_fdopen(fd, "rb"); - } - if(f == NULL) { - error_setg_errno(errp, errno, "failed to open the source descriptor"); + trace_migration_fd_incoming(fd); + + ioc = qio_channel_new_fd(fd, errp); + if (!ioc) { + close(fd); return; } - qemu_set_fd_handler(fd, fd_accept_incoming_migration, NULL, f); + qio_channel_add_watch(ioc, + G_IO_IN, + fd_accept_incoming_migration, + NULL, + NULL); } |