[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 25/41] buffered_file: make buffered_flush return
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [PATCH 25/41] buffered_file: make buffered_flush return the error code |
Date: |
Fri, 21 Sep 2012 14:43:43 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120911 Thunderbird/15.0.1 |
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 <address@hidden>
> ---
> 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);
>
- Re: [Qemu-devel] [PATCH 30/41] savevm: make qemu_fflush() return an error code, (continued)
- [Qemu-devel] [PATCH 38/41] block-migration: handle errors with the return codes correctly, Juan Quintela, 2012/09/21
- [Qemu-devel] [PATCH 40/41] savevm: make qemu_file_put_notify() return errors, Juan Quintela, 2012/09/21
- [Qemu-devel] [PATCH 36/41] block-migration: make flush_blks() return errors, Juan Quintela, 2012/09/21
- [Qemu-devel] [PATCH 39/41] savevm: un-export qemu_file_set_error(), Juan Quintela, 2012/09/21
- [Qemu-devel] [PATCH 25/41] buffered_file: make buffered_flush return the error code, Juan Quintela, 2012/09/21
- Re: [Qemu-devel] [PATCH 25/41] buffered_file: make buffered_flush return the error code,
Paolo Bonzini <=
- [Qemu-devel] [PATCH 33/41] savevm: make qemu_fill_buffer() be consistent, Juan Quintela, 2012/09/21
- [Qemu-devel] [PATCH 32/41] savevm: unexport qemu_ftell(), Juan Quintela, 2012/09/21
- [Qemu-devel] [PATCH 31/41] savevm: unfold qemu_fclose_internal(), Juan Quintela, 2012/09/21
- [Qemu-devel] [PATCH 28/41] virtio-net: use qemu_get_buffer() in a temp buffer, Juan Quintela, 2012/09/21
- [Qemu-devel] [PATCH 41/41] cpus: create qemu_cpu_is_vcpu(), Juan Quintela, 2012/09/21