Skip to content
Snippets Groups Projects
Commit 7d574b4c authored by Keith Busch's avatar Keith Busch Committed by Xibo.Wang
Browse files

nvme: Assign subsys instance from first ctrl

mainline inclusion
from mainline-v5.4
commit 733e4b69
category: bugfix
bugzilla:https://gitee.com/openeuler/kernel/issues/I5986O


CVE: NA

--------------------------------

The namespace disk names must be unique for the lifetime of the
subsystem. This was accomplished by using their parent subsystems'
instances which were allocated independently from the controllers
connected to that subsystem. This allowed name prefixes assigned to
namespaces to match a controller from an unrelated subsystem, and has
created confusion among users examining device nodes.

Ensure a namespace's subsystem instance never clashes with a controller
instance of another subsystem by transferring the instance ownership
to the parent subsystem from the first controller discovered in that
subsystem.

Reviewed-by: default avatarLogan Gunthorpe <logang@deltatee.com>
Signed-off-by: default avatarKeith Busch <kbusch@kernel.org>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarMinwoo Im <minwoo.im@samsung.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
Reviewed-off-by: default avatarSagi Grimberg <sagi@grimberg.me>
Signed-off-by: default avatarSagi Grimberg <sagi@grimberg.me>
Signed-off-by: default avatarXibo.Wang <wangxb12@chinatelecom.cn>
parent e921a80d
No related branches found
No related tags found
No related merge requests found
...@@ -89,7 +89,6 @@ EXPORT_SYMBOL_GPL(nvme_reset_wq); ...@@ -89,7 +89,6 @@ EXPORT_SYMBOL_GPL(nvme_reset_wq);
struct workqueue_struct *nvme_delete_wq; struct workqueue_struct *nvme_delete_wq;
EXPORT_SYMBOL_GPL(nvme_delete_wq); EXPORT_SYMBOL_GPL(nvme_delete_wq);
static DEFINE_IDA(nvme_subsystems_ida);
static LIST_HEAD(nvme_subsystems); static LIST_HEAD(nvme_subsystems);
static DEFINE_MUTEX(nvme_subsystems_lock); static DEFINE_MUTEX(nvme_subsystems_lock);
...@@ -2350,7 +2349,8 @@ static void nvme_release_subsystem(struct device *dev) ...@@ -2350,7 +2349,8 @@ static void nvme_release_subsystem(struct device *dev)
struct nvme_subsystem *subsys = struct nvme_subsystem *subsys =
container_of(dev, struct nvme_subsystem, dev); container_of(dev, struct nvme_subsystem, dev);
ida_simple_remove(&nvme_subsystems_ida, subsys->instance); if (subsys->instance >= 0)
ida_simple_remove(&nvme_instance_ida, subsys->instance);
kfree(subsys); kfree(subsys);
} }
...@@ -2461,12 +2461,8 @@ static int nvme_init_subsystem(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id) ...@@ -2461,12 +2461,8 @@ static int nvme_init_subsystem(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
subsys = kzalloc(sizeof(*subsys), GFP_KERNEL); subsys = kzalloc(sizeof(*subsys), GFP_KERNEL);
if (!subsys) if (!subsys)
return -ENOMEM; return -ENOMEM;
ret = ida_simple_get(&nvme_subsystems_ida, 0, 0, GFP_KERNEL);
if (ret < 0) { subsys->instance = -1;
kfree(subsys);
return ret;
}
subsys->instance = ret;
mutex_init(&subsys->lock); mutex_init(&subsys->lock);
kref_init(&subsys->ref); kref_init(&subsys->ref);
INIT_LIST_HEAD(&subsys->ctrls); INIT_LIST_HEAD(&subsys->ctrls);
...@@ -2481,7 +2477,7 @@ static int nvme_init_subsystem(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id) ...@@ -2481,7 +2477,7 @@ static int nvme_init_subsystem(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
subsys->dev.class = nvme_subsys_class; subsys->dev.class = nvme_subsys_class;
subsys->dev.release = nvme_release_subsystem; subsys->dev.release = nvme_release_subsystem;
subsys->dev.groups = nvme_subsys_attrs_groups; subsys->dev.groups = nvme_subsys_attrs_groups;
dev_set_name(&subsys->dev, "nvme-subsys%d", subsys->instance); dev_set_name(&subsys->dev, "nvme-subsys%d", ctrl->instance);
device_initialize(&subsys->dev); device_initialize(&subsys->dev);
mutex_lock(&nvme_subsystems_lock); mutex_lock(&nvme_subsystems_lock);
...@@ -2514,6 +2510,8 @@ static int nvme_init_subsystem(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id) ...@@ -2514,6 +2510,8 @@ static int nvme_init_subsystem(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
list_add_tail(&subsys->entry, &nvme_subsystems); list_add_tail(&subsys->entry, &nvme_subsystems);
} }
if (!found)
subsys->instance = ctrl->instance;
ctrl->subsys = subsys; ctrl->subsys = subsys;
mutex_unlock(&nvme_subsystems_lock); mutex_unlock(&nvme_subsystems_lock);
...@@ -3840,7 +3838,9 @@ static void nvme_free_ctrl(struct device *dev) ...@@ -3840,7 +3838,9 @@ static void nvme_free_ctrl(struct device *dev)
container_of(dev, struct nvme_ctrl, ctrl_device); container_of(dev, struct nvme_ctrl, ctrl_device);
struct nvme_subsystem *subsys = ctrl->subsys; struct nvme_subsystem *subsys = ctrl->subsys;
ida_simple_remove(&nvme_instance_ida, ctrl->instance); if (subsys && ctrl->instance != subsys->instance)
ida_simple_remove(&nvme_instance_ida, ctrl->instance);
kfree(ctrl->effects); kfree(ctrl->effects);
nvme_mpath_uninit(ctrl); nvme_mpath_uninit(ctrl);
__free_page(ctrl->discard_page); __free_page(ctrl->discard_page);
...@@ -4102,7 +4102,6 @@ int __init nvme_core_init(void) ...@@ -4102,7 +4102,6 @@ int __init nvme_core_init(void)
void nvme_core_exit(void) void nvme_core_exit(void)
{ {
ida_destroy(&nvme_subsystems_ida);
class_destroy(nvme_subsys_class); class_destroy(nvme_subsys_class);
class_destroy(nvme_class); class_destroy(nvme_class);
unregister_chrdev_region(nvme_chr_devt, NVME_MINORS); unregister_chrdev_region(nvme_chr_devt, NVME_MINORS);
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment