[PATCH] nvme: allow to re-attach namespaces after all paths are down
Keith Busch
kbusch at kernel.org
Mon May 10 08:53:25 PDT 2021
On Mon, May 10, 2021 at 04:49:06PM +0200, Hannes Reinecke wrote:
> @@ -3605,16 +3608,26 @@ static int nvme_init_ns_head(struct nvme_ns *ns, unsigned nsid,
> head->shared = is_shared;
> } else {
> ret = -EINVAL;
> - if (!is_shared || !head->shared) {
> - dev_err(ctrl->device,
> - "Duplicate unshared namespace %d\n", nsid);
> - goto out_put_ns_head;
> - }
> - if (!nvme_ns_ids_equal(&head->ids, ids)) {
> - dev_err(ctrl->device,
> - "IDs don't match for shared namespace %d\n",
> + /*
> + * If multipath is enabled we might hit an ns head with no
> + * paths, but that doesn't indicate it's a shared namespace.
> + */
> + if (!nvme_ns_head_multipath(head) ||
> + !list_empty(&head->list)) {
> + if (!is_shared || !head->shared) {
> + dev_err(ctrl->device,
> + "Duplicate unshared namespace %d\n", nsid);
> + goto out_put_ns_head;
> + }
If not multipath, then it is not shared. The above will fail attaching
single-path namespaces to a known head.
The rest is similar to something I was working on too, though, so I
think it's the right direction.
> + if (!nvme_ns_ids_equal(&head->ids, ids)) {
> + dev_err(ctrl->device,
> + "IDs don't match for shared namespace %d\n",
> nsid);
> - goto out_put_ns_head;
> + goto out_put_ns_head;
> + }
> + } else {
> + /* But the ids might have changed, so reset them */
> + head->ids = *ids;
> }
> }
>
> @@ -3764,8 +3777,6 @@ static void nvme_ns_remove(struct nvme_ns *ns)
>
> mutex_lock(&ns->ctrl->subsys->lock);
> list_del_rcu(&ns->siblings);
> - if (list_empty(&ns->head->list))
> - list_del_init(&ns->head->entry);
> mutex_unlock(&ns->ctrl->subsys->lock);
>
> synchronize_rcu(); /* guarantee not available in head->list */
> --
> 2.26.2
More information about the Linux-nvme
mailing list