Skip to content

Commit

Permalink
qemu-file: Make qemu_fflush() return errors
Browse files Browse the repository at this point in the history
This let us simplify code of this shape.

   qemu_fflush(f);
   int ret = qemu_file_get_error(f);
   if (ret) {
      return ret;
   }

into:

   int ret = qemu_fflush(f);
   if (ret) {
      return ret;
   }

I updated all callers where there is any error check.
qemu_fclose() don't need to check for f->last_error because
qemu_fflush() returns it at the beggining of the function.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Fabiano Rosas <farosas@suse.de>
Signed-off-by: Juan Quintela <quintela@redhat.com>

Message-ID: <20231025091117.6342-13-quintela@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
  • Loading branch information
Juan Quintela committed Oct 31, 2023
1 parent 0f85961 commit be07a0e
Show file tree
Hide file tree
Showing 7 changed files with 21 additions and 51 deletions.
11 changes: 3 additions & 8 deletions migration/colo.c
Original file line number Diff line number Diff line change
Expand Up @@ -314,9 +314,7 @@ static void colo_send_message(QEMUFile *f, COLOMessage msg,
return;
}
qemu_put_be32(f, msg);
qemu_fflush(f);

ret = qemu_file_get_error(f);
ret = qemu_fflush(f);
if (ret < 0) {
error_setg_errno(errp, -ret, "Can't send COLO message");
}
Expand All @@ -335,9 +333,7 @@ static void colo_send_message_value(QEMUFile *f, COLOMessage msg,
return;
}
qemu_put_be64(f, value);
qemu_fflush(f);

ret = qemu_file_get_error(f);
ret = qemu_fflush(f);
if (ret < 0) {
error_setg_errno(errp, -ret, "Failed to send value for message:%s",
COLOMessage_str(msg));
Expand Down Expand Up @@ -483,8 +479,7 @@ static int colo_do_checkpoint_transaction(MigrationState *s,
}

qemu_put_buffer(s->to_dst_file, bioc->data, bioc->usage);
qemu_fflush(s->to_dst_file);
ret = qemu_file_get_error(s->to_dst_file);
ret = qemu_fflush(s->to_dst_file);
if (ret < 0) {
goto out;
}
Expand Down
7 changes: 1 addition & 6 deletions migration/migration.c
Original file line number Diff line number Diff line change
Expand Up @@ -305,12 +305,7 @@ static int migrate_send_rp_message(MigrationIncomingState *mis,
qemu_put_be16(mis->to_src_file, (unsigned int)message_type);
qemu_put_be16(mis->to_src_file, len);
qemu_put_buffer(mis->to_src_file, data, len);
qemu_fflush(mis->to_src_file);

/* It's possible that qemu file got error during sending */
ret = qemu_file_get_error(mis->to_src_file);

return ret;
return qemu_fflush(mis->to_src_file);
}

/* Request one page from the source VM at the given start address.
Expand Down
23 changes: 7 additions & 16 deletions migration/qemu-file.c
Original file line number Diff line number Diff line change
Expand Up @@ -262,14 +262,14 @@ static void qemu_iovec_release_ram(QEMUFile *f)
* This will flush all pending data. If data was only partially flushed, it
* will set an error state.
*/
void qemu_fflush(QEMUFile *f)
int qemu_fflush(QEMUFile *f)
{
if (!qemu_file_is_writable(f)) {
return;
return f->last_error;
}

if (qemu_file_get_error(f)) {
return;
if (f->last_error) {
return f->last_error;
}
if (f->iovcnt > 0) {
Error *local_error = NULL;
Expand All @@ -287,6 +287,7 @@ void qemu_fflush(QEMUFile *f)

f->buf_index = 0;
f->iovcnt = 0;
return f->last_error;
}

/*
Expand Down Expand Up @@ -353,22 +354,12 @@ static ssize_t coroutine_mixed_fn qemu_fill_buffer(QEMUFile *f)
*/
int qemu_fclose(QEMUFile *f)
{
int ret, ret2;
qemu_fflush(f);
ret = qemu_file_get_error(f);

ret2 = qio_channel_close(f->ioc, NULL);
int ret = qemu_fflush(f);
int ret2 = qio_channel_close(f->ioc, NULL);
if (ret >= 0) {
ret = ret2;
}
g_clear_pointer(&f->ioc, object_unref);

/* If any error was spotted before closing, we should report it
* instead of the close() return value.
*/
if (f->last_error) {
ret = f->last_error;
}
error_free(f->last_error_obj);
g_free(f);
trace_qemu_file_fclose();
Expand Down
2 changes: 1 addition & 1 deletion migration/qemu-file.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ void qemu_file_set_error_obj(QEMUFile *f, int ret, Error *err);
void qemu_file_set_error(QEMUFile *f, int ret);
int qemu_file_shutdown(QEMUFile *f);
QEMUFile *qemu_file_get_return_path(QEMUFile *f);
void qemu_fflush(QEMUFile *f);
int qemu_fflush(QEMUFile *f);
void qemu_file_set_blocking(QEMUFile *f, bool block);
int qemu_file_get_to_fd(QEMUFile *f, int fd, size_t size);

Expand Down
22 changes: 7 additions & 15 deletions migration/ram.c
Original file line number Diff line number Diff line change
Expand Up @@ -305,17 +305,15 @@ int64_t ramblock_recv_bitmap_send(QEMUFile *file,

qemu_put_be64(file, size);
qemu_put_buffer(file, (const uint8_t *)le_bitmap, size);
g_free(le_bitmap);
/*
* Mark as an end, in case the middle part is screwed up due to
* some "mysterious" reason.
*/
qemu_put_be64(file, RAMBLOCK_RECV_BITMAP_ENDING);
qemu_fflush(file);

g_free(le_bitmap);

if (qemu_file_get_error(file)) {
return qemu_file_get_error(file);
int ret = qemu_fflush(file);
if (ret) {
return ret;
}

return size + sizeof(size);
Expand Down Expand Up @@ -2996,9 +2994,7 @@ static int ram_save_setup(QEMUFile *f, void *opaque)
}

qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
qemu_fflush(f);

return 0;
return qemu_fflush(f);
}

/**
Expand Down Expand Up @@ -3118,10 +3114,8 @@ static int ram_save_iterate(QEMUFile *f, void *opaque)
}

qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
qemu_fflush(f);
ram_transferred_add(8);

ret = qemu_file_get_error(f);
ret = qemu_fflush(f);
}
if (ret < 0) {
return ret;
Expand Down Expand Up @@ -3196,9 +3190,7 @@ static int ram_save_complete(QEMUFile *f, void *opaque)
qemu_put_be64(f, RAM_SAVE_FLAG_MULTIFD_FLUSH);
}
qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
qemu_fflush(f);

return 0;
return qemu_fflush(f);
}

static void ram_state_pending_estimate(void *opaque, uint64_t *must_precopy,
Expand Down
4 changes: 1 addition & 3 deletions migration/rdma.c
Original file line number Diff line number Diff line change
Expand Up @@ -3853,9 +3853,7 @@ int rdma_registration_start(QEMUFile *f, uint64_t flags)

trace_rdma_registration_start(flags);
qemu_put_be64(f, RAM_SAVE_FLAG_HOOK);
qemu_fflush(f);

return 0;
return qemu_fflush(f);
}

/*
Expand Down
3 changes: 1 addition & 2 deletions migration/savevm.c
Original file line number Diff line number Diff line change
Expand Up @@ -1583,8 +1583,7 @@ int qemu_savevm_state_complete_precopy(QEMUFile *f, bool iterable_only,
}

flush:
qemu_fflush(f);
return 0;
return qemu_fflush(f);
}

/* Give an estimate of the amount left to be transferred,
Expand Down

0 comments on commit be07a0e

Please sign in to comment.