[PATCH 3/3] nvme: check that EUI/GUID/UUID are globally unique
Keith Busch
kbusch at kernel.org
Thu Feb 24 07:43:04 PST 2022
On Thu, Feb 24, 2022 at 11:58:52AM +0100, Christoph Hellwig wrote:
> Add a check to verify that the unique identifiers are unique globally
> in addition to the existing check that verifies that they are unique
> inside a single subsystem.
>
> Signed-off-by: Christoph Hellwig <hch at lst.de>
> ---
> drivers/nvme/host/core.c | 32 ++++++++++++++++++++++++++++++--
> 1 file changed, 30 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
> index ac4749f257439..4f9623d9f7ed9 100644
> --- a/drivers/nvme/host/core.c
> +++ b/drivers/nvme/host/core.c
> @@ -3783,7 +3783,7 @@ static struct nvme_ns_head *nvme_alloc_ns_head(struct nvme_ctrl *ctrl,
> ret = nvme_subsys_check_duplicate_ids(ctrl->subsys, &head->ids);
> if (ret) {
> dev_err(ctrl->device,
> - "duplicate IDs for nsid %d\n", nsid);
> + "duplicate IDs in subsystem for nsid %d\n", nsid);
> goto out_cleanup_srcu;
> }
>
> @@ -3815,12 +3815,40 @@ static struct nvme_ns_head *nvme_alloc_ns_head(struct nvme_ctrl *ctrl,
> return ERR_PTR(ret);
> }
>
> +static int nvme_global_check_ids(struct nvme_subsystem *this,
> + struct nvme_ns_ids *ids)
> +{
> + struct nvme_subsystem *s;
> + int ret = 0;
> +
> + mutex_lock(&nvme_subsystems_lock);
> + list_for_each_entry(s, &nvme_subsystems, entry) {
> + if (s == this)
> + continue;
> + mutex_lock(&s->lock);
> + ret = nvme_subsys_check_duplicate_ids(s, ids);
> + mutex_unlock(&s->lock);
> + if (ret)
> + break;
> + }
> + mutex_unlock(&nvme_subsystems_lock);
> +
> + return ret;
> +}
> +
> static int nvme_init_ns_head(struct nvme_ns *ns, unsigned nsid,
> struct nvme_ns_ids *ids, bool is_shared)
> {
> struct nvme_ctrl *ctrl = ns->ctrl;
> struct nvme_ns_head *head = NULL;
> - int ret = 0;
> + int ret;
> +
> + ret = nvme_global_check_ids(ctrl->subsys, ids);
> + if (ret) {
> + dev_err(ctrl->device,
> + "globally duplicate IDs for nsid %d\n", nsid);
> + return ret;
> + }
It looks like a race condition exists here such that two namespaces with
duplicate IDs in different subsystems being concurrently added may not
see the duplicate.
More information about the Linux-nvme
mailing list