Flexible I/O Tester development
 help / color / mirror / Atom feed
From: Jens Axboe <axboe@kernel.dk>
To: <fio@vger.kernel.org>
Subject: Recent changes (master)
Date: Thu, 25 Jun 2026 06:00:01 -0600	[thread overview]
Message-ID: <20260625120001.5E2C71BC0156@kernel.dk> (raw)

The following changes since commit 2c69e8e9b67c0e8967cb1b9e67a74ef55ef9d027:

  test: run QEMU tests on push and pull request (2026-06-23 16:36:52 -0400)

are available in the Git repository at:

  git://git.kernel.dk/fio.git master

for you to fetch changes up to d72bcf71534b5ac82359e3b987ff109b0de57af0:

  t/io_uring_cmd: better default for fio executable (2026-06-24 13:25:19 -0400)

----------------------------------------------------------------
Jungwon Lee (2):
      engines/io_uring: Separate NVMe-specific logic
      engines/io_uring: Add bsg support for io_uring_cmd engine

Kyoungrul Kim (1):
      engines/sg: extract BE accessor helpers into shared sg.h

Vincent Fu (6):
      Merge branch 'upstream-io_uring-bsg' of https://github.com/ljw8161/fio
      engines/io_uring: add missing curly braces
      t/io_uring_cmd: rename from t/nvmept.py
      t/io_uring_cmd: support more cmd_types
      t/io_uring_cmd: add a writefua/readfua test
      t/io_uring_cmd: better default for fio executable

 HOWTO.rst                        |   2 +-
 Makefile                         |   5 +-
 configure                        |  17 ++
 engines/bsg.c                    | 169 ++++++++++++++
 engines/bsg.h                    |  67 ++++++
 engines/io_uring.c               | 468 ++++++++++++++++++++++++++-------------
 engines/sg.c                     |  37 +---
 engines/sg.h                     |  47 ++++
 examples/uring-cmd-bsg.fio       |  31 +++
 examples/uring-cmd-bsg.png       | Bin 0 -> 146241 bytes
 fio.1                            |   2 +-
 t/{nvmept.py => io_uring_cmd.py} |  43 +++-
 t/run-fio-tests.py               |   2 +-
 13 files changed, 682 insertions(+), 208 deletions(-)
 create mode 100644 engines/bsg.c
 create mode 100644 engines/bsg.h
 create mode 100644 engines/sg.h
 create mode 100644 examples/uring-cmd-bsg.fio
 create mode 100644 examples/uring-cmd-bsg.png
 rename t/{nvmept.py => io_uring_cmd.py} (90%)

---

Diff of recent changes:

diff --git a/HOWTO.rst b/HOWTO.rst
index ac570972..ef079214 100644
--- a/HOWTO.rst
+++ b/HOWTO.rst
@@ -2564,7 +2564,7 @@ with the caveat that when used on the command line, they must come after the
 .. option:: cmd_type=str : [io_uring_cmd]
 
 	Specifies the type of uring passthrough command to be used. Supported
-	value is nvme. Default is nvme.
+	values are nvme and bsg. Default is nvme.
 
 .. option:: hipri
 
diff --git a/Makefile b/Makefile
index e3960ece..4f87adba 100644
--- a/Makefile
+++ b/Makefile
@@ -218,7 +218,8 @@ ifdef CONFIG_LIBBLKIO
 endif
 ifeq ($(CONFIG_TARGET_OS), Linux)
   SOURCE += diskutil.c fifo.c blktrace.c cgroup.c trim.c engines/sg.c \
-		oslib/linux-dev-lookup.c engines/io_uring.c engines/nvme.c
+		oslib/linux-dev-lookup.c engines/io_uring.c engines/nvme.c \
+		engines/bsg.c
   cmdprio_SRCS = engines/cmdprio.c
 ifdef CONFIG_HAS_BLKZONED
   SOURCE += oslib/linux-blkzoned.c
@@ -229,7 +230,7 @@ endif
 ifeq ($(CONFIG_TARGET_OS), Android)
   SOURCE += diskutil.c fifo.c blktrace.c cgroup.c trim.c profiles/tiobench.c \
 		oslib/linux-dev-lookup.c engines/io_uring.c engines/nvme.c \
-		engines/sg.c
+		engines/sg.c engines/bsg.c
   cmdprio_SRCS = engines/cmdprio.c
 ifdef CONFIG_HAS_BLKZONED
   SOURCE += oslib/linux-blkzoned.c
diff --git a/configure b/configure
index 664ce299..cdfefa59 100755
--- a/configure
+++ b/configure
@@ -2707,6 +2707,23 @@ fi
 print_config "NVMe uring command support" "$nvme_uring_cmd"
 fi
 
+##########################################
+# Check BSG_URING_CMD support
+cat > $TMPC << EOF
+#include <linux/bsg.h>
+int main(void)
+{
+  return sizeof(struct bsg_uring_cmd);
+}
+EOF
+if compile_prog "" "" "bsg uring cmd"; then
+  output_sym "CONFIG_BSG_URING_CMD"
+  bsg_uring_cmd="yes"
+else
+  bsg_uring_cmd="no"
+fi
+print_config "BSG uring command support" "$bsg_uring_cmd"
+
 ##########################################
 # Check if we have xnvme
 if test "$xnvme" != "no" ; then
diff --git a/engines/bsg.c b/engines/bsg.c
new file mode 100644
index 00000000..372212ef
--- /dev/null
+++ b/engines/bsg.c
@@ -0,0 +1,169 @@
+#include "bsg.h"
+
+int fio_bsg_uring_cmd_read_capacity(struct thread_data *td, unsigned int *bs,
+				    unsigned long long *max_lba)
+{
+	struct sg_io_v4 hdr = { 0 };
+	unsigned long long hlba;
+	unsigned int blksz = 0;
+	unsigned char cmd[16];
+	unsigned char sb[64];
+	unsigned char buf[32];
+	int ret;
+	int fd = -1;
+
+	struct fio_file *f = td->files[0];
+
+	/* open file independent of rest of application */
+	fd = open(f->file_name, O_RDONLY);
+	if (fd < 0)
+		return -errno;
+
+	memset(cmd, 0, sizeof(cmd));
+	memset(sb, 0, sizeof(sb));
+	memset(buf, 0, sizeof(buf));
+
+	cmd[0] = bsg_cmd_read_capacity_10;
+	hdr.guard = 'Q';
+	hdr.protocol = 0;
+	hdr.subprotocol = 0;
+	hdr.response = (__u64)(uintptr_t) sb;
+	hdr.max_response_len = sizeof(sb);
+	hdr.request_len = sizeof(cmd);
+	hdr.request = (__u64)(uintptr_t) cmd;
+	hdr.din_xferp = (__u64)(uintptr_t) (buf);
+	hdr.din_xfer_len = sizeof(buf);
+
+	ret = ioctl(fd, SG_IO, &hdr);
+	if (ret < 0) {
+		close(fd);
+		return ret;
+	}
+
+	blksz = sgio_get_be32(&buf[4]);
+	hlba = sgio_get_be32(buf);
+
+	if (blksz) {
+		*bs = blksz;
+		*max_lba = hlba;
+		ret = 0;
+	} else {
+		ret = -EIO;
+	}
+
+	close(fd);
+	return ret;
+}
+
+int fio_bsg_uring_cmd_get_file_size(struct thread_data *td, struct fio_file *f)
+{
+	unsigned int bs = 0;
+	unsigned long long max_lba = 0;
+	int ret;
+
+	if (fio_file_size_known(f))
+		return 0;
+
+	if (f->filetype != FIO_TYPE_CHAR) {
+		td_verror(td, EINVAL, "wrong file type");
+		log_err("ioengine io_uring_cmd only works on character devices\n");
+		return 1;
+	}
+
+	ret = fio_bsg_uring_cmd_read_capacity(td, &bs, &max_lba);
+	if (ret) {
+		td_verror(td, td->error, "fio_bsg_uring_cmd_read_capacity");
+		log_err("ioengine io_uring_cmd unable to successfully execute "
+			"read capacity to get block size and maximum lba\n");
+		return 1;
+	}
+
+	f->real_file_size = (max_lba + 1) * bs;
+	fio_file_set_size_known(f);
+	return 0;
+}
+
+void fio_bsg_uring_cmd_init(struct bsg_uring_cmd *cmd, struct bsg_cmd *bc,
+			    struct io_u *io_u, int dxfer_dir)
+{
+	memset(cmd, 0, sizeof(*cmd));
+	memset(bc->cdb, 0, sizeof(bc->cdb));
+
+	cmd->request = (uint64_t)(uintptr_t) bc->cdb;
+	cmd->request_len = sizeof(bc->cdb);
+	cmd->response = (uint64_t)(uintptr_t) bc->sb;
+	cmd->max_response_len = sizeof(bc->sb);
+
+	if (dxfer_dir == SG_DXFER_TO_DEV) {
+		cmd->dout_xferp = (uint64_t)(uintptr_t) io_u->xfer_buf;
+		cmd->dout_xfer_len = io_u->xfer_buflen;
+	} else {
+		cmd->din_xferp = (uint64_t)(uintptr_t) io_u->xfer_buf;
+		cmd->din_xfer_len = io_u->xfer_buflen;
+	}
+}
+
+static int fio_bsg_uring_cmd_rw_lba(struct bsg_cmd *bc, unsigned long long lba,
+				    unsigned long long nlb)
+{
+	if (lba > MAX_10CDB_LBA || nlb > MAX_10CDB_NLB) {
+		log_err("offset or nlb is larger than the "
+			"maximum value of a field within CDB (10)\n");
+		return -EINVAL;
+	}
+	sgio_set_be32((uint32_t) lba, &bc->cdb[2]);
+	sgio_set_be16((uint16_t) nlb, &bc->cdb[7]);
+
+	return 0;
+}
+
+int fio_bsg_uring_cmd_prep(struct bsg_uring_cmd *cmd, struct io_u *io_u,
+			   struct bsg_cmd *bc, bool fua)
+{
+	struct bsg_data *data = FILE_ENG_DATA(io_u->file);
+	unsigned long long offset, nlb;
+	int data_len;
+
+	if (io_u->xfer_buflen & (data->bs - 1)) {
+		log_err("read/write not sector aligned\n");
+		return -EINVAL;
+	}
+
+	offset = io_u->offset / data->bs;
+	nlb = io_u->xfer_buflen / data->bs;
+
+	switch (io_u->ddir) {
+	case DDIR_READ:
+		fio_bsg_uring_cmd_init(cmd, bc, io_u, SG_DXFER_FROM_DEV);
+		bc->cdb[0] = bsg_cmd_read_10;
+		if (fua)
+			bc->cdb[1] |= 1 << 3;
+		break;
+	case DDIR_WRITE:
+		fio_bsg_uring_cmd_init(cmd, bc, io_u, SG_DXFER_TO_DEV);
+		bc->cdb[0] = bsg_cmd_write_10;
+		if (fua)
+			bc->cdb[1] |= 1 << 3;
+		break;
+	case DDIR_TRIM:
+		fio_bsg_uring_cmd_init(cmd, bc, io_u, SG_DXFER_TO_DEV);
+		bc->cdb[0] = bsg_cmd_unmap;
+		data_len = sizeof(bc->unmap_param) / sizeof(bc->unmap_param[0]);
+		sgio_set_be16((uint16_t) data_len, &bc->cdb[7]);
+		sgio_set_be16((uint16_t) data_len - 2, &bc->unmap_param[0]);
+		sgio_set_be16((uint16_t) data_len - 8, &bc->unmap_param[2]);
+		sgio_set_be64(offset, &bc->unmap_param[8]);
+		sgio_set_be32((uint32_t) nlb, &bc->unmap_param[16]);
+		cmd->dout_xferp = (uint64_t)(uintptr_t) bc->unmap_param;
+		cmd->dout_xfer_len = data_len;
+		return 0;
+	case DDIR_SYNC:
+		fio_bsg_uring_cmd_init(cmd, bc, io_u, SG_DXFER_NONE);
+		bc->cdb[0] = bsg_cmd_sync_cache_10;
+		return 0;
+	default:
+		return -ENOTSUP;
+	}
+
+	return fio_bsg_uring_cmd_rw_lba(bc, offset, nlb);
+}
diff --git a/engines/bsg.h b/engines/bsg.h
new file mode 100644
index 00000000..6a4bfd07
--- /dev/null
+++ b/engines/bsg.h
@@ -0,0 +1,67 @@
+/*
+ * bsg structure declarations and helper functions for the
+ * io_uring_cmd engine.
+ */
+
+#ifndef FIO_BSG_H
+#define FIO_BSG_H
+
+#include <linux/bsg.h>
+#include <poll.h>
+#include "../fio.h"
+#include "sg.h"
+
+/*
+ * If the uapi headers installed on the system lacks bsg uring command
+ * support, use the local version to prevent compilation issues.
+ */
+#ifndef CONFIG_BSG_URING_CMD
+struct bsg_uring_cmd {
+	__u64 request;
+	__u32 request_len;
+	__u32 protocol;
+	__u32 subprotocol;
+	__u32 max_response_len;
+	__u64 response;
+	__u64 dout_xferp;
+	__u32 dout_xfer_len;
+	__u32 dout_iovec_count;
+	__u64 din_xferp;
+	__u32 din_xfer_len;
+	__u32 din_iovec_count;
+	__u32 timeout_ms;
+	__u8  reserved[12];
+};
+#endif /* CONFIG_BSG_URING_CMD */
+
+#define MAX_SB 64
+#define MAX_10CDB_LBA  0xFFFFFFFFULL
+#define MAX_10CDB_NLB  0xFFFFU
+
+enum bsg_io_opcode {
+	bsg_cmd_read_10			= 0x28,
+	bsg_cmd_read_capacity_10	= 0x25,
+	bsg_cmd_sync_cache_10		= 0x35,
+	bsg_cmd_unmap			= 0x42,
+	bsg_cmd_write_10		= 0x2A,
+};
+
+struct bsg_cmd {
+	unsigned char cdb[16];
+	unsigned char sb[MAX_SB];
+	uint8_t unmap_param[24];
+};
+
+struct bsg_data {
+	unsigned int bs;
+};
+
+int fio_bsg_uring_cmd_read_capacity(struct thread_data *td, unsigned int *bs,
+				    unsigned long long *max_lba);
+
+int fio_bsg_uring_cmd_get_file_size(struct thread_data *td, struct fio_file *f);
+
+int fio_bsg_uring_cmd_prep(struct bsg_uring_cmd *cmd, struct io_u *io_u,
+			   struct bsg_cmd *bc, bool fua);
+
+#endif /* FIO_BSG_H */
diff --git a/engines/io_uring.c b/engines/io_uring.c
index 0db7abd6..bd50cdca 100644
--- a/engines/io_uring.c
+++ b/engines/io_uring.c
@@ -25,6 +25,7 @@
 #include "cmdprio.h"
 #include "zbd.h"
 #include "nvme.h"
