8ff596f2d3
(generated with debian/scripts/import-upstream-tag) Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
77 lines
3.2 KiB
Diff
77 lines
3.2 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Christoph Hellwig <hch@lst.de>
|
|
Date: Thu, 13 Jul 2023 15:30:42 +0200
|
|
Subject: [PATCH] nvme: don't reject probe due to duplicate IDs for
|
|
single-ported PCIe devices
|
|
|
|
While duplicate IDs are still very harmful, including the potential to easily
|
|
see changing devices in /dev/disk/by-id, it turn out they are extremely
|
|
common for cheap end user NVMe devices.
|
|
|
|
Relax our check for them for so that it doesn't reject the probe on
|
|
single-ported PCIe devices, but prints a big warning instead. In doubt
|
|
we'd still like to see quirk entries to disable the potential for
|
|
changing supposed stable device identifier links, but this will at least
|
|
allow users how have two (or more) of these devices to use them without
|
|
having to manually add a new PCI ID entry with the quirk through sysfs or
|
|
by patching the kernel.
|
|
|
|
Fixes: 2079f41ec6ff ("nvme: check that EUI/GUID/UUID are globally unique")
|
|
Cc: stable@vger.kernel.org # 6.0+
|
|
Co-developed-by: Sagi Grimberg <sagi@grimberg.me>
|
|
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
|
Signed-off-by: Keith Busch <kbusch@kernel.org>
|
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|
---
|
|
drivers/nvme/host/core.c | 36 +++++++++++++++++++++++++++++++++---
|
|
1 file changed, 33 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
|
|
index e2618d2b57bf..56d13d9e08ed 100644
|
|
--- a/drivers/nvme/host/core.c
|
|
+++ b/drivers/nvme/host/core.c
|
|
@@ -4165,10 +4165,40 @@ static int nvme_init_ns_head(struct nvme_ns *ns, struct nvme_ns_info *info)
|
|
|
|
ret = nvme_global_check_duplicate_ids(ctrl->subsys, &info->ids);
|
|
if (ret) {
|
|
- dev_err(ctrl->device,
|
|
- "globally duplicate IDs for nsid %d\n", info->nsid);
|
|
+ /*
|
|
+ * We've found two different namespaces on two different
|
|
+ * subsystems that report the same ID. This is pretty nasty
|
|
+ * for anything that actually requires unique device
|
|
+ * identification. In the kernel we need this for multipathing,
|
|
+ * and in user space the /dev/disk/by-id/ links rely on it.
|
|
+ *
|
|
+ * If the device also claims to be multi-path capable back off
|
|
+ * here now and refuse the probe the second device as this is a
|
|
+ * recipe for data corruption. If not this is probably a
|
|
+ * cheap consumer device if on the PCIe bus, so let the user
|
|
+ * proceed and use the shiny toy, but warn that with changing
|
|
+ * probing order (which due to our async probing could just be
|
|
+ * device taking longer to startup) the other device could show
|
|
+ * up at any time.
|
|
+ */
|
|
nvme_print_device_info(ctrl);
|
|
- return ret;
|
|
+ if ((ns->ctrl->ops->flags & NVME_F_FABRICS) || /* !PCIe */
|
|
+ ((ns->ctrl->subsys->cmic & NVME_CTRL_CMIC_MULTI_CTRL) &&
|
|
+ info->is_shared)) {
|
|
+ dev_err(ctrl->device,
|
|
+ "ignoring nsid %d because of duplicate IDs\n",
|
|
+ info->nsid);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ dev_err(ctrl->device,
|
|
+ "clearing duplicate IDs for nsid %d\n", info->nsid);
|
|
+ dev_err(ctrl->device,
|
|
+ "use of /dev/disk/by-id/ may cause data corruption\n");
|
|
+ memset(&info->ids.nguid, 0, sizeof(info->ids.nguid));
|
|
+ memset(&info->ids.uuid, 0, sizeof(info->ids.uuid));
|
|
+ memset(&info->ids.eui64, 0, sizeof(info->ids.eui64));
|
|
+ ctrl->quirks |= NVME_QUIRK_BOGUS_NID;
|
|
}
|
|
|
|
mutex_lock(&ctrl->subsys->lock);
|