From: Anuj Gupta <anuj20.g@xxxxxxxxxxx> Implement register/unregister handlers for char-device file. Signed-off-by: Anuj Gupta <anuj20.g@xxxxxxxxxxx> Signed-off-by: Kanchan Joshi <joshi.k@xxxxxxxxxxx> --- 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