[PATCH 1/1] nvme/host: Rescan namespace if ns_id is changed

Hannes Reinecke hare at suse.de
Mon Nov 20 05:24:22 PST 2023


On 11/14/23 22:57, wenxiong at linux.ibm.com wrote:
> From: Wen Xiong <wenxiong at linux.ibm.com>
> 
> Hi all,
> 
> Namespace is not visible if we detach/delete/create/attach a namespace
> on a new nvme device because of nguid is changed.
> 
> Like Keith's suggestion, we can do the 2nd ns-attach to get new
> namespace available. Test team likes to fix it in the driver.
> 
> The following patch has been tested by test team and works fine.
> 
> Appreciate your suggestion for difference approach!
> 
> Thanks,
> Wendy
> 
> Signed-off-by: Wen Xiong <wenxiong at linux.ibm.com>
> Tested-by: tjo at us.ibm.com
> 
> ---
>   drivers/nvme/host/core.c | 23 ++++++++++++++++-------
>   1 file changed, 16 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
> index 88b54cdcbd68..a608a63d3108 100644
> --- a/drivers/nvme/host/core.c
> +++ b/drivers/nvme/host/core.c
> @@ -3721,13 +3721,15 @@ static void nvme_ns_remove_by_nsid(struct nvme_ctrl *ctrl, u32 nsid)
>   	}
>   }
>   
> -static void nvme_validate_ns(struct nvme_ns *ns, struct nvme_ns_info *info)
> +static bool nvme_validate_ns(struct nvme_ns *ns, struct nvme_ns_info *info)
>   {
>   	int ret = NVME_SC_INVALID_NS | NVME_SC_DNR;
> +	bool ns_id_changed = false;
>   
>   	if (!nvme_ns_ids_equal(&ns->head->ids, &info->ids)) {
>   		dev_err(ns->ctrl->device,
>   			"identifiers changed for nsid %d\n", ns->head->ns_id);
> +		ns_id_changed = true;
>   		goto out;
>   	}
>   
> @@ -3741,21 +3743,24 @@ static void nvme_validate_ns(struct nvme_ns *ns, struct nvme_ns_info *info)
>   	 */
>   	if (ret > 0 && (ret & NVME_SC_DNR))
>   		nvme_ns_remove(ns);
> +
> +	return ns_id_changed;
>   }
>   
> -static void nvme_scan_ns(struct nvme_ctrl *ctrl, unsigned nsid)
> +static bool nvme_scan_ns(struct nvme_ctrl *ctrl, unsigned nsid)
>   {
>   	struct nvme_ns_info info = { .nsid = nsid };
>   	struct nvme_ns *ns;
>   	int ret;
> +	bool ns_rescan = false;
>   
>   	if (nvme_identify_ns_descs(ctrl, &info))
> -		return;
> +		return false;
>   
>   	if (info.ids.csi != NVME_CSI_NVM && !nvme_multi_css(ctrl)) {
>   		dev_warn(ctrl->device,
>   			"command set not reported for nsid: %d\n", nsid);
> -		return;
> +		return false;
>   	}
>   
>   	/*
> @@ -3777,15 +3782,17 @@ static void nvme_scan_ns(struct nvme_ctrl *ctrl, unsigned nsid)
>   	 * becomes ready and restart the scan.
>   	 */
>   	if (ret || !info.is_ready)
> -		return;
> +		return false;
>   
>   	ns = nvme_find_get_ns(ctrl, nsid);
>   	if (ns) {
> -		nvme_validate_ns(ns, &info);
> +		ns_rescan = nvme_validate_ns(ns, &info);
>   		nvme_put_ns(ns);
>   	} else {
>   		nvme_alloc_ns(ctrl, &info);
>   	}
> +
> +	return ns_rescan;
>   }
>   
>   static void nvme_remove_invalid_namespaces(struct nvme_ctrl *ctrl,
> @@ -3837,7 +3844,9 @@ static int nvme_scan_ns_list(struct nvme_ctrl *ctrl)
>   
>   			if (!nsid)	/* end of the list? */
>   				goto out;
> -			nvme_scan_ns(ctrl, nsid);
> +			if (nvme_scan_ns(ctrl, nsid))
> +				nvme_scan_ns(ctrl, nsid);
> +
>   			while (++prev < nsid)
>   				nvme_ns_remove_by_nsid(ctrl, prev);
>   		}
No. If the namespace has changed we should abort scanning altogether, as 
there is no guarantee that the _previous_ namespaces in the list have 
not changed.
We should rather abort and wait for the NS changed AEN to be signalled, 
which will trigger a rescan anyway.

Cheers,

Hannes
-- 
Dr. Hannes Reinecke		           Kernel Storage Architect
hare at suse.de			                  +49 911 74053 688
SUSE Software Solutions Germany GmbH, Frankenstr. 146, 90461 Nürnberg
Managing Directors: I. Totev, A. Myers, A. McDonald, M. B. Moerman
(HRB 36809, AG Nürnberg)




More information about the Linux-nvme mailing list