From b944e3b1bdaea4708450c97fbf03c0d1f5d0eb16 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Tue, 3 Mar 2026 01:18:52 +0900 Subject: [PATCH] libnvme/ioctl: introduce ioctl_io64 nvme transport direct handle Since currently only NVME_IOCTL_ADMIN64_CMD checked for ioctrl64. But NVME_IOCTL_IO64_CMD not checked as same. Also currently NVME_IOCTL_IO64_CMD not supported for the char dev. Therefore introduce the ioctl_io64 flag to use NVME_IOCTL_IO64_CMD. Signed-off-by: Tokunori Ikegami [wagi: renamed ioctl64 to ioctl_admin64] Signed-off-by: Daniel Wagner --- libnvme/src/nvme/ioctl.c | 4 ++-- libnvme/src/nvme/lib.c | 10 +++++++--- libnvme/src/nvme/private.h | 3 ++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/libnvme/src/nvme/ioctl.c b/libnvme/src/nvme/ioctl.c index 861c1a81fc..88902a50a8 100644 --- a/libnvme/src/nvme/ioctl.c +++ b/libnvme/src/nvme/ioctl.c @@ -178,7 +178,7 @@ static int nvme_submit_passthru64(struct nvme_transport_handle *hdl, int nvme_submit_io_passthru(struct nvme_transport_handle *hdl, struct nvme_passthru_cmd *cmd) { - if (hdl->ioctl64) + if (hdl->ioctl_io64) return nvme_submit_passthru64(hdl, NVME_IOCTL_IO64_CMD, cmd); return nvme_submit_passthru32(hdl, NVME_IOCTL_IO_CMD, cmd); } @@ -188,7 +188,7 @@ int nvme_submit_admin_passthru(struct nvme_transport_handle *hdl, { switch (hdl->type) { case NVME_TRANSPORT_HANDLE_TYPE_DIRECT: - if (hdl->ioctl64) + if (hdl->ioctl_admin64) return nvme_submit_passthru64(hdl, NVME_IOCTL_ADMIN64_CMD, cmd); if (cmd->opcode == nvme_admin_fabrics) diff --git a/libnvme/src/nvme/lib.c b/libnvme/src/nvme/lib.c index bccb06f094..0a2f76f347 100644 --- a/libnvme/src/nvme/lib.c +++ b/libnvme/src/nvme/lib.c @@ -160,8 +160,12 @@ static int __nvme_transport_handle_open_direct( if (hdl->ctx->ioctl_probing) { ret = ioctl(hdl->fd, NVME_IOCTL_ADMIN64_CMD, &dummy); - if (ret > 0) - hdl->ioctl64 = true; + if (ret > 0) { + hdl->ioctl_admin64 = true; + ret = ioctl(hdl->fd, NVME_IOCTL_IO64_CMD, &dummy); + if (ret != -1 || errno != ENOTTY) + hdl->ioctl_io64 = true; + } } return 0; @@ -211,7 +215,7 @@ int nvme_open(struct nvme_global_ctx *ctx, const char *name, hdl->fd = 0xFD; if (!strcmp(name, "NVME_TEST_FD64")) - hdl->ioctl64 = true; + hdl->ioctl_admin64 = true; *hdlp = hdl; return 0; diff --git a/libnvme/src/nvme/private.h b/libnvme/src/nvme/private.h index ee807c29d2..b1fff5b92d 100644 --- a/libnvme/src/nvme/private.h +++ b/libnvme/src/nvme/private.h @@ -113,7 +113,8 @@ struct nvme_transport_handle { /* direct */ int fd; struct stat stat; - bool ioctl64; + bool ioctl_admin64; + bool ioctl_io64; /* mi */ struct nvme_mi_ep *ep;