[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