+#include "bsg.h"
 
 #include <sys/stat.h>
 
@@ -95,6 +96,7 @@ struct logical_block_metadata_cap {
 
 enum uring_cmd_type {
 	FIO_URING_CMD_NVME = 1,
+	FIO_URING_CMD_BSG,
 };
 
 enum uring_cmd_write_mode {
@@ -168,14 +170,19 @@ struct ioring_data {
 
 	struct cmdprio cmdprio;
 
-	struct nvme_dsm *dsm;
-	uint32_t cdw12_flags[DDIR_RWDIR_CNT];
 	uint8_t write_opcode;
 	struct frand_state wmode_state;
 
 	bool is_uring_cmd_eng;
 
+	/* NVMe */
+	struct nvme_dsm *dsm;
+	uint32_t cdw12_flags[DDIR_RWDIR_CNT];
 	struct nvme_cmd_ext_io_opts ext_opts;
+
+	/* BSG */
+	struct bsg_cmd *bc;
+	bool fua[DDIR_RWDIR_CNT];
 };
 
 struct ioring_options {
@@ -507,6 +514,10 @@ static struct fio_option options[] = {
 			    .oval = FIO_URING_CMD_NVME,
 			    .help = "Issue nvme-uring-cmd",
 			  },
+			  { .ival = "bsg",
+			    .oval = FIO_URING_CMD_BSG,
+			    .help = "Issue bsg-uring-cmd",
+			  },
 		},
 		.category = FIO_OPT_C_ENGINE,
 		.group	= FIO_OPT_G_IOURING,
@@ -713,20 +724,48 @@ static int fio_ioring_prep(struct thread_data *td, struct io_u *io_u)
 	return 0;
 }
 
+static int fio_ioring_cmd_prep_write_split(struct thread_data *td,
+				  struct nvme_uring_cmd *cmd,
+				  struct io_u *io_u, struct iovec *iov)
+{
+	struct ioring_data *ld = td->io_ops_data;
+	struct ioring_options *o = td->eo;
+	unsigned int rand = rand_between(&ld->wmode_state, 0, 99);
+	unsigned int perc = 0;
+	int i;
+
+	for (i = 0; i < (int)o->wmode_split_nr; i++) {
+		perc += o->wmode_split[i].perc;
+		if (rand < perc) {
+			uint8_t op = o->wmode_split[i].opcode;
+
+			io_u_clear(td, io_u, IO_U_F_TRIMMED | IO_U_F_ZEROED | IO_U_F_ERRORED);
+			if (op == nvme_cmd_write_zeroes) {
+				if (o->deac)
+					io_u_set(td, io_u, IO_U_F_TRIMMED);
+				else
+					io_u_set(td, io_u, IO_U_F_ZEROED);
+			} else if (op == nvme_cmd_write_uncor) {
+				io_u_set(td, io_u, IO_U_F_ERRORED);
+			}
+
+			dprint(FD_IO, "op selected %u\n", op);
+			return fio_nvme_uring_cmd_prep(cmd, io_u, iov, NULL,
+						       nvme_cmd_read, op, o->wmode_split[i].cdw12_flag);
+		}
+	}
+	return -EINVAL;
+}
+
 static int fio_ioring_cmd_prep(struct thread_data *td, struct io_u *io_u)
 {
 	struct ioring_data *ld = td->io_ops_data;
 	struct ioring_options *o = td->eo;
 	struct fio_file *f = io_u->file;
-	struct nvme_uring_cmd *cmd;
 	struct io_uring_sqe *sqe;
-	struct nvme_dsm *dsm;
-	void *ptr = ld->dsm;
-	unsigned int dsm_size;
-	uint8_t read_opcode = nvme_cmd_read;
 
-	/* only supports nvme_uring_cmd */
-	if (o->cmd_type != FIO_URING_CMD_NVME)
+	/* only supports nvme_uring_cmd and bsg_uring_cmd */
+	if (o->cmd_type != FIO_URING_CMD_NVME && o->cmd_type != FIO_URING_CMD_BSG)
 		return -EINVAL;
 
 	if (io_u->ddir == DDIR_TRIM && td->io_ops->flags & FIO_ASYNCIO_SYNC_TRIM)
@@ -748,10 +787,6 @@ static int fio_ioring_cmd_prep(struct thread_data *td, struct io_u *io_u)
 
 	sqe->opcode = IORING_OP_URING_CMD;
 	sqe->user_data = (unsigned long) io_u;
-	if (o->nonvectored)
-		sqe->cmd_op = NVME_URING_CMD_IO;
-	else
-		sqe->cmd_op = NVME_URING_CMD_IO_VEC;
 	if (o->force_async && ++ld->prepped == o->force_async) {
 		ld->prepped = 0;
 		sqe->flags |= IOSQE_ASYNC;
@@ -761,55 +796,51 @@ static int fio_ioring_cmd_prep(struct thread_data *td, struct io_u *io_u)
 		sqe->buf_index = io_u->index;
 	}
 
-	cmd = (struct nvme_uring_cmd *)sqe->cmd;
-	dsm_size = sizeof(*ld->dsm) + td->o.num_range * sizeof(struct nvme_dsm_range);
-	ptr += io_u->index * dsm_size;
-	dsm = (struct nvme_dsm *)ptr;
+	if (o->cmd_type == FIO_URING_CMD_NVME) {
+		struct nvme_uring_cmd *cmd;
+		struct nvme_dsm *dsm;
+		void *ptr = ld->dsm;
+		unsigned int dsm_size;
+		uint8_t read_opcode = nvme_cmd_read;
+
+		if (o->nonvectored)
+			sqe->cmd_op = NVME_URING_CMD_IO;
+		else
+			sqe->cmd_op = NVME_URING_CMD_IO_VEC;
 
-	/*
-	 * If READ command belongs to the verification phase and the
-	 * verify_mode=compare, convert READ to COMPARE command.
-	 */
-	if (io_u->flags & IO_U_F_VER_LIST && io_u->ddir == DDIR_READ &&
-			o->verify_mode == FIO_URING_CMD_VMODE_COMPARE) {
-		populate_verify_io_u(td, io_u);
-		read_opcode = nvme_cmd_compare;
-		io_u_set(td, io_u, IO_U_F_VER_IN_DEV);
-	}
+		cmd = (struct nvme_uring_cmd *)sqe->cmd;
+		dsm_size = sizeof(*ld->dsm) + td->o.num_range * sizeof(struct nvme_dsm_range);
+		ptr += io_u->index * dsm_size;
+		dsm = (struct nvme_dsm *)ptr;
 
-	if (o->wmode_split_nr > 1 && io_u->ddir == DDIR_WRITE) {
-		unsigned int rand = rand_between(&ld->wmode_state, 0, 99);
-		unsigned int perc = 0;
-		int i;
+		/*
+		 * If READ command belongs to the verification phase and the
+		 * verify_mode=compare, convert READ to COMPARE command.
+		 */
+		if (io_u->flags & IO_U_F_VER_LIST && io_u->ddir == DDIR_READ &&
+				o->verify_mode == FIO_URING_CMD_VMODE_COMPARE) {
+			populate_verify_io_u(td, io_u);
+			read_opcode = nvme_cmd_compare;
+			io_u_set(td, io_u, IO_U_F_VER_IN_DEV);
+		}
 
-		for (i = 0; i < (int)o->wmode_split_nr; i++) {
-			perc += o->wmode_split[i].perc;
-			if (rand < perc) {
-				uint8_t op = o->wmode_split[i].opcode;
+		if (o->wmode_split_nr > 1 && io_u->ddir == DDIR_WRITE) {
+			return fio_ioring_cmd_prep_write_split(td, cmd, io_u,
+					o->nonvectored ? NULL : &ld->iovecs[io_u->index]);
+		}
 
-				io_u_clear(td, io_u, IO_U_F_TRIMMED | IO_U_F_ZEROED | IO_U_F_ERRORED);
-				if (op == nvme_cmd_write_zeroes) {
-					if (o->deac)
-						io_u_set(td, io_u, IO_U_F_TRIMMED);
-					else
-						io_u_set(td, io_u, IO_U_F_ZEROED);
-				} else if (op == nvme_cmd_write_uncor) {
-					io_u_set(td, io_u, IO_U_F_ERRORED);
-				}
+		return fio_nvme_uring_cmd_prep(cmd, io_u,
+				o->nonvectored ? NULL : &ld->iovecs[io_u->index],
+				dsm, read_opcode, ld->write_opcode,
+				ld->cdw12_flags[io_u->ddir]);
+	} else {
+		struct bsg_uring_cmd *cmd;
 
-				dprint(FD_IO, "op selected %u\n", op);
-				return fio_nvme_uring_cmd_prep(cmd, io_u,
-					o->nonvectored ? NULL : &ld->iovecs[io_u->index],
-					dsm, read_opcode, op,
-					o->wmode_split[i].cdw12_flag);
-			}
-		}
-	}
+		sqe->len = io_u->xfer_buflen;
+		cmd = (struct bsg_uring_cmd *)sqe->cmd;
 
-	return fio_nvme_uring_cmd_prep(cmd, io_u,
-			o->nonvectored ? NULL : &ld->iovecs[io_u->index],
-			dsm, read_opcode, ld->write_opcode,
-			ld->cdw12_flags[io_u->ddir]);
+		return fio_bsg_uring_cmd_prep(cmd, io_u, &ld->bc[io_u->index], ld->fua[io_u->ddir]);
+	}
 }
 
 static void fio_ioring_validate_md(struct thread_data *td, struct io_u *io_u)
@@ -873,7 +904,7 @@ static struct io_u *fio_ioring_cmd_event(struct thread_data *td, int event)
 	int ret;
 
 	index = (event + ld->cq_ring_off) & ld->cq_ring_mask;
-	if (o->cmd_type == FIO_URING_CMD_NVME)
+	if (o->cmd_type == FIO_URING_CMD_NVME || o->cmd_type == FIO_URING_CMD_BSG)
 		index <<= 1;
 
 	cqe = &ld->cq_ring.cqes[index];
@@ -890,6 +921,17 @@ static struct io_u *fio_ioring_cmd_event(struct thread_data *td, int event)
 			if (ret)
 				io_u->error = ret;
 		}
+	} else if (o->cmd_type == FIO_URING_CMD_BSG) {
+		/*
+		 * For bsg uring cmd, the big_cqe[0] in cqe contains the packed
+		 * SCSI status, where bits 0-7 hold the device status and bits 16-23
+		 * contaion the host status
+		 */
+		ret = (cqe->big_cqe[0] >> 16) & 0xff;
+		if (ret)
+			io_u->error = -ret;
+		else
+			io_u->error = cqe->big_cqe[0] & 0xff;
 	}
 
 ret:
@@ -909,8 +951,6 @@ static char *fio_ioring_cmd_errdetails(struct thread_data *td,
 				       struct io_u *io_u)
 {
 	struct ioring_options *o = td->eo;
-	unsigned int sct = (io_u->error >> 8) & 0x7;
-	unsigned int sc = io_u->error & 0xff;
 #define MAXERRDETAIL 1024
 #define MAXMSGCHUNK 128
 	char *msg, msgchunk[MAXMSGCHUNK];
@@ -925,6 +965,9 @@ static char *fio_ioring_cmd_errdetails(struct thread_data *td,
 	strlcat(msg, msgchunk, MAXERRDETAIL);
 
 	if (o->cmd_type == FIO_URING_CMD_NVME) {
+		unsigned int sct = (io_u->error >> 8) & 0x7;
+		unsigned int sc = io_u->error & 0xff;
+
 		strlcat(msg, "cq entry status (", MAXERRDETAIL);
 
 		snprintf(msgchunk, MAXMSGCHUNK, "sct=0x%02x; ", sct);
@@ -932,6 +975,17 @@ static char *fio_ioring_cmd_errdetails(struct thread_data *td,
 
 		snprintf(msgchunk, MAXMSGCHUNK, "sc=0x%02x)", sc);
 		strlcat(msg, msgchunk, MAXERRDETAIL);
+	} else if (o->cmd_type == FIO_URING_CMD_BSG) {
+		unsigned int status = io_u->error & 0xff;
+		unsigned int host_status = (io_u->error >> 16) & 0xff;
+		if (status) {
+			snprintf(msgchunk, MAXMSGCHUNK, "BSG SCSI Status: 0x%02x; ", status);
+			strlcat(msg, msgchunk, MAXERRDETAIL);
+		}
+		if (host_status) {
+			snprintf(msgchunk, MAXMSGCHUNK, "BSG Host Status: 0x%02x; ", host_status);
+			strlcat(msg, msgchunk, MAXERRDETAIL);
+		}
 	} else {
 		/* Print status code in generic */
 		snprintf(msgchunk, MAXMSGCHUNK, "status=0x%x", io_u->error);
@@ -1018,11 +1072,19 @@ static inline void fio_ioring_setup_pi(struct thread_data *td,
 				      struct io_u *io_u)
 {
 	struct ioring_data *ld = td->io_ops_data;
+	struct ioring_options *o = td->eo;
+	struct fio_file *f = io_u->file;
 
 	if (io_u->ddir == DDIR_TRIM)
 		return;
 
-	fio_nvme_generate_guard(io_u, &ld->ext_opts);
+	if (o->cmd_type == FIO_URING_CMD_NVME) {
+		fio_nvme_generate_guard(io_u, &ld->ext_opts);
+	}
+	else {
+		td_verror(td, EINVAL, "wrong cmd_type");
+		log_err("%s: This cmd_type does not support generate_guard\n", f->file_name);
+	}
 }
 
 static inline void fio_ioring_cmdprio_prep(struct thread_data *td,
@@ -1220,6 +1282,7 @@ static void fio_ioring_cleanup(struct thread_data *td)
 		free(ld->iovecs);
 		free(ld->fds);
 		free(ld->dsm);
+		free(ld->bc);
 		free(ld);
 	}
 }
@@ -1492,46 +1555,65 @@ static int fio_ioring_cmd_init(struct thread_data *td, struct ioring_data *ld)
 {
 	struct ioring_options *o = td->eo;
 
-	if (td_write(td)) {
-		if (o->wmode_split_nr > 1) {
-			int i;
-
-			init_rand_seed(&ld->wmode_state,
-				       td->rand_seeds[FIO_RAND_WMODE_OFF],
-				       false);
-			for (i = 0; i < (int)o->wmode_split_nr; i++) {
-				struct wmode_split_entry *e = &o->wmode_split[i];
-
-				e->cdw12_flag = 0;
-				if (e->opcode == nvme_cmd_write_zeroes && o->deac)
-					e->cdw12_flag = 1 << 25;
-				else if (e->opcode == nvme_cmd_write && o->writefua)
-					e->cdw12_flag = 1 << 30;
+	if (o->cmd_type == FIO_URING_CMD_NVME) {
+		if (td_write(td)) {
+			if (o->wmode_split_nr > 1) {
+				int i;
+
+				init_rand_seed(&ld->wmode_state,
+					       td->rand_seeds[FIO_RAND_WMODE_OFF],
+					       false);
+				for (i = 0; i < (int)o->wmode_split_nr; i++) {
+					struct wmode_split_entry *e = &o->wmode_split[i];
+
+					e->cdw12_flag = 0;
+					if (e->opcode == nvme_cmd_write_zeroes && o->deac)
+						e->cdw12_flag = 1 << 25;
+					else if (e->opcode == nvme_cmd_write && o->writefua)
+						e->cdw12_flag = 1 << 30;
+				}
+			} else {
+				switch (o->write_mode) {
+				case FIO_URING_CMD_WMODE_UNCOR:
+					ld->write_opcode = nvme_cmd_write_uncor;
+					break;
+				case FIO_URING_CMD_WMODE_ZEROES:
+					ld->write_opcode = nvme_cmd_write_zeroes;
+					if (o->deac)
+						ld->cdw12_flags[DDIR_WRITE] = 1 << 25;
+					break;
+				case FIO_URING_CMD_WMODE_VERIFY:
+					ld->write_opcode = nvme_cmd_verify;
+					break;
+				default:
+					ld->write_opcode = nvme_cmd_write;
+					break;
+				}
 			}
-		} else {
-			switch (o->write_mode) {
-			case FIO_URING_CMD_WMODE_UNCOR:
-				ld->write_opcode = nvme_cmd_write_uncor;
-				break;
-			case FIO_URING_CMD_WMODE_ZEROES:
-				ld->write_opcode = nvme_cmd_write_zeroes;
-				if (o->deac)
-					ld->cdw12_flags[DDIR_WRITE] = 1 << 25;
-				break;
-			case FIO_URING_CMD_WMODE_VERIFY:
-				ld->write_opcode = nvme_cmd_verify;
-				break;
-			default:
-				ld->write_opcode = nvme_cmd_write;
-				break;
+		}
+
+		if (o->readfua)
+			ld->cdw12_flags[DDIR_READ] = 1 << 30;
+		if (o->writefua && o->wmode_split_nr <= 1)
+			ld->cdw12_flags[DDIR_WRITE] = 1 << 30;
+	} else if (o->cmd_type == FIO_URING_CMD_BSG) {
+		ld->bc = calloc(td->o.iodepth, sizeof(struct bsg_cmd));
+
+		if (td_write(td)) {
+			if (o->write_mode == FIO_URING_CMD_WMODE_WRITE) {
+				ld->write_opcode = bsg_cmd_write_10;
+			} else {
+				log_err("Not Support Write mode in BSG io_uring_cmd\n");
+				td_verror(td, EINVAL, "fio_ioring_cmd_init");
+				return 1;
 			}
 		}
-	}
 
-	if (o->readfua)
-		ld->cdw12_flags[DDIR_READ] = 1 << 30;
-	if (o->writefua && o->wmode_split_nr <= 1)
-		ld->cdw12_flags[DDIR_WRITE] = 1 << 30;
+		if (o->readfua)
+			ld->fua[DDIR_READ] = 1;
+		if (o->writefua)
+			ld->fua[DDIR_WRITE] = 1;
+	}
 
 	return 0;
 }
@@ -1618,13 +1700,16 @@ static int fio_ioring_init(struct thread_data *td)
 		}
 
 	}
-	parse_prchk_flags(o);
-	ext_opts = &ld->ext_opts;
-	if (o->pi_act)
-		ext_opts->io_flags |= NVME_IO_PRINFO_PRACT;
-	ext_opts->io_flags |= o->prchk;
-	ext_opts->apptag = o->apptag;
-	ext_opts->apptag_mask = o->apptag_mask;
+	if ((ld->is_uring_cmd_eng && o->cmd_type == FIO_URING_CMD_NVME) ||
+			!ld->is_uring_cmd_eng) {
+		parse_prchk_flags(o);
+		ext_opts = &ld->ext_opts;
+		if (o->pi_act)
+			ext_opts->io_flags |= NVME_IO_PRINFO_PRACT;
+		ext_opts->io_flags |= o->prchk;
+		ext_opts->apptag = o->apptag;
+		ext_opts->apptag_mask = o->apptag_mask;
+	}
 
 	ld->iovecs = calloc(ld->iodepth, sizeof(struct iovec));
 
@@ -1643,7 +1728,7 @@ static int fio_ioring_init(struct thread_data *td)
 	if (td_trim(td) && td->o.zone_mode == ZONE_MODE_ZBD &&
 	    ld->is_uring_cmd_eng) {
 		td->io_ops->flags |= FIO_ASYNCIO_SYNC_TRIM;
-	} else {
+	} else if (o->cmd_type == FIO_URING_CMD_NVME) {
 		dsm_size = sizeof(*ld->dsm);
 		dsm_size += td->o.num_range * sizeof(struct nvme_dsm_range);
 		ld->dsm = calloc(td->o.iodepth, dsm_size);
@@ -1664,8 +1749,7 @@ static int fio_ioring_io_u_init(struct thread_data *td, struct io_u *io_u)
 {
 	struct ioring_data *ld = td->io_ops_data;
 	struct ioring_options *o = td->eo;
-	struct nvme_pi_data *pi_data;
-	char *p, *q;
+	char *p;
 
 	ld->io_u_index[io_u->index] = io_u;
 
@@ -1673,31 +1757,37 @@ static int fio_ioring_io_u_init(struct thread_data *td, struct io_u *io_u)
 	p += o->md_per_io_size * io_u->index;
 	io_u->mmap_data = p;
 
-	if (ld->pi_attr) {
-		struct io_uring_attr_pi *pi_attr;
-
-		q = ld->pi_attr;
-		q += (sizeof(struct io_uring_attr_pi) * io_u->index);
-		io_u->pi_attr = q;
-
-		pi_attr = io_u->pi_attr;
-		pi_attr->len = o->md_per_io_size;
-		pi_attr->app_tag = o->apptag;
-		pi_attr->flags = 0;
-		if (o->prchk & NVME_IO_PRINFO_PRCHK_GUARD)
-			pi_attr->flags |= IO_INTEGRITY_CHK_GUARD;
-		if (o->prchk & NVME_IO_PRINFO_PRCHK_REF)
-			pi_attr->flags |= IO_INTEGRITY_CHK_REFTAG;
-		if (o->prchk & NVME_IO_PRINFO_PRCHK_APP)
-			pi_attr->flags |= IO_INTEGRITY_CHK_APPTAG;
-	}
+	if ((ld->is_uring_cmd_eng && o->cmd_type == FIO_URING_CMD_NVME) ||
+			!ld->is_uring_cmd_eng) {
+		struct nvme_pi_data *pi_data;
+		char *q;
+
+		if (ld->pi_attr) {
+			struct io_uring_attr_pi *pi_attr;
+
+			q = ld->pi_attr;
+			q += (sizeof(struct io_uring_attr_pi) * io_u->index);
+			io_u->pi_attr = q;
+
+			pi_attr = io_u->pi_attr;
+			pi_attr->len = o->md_per_io_size;
+			pi_attr->app_tag = o->apptag;
+			pi_attr->flags = 0;
+			if (o->prchk & NVME_IO_PRINFO_PRCHK_GUARD)
+				pi_attr->flags |= IO_INTEGRITY_CHK_GUARD;
+			if (o->prchk & NVME_IO_PRINFO_PRCHK_REF)
+				pi_attr->flags |= IO_INTEGRITY_CHK_REFTAG;
+			if (o->prchk & NVME_IO_PRINFO_PRCHK_APP)
+				pi_attr->flags |= IO_INTEGRITY_CHK_APPTAG;
+		}
 
-	if (!o->pi_act) {
-		pi_data = calloc(1, sizeof(*pi_data));
-		pi_data->io_flags |= o->prchk;
-		pi_data->apptag_mask = o->apptag_mask;
-		pi_data->apptag = o->apptag;
-		io_u->engine_data = pi_data;
+		if (!o->pi_act) {
+			pi_data = calloc(1, sizeof(*pi_data));
+			pi_data->io_flags |= o->prchk;
+			pi_data->apptag_mask = o->apptag_mask;
+			pi_data->apptag = o->apptag;
+			io_u->engine_data = pi_data;
+		}
 	}
 
 	if (ld->is_uring_cmd_eng && o->wmode_split_nr <= 1) {
@@ -1716,9 +1806,7 @@ static int fio_ioring_io_u_init(struct thread_data *td, struct io_u *io_u)
 
 static void fio_ioring_io_u_free(struct thread_data *td, struct io_u *io_u)
 {
-	struct nvme_pi *pi = io_u->engine_data;
-
-	free(pi);
+	free(io_u->engine_data);
 	io_u->engine_data = NULL;
 }
 
@@ -1922,6 +2010,22 @@ static int fio_ioring_cmd_open_file(struct thread_data *td, struct fio_file *f)
 		ret = fio_ioring_open_nvme(td, f);
 		if (ret)
 			return ret;
+	} else if (o->cmd_type == FIO_URING_CMD_BSG) {
+		struct bsg_data *data;
+		unsigned int bs = 0;
+		unsigned long long last_lba = 0;
+		int ret;
+
+		data = FILE_ENG_DATA(f);
+		if (data == NULL) {
+			ret = fio_bsg_uring_cmd_read_capacity(td, &bs, &last_lba);
+			if (ret) {
+				return ret;
+			}
+			data = calloc(1, sizeof(struct bsg_data));
+			data->bs = bs;
+			FILE_SET_ENG_DATA(f, data);
+		}
 	}
 
 	return fio_ioring_open_file(td, f);
@@ -1944,11 +2048,11 @@ static int fio_ioring_cmd_close_file(struct thread_data *td,
 {
 	struct ioring_options *o = td->eo;
 
-	if (o->cmd_type == FIO_URING_CMD_NVME) {
-		struct nvme_data *data = FILE_ENG_DATA(f);
-
+	if (o->cmd_type == FIO_URING_CMD_NVME || o->cmd_type == FIO_URING_CMD_BSG) {
+		free(FILE_ENG_DATA(f));
 		FILE_SET_ENG_DATA(f, NULL);
-		free(data);
+	} else {
+		log_err("%s: This cmd_type does not support\n", f->file_name);
 	}
 
 	return fio_ioring_close_file(td, f);
@@ -1980,6 +2084,25 @@ static int fio_ioring_cmd_get_file_size(struct thread_data *td,
 			f->real_file_size = data->lba_size * nlba;
 		fio_file_set_size_known(f);
 
+		FILE_SET_ENG_DATA(f, data);
+		return 0;
+	} else if (o->cmd_type == FIO_URING_CMD_BSG) {
+		struct bsg_data *data = NULL;
+		unsigned int bs = 0;
+		unsigned long long last_lba = 0;
+		int ret;
+
+		ret = fio_bsg_uring_cmd_read_capacity(td, &bs, &last_lba);
+		if (ret) {
+			return ret;
+		}
+
+		f->real_file_size = (last_lba + 1) * bs;
+		fio_file_set_size_known(f);
+
+		data = calloc(1, sizeof(struct bsg_data));
+		data->bs = bs;
+
 		FILE_SET_ENG_DATA(f, data);
 		return 0;
 	}
@@ -2031,7 +2154,14 @@ static int fio_ioring_cmd_get_zoned_model(struct thread_data *td,
 					  struct fio_file *f,
 					  enum zbd_zoned_model *model)
 {
-	return fio_nvme_get_zoned_model(td, f, model);
+	struct ioring_options *o = td->eo;
+
+	if (o->cmd_type == FIO_URING_CMD_NVME)
+		return fio_nvme_get_zoned_model(td, f, model);
+
+	td_verror(td, EINVAL, "wrong cmd_type");
+	log_err("%s: This cmd_type does not support get_zoned_model\n", f->file_name);
+	return -EINVAL;
 }
 
 static int fio_ioring_cmd_report_zones(struct thread_data *td,
@@ -2039,45 +2169,73 @@ static int fio_ioring_cmd_report_zones(struct thread_data *td,
 				       struct zbd_zone *zbdz,
 				       unsigned int nr_zones)
 {
-	return fio_nvme_report_zones(td, f, offset, zbdz, nr_zones);
+	struct ioring_options *o = td->eo;
+
+	if (o->cmd_type == FIO_URING_CMD_NVME)
+		return fio_nvme_report_zones(td, f, offset, zbdz, nr_zones);
+
+	td_verror(td, EINVAL, "wrong cmd_type");
+	log_err("%s: This cmd_type does not support report_zones\n", f->file_name);
+	return -EINVAL;
 }
 
 static int fio_ioring_cmd_reset_wp(struct thread_data *td, struct fio_file *f,
 				   uint64_t offset, uint64_t length)
 {
-	return fio_nvme_reset_wp(td, f, offset, length);
+	struct ioring_options *o = td->eo;
+
+	if (o->cmd_type == FIO_URING_CMD_NVME)
+		return fio_nvme_reset_wp(td, f, offset, length);
+
+	td_verror(td, EINVAL, "wrong cmd_type");
+	log_err("%s: This cmd_type does not support reset_wp\n", f->file_name);
+	return -EINVAL;
 }
 
 static int fio_ioring_cmd_get_max_open_zones(struct thread_data *td,
 					     struct fio_file *f,
 					     unsigned int *max_open_zones)
 {
-	return fio_nvme_get_max_open_zones(td, f, max_open_zones);
+	struct ioring_options *o = td->eo;
+
+	if (o->cmd_type == FIO_URING_CMD_NVME)
+		return fio_nvme_get_max_open_zones(td, f, max_open_zones);
+
+	td_verror(td, EINVAL, "wrong cmd_type");
+	log_err("%s: This cmd_type does not support get_max_open_zones\n", f->file_name);
+	return -EINVAL;
 }
 
 static int fio_ioring_cmd_fetch_ruhs(struct thread_data *td, struct fio_file *f,
 				     struct fio_ruhs_info *fruhs_info)
 {
+	struct ioring_options *o = td->eo;
 	struct nvme_fdp_ruh_status *ruhs;
 	int bytes, nr_ruhs, ret, i;
 
-	nr_ruhs = fruhs_info->nr_ruhs;
-	bytes = sizeof(*ruhs) + fruhs_info->nr_ruhs * sizeof(struct nvme_fdp_ruh_status_desc);
+	if (o->cmd_type == FIO_URING_CMD_NVME) {
+		nr_ruhs = fruhs_info->nr_ruhs;
+		bytes = sizeof(*ruhs) + fruhs_info->nr_ruhs * sizeof(struct nvme_fdp_ruh_status_desc);
 
-	ruhs = calloc(1, bytes);
-	if (!ruhs)
-		return -ENOMEM;
+		ruhs = calloc(1, bytes);
+		if (!ruhs)
+			return -ENOMEM;
 
-	ret = fio_nvme_iomgmt_ruhs(td, f, ruhs, bytes);
-	if (ret)
-		goto free;
+		ret = fio_nvme_iomgmt_ruhs(td, f, ruhs, bytes);
+		if (ret)
+			goto free;
 
-	fruhs_info->nr_ruhs = le16_to_cpu(ruhs->nruhsd);
-	for (i = 0; i < nr_ruhs; i++)
-		fruhs_info->plis[i] = le16_to_cpu(ruhs->ruhss[i].pid);
-free:
-	free(ruhs);
-	return ret;
+		fruhs_info->nr_ruhs = le16_to_cpu(ruhs->nruhsd);
+		for (i = 0; i < nr_ruhs; i++)
+			fruhs_info->plis[i] = le16_to_cpu(ruhs->ruhss[i].pid);
+	free:
+		free(ruhs);
+		return ret;
+	}
+
+	td_verror(td, EINVAL, "wrong cmd_type");
+	log_err("%s: This cmd_type does not support fetch_ruhs\n", f->file_name);
+	return -EINVAL;
 }
 
 static struct ioengine_ops ioengine_uring = {
diff --git a/engines/sg.c b/engines/sg.c
index 7912e9c8..bd81af78 100644
--- a/engines/sg.c
+++ b/engines/sg.c
@@ -57,6 +57,7 @@
 
 #include "../fio.h"
 #include "../optgroup.h"
+#include "sg.h"
 
 #ifdef FIO_HAVE_SGIO
 
@@ -217,42 +218,6 @@ struct sgio_data {
 #endif
 };
 
-static inline uint16_t sgio_get_be16(uint8_t *buf)
-{
-	return be16_to_cpu(*((uint16_t *) buf));
-}
-
-static inline uint32_t sgio_get_be32(uint8_t *buf)
-{
-	return be32_to_cpu(*((uint32_t *) buf));
-}
-
-static inline uint64_t sgio_get_be64(uint8_t *buf)
-{
-	return be64_to_cpu(*((uint64_t *) buf));
-}
-
-static inline void sgio_set_be16(uint16_t val, uint8_t *buf)
-{
-	uint16_t t = cpu_to_be16(val);
-
-	memcpy(buf, &t, sizeof(uint16_t));
-}
-
-static inline void sgio_set_be32(uint32_t val, uint8_t *buf)
-{
-	uint32_t t = cpu_to_be32(val);
-
-	memcpy(buf, &t, sizeof(uint32_t));
-}
-
-static inline void sgio_set_be64(uint64_t val, uint8_t *buf)
-{
-	uint64_t t = cpu_to_be64(val);
-
-	memcpy(buf, &t, sizeof(uint64_t));
-}
-
 static inline bool sgio_unbuffered(struct thread_data *td)
 {
 	return (td->o.odirect || td->o.sync_io);
diff --git a/engines/sg.h b/engines/sg.h
new file mode 100644
index 00000000..957e0f26
--- /dev/null
+++ b/engines/sg.h
@@ -0,0 +1,47 @@
+/*
+ * Shared inline helpers for SCSI byte-order accessors, used by both the
+ * sg and bsg/io_uring_cmd engines.
+ */
+
+#ifndef FIO_SG_H
+#define FIO_SG_H
+
+#include "../fio.h"
+
+static inline uint16_t sgio_get_be16(uint8_t *buf)
+{
+	return be16_to_cpu(*((uint16_t *) buf));
+}
+
+static inline uint32_t sgio_get_be32(uint8_t *buf)
+{
+	return be32_to_cpu(*((uint32_t *) buf));
+}
+
+static inline uint64_t sgio_get_be64(uint8_t *buf)
+{
+	return be64_to_cpu(*((uint64_t *) buf));
+}
+
+static inline void sgio_set_be16(uint16_t val, uint8_t *buf)
+{
+	uint16_t t = cpu_to_be16(val);
+
+	memcpy(buf, &t, sizeof(uint16_t));
+}
+
+static inline void sgio_set_be32(uint32_t val, uint8_t *buf)
+{
+	uint32_t t = cpu_to_be32(val);
+
+	memcpy(buf, &t, sizeof(uint32_t));
+}
+
+static inline void sgio_set_be64(uint64_t val, uint8_t *buf)
+{
+	uint64_t t = cpu_to_be64(val);
+
+	memcpy(buf, &t, sizeof(uint64_t));
+}
+
+#endif /* FIO_SG_H */
diff --git a/examples/uring-cmd-bsg.fio b/examples/uring-cmd-bsg.fio
new file mode 100644
index 00000000..d3d5f615
--- /dev/null
+++ b/examples/uring-cmd-bsg.fio
@@ -0,0 +1,31 @@
+# io_uring_cmd I/O engine for block SCSI generic character device
+
+[global]
+filename=/dev/bsg/0\:0\:0\:0
+ioengine=io_uring_cmd
+cmd_type=bsg
+size=1G
+iodepth=32
+bs=4KB
+stonewall=1
+
+[rand-write]
+rw=randwrite
+
+[rand-read]
+rw=randread
+
+[trimwrite]
+rw=trimwrite
+
+[writefua]
+rw=write
+writefua=1
+
+[readfua]
+rw=read
+readfua=1
+
+[fsync]
+rw=write
+fsync=1
diff --git a/examples/uring-cmd-bsg.png b/examples/uring-cmd-bsg.png
new file mode 100644
index 00000000..4202d3a2
Binary files /dev/null and b/examples/uring-cmd-bsg.png differ
diff --git a/fio.1 b/fio.1
index d2933a8f..bdb7662d 100644
--- a/fio.1
+++ b/fio.1
@@ -2347,7 +2347,7 @@ should be used for the polling thread.
 .TP
 .BI (io_uring_cmd)cmd_type \fR=\fPstr
 Specifies the type of uring passthrough command to be used. Supported
-value is nvme. Default is nvme.
+values are nvme and bsg. Default is nvme.
 .TP
 .BI (libaio)userspace_reap
 Normally, with the libaio engine in use, fio will use the
diff --git a/t/nvmept.py b/t/io_uring_cmd.py
similarity index 90%
rename from t/nvmept.py
rename to t/io_uring_cmd.py
index 3d90f4bf..a53f5627 100755
--- a/t/nvmept.py
+++ b/t/io_uring_cmd.py
@@ -1,15 +1,15 @@
 #!/usr/bin/env python3
 """
-# nvmept.py
+# io_uring_cmd.py
 #
 # Test fio's io_uring_cmd ioengine with NVMe pass-through commands.
 #
 # USAGE
-# see python3 nvmept.py --help
+# see python3 io_uring_cmd.py --help
 #
 # EXAMPLES
-# python3 t/nvmept.py --dut /dev/ng0n1
-# python3 t/nvmept.py --dut /dev/ng1n1 -f ./fio
+# python3 t/io_uring_cmd.py --dut /dev/ng0n1
+# python3 t/io_uring_cmd.py --dut /dev/ng1n1 -f ./fio
 #
 # REQUIREMENTS
 # Python 3.6
@@ -33,12 +33,12 @@ class PassThruTest(FioJobCmdTest):
         """Setup a test."""
 
         fio_args = [
-            "--name=nvmept",
+            "--name=io_uring_cmd",
             "--ioengine=io_uring_cmd",
-            "--cmd_type=nvme",
             "--iodepth=8",
             "--iodepth_batch=4",
             "--iodepth_batch_complete=4",
+            f"--cmd_type={self.fio_opts['cmd_type']}",
             f"--filename={self.fio_opts['filename']}",
             f"--rw={self.fio_opts['rw']}",
             f"--output={self.filenames['output']}",
@@ -46,7 +46,8 @@ class PassThruTest(FioJobCmdTest):
         ]
         for opt in ['fixedbufs', 'nonvectored', 'force_async', 'registerfiles',
                     'sqthread_poll', 'sqthread_poll_cpu', 'hipri', 'nowait',
-                    'time_based', 'runtime', 'verify', 'io_size']:
+                    'time_based', 'runtime', 'verify', 'io_size', 'readfua',
+                    'writefua', ]:
             if opt in self.fio_opts:
                 option = f"--{opt}={self.fio_opts[opt]}"
                 fio_args.append(option)
@@ -90,10 +91,10 @@ class PassThruTest(FioJobCmdTest):
 class FlushTest(FioJobCmdTest):
     def setup(self, parameters):
         fio_args = [
-            "--name=nvmept-flush",
+            "--name=io_uring_cmd-flush",
             "--ioengine=io_uring_cmd",
-            "--cmd_type=nvme",
             "--randrepeat=0",
+            f"--cmd_type={self.fio_opts['cmd_type']}",
             f"--filename={self.fio_opts['filename']}",
             f"--rw={self.fio_opts['rw']}",
             f"--output={self.filenames['output']}",
@@ -346,6 +347,21 @@ TEST_LIST = [
             },
         "test_class": FlushTest,
     },
+    #
+    # Run a test with writefua and readfua
+    #
+    {
+        "test_id": 20,
+        "fio_opts": {
+            "rw": 'randrw',
+            "writefua": 1,
+            "readfua": 1,
+            "timebased": 1,
+            "runtime": 3,
+            "output-format": "json",
+            },
+        "test_class": PassThruTest,
+    },
 ]
 
 def parse_args():
@@ -360,6 +376,8 @@ def parse_args():
                         help='list of test(s) to run, skipping all others')
     parser.add_argument('--dut', help='target NVMe character device to test '
                         '(e.g., /dev/ng0n1). WARNING: THIS IS A DESTRUCTIVE TEST', required=True)
+    parser.add_argument('-c', '--cmd_type', help='cmd_type for io_uring_cmd',
+                        default='nvme')
     args = parser.parse_args()
 
     return args
@@ -371,24 +389,25 @@ def main():
     args = parse_args()
 
     artifact_root = args.artifact_root if args.artifact_root else \
-        f"nvmept-test-{time.strftime('%Y%m%d-%H%M%S')}"
+        f"io_uring_cmd-test-{time.strftime('%Y%m%d-%H%M%S')}"
     os.mkdir(artifact_root)
     print(f"Artifact directory is {artifact_root}")
 
     if args.fio:
         fio_path = str(Path(args.fio).absolute())
     else:
-        fio_path = 'fio'
+        fio_path = os.path.join(str(Path(__file__).absolute().parent.parent), "fio")
     print(f"fio path is {fio_path}")
 
     for test in TEST_LIST:
         test['fio_opts']['filename'] = args.dut
+        test['fio_opts']['cmd_type'] = args.cmd_type
 
     test_env = {
               'fio_path': fio_path,
               'fio_root': str(Path(__file__).absolute().parent.parent),
               'artifact_root': artifact_root,
-              'basename': 'nvmept',
+              'basename': 'io_uring_cmd',
               }
 
     _, failed, _ = run_fio_tests(TEST_LIST, test_env, args)
diff --git a/t/run-fio-tests.py b/t/run-fio-tests.py
index 35790120..aef2d026 100755
--- a/t/run-fio-tests.py
+++ b/t/run-fio-tests.py
@@ -1086,7 +1086,7 @@ TEST_LIST = [
     {
         'test_id':          1014,
         'test_class':       FioExeTest,
-        'exe':              't/nvmept.py',
+        'exe':              't/io_uring_cmd.py',
         'parameters':       ['-f', '{fio_path}', '--dut', '{nvmecdev}'],
         'success':          SUCCESS_DEFAULT,
         'requirements':     [Requirements.linux, Requirements.nvmecdev],

             reply	other threads:[~2026-06-25 12:00 UTC|newest]

Thread overview: 1489+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-25 12:00 Jens Axboe [this message]
  -- strict thread matches above, loose matches on Subject: below --
2026-07-28 12:00 Recent changes (master) Jens Axboe
2026-07-24 12:00 Jens Axboe
2026-07-23 12:00 Jens Axboe
2026-07-18 12:00 Jens Axboe
2026-07-16 12:00 Jens Axboe
2026-07-08 12:00 Jens Axboe
2026-07-03 12:00 Jens Axboe
2026-07-01 12:00 Jens Axboe
2026-06-27 12:00 Jens Axboe
2026-06-26 12:00 Jens Axboe
2026-06-24 12:00 Jens Axboe
2026-06-16 12:00 Jens Axboe
2026-06-14 12:00 Jens Axboe
2026-06-12 12:00 Jens Axboe
2026-06-11 12:00 Jens Axboe
2026-06-10 12:00 Jens Axboe
2026-06-09 12:00 Jens Axboe
2026-06-06 12:00 Jens Axboe
2026-06-03 12:00 Jens Axboe
2026-06-02 12:00 Jens Axboe
2026-05-29 12:00 Jens Axboe
2026-05-21 12:00 Jens Axboe
2026-05-16 12:00 Jens Axboe
2026-05-13 12:00 Jens Axboe
2026-05-01 12:00 Jens Axboe
2026-04-29 12:00 Jens Axboe
2026-04-23 12:00 Jens Axboe
2026-04-18 12:00 Jens Axboe
2026-04-17 12:00 Jens Axboe
2026-04-08 12:00 Jens Axboe
2026-04-07 12:00 Jens Axboe
2026-04-02 12:00 Jens Axboe
2026-03-19 12:00 Jens Axboe
2026-03-17 12:00 Jens Axboe
2026-03-11 12:00 Jens Axboe
2026-03-10 12:00 Jens Axboe
2026-03-04 13:00 Jens Axboe
2026-03-03 13:00 Jens Axboe
2026-03-02 13:00 Jens Axboe
2026-02-25 13:00 Jens Axboe
2026-02-14 13:00 Jens Axboe
2026-02-10 13:00 Jens Axboe
2026-02-09 13:00 Jens Axboe
2026-02-06 13:00 Jens Axboe
2026-02-03 13:00 Jens Axboe
2026-01-31 13:00 Jens Axboe
2026-01-28 13:00 Jens Axboe
2026-01-24 13:00 Jens Axboe
2026-01-21 13:00 Jens Axboe
2026-01-17 13:00 Jens Axboe
2026-01-16 13:00 Jens Axboe
2026-01-12 13:00 Jens Axboe
2026-01-08 13:00 Jens Axboe
2025-12-30 13:00 Jens Axboe
2025-12-19 13:00 Jens Axboe
2025-12-17 13:00 Jens Axboe
2025-12-14 13:00 Jens Axboe
2025-12-09 13:00 Jens Axboe
2025-11-25 13:00 Jens Axboe
2025-11-19 13:00 Jens Axboe
2025-11-18 13:00 Jens Axboe
2025-11-15 13:00 Jens Axboe
2025-11-06 13:00 Jens Axboe
2025-11-01 12:00 Jens Axboe
2025-10-31 12:00 Jens Axboe
2025-10-30 12:00 Jens Axboe
2025-10-29 12:00 Jens Axboe
2025-10-16 12:00 Jens Axboe
2025-10-11 12:00 Jens Axboe
2025-10-10 12:00 Jens Axboe
2025-10-09 12:00 Jens Axboe
2025-10-06 12:00 Jens Axboe
2025-10-05 12:00 Jens Axboe
2025-10-02 12:00 Jens Axboe
2025-09-26 12:00 Jens Axboe
2025-09-24 12:00 Jens Axboe
2025-09-19 12:00 Jens Axboe
2025-09-18 12:00 Jens Axboe
2025-09-17 12:00 Jens Axboe
2025-09-09 12:00 Jens Axboe
2025-09-06 12:00 Jens Axboe
2025-09-05 12:00 Jens Axboe
2025-09-04 12:00 Jens Axboe
2025-08-27 12:00 Jens Axboe
2025-08-26 12:00 Jens Axboe
2025-08-23 12:00 Jens Axboe
2025-08-22 12:00 Jens Axboe
2025-08-21 12:00 Jens Axboe
2025-08-20 12:00 Jens Axboe
2025-08-19 12:00 Jens Axboe
2025-08-12 12:00 Jens Axboe
2025-08-10 12:00 Jens Axboe
2025-08-08 12:00 Jens Axboe
2025-08-06 12:00 Jens Axboe
2025-08-03 12:00 Jens Axboe
2025-08-01 12:00 Jens Axboe
2025-07-24 12:00 Jens Axboe
2025-07-23 12:00 Jens Axboe
2025-07-19 12:00 Jens Axboe
2025-07-17 12:00 Jens Axboe
2025-07-10 12:00 Jens Axboe
2025-07-09 12:00 Jens Axboe
2025-07-01 12:00 Jens Axboe
2025-06-24 12:00 Jens Axboe
2025-06-05 12:00 Jens Axboe
2025-06-03 12:00 Jens Axboe
2025-06-01 12:00 Jens Axboe
2025-05-24 12:00 Jens Axboe
2025-05-21 12:00 Jens Axboe
2025-05-17 12:00 Jens Axboe
2025-05-14 12:00 Jens Axboe
2025-05-10 12:00 Jens Axboe
2025-05-09 12:00 Jens Axboe
2025-05-08 12:00 Jens Axboe
2025-05-07 12:00 Jens Axboe
2025-04-16 12:00 Jens Axboe
2025-04-15 12:00 Jens Axboe
2025-04-08 12:00 Jens Axboe
2025-04-05 12:00 Jens Axboe
2025-03-19 12:00 Jens Axboe
2025-03-08 13:00 Jens Axboe
2025-03-07 13:00 Jens Axboe
2025-03-06 13:00 Jens Axboe
2025-02-21 13:00 Jens Axboe
2025-02-19 13:00 Jens Axboe
2025-02-18 13:00 Jens Axboe
2025-02-15 13:00 Jens Axboe
2025-02-14 13:00 Jens Axboe
2025-01-24 13:00 Jens Axboe
2025-01-23 13:00 Jens Axboe
2025-01-22 13:00 Jens Axboe
2024-12-17 13:00 Jens Axboe
2024-12-10 13:00 Jens Axboe
2024-12-05 13:00 Jens Axboe
2024-11-23 13:00 Jens Axboe
2024-11-06 13:00 Jens Axboe
2024-11-05 13:00 Jens Axboe
2024-10-29 12:00 Jens Axboe
2024-10-17 12:00 Jens Axboe
2024-10-04 12:00 Jens Axboe
2024-10-03 12:00 Jens Axboe
2024-10-01 12:00 Jens Axboe
2024-09-28 12:00 Jens Axboe
2024-09-27 12:00 Jens Axboe
2024-09-17 12:00 Jens Axboe
2024-09-07 12:00 Jens Axboe
2024-09-06 12:00 Jens Axboe
2024-09-05 12:00 Jens Axboe
2024-09-04 12:00 Jens Axboe
2024-08-30 12:00 Jens Axboe
2024-08-29 12:00 Jens Axboe
2024-08-22 12:00 Jens Axboe
2024-08-17 12:00 Jens Axboe
2024-08-07 12:00 Jens Axboe
2024-08-06 12:00 Jens Axboe
2024-07-27 12:00 Jens Axboe
2024-07-18 12:00 Jens Axboe
2024-07-16 12:00 Jens Axboe
2024-07-13 12:00 Jens Axboe
2024-07-12 12:00 Jens Axboe
2024-06-29 12:00 Jens Axboe
2024-06-15 12:00 Jens Axboe
2024-06-13 12:00 Jens Axboe
2024-06-12 12:00 Jens Axboe
2024-06-08 12:00 Jens Axboe
2024-06-07 12:00 Jens Axboe
2024-06-05 12:00 Jens Axboe
2024-06-04 12:00 Jens Axboe
2024-06-04 12:11 ` Niklas Cassel
2024-06-04 12:53   ` Vincent Fu
2024-06-01 12:00 Jens Axboe
2024-05-29 12:00 Jens Axboe
2024-05-25 12:00 Jens Axboe
2024-05-22 12:00 Jens Axboe
2024-05-01 12:00 Jens Axboe
2024-04-26 12:00 Jens Axboe
2024-04-25 12:00 Jens Axboe
2024-04-20 12:00 Jens Axboe
2024-04-19 12:00 Jens Axboe
2024-04-18 12:00 Jens Axboe
2024-04-17 12:00 Jens Axboe
2024-04-16 12:00 Jens Axboe
2024-04-03 12:00 Jens Axboe
2024-03-27 12:00 Jens Axboe
2024-03-26 12:00 Jens Axboe
2024-03-23 12:00 Jens Axboe
2024-03-22 12:00 Jens Axboe
2024-03-21 12:00 Jens Axboe
2024-03-19 12:00 Jens Axboe
2024-03-08 13:00 Jens Axboe
2024-03-06 13:00 Jens Axboe
2024-03-05 13:00 Jens Axboe
2024-02-28 13:00 Jens Axboe
2024-02-23 13:00 Jens Axboe
2024-02-17 13:00 Jens Axboe
2024-02-16 13:00 Jens Axboe
2024-02-15 13:00 Jens Axboe
2024-02-14 13:00 Jens Axboe
2024-02-13 13:00 Jens Axboe
2024-02-09 13:00 Jens Axboe
2024-02-08 13:00 Jens Axboe
2024-01-28 13:00 Jens Axboe
2024-01-26 13:00 Jens Axboe
2024-01-25 13:00 Jens Axboe
2024-01-24 13:00 Jens Axboe
2024-01-23 13:00 Jens Axboe
2024-01-19 13:00 Jens Axboe
2024-01-18 13:00 Jens Axboe
2024-01-17 13:00 Jens Axboe
2023-12-30 13:00 Jens Axboe
2023-12-20 13:00 Jens Axboe
2023-12-16 13:00 Jens Axboe
2023-12-15 13:00 Jens Axboe
2023-12-13 13:00 Jens Axboe
2023-12-12 13:00 Jens Axboe
2023-11-20 13:00 Jens Axboe
2023-11-08 13:00 Jens Axboe
2023-11-07 13:00 Jens Axboe
2023-11-04 12:00 Jens Axboe
2023-11-03 12:00 Jens Axboe
2023-11-01 12:00 Jens Axboe
2023-10-26 12:00 Jens Axboe
2023-10-24 12:00 Jens Axboe
2023-10-23 12:00 Jens Axboe
2023-10-20 12:00 Jens Axboe
2023-10-17 12:00 Jens Axboe
2023-10-14 12:00 Jens Axboe
2023-10-07 12:00 Jens Axboe
2023-10-03 12:00 Jens Axboe
2023-09-30 12:00 Jens Axboe
2023-09-29 12:00 Jens Axboe
2023-09-27 12:00 Jens Axboe
2023-09-20 12:00 Jens Axboe
2023-09-16 12:00 Jens Axboe
2023-09-12 12:00 Jens Axboe
2023-09-03 12:00 Jens Axboe
2023-08-24 12:00 Jens Axboe
2023-08-17 12:00 Jens Axboe
2023-08-15 12:00 Jens Axboe
2023-08-04 12:00 Jens Axboe
2023-08-03 12:00 Jens Axboe
2023-08-01 12:00 Jens Axboe
2023-07-29 12:00 Jens Axboe
2023-07-28 12:00 Jens Axboe
2023-07-22 12:00 Jens Axboe
2023-07-21 12:00 Jens Axboe
2023-07-16 12:00 Jens Axboe
2023-07-15 12:00 Jens Axboe
2023-07-14 12:00 Jens Axboe
2023-07-06 12:00 Jens Axboe
2023-07-04 12:00 Jens Axboe
2023-06-22 12:00 Jens Axboe
2023-06-17 12:00 Jens Axboe
2023-06-10 12:00 Jens Axboe
2023-06-09 12:00 Jens Axboe
2023-06-02 12:00 Jens Axboe
2023-05-31 12:00 Jens Axboe
2023-05-25 12:00 Jens Axboe
2023-05-24 12:00 Jens Axboe
2023-05-20 12:00 Jens Axboe
2023-05-19 12:00 Jens Axboe
2023-05-18 12:00 Jens Axboe
2023-05-17 12:00 Jens Axboe
2023-05-16 12:00 Jens Axboe
2023-05-12 12:00 Jens Axboe
2023-05-11 12:00 Jens Axboe
2023-04-28 12:00 Jens Axboe
2023-04-27 12:00 Jens Axboe
2023-04-21 12:00 Jens Axboe
2023-04-14 12:00 Jens Axboe
2023-04-11 12:00 Jens Axboe
2023-04-08 12:00 Jens Axboe
2023-04-05 12:00 Jens Axboe
2023-04-01 12:00 Jens Axboe
2023-03-28 12:00 Jens Axboe
2023-03-22 12:00 Jens Axboe
2023-03-21 12:00 Jens Axboe
2023-03-16 12:00 Jens Axboe
2023-03-15 12:00 Jens Axboe
2023-03-08 13:00 Jens Axboe
2023-03-04 13:00 Jens Axboe
2023-03-03 13:00 Jens Axboe
2023-03-01 13:00 Jens Axboe
2023-02-28 13:00 Jens Axboe
2023-02-24 13:00 Jens Axboe
2023-02-22 13:00 Jens Axboe
2023-02-21 13:00 Jens Axboe
2023-02-18 13:00 Jens Axboe
2023-02-16 13:00 Jens Axboe
2023-02-15 13:00 Jens Axboe
2023-02-11 13:00 Jens Axboe
2023-02-10 13:00 Jens Axboe
2023-02-08 13:00 Jens Axboe
2023-02-07 13:00 Jens Axboe
2023-02-04 13:00 Jens Axboe
2023-02-01 13:00 Jens Axboe
2023-01-31 13:00 Jens Axboe
2023-01-26 13:00 Jens Axboe
2023-01-25 13:00 Jens Axboe
2023-01-24 13:00 Jens Axboe
2023-01-21 13:00 Jens Axboe
2023-01-19 13:00 Jens Axboe
2023-01-12 13:00 Jens Axboe
2022-12-23 13:00 Jens Axboe
2022-12-17 13:00 Jens Axboe
2022-12-16 13:00 Jens Axboe
2022-12-13 13:00 Jens Axboe
2022-12-03 13:00 Jens Axboe
2022-12-02 13:00 Jens Axboe
2022-12-01 13:00 Jens Axboe
2022-11-30 13:00 Jens Axboe
2022-11-29 13:00 Jens Axboe
2022-11-24 13:00 Jens Axboe
2022-11-19 13:00 Jens Axboe
2022-11-15 13:00 Jens Axboe
2022-11-08 13:00 Jens Axboe
2022-11-07 13:00 Jens Axboe
2022-11-05 12:00 Jens Axboe
2022-11-03 12:00 Jens Axboe
2022-11-02 12:00 Jens Axboe
2022-10-25 12:00 Jens Axboe
2022-10-22 12:00 Jens Axboe
2022-10-20 12:00 Jens Axboe
2022-10-19 12:00 Jens Axboe
2022-10-17 12:00 Jens Axboe
2022-10-16 12:00 Jens Axboe
2022-10-15 12:00 Jens Axboe
2022-10-08 12:00 Jens Axboe
2022-10-06 12:00 Jens Axboe
2022-10-05 12:00 Jens Axboe
2022-10-04 12:00 Jens Axboe
2022-09-29 12:00 Jens Axboe
2022-09-23 12:00 Jens Axboe
2022-09-20 12:00 Jens Axboe
2022-09-16 12:00 Jens Axboe
2022-09-14 12:00 Jens Axboe
2022-09-13 12:00 Jens Axboe
2022-09-07 12:00 Jens Axboe
2022-09-04 12:00 Jens Axboe
2022-09-03 12:00 Jens Axboe
2022-09-02 12:00 Jens Axboe
2022-09-01 12:00 Jens Axboe
2022-08-31 12:00 Jens Axboe
2022-08-30 12:00 Jens Axboe
2022-08-27 12:00 Jens Axboe
2022-08-26 12:00 Jens Axboe
2022-08-25 12:00 Jens Axboe
2022-08-24 12:00 Jens Axboe
2022-08-17 12:00 Jens Axboe
2022-08-16 12:00 Jens Axboe
2022-08-12 12:00 Jens Axboe
2022-08-11 12:00 Jens Axboe
2022-08-10 12:00 Jens Axboe
2022-08-08 12:00 Jens Axboe
2022-08-04 12:00 Jens Axboe
2022-08-03 12:00 Jens Axboe
2022-08-01 12:00 Jens Axboe
2022-07-29 12:00 Jens Axboe
2022-07-28 12:00 Jens Axboe
2022-07-23 12:00 Jens Axboe
2022-07-22 12:00 Jens Axboe
2022-07-20 12:00 Jens Axboe
2022-07-12 12:00 Jens Axboe
2022-07-08 12:00 Jens Axboe
2022-07-07 12:00 Jens Axboe
2022-07-06 12:00 Jens Axboe
2022-07-02 12:00 Jens Axboe
2022-06-24 12:00 Jens Axboe
2022-06-23 12:00 Jens Axboe
2022-06-20 12:00 Jens Axboe
2022-06-16 12:00 Jens Axboe
2022-06-14 12:00 Jens Axboe
2022-06-02 12:00 Jens Axboe
2022-06-01 12:00 Jens Axboe
2022-05-30 12:00 Jens Axboe
2022-05-26 12:00 Jens Axboe
2022-05-13 12:00 Jens Axboe
2022-05-02 12:00 Jens Axboe
2022-04-30 12:00 Jens Axboe
2022-04-18 12:00 Jens Axboe
2022-04-11 12:00 Jens Axboe
2022-04-09 12:00 Jens Axboe
2022-04-07 12:00 Jens Axboe
2022-04-06 12:00 Jens Axboe
2022-03-31 12:00 Jens Axboe
2022-03-30 12:00 Jens Axboe
2022-03-29 12:00 Jens Axboe
2022-03-25 12:00 Jens Axboe
2022-03-21 12:00 Jens Axboe
2022-03-16 12:00 Jens Axboe
2022-03-12 13:00 Jens Axboe
2022-03-11 13:00 Jens Axboe
2022-03-10 13:00 Jens Axboe
2022-03-09 13:00 Jens Axboe
2022-03-08 13:00 Jens Axboe
2022-02-27 13:00 Jens Axboe
2022-02-25 13:00 Jens Axboe
2022-02-22 13:00 Jens Axboe
2022-02-21 13:00 Jens Axboe
2022-02-19 13:00 Jens Axboe
2022-02-18 13:00 Jens Axboe
2022-02-16 13:00 Jens Axboe
2022-02-12 13:00 Jens Axboe
2022-02-09 13:00 Jens Axboe
2022-02-05 13:00 Jens Axboe
2022-02-04 13:00 Jens Axboe
2022-01-29 13:00 Jens Axboe
2022-01-27 13:00 Jens Axboe
2022-01-22 13:00 Jens Axboe
2022-01-21 13:00 Jens Axboe
2022-01-19 13:00 Jens Axboe
2022-01-18 13:00 Jens Axboe
2022-01-11 13:00 Jens Axboe
2022-01-10 13:00 Jens Axboe
2021-12-24 13:00 Jens Axboe
2021-12-19 13:00 Jens Axboe
2021-12-16 13:00 Jens Axboe
2021-12-15 13:00 Jens Axboe
2021-12-11 13:00 Jens Axboe
2021-12-10 13:00 Jens Axboe
2021-12-07 13:00 Jens Axboe
2021-12-03 13:00 Jens Axboe
2021-11-26 13:00 Jens Axboe
2021-11-25 13:00 Jens Axboe
2021-11-22 13:00 Jens Axboe
2021-11-21 13:00 Jens Axboe
2021-11-20 13:00 Jens Axboe
2021-11-18 13:00 Jens Axboe
2021-11-13 13:00 Jens Axboe
2021-11-11 13:00 Jens Axboe
2021-10-26 12:00 Jens Axboe
2021-10-23 12:00 Jens Axboe
2021-10-25 15:37 ` Rebecca Cran
2021-10-25 15:41   ` Jens Axboe
2021-10-25 15:42     ` Rebecca Cran
2021-10-25 15:43       ` Jens Axboe
2021-10-20 12:00 Jens Axboe
2021-10-19 12:00 Jens Axboe
2021-10-18 12:00 Jens Axboe
2021-10-16 12:00 Jens Axboe
2021-10-15 12:00 Jens Axboe
2021-10-14 12:00 Jens Axboe
2021-10-13 12:00 Jens Axboe
2021-10-12 12:00 Jens Axboe
2021-10-10 12:00 Jens Axboe
2021-10-08 12:00 Jens Axboe
2021-10-06 12:00 Jens Axboe
2021-10-05 12:00 Jens Axboe
2021-10-02 12:00 Jens Axboe
2021-10-01 12:00 Jens Axboe
2021-09-30 12:00 Jens Axboe
2021-09-29 12:00 Jens Axboe
2021-09-27 12:00 Jens Axboe
2021-09-26 12:00 Jens Axboe
2021-09-25 12:00 Jens Axboe
2021-09-24 12:00 Jens Axboe
2021-09-21 12:00 Jens Axboe
2021-09-17 12:00 Jens Axboe
2021-09-16 12:00 Jens Axboe
2021-09-14 12:00 Jens Axboe
2021-09-09 12:00 Jens Axboe
2021-09-06 12:00 Jens Axboe
2021-09-04 12:00 Jens Axboe
2021-09-04 12:00 ` Jens Axboe
2021-09-03 12:00 Jens Axboe
2021-08-29 12:00 Jens Axboe
2021-08-28 12:00 Jens Axboe
2021-08-27 12:00 Jens Axboe
2021-08-21 12:00 Jens Axboe
2021-08-19 12:00 Jens Axboe
2021-08-14 12:00 Jens Axboe
2021-08-12 12:00 Jens Axboe
2021-08-07 12:00 Jens Axboe
2021-08-05 12:00 Jens Axboe
2021-08-04 12:00 Jens Axboe
2021-08-03 12:00 Jens Axboe
2021-08-02 12:00 Jens Axboe
2021-07-29 12:00 Jens Axboe
2021-07-26 12:00 Jens Axboe
2021-07-16 12:00 Jens Axboe
2021-07-08 12:00 Jens Axboe
2021-07-02 12:00 Jens Axboe
2021-06-30 12:00 Jens Axboe
2021-06-21 12:00 Jens Axboe
2021-06-18 12:00 Jens Axboe
2021-06-15 12:00 Jens Axboe
2021-06-11 12:00 Jens Axboe
2021-06-09 12:00 Jens Axboe
2021-06-04 12:00 Jens Axboe
2021-05-28 12:00 Jens Axboe
2021-05-27 12:00 Jens Axboe
2021-05-26 12:00 Jens Axboe
2021-05-19 12:00 Jens Axboe
2021-05-15 12:00 Jens Axboe
2021-05-12 12:00 Jens Axboe
2021-05-11 12:00 Jens Axboe
2021-05-09 12:00 Jens Axboe
2021-05-07 12:00 Jens Axboe
2021-04-28 12:00 Jens Axboe
2021-04-26 12:00 Jens Axboe
2021-04-24 12:00 Jens Axboe
2021-04-23 12:00 Jens Axboe
2021-04-17 12:00 Jens Axboe
2021-04-16 12:00 Jens Axboe
2021-04-14 12:00 Jens Axboe
2021-04-13 12:00 Jens Axboe
2021-04-11 12:00 Jens Axboe
2021-03-31 12:00 Jens Axboe
2021-03-19 12:00 Jens Axboe
2021-03-18 12:00 Jens Axboe
2021-03-12 13:00 Jens Axboe
2021-03-11 13:00 Jens Axboe
2021-03-10 13:00 Jens Axboe
2021-03-09 13:00 Jens Axboe
2021-03-07 13:00 Jens Axboe
2021-02-22 13:00 Jens Axboe
2021-02-17 13:00 Jens Axboe
2021-02-15 13:00 Jens Axboe
2021-02-11 13:00 Jens Axboe
2021-01-30 13:00 Jens Axboe
2021-01-28 13:00 Jens Axboe
2021-01-27 13:00 Jens Axboe
2021-01-26 13:00 Jens Axboe
2021-01-24 13:00 Jens Axboe
2021-01-17 13:00 Jens Axboe
2021-01-16 13:00 Jens Axboe
2021-01-13 13:00 Jens Axboe
2021-01-10 13:00 Jens Axboe
2021-01-08 13:00 Jens Axboe
2021-01-07 13:00 Jens Axboe
2021-01-06 13:00 Jens Axboe
2020-12-30 13:00 Jens Axboe
2020-12-25 13:00 Jens Axboe
2020-12-18 13:00 Jens Axboe
2020-12-16 13:00 Jens Axboe
2020-12-08 13:00 Jens Axboe
2020-12-06 13:00 Jens Axboe
2020-12-05 13:00 Jens Axboe
2020-12-04 13:00 Jens Axboe
2020-11-28 13:00 Jens Axboe
2020-11-26 13:00 Jens Axboe
2020-11-23 13:00 Jens Axboe
2020-11-14 13:00 Jens Axboe
2020-11-13 13:00 Jens Axboe
2020-11-10 13:00 Jens Axboe
2020-11-06 13:00 Jens Axboe
2020-11-12 20:51 ` Rebecca Cran
2020-11-05 13:00 Jens Axboe
2020-11-02 13:00 Jens Axboe
2020-10-31 12:00 Jens Axboe
2020-10-29 12:00 Jens Axboe
2020-10-15 12:00 Jens Axboe
2020-10-14 12:00 Jens Axboe
2020-10-11 12:00 Jens Axboe
2020-10-10 12:00 Jens Axboe
2020-09-15 12:00 Jens Axboe
2020-09-12 12:00 Jens Axboe
2020-09-10 12:00 Jens Axboe
2020-09-09 12:00 Jens Axboe
2020-09-08 12:00 Jens Axboe
2020-09-07 12:00 Jens Axboe
2020-09-06 12:00 Jens Axboe
2020-09-04 12:00 Jens Axboe
2020-09-02 12:00 Jens Axboe
2020-09-01 12:00 Jens Axboe
2020-08-30 12:00 Jens Axboe
2020-08-29 12:00 Jens Axboe
2020-08-28 12:00 Jens Axboe
2020-08-23 12:00 Jens Axboe
2020-08-22 12:00 Jens Axboe
2020-08-20 12:00 Jens Axboe
2020-08-19 12:00 Jens Axboe
2020-08-18 12:00 Jens Axboe
2020-08-17 12:00 Jens Axboe
2020-08-15 12:00 Jens Axboe
2020-08-14 12:00 Jens Axboe
2020-08-13 12:00 Jens Axboe
2020-08-12 12:00 Jens Axboe
2020-08-11 12:00 Jens Axboe
2020-08-08 12:00 Jens Axboe
2020-08-02 12:00 Jens Axboe
2020-07-28 12:00 Jens Axboe
2020-07-27 12:00 Jens Axboe
2020-07-26 12:00 Jens Axboe
2020-07-25 12:00 Jens Axboe
2020-07-22 12:00 Jens Axboe
2020-07-21 12:00 Jens Axboe
2020-07-19 12:00 Jens Axboe
2020-07-18 12:00 Jens Axboe
2020-07-15 12:00 Jens Axboe
2020-07-14 12:00 Jens Axboe
2020-07-09 12:00 Jens Axboe
2020-07-05 12:00 Jens Axboe
2020-07-04 12:00 Jens Axboe
2020-07-03 12:00 Jens Axboe
2020-06-29 12:00 Jens Axboe
2020-06-25 12:00 Jens Axboe
2020-06-24 12:00 Jens Axboe
2020-06-22 12:00 Jens Axboe
2020-06-13 12:00 Jens Axboe
2020-06-10 12:00 Jens Axboe
2020-06-08 12:00 Jens Axboe
2020-06-06 12:00 Jens Axboe
2020-06-04 12:00 Jens Axboe
2020-06-03 12:00 Jens Axboe
2020-05-30 12:00 Jens Axboe
2020-05-29 12:00 Jens Axboe
2020-05-26 12:00 Jens Axboe
2020-05-25 12:00 Jens Axboe
2020-05-24 12:00 Jens Axboe
2020-05-22 12:00 Jens Axboe
2020-05-21 12:00 Jens Axboe
2020-05-20 12:00 Jens Axboe
2020-05-19 12:00 Jens Axboe
2020-05-15 12:00 Jens Axboe
2020-05-14 12:00 Jens Axboe
2020-05-12 12:00 Jens Axboe
2020-04-30 12:00 Jens Axboe
2020-04-22 12:00 Jens Axboe
2020-04-21 12:00 Jens Axboe
2020-04-18 12:00 Jens Axboe
2020-04-17 12:00 Jens Axboe
2020-04-16 12:00 Jens Axboe
2020-04-14 12:00 Jens Axboe
2020-04-09 12:00 Jens Axboe
2020-04-08 12:00 Jens Axboe
2020-04-07 12:00 Jens Axboe
2020-04-03 12:00 Jens Axboe
2020-04-01 12:00 Jens Axboe
2020-03-27 12:00 Jens Axboe
2020-03-18 12:00 Jens Axboe
2020-03-17 12:00 Jens Axboe
2020-03-16 12:00 Jens Axboe
2020-03-13 12:00 Jens Axboe
2020-03-04 13:00 Jens Axboe
2020-03-03 13:00 Jens Axboe
2020-03-02 13:00 Jens Axboe
2020-02-27 13:00 Jens Axboe
2020-02-25 13:00 Jens Axboe
2020-02-07 13:00 Jens Axboe
2020-02-06 13:00 Jens Axboe
2020-02-05 13:00 Jens Axboe
2020-01-29 13:00 Jens Axboe
2020-01-24 13:00 Jens Axboe
2020-01-23 13:00 Jens Axboe
2020-01-19 13:00 Jens Axboe
2020-01-17 13:00 Jens Axboe
2020-01-15 13:00 Jens Axboe
2020-01-14 13:00 Jens Axboe
2020-01-10 13:00 Jens Axboe
2020-01-07 13:00 Jens Axboe
2020-01-06 13:00 Jens Axboe
2020-01-05 13:00 Jens Axboe
2020-01-04 13:00 Jens Axboe
2019-12-26 13:00 Jens Axboe
2019-12-24 13:00 Jens Axboe
2019-12-22 13:00 Jens Axboe
2019-12-19 13:00 Jens Axboe
2019-12-17 13:00 Jens Axboe
2019-12-12 13:00 Jens Axboe
2019-12-07 13:00 Jens Axboe
2019-11-28 13:00 Jens Axboe
2019-11-27 13:00 Jens Axboe
2019-11-26 13:00 Jens Axboe
2019-11-15 13:00 Jens Axboe
2019-11-07 15:25 Jens Axboe
2019-11-07 13:00 Jens Axboe
2019-11-06 13:00 Jens Axboe
2019-11-04 13:00 Jens Axboe
2019-11-03 13:00 Jens Axboe
2019-10-30 12:00 Jens Axboe
2019-10-25 12:00 Jens Axboe
2019-10-22 12:00 Jens Axboe
2019-10-16 12:00 Jens Axboe
2019-10-15 12:00 Jens Axboe
2019-10-14 12:00 Jens Axboe
2019-10-09 12:00 Jens Axboe
2019-10-08 12:00 Jens Axboe
2019-10-07 12:00 Jens Axboe
2019-10-03 12:00 Jens Axboe
2019-10-02 12:00 Jens Axboe
2019-09-28 12:00 Jens Axboe
2019-09-26 12:00 Jens Axboe
2019-09-25 12:00 Jens Axboe
2019-09-24 12:00 Jens Axboe
2019-09-20 12:00 Jens Axboe
2019-09-14 12:00 Jens Axboe
2019-09-13 12:00 Jens Axboe
2019-09-06 12:00 Jens Axboe
2019-09-04 12:00 Jens Axboe
2019-08-30 12:00 Jens Axboe
2019-08-29 12:00 Jens Axboe
2019-08-16 12:00 Jens Axboe
2019-08-15 12:00 Jens Axboe
2019-08-15 14:27 ` Rebecca Cran
2019-08-15 14:28   ` Jens Axboe
2019-08-15 15:05     ` Rebecca Cran
2019-08-15 15:17       ` Jens Axboe
2019-08-15 15:35         ` Rebecca Cran
2019-08-09 12:00 Jens Axboe
2019-08-06 12:00 Jens Axboe
2019-08-04 12:00 Jens Axboe
2019-08-03 12:00 Jens Axboe
2019-08-01 12:00 Jens Axboe
2019-07-27 12:00 Jens Axboe
2019-07-13 12:00 Jens Axboe
2019-07-10 12:00 Jens Axboe
2019-07-02 12:00 Jens Axboe
2019-06-01 12:00 Jens Axboe
2019-05-24 12:00 Jens Axboe
2019-05-23 12:00 Jens Axboe
2019-05-21 12:00 Jens Axboe
2019-05-17 12:00 Jens Axboe
2019-05-10 12:00 Jens Axboe
2019-05-09 12:00 Jens Axboe
2019-05-09 12:47 ` Erwan Velu
2019-05-09 14:07   ` Jens Axboe
2019-05-09 15:47 ` Elliott, Robert (Servers)
2019-05-09 15:52   ` Sebastien Boisvert
2019-05-09 16:12     ` Elliott, Robert (Servers)
2019-05-09 15:57   ` Jens Axboe
2019-05-07 12:00 Jens Axboe
2019-04-26 12:00 Jens Axboe
2019-04-23 12:00 Jens Axboe
2019-04-20 12:00 Jens Axboe
2019-04-19 12:00 Jens Axboe
2019-04-18 12:00 Jens Axboe
2019-04-02 12:00 Jens Axboe
2019-03-26 12:00 Jens Axboe
2019-03-22 12:00 Jens Axboe
2019-03-12 12:00 Jens Axboe
2019-03-09 13:00 Jens Axboe
2019-03-08 13:00 Jens Axboe
2019-03-07 13:00 Jens Axboe
2019-03-01 13:00 Jens Axboe
2019-02-25 13:00 Jens Axboe
2019-02-24 13:00 Jens Axboe
2019-02-22 13:00 Jens Axboe
2019-02-12 13:00 Jens Axboe
2019-02-11 13:00 Jens Axboe
2019-02-09 13:00 Jens Axboe
2019-02-08 13:00 Jens Axboe
2019-02-05 13:00 Jens Axboe
2019-02-01 13:00 Jens Axboe
2019-01-30 13:00 Jens Axboe
2019-01-29 13:00 Jens Axboe
2019-01-25 13:00 Jens Axboe
2019-01-24 13:00 Jens Axboe
2019-01-17 13:00 Jens Axboe
2019-01-16 13:00 Jens Axboe
2019-01-15 13:00 Jens Axboe
2019-01-14 13:00 Jens Axboe
2019-01-13 13:00 Jens Axboe
2019-01-12 13:00 Jens Axboe
2019-01-11 13:00 Jens Axboe
2019-01-10 13:00 Jens Axboe
2019-01-09 13:00 Jens Axboe
2019-01-08 13:00 Jens Axboe
2019-01-06 13:00 Jens Axboe
2019-01-05 13:00 Jens Axboe
2018-12-31 13:00 Jens Axboe
2018-12-22 13:00 Jens Axboe
2018-12-20 13:00 Jens Axboe
2018-12-15 13:00 Jens Axboe
2018-12-14 13:00 Jens Axboe
2018-12-13 13:00 Jens Axboe
2018-12-11 13:00 Jens Axboe
2018-12-05 13:00 Jens Axboe
2018-12-02 13:00 Jens Axboe
2018-12-01 13:00 Jens Axboe
2018-11-30 13:00 Jens Axboe
2018-11-28 13:00 Jens Axboe
2018-11-27 13:00 Jens Axboe
2018-11-26 13:00 Jens Axboe
2018-11-25 13:00 Jens Axboe
2018-11-22 13:00 Jens Axboe
2018-11-21 13:00 Jens Axboe
2018-11-20 13:00 Jens Axboe
2018-11-16 13:00 Jens Axboe
2018-11-07 13:00 Jens Axboe
2018-11-03 12:00 Jens Axboe
2018-10-27 12:00 Jens Axboe
2018-10-24 12:00 Jens Axboe
2018-10-20 12:00 Jens Axboe
2018-10-19 12:00 Jens Axboe
2018-10-16 12:00 Jens Axboe
2018-10-09 12:00 Jens Axboe
2018-10-06 12:00 Jens Axboe
2018-10-05 12:00 Jens Axboe
2018-10-04 12:00 Jens Axboe
2018-10-02 12:00 Jens Axboe
2018-10-01 12:00 Jens Axboe
2018-09-30 12:00 Jens Axboe
2018-09-28 12:00 Jens Axboe
2018-09-27 12:00 Jens Axboe
2018-09-26 12:00 Jens Axboe
2018-09-23 12:00 Jens Axboe
2018-09-22 12:00 Jens Axboe
2018-09-21 12:00 Jens Axboe
2018-09-20 12:00 Jens Axboe
2018-09-18 12:00 Jens Axboe
2018-09-17 12:00 Jens Axboe
2018-09-13 12:00 Jens Axboe
2018-09-12 12:00 Jens Axboe
2018-09-11 12:00 Jens Axboe
2018-09-10 12:00 Jens Axboe
2018-09-09 12:00 Jens Axboe
2018-09-08 12:00 Jens Axboe
2018-09-07 12:00 Jens Axboe
2018-09-06 12:00 Jens Axboe
2018-09-04 12:00 Jens Axboe
2018-09-01 12:00 Jens Axboe
2018-08-31 12:00 Jens Axboe
2018-08-26 12:00 Jens Axboe
2018-08-25 12:00 Jens Axboe
2018-08-24 12:00 Jens Axboe
2018-08-23 12:00 Jens Axboe
2018-08-22 12:00 Jens Axboe
2018-08-21 12:00 Jens Axboe
2018-08-18 12:00 Jens Axboe
2018-08-17 12:00 Jens Axboe
2018-08-16 12:00 Jens Axboe
2018-08-15 12:00 Jens Axboe
2018-08-14 12:00 Jens Axboe
2018-08-13 12:00 Jens Axboe
2018-08-11 12:00 Jens Axboe
2018-08-10 12:00 Jens Axboe
2018-08-08 12:00 Jens Axboe
2018-08-06 12:00 Jens Axboe
2018-08-04 12:00 Jens Axboe
2018-08-03 12:00 Jens Axboe
2018-07-31 12:00 Jens Axboe
2018-07-27 12:00 Jens Axboe
2018-07-26 12:00 Jens Axboe
2018-07-25 12:00 Jens Axboe
2018-07-24 12:00 Jens Axboe
2018-07-13 12:00 Jens Axboe
2018-07-12 12:00 Jens Axboe
2018-07-11 12:00 Jens Axboe
2018-07-05 12:00 Jens Axboe
2018-06-30 12:00 Jens Axboe
2018-06-22 12:00 Jens Axboe
2018-06-19 12:00 Jens Axboe
2018-06-16 12:00 Jens Axboe
2018-06-13 12:00 Jens Axboe
2018-06-12 12:00 Jens Axboe
2018-06-09 12:00 Jens Axboe
2018-06-08 12:00 Jens Axboe
2018-06-06 12:00 Jens Axboe
2018-06-05 12:00 Jens Axboe
2018-06-02 12:00 Jens Axboe
2018-06-01 12:00 Jens Axboe
2018-05-26 12:00 Jens Axboe
2018-05-19 12:00 Jens Axboe
2018-05-17 12:00 Jens Axboe
2018-05-15 12:00 Jens Axboe
2018-04-27 12:00 Jens Axboe
2018-04-25 12:00 Jens Axboe
2018-04-21 12:00 Jens Axboe
2018-04-19 12:00 Jens Axboe
2018-04-18 12:00 Jens Axboe
2018-04-17 12:00 Jens Axboe
2018-04-15 12:00 Jens Axboe
2018-04-14 12:00 Jens Axboe
2018-04-11 12:00 Jens Axboe
2018-04-10 12:00 Jens Axboe
2018-04-09 12:00 Jens Axboe
2018-04-07 12:00 Jens Axboe
2018-04-05 12:00 Jens Axboe
2018-04-04 12:00 Jens Axboe
2018-03-31 12:00 Jens Axboe
2018-03-30 12:00 Jens Axboe
2018-03-24 12:00 Jens Axboe
2018-03-23 12:00 Jens Axboe
2018-03-22 12:00 Jens Axboe
2018-03-21 12:00 Jens Axboe
2018-03-20 12:00 Jens Axboe
2018-03-14 12:00 Jens Axboe
2018-03-13 12:00 Jens Axboe
2018-03-10 13:00 Jens Axboe
2018-03-08 13:00 Jens Axboe
2018-03-07 13:00 Jens Axboe
2018-03-06 13:00 Jens Axboe
2018-03-03 13:00 Jens Axboe
2018-03-02 13:00 Jens Axboe
2018-03-01 13:00 Jens Axboe
2018-02-28 13:00 Jens Axboe
2018-02-27 13:00 Jens Axboe
2018-02-21 13:00 Jens Axboe
2018-02-15 13:00 Jens Axboe
2018-02-13 13:00 Jens Axboe
2018-02-11 13:00 Jens Axboe
2018-02-09 13:00 Jens Axboe
2018-02-08 13:00 Jens Axboe
2018-01-26 13:00 Jens Axboe
2018-01-25 13:00 Jens Axboe
2018-01-17 13:00 Jens Axboe
2018-01-13 13:00 Jens Axboe
2018-01-11 13:00 Jens Axboe
2018-01-07 13:00 Jens Axboe
2018-01-06 13:00 Jens Axboe
2018-01-03 13:00 Jens Axboe
2017-12-30 13:00 Jens Axboe
2017-12-29 13:00 Jens Axboe
2017-12-28 13:00 Jens Axboe
2017-12-22 13:00 Jens Axboe
2017-12-20 13:00 Jens Axboe
2017-12-16 13:00 Jens Axboe
2017-12-15 13:00 Jens Axboe
2017-12-14 13:00 Jens Axboe
2017-12-09 13:00 Jens Axboe
2017-12-08 13:00 Jens Axboe
2017-12-07 13:00 Jens Axboe
2017-12-04 13:00 Jens Axboe
2017-12-03 13:00 Jens Axboe
2017-12-02 13:00 Jens Axboe
2017-12-01 13:00 Jens Axboe
2017-11-30 13:00 Jens Axboe
2017-11-29 13:00 Jens Axboe
2017-11-24 13:00 Jens Axboe
2017-11-23 13:00 Jens Axboe
2017-11-18 13:00 Jens Axboe
2017-11-20 15:00 ` Elliott, Robert (Persistent Memory)
2017-11-17 13:00 Jens Axboe
2017-11-16 13:00 Jens Axboe
2017-11-07 13:00 Jens Axboe
2017-11-04 12:00 Jens Axboe
2017-11-03 12:00 Jens Axboe
2017-11-02 12:00 Jens Axboe
2017-11-01 12:00 Jens Axboe
2017-10-31 12:00 Jens Axboe
2017-10-27 12:00 Jens Axboe
2017-10-26 12:00 Jens Axboe
2017-10-21 12:00 Jens Axboe
2017-10-18 12:00 Jens Axboe
2017-10-13 12:00 Jens Axboe
2017-10-12 12:00 Jens Axboe
2017-10-11 12:00 Jens Axboe
2017-10-10 12:00 Jens Axboe
2017-10-07 12:00 Jens Axboe
2017-10-04 12:00 Jens Axboe
2017-09-29 12:00 Jens Axboe
2017-09-28 12:00 Jens Axboe
2017-09-27 12:00 Jens Axboe
2017-09-21 12:00 Jens Axboe
2017-09-19 12:00 Jens Axboe
2017-09-15 12:00 Jens Axboe
2017-09-14 12:00 Jens Axboe
2017-09-13 12:00 Jens Axboe
2017-09-12 12:00 Jens Axboe
2017-09-06 12:00 Jens Axboe
2017-09-03 12:00 Jens Axboe
2017-09-02 12:00 Jens Axboe
2017-09-01 12:00 Jens Axboe
2017-08-31 12:00 Jens Axboe
2017-08-30 12:00 Jens Axboe
2017-08-29 12:00 Jens Axboe
2017-08-28 12:00 Jens Axboe
2017-08-24 12:00 Jens Axboe
2017-08-23 12:00 Jens Axboe
2017-08-18 12:00 Jens Axboe
2017-08-17 12:00 Jens Axboe
2017-08-15 12:00 Jens Axboe
2017-08-10 12:00 Jens Axboe
2017-08-09 12:00 Jens Axboe
2017-08-08 12:00 Jens Axboe
2017-08-02 12:00 Jens Axboe
2017-08-01 12:00 Jens Axboe
2017-07-28 12:00 Jens Axboe
2017-07-26 12:00 Jens Axboe
2017-07-21 12:00 Jens Axboe
2017-07-17 12:00 Jens Axboe
2017-07-15 12:00 Jens Axboe
2017-07-14 12:00 Jens Axboe
2017-07-13 12:00 Jens Axboe
2017-07-11 12:00 Jens Axboe
2017-07-08 12:00 Jens Axboe
2017-07-07 12:00 Jens Axboe
2017-07-05 12:00 Jens Axboe
2017-07-04 12:00 Jens Axboe
2017-07-03 12:00 Jens Axboe
2017-06-29 12:00 Jens Axboe
2017-06-28 12:00 Jens Axboe
2017-06-27 12:00 Jens Axboe
2017-06-26 12:00 Jens Axboe
2017-06-24 12:00 Jens Axboe
2017-06-23 12:00 Jens Axboe
2017-06-20 12:00 Jens Axboe
2017-06-19 12:00 Jens Axboe
2017-06-16 12:00 Jens Axboe
2017-06-15 12:00 Jens Axboe
2017-06-13 12:00 Jens Axboe
2017-06-09 12:00 Jens Axboe
2017-06-08 12:00 Jens Axboe
2017-06-06 12:00 Jens Axboe
2017-06-03 12:00 Jens Axboe
2017-05-27 12:00 Jens Axboe
2017-05-25 12:00 Jens Axboe
2017-05-24 12:00 Jens Axboe

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260625120001.5E2C71BC0156@kernel.dk \
    --to=axboe@kernel.dk \
    --cc=fio@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox