diff options
author | John Levon <john.levon@nutanix.com> | 2021-04-14 10:45:41 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-14 10:45:41 +0100 |
commit | b91f52e49039d41007c530a5ba7554c1603060c9 (patch) | |
tree | a99159d9d2f8640c324500b0637049094f4c2320 | |
parent | 7c08067fa7376589ff8177c6cc9a36a12a12c407 (diff) | |
download | libvfio-user-b91f52e49039d41007c530a5ba7554c1603060c9.zip libvfio-user-b91f52e49039d41007c530a5ba7554c1603060c9.tar.gz libvfio-user-b91f52e49039d41007c530a5ba7554c1603060c9.tar.bz2 |
migration: use ERROR_INT() (#432)
Signed-off-by: John Levon <john.levon@nutanix.com>
Reviewed-by: Thanos Makatos <thanos.makatos@nutanix.com>
-rw-r--r-- | include/libvfio-user.h | 6 | ||||
-rw-r--r-- | lib/libvfio-user.c | 3 | ||||
-rw-r--r-- | lib/migration.c | 55 | ||||
-rw-r--r-- | lib/tran_sock.c | 2 |
4 files changed, 35 insertions, 31 deletions
diff --git a/include/libvfio-user.h b/include/libvfio-user.h index fa21bc2..d1c30e4 100644 --- a/include/libvfio-user.h +++ b/include/libvfio-user.h @@ -495,7 +495,7 @@ typedef struct { /* * Migration state transition callback. * - * Returns -1 on error, setting errno. + * The callback should return -1 on error, setting errno. * * TODO rename to vfu_migration_state_transition_callback * FIXME maybe we should create a single callback and pass the state? @@ -524,6 +524,8 @@ typedef struct { * * When in resuming state, @offset must be set to where migration data must * written. @size points to NULL. + * + * The callback should return -1 on error, setting errno. */ int (*prepare_data)(vfu_ctx_t *vfu_ctx, uint64_t *offset, uint64_t *size); @@ -554,6 +556,8 @@ typedef struct { /* * Function that is called when client has written some previously stored * device state. + * + * The callback should return -1 on error, setting errno. */ int (*data_written)(vfu_ctx_t *vfu_ctx, uint64_t count); diff --git a/lib/libvfio-user.c b/lib/libvfio-user.c index 47d0651..0d8a310 100644 --- a/lib/libvfio-user.c +++ b/lib/libvfio-user.c @@ -221,6 +221,9 @@ region_access(vfu_ctx_t *vfu_ctx, size_t region_index, char *buf, } } else if (is_migr_reg(vfu_ctx, region_index) && vfu_ctx->migration != NULL) { ret = migration_region_access(vfu_ctx, buf, count, offset, is_write); + if (ret == -1) { + ret = -errno; + } } else { vfu_region_access_cb_t *cb = vfu_ctx->reg_info[region_index].cb; diff --git a/lib/migration.c b/lib/migration.c index ff6913b..899a8c4 100644 --- a/lib/migration.c +++ b/lib/migration.c @@ -122,7 +122,7 @@ handle_device_state(vfu_ctx_t *vfu_ctx, struct migration *migr, if (*device_state & ~VFIO_DEVICE_STATE_MASK) { vfu_log(vfu_ctx, LOG_ERR, "bad device state %#x", *device_state); - return -EINVAL; + return ERROR_INT(EINVAL); } if (!vfio_migr_state_transition_is_valid(migr->info.device_state, @@ -130,7 +130,7 @@ handle_device_state(vfu_ctx_t *vfu_ctx, struct migration *migr, vfu_log(vfu_ctx, LOG_ERR, "bad transition from state %s to state %s", migr_states[migr->info.device_state].name, migr_states[*device_state].name); - return -EINVAL; + return ERROR_INT(EINVAL); } switch (*device_state) { @@ -164,8 +164,8 @@ handle_device_state(vfu_ctx_t *vfu_ctx, struct migration *migr, migr->info.device_state = *device_state; migr_state_transition(migr, VFIO_USER_MIGR_ITER_STATE_INITIAL); } else if (ret < 0) { - vfu_log(vfu_ctx, LOG_ERR, "failed to transition to state %d: %s", - *device_state, strerror(-ret)); + vfu_log(vfu_ctx, LOG_ERR, "failed to transition to state %d: %m", + *device_state); } return ret; @@ -181,7 +181,7 @@ handle_pending_bytes(vfu_ctx_t *vfu_ctx, struct migration *migr, assert(pending_bytes != NULL); if (is_write) { - return -EINVAL; + return ERROR_INT(EINVAL); } if (migr->iter.state == VFIO_USER_MIGR_ITER_STATE_FINISHED) { @@ -213,7 +213,7 @@ handle_pending_bytes(vfu_ctx_t *vfu_ctx, struct migration *migr, *pending_bytes = migr->iter.pending_bytes; break; default: - return -EINVAL; + return ERROR_INT(EINVAL); } return 0; } @@ -235,7 +235,7 @@ handle_data_offset_when_saving(vfu_ctx_t *vfu_ctx, struct migration *migr, if (is_write) { vfu_log(vfu_ctx, LOG_ERR, "data_offset is RO when saving"); - return -EINVAL; + return ERROR_INT(EINVAL); } switch (migr->iter.state) { @@ -262,7 +262,7 @@ handle_data_offset_when_saving(vfu_ctx_t *vfu_ctx, struct migration *migr, default: vfu_log(vfu_ctx, LOG_ERR, "reading data_offset out of sequence is undefined"); - return -EINVAL; + return ERROR_INT(EINVAL); } return 0; @@ -289,7 +289,7 @@ handle_data_offset(vfu_ctx_t *vfu_ctx, struct migration *migr, if (is_write) { /* TODO writing to read-only registers should be simply ignored */ vfu_log(vfu_ctx, LOG_ERR, "bad write to migration data_offset"); - return -EINVAL; + return ERROR_INT(EINVAL); } ret = migr->callbacks.prepare_data(vfu_ctx, offset, NULL); if (ret < 0) { @@ -302,7 +302,7 @@ handle_data_offset(vfu_ctx_t *vfu_ctx, struct migration *migr, vfu_log(vfu_ctx, LOG_ERR, "bad access to migration data_offset in state %s", migr_states[migr->info.device_state].name); - return -EINVAL; + return ERROR_INT(EINVAL); } static ssize_t @@ -314,14 +314,14 @@ handle_data_size_when_saving(vfu_ctx_t *vfu_ctx, struct migration *migr, if (is_write) { /* TODO improve error message */ vfu_log(vfu_ctx, LOG_ERR, "data_size is RO when saving"); - return -EINVAL; + return ERROR_INT(EINVAL); } if (migr->iter.state != VFIO_USER_MIGR_ITER_STATE_STARTED && migr->iter.state != VFIO_USER_MIGR_ITER_STATE_DATA_PREPARED) { vfu_log(vfu_ctx, LOG_ERR, "reading data_size ouf of sequence is undefined"); - return -EINVAL; + return ERROR_INT(EINVAL); } return 0; } @@ -360,7 +360,7 @@ handle_data_size(vfu_ctx_t *vfu_ctx, struct migration *migr, } /* TODO improve error message */ vfu_log(vfu_ctx, LOG_ERR, "bad access to data_size"); - return -EINVAL; + return ERROR_INT(EINVAL); } static ssize_t @@ -377,7 +377,7 @@ migration_region_access_registers(vfu_ctx_t *vfu_ctx, char *buf, size_t count, if (count != sizeof(migr->info.device_state)) { vfu_log(vfu_ctx, LOG_ERR, "bad device_state access size %ld", count); - return -EINVAL; + return ERROR_INT(EINVAL); } ret = handle_device_state(vfu_ctx, migr, (uint32_t *)buf, is_write); break; @@ -385,7 +385,7 @@ migration_region_access_registers(vfu_ctx_t *vfu_ctx, char *buf, size_t count, if (count != sizeof(migr->info.pending_bytes)) { vfu_log(vfu_ctx, LOG_ERR, "bad pending_bytes access size %ld", count); - return -EINVAL; + return ERROR_INT(EINVAL); } ret = handle_pending_bytes(vfu_ctx, migr, (uint64_t *)buf, is_write); break; @@ -393,7 +393,7 @@ migration_region_access_registers(vfu_ctx_t *vfu_ctx, char *buf, size_t count, if (count != sizeof(migr->info.data_offset)) { vfu_log(vfu_ctx, LOG_ERR, "bad data_offset access size %ld", count); - return -EINVAL; + return ERROR_INT(EINVAL); } ret = handle_data_offset(vfu_ctx, migr, (uint64_t *)buf, is_write); break; @@ -401,14 +401,14 @@ migration_region_access_registers(vfu_ctx_t *vfu_ctx, char *buf, size_t count, if (count != sizeof(migr->info.data_size)) { vfu_log(vfu_ctx, LOG_ERR, "bad data_size access size %ld", count); - return -EINVAL; + return ERROR_INT(EINVAL); } ret = handle_data_size(vfu_ctx, migr, (uint64_t *)buf, is_write); break; default: vfu_log(vfu_ctx, LOG_ERR, "bad migration region register offset %#lx", pos); - return -EINVAL; + return ERROR_INT(EINVAL); } return ret; } @@ -418,7 +418,7 @@ migration_region_access(vfu_ctx_t *vfu_ctx, char *buf, size_t count, loff_t pos, bool is_write) { struct migration *migr = vfu_ctx->migration; - ssize_t ret = -EINVAL; + ssize_t ret; assert(migr != NULL); assert(buf != NULL); @@ -442,14 +442,14 @@ migration_region_access(vfu_ctx_t *vfu_ctx, char *buf, size_t count, vfu_log(vfu_ctx, LOG_WARNING, "bad access to dead space %#lx-%#lx in migration region", pos, pos + count - 1); - return -EINVAL; + return ERROR_INT(EINVAL); } pos -= migr->data_offset; if (is_write) { ret = migr->callbacks.write_data(vfu_ctx, buf, count, pos); - if (ret == -1) { - ret = -errno; + if (ret < 0) { + return -1; } } else { /* @@ -461,16 +461,13 @@ migration_region_access(vfu_ctx_t *vfu_ctx, char *buf, size_t count, * Does this mean that partial reads are not allowed? */ ret = migr->callbacks.read_data(vfu_ctx, buf, count, pos); - if (ret == -1) { - ret = -errno; + if (ret < 0) { + return -1; } } } - if (ret == 0) { - ret = count; - } - return ret; + return count; } bool @@ -500,7 +497,7 @@ migration_set_pgsize(struct migration *migr, size_t pgsize) // FIXME? if (pgsize != PAGE_SIZE) { - return -EINVAL; + return ERROR_INT(EINVAL); } migr->pgsize = pgsize; diff --git a/lib/tran_sock.c b/lib/tran_sock.c index 868a5be..3785e67 100644 --- a/lib/tran_sock.c +++ b/lib/tran_sock.c @@ -620,7 +620,7 @@ recv_version(vfu_ctx_t *vfu_ctx, int sock, uint16_t *msg_idp, if (ret != 0) { vfu_log(vfu_ctx, LOG_ERR, "refusing client page size of %zu", pgsize); - ret = -ret; + ret = errno; goto out; } } |