Unverified Commit c13fd95d authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!139 nvme: Assign subsys instance from first ctrl

Merge Pull Request from: @babyihc 
 
This PR is to fix nvme disk names not unique for the lifetime of the subsystem.
Kernel issuse:
https://gitee.com/openeuler/kernel/issues/I5986O
 
 
Link:https://gitee.com/openeuler/kernel/pulls/139

 
Reviewed-by: default avatarXie XiuQi <xiexiuqi@huawei.com>
Signed-off-by: default avatarXie XiuQi <xiexiuqi@huawei.com>
parents 4b472e21 1e83e42b
Loading
Loading
Loading
Loading
+10 −11
Original line number Diff line number Diff line
@@ -89,7 +89,6 @@ EXPORT_SYMBOL_GPL(nvme_reset_wq);
struct workqueue_struct *nvme_delete_wq;
EXPORT_SYMBOL_GPL(nvme_delete_wq);

static DEFINE_IDA(nvme_subsystems_ida);
static LIST_HEAD(nvme_subsystems);
static DEFINE_MUTEX(nvme_subsystems_lock);

@@ -2350,7 +2349,8 @@ static void nvme_release_subsystem(struct device *dev)
	struct nvme_subsystem *subsys =
		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);
}

@@ -2461,12 +2461,8 @@ static int nvme_init_subsystem(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
	subsys = kzalloc(sizeof(*subsys), GFP_KERNEL);
	if (!subsys)
		return -ENOMEM;
	ret = ida_simple_get(&nvme_subsystems_ida, 0, 0, GFP_KERNEL);
	if (ret < 0) {
		kfree(subsys);
		return ret;
	}
	subsys->instance = ret;

	subsys->instance = -1;
	mutex_init(&subsys->lock);
	kref_init(&subsys->ref);
	INIT_LIST_HEAD(&subsys->ctrls);
@@ -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.release = nvme_release_subsystem;
	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);

	mutex_lock(&nvme_subsystems_lock);
@@ -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);
	}

	if (!found)
		subsys->instance = ctrl->instance;
	ctrl->subsys = subsys;
	mutex_unlock(&nvme_subsystems_lock);

@@ -3840,7 +3838,9 @@ static void nvme_free_ctrl(struct device *dev)
		container_of(dev, struct nvme_ctrl, ctrl_device);
	struct nvme_subsystem *subsys = ctrl->subsys;

	if (!subsys || ctrl->instance != subsys->instance)
		ida_simple_remove(&nvme_instance_ida, ctrl->instance);

	kfree(ctrl->effects);
	nvme_mpath_uninit(ctrl);
	__free_page(ctrl->discard_page);
@@ -4102,7 +4102,6 @@ int __init nvme_core_init(void)

void nvme_core_exit(void)
{
	ida_destroy(&nvme_subsystems_ida);
	class_destroy(nvme_subsys_class);
	class_destroy(nvme_class);
	unregister_chrdev_region(nvme_chr_devt, NVME_MINORS);