summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndres Freund <andres@anarazel.de>2019-09-13 12:10:10 -0700
committerAndres Freund <andres@anarazel.de>2019-09-13 12:18:23 -0700
commit34d6090ea96ddaa4e2a0f914939e2b8ff7008bec (patch)
tree59d7720d94a5af674dc5f46f9e7f2dafd56d330d
parent4c29a34fcc8cae333ec8b7af7657495745153b44 (diff)
downloadfio-34d6090ea96ddaa4e2a0f914939e2b8ff7008bec.tar.gz
fio-34d6090ea96ddaa4e2a0f914939e2b8ff7008bec.tar.bz2
engines/io_uring: Fully clear out previous SQE contents.
Without this change SQEs can contain data set in previous submissions. E.g. a WRITE following an fdatasync would have still have IORING_FSYNC_DATASYNC set in sync_flags, which shares storage with the WRITE's rw_flags. Which was not reset, causing all writes to be synchronous. Similarly, an fsync following a READ/WRITE would not reset off/addr/len, which causes errors, because the kernel's io_prep_fsync returns an error if e.g. addr is not 0. While this could also be fixed by resetting only the unused fields in the respective branches, it seems less failure prone to start with a zeroed out sqe.
-rw-r--r--engines/io_uring.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/engines/io_uring.c b/engines/io_uring.c
index 53cb60c5..e5edfcd2 100644
--- a/engines/io_uring.c
+++ b/engines/io_uring.c
@@ -152,15 +152,16 @@ static int fio_ioring_prep(struct thread_data *td, struct io_u *io_u)
struct io_uring_sqe *sqe;
sqe = &ld->sqes[io_u->index];
+
+ /* zero out fields not used in this submission */
+ memset(sqe, 0, sizeof(*sqe));
+
if (o->registerfiles) {
sqe->fd = f->engine_pos;
sqe->flags = IOSQE_FIXED_FILE;
} else {
sqe->fd = f->fd;
- sqe->flags = 0;
}
- sqe->ioprio = 0;
- sqe->buf_index = 0;
if (io_u->ddir == DDIR_READ || io_u->ddir == DDIR_WRITE) {
if (o->fixedbufs) {
@@ -187,7 +188,6 @@ static int fio_ioring_prep(struct thread_data *td, struct io_u *io_u)
sqe->sync_range_flags = td->o.sync_file_range;
sqe->opcode = IORING_OP_SYNC_FILE_RANGE;
} else {
- sqe->fsync_flags = 0;
if (io_u->ddir == DDIR_DATASYNC)
sqe->fsync_flags |= IORING_FSYNC_DATASYNC;
sqe->opcode = IORING_OP_FSYNC;