aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Levon <john.levon@nutanix.com>2021-04-14 10:45:41 +0100
committerGitHub <noreply@github.com>2021-04-14 10:45:41 +0100
commitb91f52e49039d41007c530a5ba7554c1603060c9 (patch)
treea99159d9d2f8640c324500b0637049094f4c2320
parent7c08067fa7376589ff8177c6cc9a36a12a12c407 (diff)
downloadlibvfio-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.h6
-rw-r--r--lib/libvfio-user.c3
-rw-r--r--lib/migration.c55
-rw-r--r--lib/tran_sock.c2
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;
}
}