From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:36981) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TF2aJ-00083O-0g for qemu-devel@nongnu.org; Fri, 21 Sep 2012 08:43:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TF2aE-0000mH-RK for qemu-devel@nongnu.org; Fri, 21 Sep 2012 08:43:54 -0400 Received: from mail-pb0-f45.google.com ([209.85.160.45]:63961) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TF2aE-0000mC-KQ for qemu-devel@nongnu.org; Fri, 21 Sep 2012 08:43:50 -0400 Received: by pbbrp12 with SMTP id rp12so7603284pbb.4 for ; Fri, 21 Sep 2012 05:43:49 -0700 (PDT) Sender: Paolo Bonzini Message-ID: <505C60FF.70205@redhat.com> Date: Fri, 21 Sep 2012 14:43:43 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: <1348217255-22441-1-git-send-email-quintela@redhat.com> <1348217255-22441-26-git-send-email-quintela@redhat.com> In-Reply-To: <1348217255-22441-26-git-send-email-quintela@redhat.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: Re: [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: Juan Quintela Cc: qemu-devel@nongnu.org Il 21/09/2012 10:47, Juan Quintela ha scritto: > 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) Should this be ssize_t? > { > 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; Same here too (ssize_t). Paolo > > 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; > + } Perhaps the other way round: if (ret < 0) { ret2 = -1; } ... return ret2; so that buffered_close can still return int without having a suspicious truncation of its return value from ssize_t to int. Paolo > qemu_del_timer(s->timer); > qemu_free_timer(s->timer); > g_free(s->buffer); >