diff options
author | Juan Quintela <quintela@redhat.com> | 2011-02-23 19:56:52 +0100 |
---|---|---|
committer | Juan Quintela <quintela@redhat.com> | 2011-10-20 13:23:54 +0200 |
commit | 8414ff3bd8bfafbcb632c670f4d81c8e4f15e703 (patch) | |
tree | 193b7ec16125456715929dac6c16cb5e8493d3c6 | |
parent | efab4718f4203132244758fbc76b8b0676b9d85d (diff) |
migration: propagate error correctly
unix and tcp outgoing migration have error values, but didn't returned
it. Make them return the error. Notice that EINPROGRESS & EWOULDBLOCK
are not considered errors as call will be retry later.
Signed-off-by: Juan Quintela <quintela@redhat.com>
Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>
-rw-r--r-- | migration-tcp.c | 20 | ||||
-rw-r--r-- | migration-unix.c | 26 |
2 files changed, 21 insertions, 25 deletions
diff --git a/migration-tcp.c b/migration-tcp.c index bd3aa3a4a5..619df2108d 100644 --- a/migration-tcp.c +++ b/migration-tcp.c @@ -90,26 +90,28 @@ int tcp_start_outgoing_migration(MigrationState *s, const char *host_port) s->fd = qemu_socket(PF_INET, SOCK_STREAM, 0); if (s->fd == -1) { - return -1; + return -socket_error(); } socket_set_nonblock(s->fd); do { ret = connect(s->fd, (struct sockaddr *)&addr, sizeof(addr)); - if (ret == -1) - ret = -(socket_error()); - - if (ret == -EINPROGRESS || ret == -EWOULDBLOCK) + if (ret == -1) { + ret = -socket_error(); + } + if (ret == -EINPROGRESS || ret == -EWOULDBLOCK) { qemu_set_fd_handler2(s->fd, NULL, NULL, tcp_wait_for_connect, s); + return 0; + } } while (ret == -EINTR); - if (ret < 0 && ret != -EINPROGRESS && ret != -EWOULDBLOCK) { + if (ret < 0) { DPRINTF("connect failed\n"); migrate_fd_error(s); - } else if (ret >= 0) - migrate_fd_connect(s); - + return ret; + } + migrate_fd_connect(s); return 0; } diff --git a/migration-unix.c b/migration-unix.c index ca6685101a..f979b5fb9d 100644 --- a/migration-unix.c +++ b/migration-unix.c @@ -88,35 +88,29 @@ int unix_start_outgoing_migration(MigrationState *s, const char *path) s->fd = qemu_socket(PF_UNIX, SOCK_STREAM, 0); if (s->fd < 0) { DPRINTF("Unable to open socket"); - goto err_after_socket; + return -errno; } socket_set_nonblock(s->fd); do { ret = connect(s->fd, (struct sockaddr *)&addr, sizeof(addr)); - if (ret == -1) + if (ret == -1) { ret = -errno; - - if (ret == -EINPROGRESS || ret == -EWOULDBLOCK) + } + if (ret == -EINPROGRESS || ret == -EWOULDBLOCK) { qemu_set_fd_handler2(s->fd, NULL, NULL, unix_wait_for_connect, s); + return 0; + } } while (ret == -EINTR); - if (ret < 0 && ret != -EINPROGRESS && ret != -EWOULDBLOCK) { + if (ret < 0) { DPRINTF("connect failed\n"); - goto err_after_open; + migrate_fd_error(s); + return ret; } - - if (ret >= 0) - migrate_fd_connect(s); - + migrate_fd_connect(s); return 0; - -err_after_open: - close(s->fd); - -err_after_socket: - return -1; } static void unix_accept_incoming_migration(void *opaque) |