|
@@ -2069,6 +2069,22 @@ static const struct attribute_group *nvme_subsys_attrs_groups[] = {
|
|
|
NULL,
|
|
|
};
|
|
|
|
|
|
+static int nvme_active_ctrls(struct nvme_subsystem *subsys)
|
|
|
+{
|
|
|
+ int count = 0;
|
|
|
+ struct nvme_ctrl *ctrl;
|
|
|
+
|
|
|
+ mutex_lock(&subsys->lock);
|
|
|
+ list_for_each_entry(ctrl, &subsys->ctrls, subsys_entry) {
|
|
|
+ if (ctrl->state != NVME_CTRL_DELETING &&
|
|
|
+ ctrl->state != NVME_CTRL_DEAD)
|
|
|
+ count++;
|
|
|
+ }
|
|
|
+ mutex_unlock(&subsys->lock);
|
|
|
+
|
|
|
+ return count;
|
|
|
+}
|
|
|
+
|
|
|
static int nvme_init_subsystem(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
|
|
|
{
|
|
|
struct nvme_subsystem *subsys, *found;
|
|
@@ -2107,7 +2123,7 @@ static int nvme_init_subsystem(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
|
|
|
* Verify that the subsystem actually supports multiple
|
|
|
* controllers, else bail out.
|
|
|
*/
|
|
|
- if (!(id->cmic & (1 << 1))) {
|
|
|
+ if (nvme_active_ctrls(found) && !(id->cmic & (1 << 1))) {
|
|
|
dev_err(ctrl->device,
|
|
|
"ignoring ctrl due to duplicate subnqn (%s).\n",
|
|
|
found->subnqn);
|