[RFC PATCH 05/12] nvme: wire-up register/unregister queue f_op callback
From: Kanchan Joshi <hidden>
Date: 2023-04-29 09:43:04
Also in:
io-uring, linux-nvme
Subsystem:
nvm express driver, the rest · Maintainers:
Keith Busch, Jens Axboe, Christoph Hellwig, Sagi Grimberg, Linus Torvalds
From: Anuj Gupta <redacted> Implement register/unregister handlers for char-device file. Signed-off-by: Anuj Gupta <redacted> Signed-off-by: Kanchan Joshi <redacted> --- drivers/nvme/host/core.c | 26 +++++++++++++++++++ drivers/nvme/host/ioctl.c | 48 +++++++++++++++++++++++++++++++++++ drivers/nvme/host/multipath.c | 2 ++ drivers/nvme/host/nvme.h | 2 ++ 4 files changed, 78 insertions(+)
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index ba476c48d566..4462ce50d076 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c@@ -4059,6 +4059,30 @@ static int nvme_ns_chr_release(struct inode *inode, struct file *file) return 0; } +int nvme_register_queue(struct file *file) +{ + struct nvme_ns *ns = container_of(file_inode(file)->i_cdev, + struct nvme_ns, cdev); + struct nvme_ctrl *ctrl = ns->ctrl; + struct request_queue *q = ns ? ns->queue : ctrl->admin_q; + + if (q->mq_ops && q->mq_ops->register_queue) + return q->mq_ops->register_queue(ns); + return -EINVAL; +} + +int nvme_unregister_queue(struct file *file, int qid) +{ + struct nvme_ns *ns = container_of(file_inode(file)->i_cdev, + struct nvme_ns, cdev); + struct nvme_ctrl *ctrl = ns->ctrl; + struct request_queue *q = ns ? ns->queue : ctrl->admin_q; + + if (q->mq_ops && q->mq_ops->unregister_queue) + return q->mq_ops->unregister_queue(ns, qid); + return -EINVAL; +} + static const struct file_operations nvme_ns_chr_fops = { .owner = THIS_MODULE, .open = nvme_ns_chr_open,
@@ -4067,6 +4091,8 @@ static const struct file_operations nvme_ns_chr_fops = { .compat_ioctl = compat_ptr_ioctl, .uring_cmd = nvme_ns_chr_uring_cmd, .uring_cmd_iopoll = nvme_ns_chr_uring_cmd_iopoll, + .register_queue = nvme_register_queue, + .unregister_queue = nvme_unregister_queue, }; static int nvme_add_ns_cdev(struct nvme_ns *ns)
diff --git a/drivers/nvme/host/ioctl.c b/drivers/nvme/host/ioctl.c
index d24ea2e05156..292a578686b6 100644
--- a/drivers/nvme/host/ioctl.c
+++ b/drivers/nvme/host/ioctl.c@@ -871,6 +871,54 @@ long nvme_ns_head_chr_ioctl(struct file *file, unsigned int cmd, return ret; } +int nvme_ns_head_register_queue(struct file *file) +{ + struct cdev *cdev = file_inode(file)->i_cdev; + struct nvme_ns_head *head = + container_of(cdev, struct nvme_ns_head, cdev); + struct nvme_ns *ns; + struct nvme_ctrl *ctrl; + struct request_queue *q; + int srcu_idx, ret = -EINVAL; + + srcu_idx = srcu_read_lock(&head->srcu); + ns = nvme_find_path(head); + if (!ns) + goto out_unlock; + + ctrl = ns->ctrl; + q = ns ? ns->queue : ctrl->admin_q; + if (q->mq_ops && q->mq_ops->register_queue) + ret = q->mq_ops->register_queue(ns); +out_unlock: + srcu_read_unlock(&head->srcu, srcu_idx); + return ret; +} + +int nvme_ns_head_unregister_queue(struct file *file, int qid) +{ + struct cdev *cdev = file_inode(file)->i_cdev; + struct nvme_ns_head *head = + container_of(cdev, struct nvme_ns_head, cdev); + struct nvme_ns *ns; + struct nvme_ctrl *ctrl; + struct request_queue *q; + int srcu_idx, ret = -EINVAL; + + srcu_idx = srcu_read_lock(&head->srcu); + ns = nvme_find_path(head); + if (!ns) + goto out_unlock; + + ctrl = ns->ctrl; + q = ns ? ns->queue : ctrl->admin_q; + if (q->mq_ops && q->mq_ops->unregister_queue) + ret = q->mq_ops->unregister_queue(ns, qid); +out_unlock: + srcu_read_unlock(&head->srcu, srcu_idx); + return ret; +} + int nvme_ns_head_chr_uring_cmd(struct io_uring_cmd *ioucmd, unsigned int issue_flags) {
diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c
index 9171452e2f6d..eed30daf1a37 100644
--- a/drivers/nvme/host/multipath.c
+++ b/drivers/nvme/host/multipath.c@@ -471,6 +471,8 @@ static const struct file_operations nvme_ns_head_chr_fops = { .compat_ioctl = compat_ptr_ioctl, .uring_cmd = nvme_ns_head_chr_uring_cmd, .uring_cmd_iopoll = nvme_ns_head_chr_uring_cmd_iopoll, + .register_queue = nvme_ns_head_register_queue, + .unregister_queue = nvme_ns_head_unregister_queue, }; static int nvme_add_ns_head_cdev(struct nvme_ns_head *head)
diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h
index 73992dc9dec7..4619a7498f8e 100644
--- a/drivers/nvme/host/nvme.h
+++ b/drivers/nvme/host/nvme.h@@ -843,6 +843,8 @@ int nvme_ns_head_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg); long nvme_ns_head_chr_ioctl(struct file *file, unsigned int cmd, unsigned long arg); +int nvme_ns_head_register_queue(struct file *file); +int nvme_ns_head_unregister_queue(struct file *file, int qid); long nvme_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg); int nvme_ns_chr_uring_cmd_iopoll(struct io_uring_cmd *ioucmd,
--
2.25.1