From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:44917) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TEyuH-0007uk-K1 for qemu-devel@nongnu.org; Fri, 21 Sep 2012 04:48:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TEyuB-0004pM-Lw for qemu-devel@nongnu.org; Fri, 21 Sep 2012 04:48:17 -0400 Received: from mx1.redhat.com ([209.132.183.28]:3253) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TEyuB-0004pD-CT for qemu-devel@nongnu.org; Fri, 21 Sep 2012 04:48:11 -0400 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8L8mA74012324 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 21 Sep 2012 04:48:10 -0400 From: Juan Quintela Date: Fri, 21 Sep 2012 10:47:19 +0200 Message-Id: <1348217255-22441-26-git-send-email-quintela@redhat.com> In-Reply-To: <1348217255-22441-1-git-send-email-quintela@redhat.com> References: <1348217255-22441-1-git-send-email-quintela@redhat.com> Subject: [Qemu-devel] [PATCH 25/41] buffered_file: make buffered_flush return the error code List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Or the amount of data written if there is no error. Adjust all callers. Signed-off-by: Juan Quintela --- buffered_file.c | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/buffered_file.c b/buffered_file.c index 747d672..9db73dc 100644 --- a/buffered_file.c +++ b/buffered_file.c @@ -58,26 +58,26 @@ static void buffered_append(QEMUFileBuffered *s, s->buffer_size += size; } -static void buffered_flush(QEMUFileBuffered *s) +static int buffered_flush(QEMUFileBuffered *s) { size_t offset = 0; + int ret = 0; DPRINTF("flushing %zu byte(s) of data\n", s->buffer_size); while (s->bytes_xfer < s->xfer_limit && offset < s->buffer_size) { - ssize_t ret; ret = migrate_fd_put_buffer(s->migration_state, s->buffer + offset, s->buffer_size - offset); if (ret == -EAGAIN) { DPRINTF("backend not ready, freezing\n"); + ret = 0; s->freeze_output = 1; break; } if (ret <= 0) { DPRINTF("error flushing data, %zd\n", ret); - qemu_file_set_error(s->file, ret); break; } else { DPRINTF("flushed %zd byte(s)\n", ret); @@ -89,6 +89,11 @@ static void buffered_flush(QEMUFileBuffered *s) DPRINTF("flushed %zu of %zu byte(s)\n", offset, s->buffer_size); memmove(s->buffer, s->buffer + offset, s->buffer_size - offset); s->buffer_size -= offset; + + if (ret < 0) { + return ret; + } + return offset; } static int buffered_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, int size) @@ -112,7 +117,13 @@ static int buffered_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, in buffered_append(s, buf, size); } - buffered_flush(s); + error = buffered_flush(s); + if (error < 0) { + DPRINTF("buffered flush error. bailing: %s\n", strerror(-error)); + qemu_file_set_error(s->file, error); + + return error; + } if (pos == 0 && size == 0) { DPRINTF("file is ready\n"); @@ -128,19 +139,24 @@ static int buffered_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, in static int buffered_close(void *opaque) { QEMUFileBuffered *s = opaque; - int ret; + int ret = 0, ret2; DPRINTF("closing\n"); s->xfer_limit = INT_MAX; while (!qemu_file_get_error(s->file) && s->buffer_size) { - buffered_flush(s); + ret = buffered_flush(s); + if (ret < 0) { + break; + } if (s->freeze_output) migrate_fd_wait_for_unfreeze(s->migration_state); } - ret = migrate_fd_close(s->migration_state); - + ret2 = migrate_fd_close(s->migration_state); + if (ret >= 0) { + ret = ret2; + } qemu_del_timer(s->timer); qemu_free_timer(s->timer); g_free(s->buffer); -- 1.7.11.4