|
@@ -55,8 +55,9 @@ static void nvme_free_ns(struct kref *kref)
|
|
|
ns->disk->private_data = NULL;
|
|
|
spin_unlock(&dev_list_lock);
|
|
|
|
|
|
- nvme_put_ctrl(ns->ctrl);
|
|
|
put_disk(ns->disk);
|
|
|
+ ida_simple_remove(&ns->ctrl->ns_ida, ns->instance);
|
|
|
+ nvme_put_ctrl(ns->ctrl);
|
|
|
kfree(ns);
|
|
|
}
|
|
|
|
|
@@ -1118,9 +1119,13 @@ static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid)
|
|
|
if (!ns)
|
|
|
return;
|
|
|
|
|
|
+ ns->instance = ida_simple_get(&ctrl->ns_ida, 1, 0, GFP_KERNEL);
|
|
|
+ if (ns->instance < 0)
|
|
|
+ goto out_free_ns;
|
|
|
+
|
|
|
ns->queue = blk_mq_init_queue(ctrl->tagset);
|
|
|
if (IS_ERR(ns->queue))
|
|
|
- goto out_free_ns;
|
|
|
+ goto out_release_instance;
|
|
|
queue_flag_set_unlocked(QUEUE_FLAG_NONROT, ns->queue);
|
|
|
ns->queue->queuedata = ns;
|
|
|
ns->ctrl = ctrl;
|
|
@@ -1153,7 +1158,7 @@ static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid)
|
|
|
disk->queue = ns->queue;
|
|
|
disk->driverfs_dev = ctrl->device;
|
|
|
disk->flags = GENHD_FL_EXT_DEVT;
|
|
|
- sprintf(disk->disk_name, "nvme%dn%d", ctrl->instance, nsid);
|
|
|
+ sprintf(disk->disk_name, "nvme%dn%d", ctrl->instance, ns->instance);
|
|
|
|
|
|
if (nvme_revalidate_disk(ns->disk))
|
|
|
goto out_free_disk;
|
|
@@ -1173,6 +1178,8 @@ static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid)
|
|
|
kfree(disk);
|
|
|
out_free_queue:
|
|
|
blk_cleanup_queue(ns->queue);
|
|
|
+ out_release_instance:
|
|
|
+ ida_simple_remove(&ctrl->ns_ida, ns->instance);
|
|
|
out_free_ns:
|
|
|
kfree(ns);
|
|
|
}
|
|
@@ -1350,6 +1357,7 @@ static void nvme_free_ctrl(struct kref *kref)
|
|
|
|
|
|
put_device(ctrl->device);
|
|
|
nvme_release_instance(ctrl);
|
|
|
+ ida_destroy(&ctrl->ns_ida);
|
|
|
|
|
|
ctrl->ops->free_ctrl(ctrl);
|
|
|
}
|
|
@@ -1390,6 +1398,7 @@ int nvme_init_ctrl(struct nvme_ctrl *ctrl, struct device *dev,
|
|
|
}
|
|
|
get_device(ctrl->device);
|
|
|
dev_set_drvdata(ctrl->device, ctrl);
|
|
|
+ ida_init(&ctrl->ns_ida);
|
|
|
|
|
|
spin_lock(&dev_list_lock);
|
|
|
list_add_tail(&ctrl->node, &nvme_ctrl_list);
|