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 /migration-tcp.c | |
parent | efab4718f4203132244758fbc76b8b0676b9d85d (diff) | |
download | qemu-8414ff3bd8bfafbcb632c670f4d81c8e4f15e703.zip qemu-8414ff3bd8bfafbcb632c670f4d81c8e4f15e703.tar.gz qemu-8414ff3bd8bfafbcb632c670f4d81c8e4f15e703.tar.bz2 |
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>
Diffstat (limited to 'migration-tcp.c')
-rw-r--r-- | migration-tcp.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/migration-tcp.c b/migration-tcp.c index bd3aa3a..619df21 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; } |