Skip to content

Commit

Permalink
migration: drop is_write complications
Browse files Browse the repository at this point in the history
The same QEMUFile is never used for both read and write.  Simplify
the logic to simply look for presence or absence of the right ops.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
  • Loading branch information
bonzini authored and Juan Quintela committed Apr 9, 2013
1 parent 7ce51f1 commit d9658c4
Showing 1 changed file with 20 additions and 48 deletions.
68 changes: 20 additions & 48 deletions savevm.c
Expand Up @@ -119,7 +119,6 @@ void qemu_announce_self(void)
struct QEMUFile {
const QEMUFileOps *ops;
void *opaque;
int is_write;

int64_t bytes_xfer;
int64_t xfer_limit;
Expand Down Expand Up @@ -500,7 +499,6 @@ QEMUFile *qemu_fopen_ops(void *opaque, const QEMUFileOps *ops)

f->opaque = opaque;
f->ops = ops;
f->is_write = 0;
return f;
}

Expand All @@ -516,6 +514,11 @@ static void qemu_file_set_error(QEMUFile *f, int ret)
}
}

static inline bool qemu_file_is_writable(QEMUFile *f)
{
return f->ops->writev_buffer || f->ops->put_buffer;
}

/**
* Flushes QEMUFile buffer
*
Expand All @@ -526,26 +529,24 @@ static void qemu_fflush(QEMUFile *f)
{
ssize_t ret = 0;

if (!f->ops->writev_buffer && !f->ops->put_buffer) {
if (!qemu_file_is_writable(f)) {
return;
}

if (f->is_write) {
if (f->ops->writev_buffer) {
if (f->iovcnt > 0) {
ret = f->ops->writev_buffer(f->opaque, f->iov, f->iovcnt);
}
} else {
if (f->buf_index > 0) {
ret = f->ops->put_buffer(f->opaque, f->buf, f->pos, f->buf_index);
}
if (f->ops->writev_buffer) {
if (f->iovcnt > 0) {
ret = f->ops->writev_buffer(f->opaque, f->iov, f->iovcnt);
}
if (ret >= 0) {
f->pos += ret;
} else {
if (f->buf_index > 0) {
ret = f->ops->put_buffer(f->opaque, f->buf, f->pos, f->buf_index);
}
f->buf_index = 0;
f->iovcnt = 0;
}
if (ret >= 0) {
f->pos += ret;
}
f->buf_index = 0;
f->iovcnt = 0;
if (ret < 0) {
qemu_file_set_error(f, ret);
}
Expand All @@ -556,11 +557,7 @@ static void qemu_fill_buffer(QEMUFile *f)
int len;
int pending;

if (!f->ops->get_buffer)
return;

if (f->is_write)
abort();
assert(!qemu_file_is_writable(f));

pending = f->buf_size - f->buf_index;
if (pending > 0) {
Expand Down Expand Up @@ -629,7 +626,6 @@ static void add_to_iovec(QEMUFile *f, const uint8_t *buf, int size)
f->iov[f->iovcnt++].iov_len = size;
}

f->is_write = 1;
if (f->buf_index >= IO_BUF_SIZE || f->iovcnt >= MAX_IOV_SIZE) {
qemu_fflush(f);
}
Expand All @@ -646,12 +642,6 @@ void qemu_put_buffer_async(QEMUFile *f, const uint8_t *buf, int size)
return;
}

if (f->is_write == 0 && f->buf_index > 0) {
fprintf(stderr,
"Attempted to write to buffer while read buffer is not empty\n");
abort();
}

f->bytes_xfer += size;
add_to_iovec(f, buf, size);
}
Expand All @@ -664,12 +654,6 @@ void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size)
return;
}

if (f->is_write == 0 && f->buf_index > 0) {
fprintf(stderr,
"Attempted to write to buffer while read buffer is not empty\n");
abort();
}

while (size > 0) {
l = IO_BUF_SIZE - f->buf_index;
if (l > size)
Expand All @@ -680,7 +664,6 @@ void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size)
add_to_iovec(f, f->buf + f->buf_index, l);
f->buf_index += l;
} else {
f->is_write = 1;
f->buf_index += l;
if (f->buf_index == IO_BUF_SIZE) {
qemu_fflush(f);
Expand All @@ -700,19 +683,12 @@ void qemu_put_byte(QEMUFile *f, int v)
return;
}

if (f->is_write == 0 && f->buf_index > 0) {
fprintf(stderr,
"Attempted to write to buffer while read buffer is not empty\n");
abort();
}

f->buf[f->buf_index] = v;
f->bytes_xfer++;
if (f->ops->writev_buffer) {
add_to_iovec(f, f->buf + f->buf_index, 1);
f->buf_index++;
} else {
f->is_write = 1;
f->buf_index++;
if (f->buf_index == IO_BUF_SIZE) {
qemu_fflush(f);
Expand All @@ -732,9 +708,7 @@ static int qemu_peek_buffer(QEMUFile *f, uint8_t *buf, int size, size_t offset)
int pending;
int index;

if (f->is_write) {
abort();
}
assert(!qemu_file_is_writable(f));

index = f->buf_index + offset;
pending = f->buf_size - index;
Expand Down Expand Up @@ -779,9 +753,7 @@ static int qemu_peek_byte(QEMUFile *f, int offset)
{
int index = f->buf_index + offset;

if (f->is_write) {
abort();
}
assert(!qemu_file_is_writable(f));

if (index >= f->buf_size) {
qemu_fill_buffer(f);
Expand Down

0 comments on commit d9658c4

Please sign in to comment.