[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 32/41] qemu-file: add writable socket QEMUFile
From: |
Orit Wasserman |
Subject: |
Re: [Qemu-devel] [PATCH 32/41] qemu-file: add writable socket QEMUFile |
Date: |
Thu, 21 Feb 2013 10:09:05 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130110 Thunderbird/17.0.2 |
On 02/15/2013 07:47 PM, Paolo Bonzini wrote:
> Signed-off-by: Paolo Bonzini <address@hidden>
> ---
> include/migration/qemu-file.h | 2 +-
> migration-tcp.c | 2 +-
> migration-unix.c | 2 +-
> savevm.c | 33 +++++++++++++++++++++++++++++++--
> util/osdep.c | 6 +++++-
> 5 files changed, 39 insertions(+), 6 deletions(-)
>
> diff --git a/include/migration/qemu-file.h b/include/migration/qemu-file.h
> index 987e719..25e8461 100644
> --- a/include/migration/qemu-file.h
> +++ b/include/migration/qemu-file.h
> @@ -76,7 +76,7 @@ typedef struct QEMUFileOps {
> QEMUFile *qemu_fopen_ops(void *opaque, const QEMUFileOps *ops);
> QEMUFile *qemu_fopen(const char *filename, const char *mode);
> QEMUFile *qemu_fdopen(int fd, const char *mode);
> -QEMUFile *qemu_fopen_socket(int fd);
> +QEMUFile *qemu_fopen_socket(int fd, const char *mode);
> QEMUFile *qemu_popen_cmd(const char *command, const char *mode);
> int qemu_get_fd(QEMUFile *f);
> int qemu_fclose(QEMUFile *f);
> diff --git a/migration-tcp.c b/migration-tcp.c
> index e78a296..7d975b5 100644
> --- a/migration-tcp.c
> +++ b/migration-tcp.c
> @@ -95,7 +95,7 @@ static void tcp_accept_incoming_migration(void *opaque)
> goto out;
> }
>
> - f = qemu_fopen_socket(c);
> + f = qemu_fopen_socket(c, "rb");
> if (f == NULL) {
> fprintf(stderr, "could not qemu_fopen socket\n");
> goto out;
> diff --git a/migration-unix.c b/migration-unix.c
> index 218835a..4693b43 100644
> --- a/migration-unix.c
> +++ b/migration-unix.c
> @@ -95,7 +95,7 @@ static void unix_accept_incoming_migration(void *opaque)
> goto out;
> }
>
> - f = qemu_fopen_socket(c);
> + f = qemu_fopen_socket(c, "rb");
> if (f == NULL) {
> fprintf(stderr, "could not qemu_fopen socket\n");
> goto out;
> diff --git a/savevm.c b/savevm.c
> index f593acd..b6cf415 100644
> --- a/savevm.c
> +++ b/savevm.c
> @@ -198,6 +198,18 @@ static int socket_get_buffer(void *opaque, uint8_t *buf,
> int64_t pos, int size)
> return len;
> }
>
> +static int socket_put_buffer(void *opaque, const uint8_t *buf, int64_t pos,
> int size)
> +{
> + QEMUFileSocket *s = opaque;
> + ssize_t len;
> +
> + len = qemu_send_full(s->fd, buf, size, 0);
> + if (len == -1) {
> + len = -socket_error();
> + }
We won't always detect partial buffer write here
Why not check len < size? this way you won't need to change qemu_send_full
> + return len;
> +}
> +
> static int socket_close(void *opaque)
> {
> QEMUFileSocket *s = opaque;
> @@ -369,12 +381,29 @@ static const QEMUFileOps socket_read_ops = {
> .close = socket_close
> };
>
> -QEMUFile *qemu_fopen_socket(int fd)
> +static const QEMUFileOps socket_write_ops = {
> + .get_fd = socket_get_fd,
> + .put_buffer = socket_put_buffer,
> + .close = socket_close
> +};
> +
> +QEMUFile *qemu_fopen_socket(int fd, const char *mode)
> {
> QEMUFileSocket *s = g_malloc0(sizeof(QEMUFileSocket));
>
> + if (mode == NULL ||
> + (mode[0] != 'r' && mode[0] != 'w') ||
> + mode[1] != 'b' || mode[2] != 0) {
> + fprintf(stderr, "qemu_fopen: Argument validity check failed\n");
> + return NULL;
> + }
> +
> s->fd = fd;
> - s->file = qemu_fopen_ops(s, &socket_read_ops);
> + if (mode[0] == 'w') {
> + s->file = qemu_fopen_ops(s, &socket_write_ops);
> + } else {
> + s->file = qemu_fopen_ops(s, &socket_read_ops);
> + }
> return s->file;
> }
>
> diff --git a/util/osdep.c b/util/osdep.c
> index 5b51a03..be168e5 100644
> --- a/util/osdep.c
> +++ b/util/osdep.c
> @@ -243,8 +243,12 @@ ssize_t qemu_write_full(int fd, const void *buf, size_t
> count)
> while (count) {
> ret = write(fd, buf, count);
> if (ret < 0) {
> - if (errno == EINTR)
> + if (errno == EINTR) {
> continue;
> + }
> + if (total == 0) {
> + total = ret;
> + }
I don't like it, first it only detect the first write failure (if the error
happens when total !=0
the function won't return -1).
Secondly this behavior is different from the function documentation.
Regards,
Orit
> break;
> }
>
>
- [Qemu-devel] [PATCH 37/41] migration: small changes around rate-limiting, (continued)
- [Qemu-devel] [PATCH 37/41] migration: small changes around rate-limiting, Paolo Bonzini, 2013/02/15
- [Qemu-devel] [PATCH 33/41] qemu-file: simplify and export qemu_ftell, Paolo Bonzini, 2013/02/15
- [Qemu-devel] [PATCH 15/41] block-migration: remove variables that are never read, Paolo Bonzini, 2013/02/15
- [Qemu-devel] [PATCH 06/41] qemu-file: pass errno from qemu_fflush via f->last_error, Paolo Bonzini, 2013/02/15
- [Qemu-devel] [PATCH 32/41] qemu-file: add writable socket QEMUFile, Paolo Bonzini, 2013/02/15
- Re: [Qemu-devel] [PATCH 32/41] qemu-file: add writable socket QEMUFile,
Orit Wasserman <=
- [Qemu-devel] [PATCH 10/41] migration: use qemu_file_set_error, Paolo Bonzini, 2013/02/15
- [Qemu-devel] [PATCH 12/41] migration: do not nest flushing of device data, Paolo Bonzini, 2013/02/15
- [Qemu-devel] [PATCH 14/41] migration: cleanup migration (including thread) in the iothread, Paolo Bonzini, 2013/02/15