* quirk broken namespace identifiers
@ 2022-04-12 6:11 Christoph Hellwig
2022-04-12 6:11 ` [PATCH 1/3] nvme: add a quirk to disable " Christoph Hellwig
` (2 more replies)
0 siblings, 3 replies; 15+ messages in thread
From: Christoph Hellwig @ 2022-04-12 6:11 UTC (permalink / raw)
To: Keith Busch, Sagi Grimberg; +Cc: Luis Chamberlain, Klaus Jensen, linux-nvme
Hi all,
this series adds a quirk to ignore namespace identifiers on controllers
where they are completely broken and then quirks two controllers for it.
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 1/3] nvme: add a quirk to disable namespace identifiers
2022-04-12 6:11 quirk broken namespace identifiers Christoph Hellwig
@ 2022-04-12 6:11 ` Christoph Hellwig
2022-04-12 6:56 ` Chaitanya Kulkarni
` (2 more replies)
2022-04-12 6:11 ` [PATCH 2/3] nvme-pci: disable namespace identifiers for the MAXIO MAP1202 Christoph Hellwig
2022-04-12 6:11 ` [PATCH 3/3] nvme-pci: disable namespace identifiers for Qemu controllers Christoph Hellwig
2 siblings, 3 replies; 15+ messages in thread
From: Christoph Hellwig @ 2022-04-12 6:11 UTC (permalink / raw)
To: Keith Busch, Sagi Grimberg; +Cc: Luis Chamberlain, Klaus Jensen, linux-nvme
Add a quirk to disable using and exporting namespace identifiers for
controllers where they are broken beyond repair.
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
drivers/nvme/host/core.c | 24 ++++++++++++++++++------
drivers/nvme/host/nvme.h | 5 +++++
2 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index efb85c6d8e2d5..41314dccb2209 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -1282,6 +1282,8 @@ static int nvme_process_ns_desc(struct nvme_ctrl *ctrl, struct nvme_ns_ids *ids,
switch (cur->nidt) {
case NVME_NIDT_EUI64:
+ if (ctrl->quirks & NVME_QUIRK_BOGUS_NID)
+ return NVME_NIDT_EUI64_LEN;
if (cur->nidl != NVME_NIDT_EUI64_LEN) {
dev_warn(ctrl->device, "%s %d for NVME_NIDT_EUI64\n",
warn_str, cur->nidl);
@@ -1290,6 +1292,8 @@ static int nvme_process_ns_desc(struct nvme_ctrl *ctrl, struct nvme_ns_ids *ids,
memcpy(ids->eui64, data + sizeof(*cur), NVME_NIDT_EUI64_LEN);
return NVME_NIDT_EUI64_LEN;
case NVME_NIDT_NGUID:
+ if (ctrl->quirks & NVME_QUIRK_BOGUS_NID)
+ return NVME_NIDT_NGUID_LEN;
if (cur->nidl != NVME_NIDT_NGUID_LEN) {
dev_warn(ctrl->device, "%s %d for NVME_NIDT_NGUID\n",
warn_str, cur->nidl);
@@ -1298,6 +1302,8 @@ static int nvme_process_ns_desc(struct nvme_ctrl *ctrl, struct nvme_ns_ids *ids,
memcpy(ids->nguid, data + sizeof(*cur), NVME_NIDT_NGUID_LEN);
return NVME_NIDT_NGUID_LEN;
case NVME_NIDT_UUID:
+ if (ctrl->quirks & NVME_QUIRK_BOGUS_NID)
+ return NVME_NIDT_UUID_LEN;
if (cur->nidl != NVME_NIDT_UUID_LEN) {
dev_warn(ctrl->device, "%s %d for NVME_NIDT_UUID\n",
warn_str, cur->nidl);
@@ -1399,12 +1405,18 @@ static int nvme_identify_ns(struct nvme_ctrl *ctrl, unsigned nsid,
if ((*id)->ncap == 0) /* namespace not allocated or attached */
goto out_free_id;
- if (ctrl->vs >= NVME_VS(1, 1, 0) &&
- !memchr_inv(ids->eui64, 0, sizeof(ids->eui64)))
- memcpy(ids->eui64, (*id)->eui64, sizeof(ids->eui64));
- if (ctrl->vs >= NVME_VS(1, 2, 0) &&
- !memchr_inv(ids->nguid, 0, sizeof(ids->nguid)))
- memcpy(ids->nguid, (*id)->nguid, sizeof(ids->nguid));
+
+ if (ctrl->quirks & NVME_QUIRK_BOGUS_NID) {
+ dev_info(ctrl->device,
+ "Ignoring bogus Namespace Identifiers\n");
+ } else {
+ if (ctrl->vs >= NVME_VS(1, 1, 0) &&
+ !memchr_inv(ids->eui64, 0, sizeof(ids->eui64)))
+ memcpy(ids->eui64, (*id)->eui64, sizeof(ids->eui64));
+ if (ctrl->vs >= NVME_VS(1, 2, 0) &&
+ !memchr_inv(ids->nguid, 0, sizeof(ids->nguid)))
+ memcpy(ids->nguid, (*id)->nguid, sizeof(ids->nguid));
+ }
return 0;
diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h
index 1393bbf82d71e..a2b53ca633359 100644
--- a/drivers/nvme/host/nvme.h
+++ b/drivers/nvme/host/nvme.h
@@ -144,6 +144,11 @@ enum nvme_quirks {
* encoding the generation sequence number.
*/
NVME_QUIRK_SKIP_CID_GEN = (1 << 17),
+
+ /*
+ * Reports garbage in the namespace identifiers (eui64, nguid, uuid).
+ */
+ NVME_QUIRK_BOGUS_NID = (1 << 18),
};
/*
--
2.30.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 2/3] nvme-pci: disable namespace identifiers for the MAXIO MAP1202
2022-04-12 6:11 quirk broken namespace identifiers Christoph Hellwig
2022-04-12 6:11 ` [PATCH 1/3] nvme: add a quirk to disable " Christoph Hellwig
@ 2022-04-12 6:11 ` Christoph Hellwig
2022-04-12 6:57 ` Chaitanya Kulkarni
2022-04-12 10:25 ` Sagi Grimberg
2022-04-12 6:11 ` [PATCH 3/3] nvme-pci: disable namespace identifiers for Qemu controllers Christoph Hellwig
2 siblings, 2 replies; 15+ messages in thread
From: Christoph Hellwig @ 2022-04-12 6:11 UTC (permalink / raw)
To: Keith Busch, Sagi Grimberg
Cc: Luis Chamberlain, Klaus Jensen, linux-nvme, 金韬
The MAXIO MAP1202 controllers reports completely bogus Namespace
identifiers that even change after suspend cycles. Disable using
the Identifiers entirely.
Reported-by: 金韬 <me@kingtous.cn>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Tested-by: 金韬 <me@kingtous.cn>
---
drivers/nvme/host/pci.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
index d817ca17463ed..c386c91483505 100644
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
@@ -3447,6 +3447,8 @@ static const struct pci_device_id nvme_id_table[] = {
.driver_data = NVME_QUIRK_NO_DEEPEST_PS, },
{ PCI_DEVICE(0x2646, 0x2263), /* KINGSTON A2000 NVMe SSD */
.driver_data = NVME_QUIRK_NO_DEEPEST_PS, },
+ { PCI_DEVICE(0x1e4B, 0x1202), /* MAXIO MAP1202 */
+ .driver_data = NVME_QUIRK_BOGUS_NID, },
{ PCI_DEVICE(PCI_VENDOR_ID_AMAZON, 0x0061),
.driver_data = NVME_QUIRK_DMA_ADDRESS_BITS_48, },
{ PCI_DEVICE(PCI_VENDOR_ID_AMAZON, 0x0065),
--
2.30.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 3/3] nvme-pci: disable namespace identifiers for Qemu controllers
2022-04-12 6:11 quirk broken namespace identifiers Christoph Hellwig
2022-04-12 6:11 ` [PATCH 1/3] nvme: add a quirk to disable " Christoph Hellwig
2022-04-12 6:11 ` [PATCH 2/3] nvme-pci: disable namespace identifiers for the MAXIO MAP1202 Christoph Hellwig
@ 2022-04-12 6:11 ` Christoph Hellwig
2022-04-12 6:33 ` Klaus Jensen
2022-04-12 10:25 ` Sagi Grimberg
2 siblings, 2 replies; 15+ messages in thread
From: Christoph Hellwig @ 2022-04-12 6:11 UTC (permalink / raw)
To: Keith Busch, Sagi Grimberg; +Cc: Luis Chamberlain, Klaus Jensen, linux-nvme
Qemu unconditionally reports a UUID, which depending on the qemu version
is either all-null (which is incorrect but harmless) or contains a single
bit set for all controllers. In addition it can also optionally report
a eui64 which needs to be manually set. Disable namespace identifiers
for Qemu controlles entirely even if in some cases they could be set
corretly through manual intervention.
Reported-by: Luis Chamberlain <mcgrof@kernel.org>
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
drivers/nvme/host/pci.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
index c386c91483505..b191e7dcf15ca 100644
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
@@ -3410,6 +3410,8 @@ static const struct pci_device_id nvme_id_table[] = {
{ PCI_VDEVICE(INTEL, 0x5845), /* Qemu emulated controller */
.driver_data = NVME_QUIRK_IDENTIFY_CNS |
NVME_QUIRK_DISABLE_WRITE_ZEROES, },
+ { PCI_VDEVICE(REDHAT, 0x0010), /* Qemu emulated controller */
+ .driver_data = NVME_QUIRK_BOGUS_NID, },
{ PCI_DEVICE(0x126f, 0x2263), /* Silicon Motion unidentified */
.driver_data = NVME_QUIRK_NO_NS_DESC_LIST, },
{ PCI_DEVICE(0x1bb1, 0x0100), /* Seagate Nytro Flash Storage */
--
2.30.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 3/3] nvme-pci: disable namespace identifiers for Qemu controllers
2022-04-12 6:11 ` [PATCH 3/3] nvme-pci: disable namespace identifiers for Qemu controllers Christoph Hellwig
@ 2022-04-12 6:33 ` Klaus Jensen
2022-04-12 11:45 ` Christoph Hellwig
2022-04-12 10:25 ` Sagi Grimberg
1 sibling, 1 reply; 15+ messages in thread
From: Klaus Jensen @ 2022-04-12 6:33 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Keith Busch, Sagi Grimberg, Luis Chamberlain, linux-nvme
[-- Attachment #1: Type: text/plain, Size: 1542 bytes --]
On Apr 12 08:11, Christoph Hellwig wrote:
> Qemu unconditionally reports a UUID, which depending on the qemu version
> is either all-null (which is incorrect but harmless) or contains a single
> bit set for all controllers. In addition it can also optionally report
> a eui64 which needs to be manually set. Disable namespace identifiers
> for Qemu controlles entirely even if in some cases they could be set
> corretly through manual intervention.
>
> Reported-by: Luis Chamberlain <mcgrof@kernel.org>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
> drivers/nvme/host/pci.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
> index c386c91483505..b191e7dcf15ca 100644
> --- a/drivers/nvme/host/pci.c
> +++ b/drivers/nvme/host/pci.c
> @@ -3410,6 +3410,8 @@ static const struct pci_device_id nvme_id_table[] = {
> { PCI_VDEVICE(INTEL, 0x5845), /* Qemu emulated controller */
> .driver_data = NVME_QUIRK_IDENTIFY_CNS |
> NVME_QUIRK_DISABLE_WRITE_ZEROES, },
> + { PCI_VDEVICE(REDHAT, 0x0010), /* Qemu emulated controller */
> + .driver_data = NVME_QUIRK_BOGUS_NID, },
> { PCI_DEVICE(0x126f, 0x2263), /* Silicon Motion unidentified */
> .driver_data = NVME_QUIRK_NO_NS_DESC_LIST, },
> { PCI_DEVICE(0x1bb1, 0x0100), /* Seagate Nytro Flash Storage */
> --
> 2.30.2
>
When I fix this in QEMU properly, can we move this quirk to the
core_quirks and match on firmware revision? That way I don't have to
request a new DID.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/3] nvme: add a quirk to disable namespace identifiers
2022-04-12 6:11 ` [PATCH 1/3] nvme: add a quirk to disable " Christoph Hellwig
@ 2022-04-12 6:56 ` Chaitanya Kulkarni
2022-04-12 7:01 ` Christoph Hellwig
2022-04-12 10:25 ` Sagi Grimberg
2022-04-12 14:16 ` Keith Busch
2 siblings, 1 reply; 15+ messages in thread
From: Chaitanya Kulkarni @ 2022-04-12 6:56 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Luis Chamberlain, Sagi Grimberg, Keith Busch, Klaus Jensen,
linux-nvme@lists.infradead.org
On 4/11/22 23:11, Christoph Hellwig wrote:
> Add a quirk to disable using and exporting namespace identifiers for
> controllers where they are broken beyond repair.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
if possible take that quirk check out see [1] it is but more
code but look much clean, either way looks good.
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
-ck
[1] totally untested :-
+static int nvme_id_check_quirk(u64 nidt)
+{
+ switch (cur->nidt) {
+ case NVME_NIDT_EUI64:
+ if (ctrl->quirks & NVME_QUIRK_BOGUS_NID)
+ return NVME_NIDT_EUI64_LEN;
+ return 0;
+ case NVME_NIDT_NGUID:
+ if (ctrl->quirks & NVME_QUIRK_BOGUS_NID)
+ return NVME_NIDT_NGUID_LEN;
+ return 0;
+ case NVME_NIDT_UUID:
+ if (ctrl->quirks & NVME_QUIRK_BOGUS_NID)
+ return NVME_NIDT_UUID_LEN;
+ return 0;
+ default:
+ return 0;
+ }
+}
+
static int nvme_process_ns_desc(struct nvme_ctrl *ctrl, struct
nvme_ns_ids *ids,
struct nvme_ns_id_desc *cur, bool *csi_seen)
{
const char *warn_str = "ctrl returned bogus length:";
void *data = cur;
+ int ret;
+
+ ret = nvme_id_check_quirk(cur->nidt);
+ if (ret)
+ return ret;
switch (cur->nidt) {
case NVME_NIDT_EUI64:
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/3] nvme-pci: disable namespace identifiers for the MAXIO MAP1202
2022-04-12 6:11 ` [PATCH 2/3] nvme-pci: disable namespace identifiers for the MAXIO MAP1202 Christoph Hellwig
@ 2022-04-12 6:57 ` Chaitanya Kulkarni
2022-04-12 10:25 ` Sagi Grimberg
1 sibling, 0 replies; 15+ messages in thread
From: Chaitanya Kulkarni @ 2022-04-12 6:57 UTC (permalink / raw)
To: Christoph Hellwig, Keith Busch, Sagi Grimberg
Cc: Luis Chamberlain, Klaus Jensen, linux-nvme@lists.infradead.org,
金韬
On 4/11/22 23:11, Christoph Hellwig wrote:
> The MAXIO MAP1202 controllers reports completely bogus Namespace
> identifiers that even change after suspend cycles. Disable using
> the Identifiers entirely.
>
> Reported-by: 金韬 <me@kingtous.cn>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> Tested-by: 金韬 <me@kingtous.cn>
Looks good.
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
-ck
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/3] nvme: add a quirk to disable namespace identifiers
2022-04-12 6:56 ` Chaitanya Kulkarni
@ 2022-04-12 7:01 ` Christoph Hellwig
0 siblings, 0 replies; 15+ messages in thread
From: Christoph Hellwig @ 2022-04-12 7:01 UTC (permalink / raw)
To: Chaitanya Kulkarni
Cc: Christoph Hellwig, Luis Chamberlain, Sagi Grimberg, Keith Busch,
Klaus Jensen, linux-nvme@lists.infradead.org
On Tue, Apr 12, 2022 at 06:56:07AM +0000, Chaitanya Kulkarni wrote:
> + ret = nvme_id_check_quirk(cur->nidt);
> + if (ret)
> + return ret;
We still need to process the list to find the CSI. This is actually
relevant for modern qemu, which supports multiple command sets.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/3] nvme: add a quirk to disable namespace identifiers
2022-04-12 6:11 ` [PATCH 1/3] nvme: add a quirk to disable " Christoph Hellwig
2022-04-12 6:56 ` Chaitanya Kulkarni
@ 2022-04-12 10:25 ` Sagi Grimberg
2022-04-12 14:16 ` Keith Busch
2 siblings, 0 replies; 15+ messages in thread
From: Sagi Grimberg @ 2022-04-12 10:25 UTC (permalink / raw)
To: Christoph Hellwig, Keith Busch; +Cc: Luis Chamberlain, Klaus Jensen, linux-nvme
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/3] nvme-pci: disable namespace identifiers for the MAXIO MAP1202
2022-04-12 6:11 ` [PATCH 2/3] nvme-pci: disable namespace identifiers for the MAXIO MAP1202 Christoph Hellwig
2022-04-12 6:57 ` Chaitanya Kulkarni
@ 2022-04-12 10:25 ` Sagi Grimberg
1 sibling, 0 replies; 15+ messages in thread
From: Sagi Grimberg @ 2022-04-12 10:25 UTC (permalink / raw)
To: Christoph Hellwig, Keith Busch
Cc: Luis Chamberlain, Klaus Jensen, linux-nvme, 金韬
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3/3] nvme-pci: disable namespace identifiers for Qemu controllers
2022-04-12 6:11 ` [PATCH 3/3] nvme-pci: disable namespace identifiers for Qemu controllers Christoph Hellwig
2022-04-12 6:33 ` Klaus Jensen
@ 2022-04-12 10:25 ` Sagi Grimberg
1 sibling, 0 replies; 15+ messages in thread
From: Sagi Grimberg @ 2022-04-12 10:25 UTC (permalink / raw)
To: Christoph Hellwig, Keith Busch; +Cc: Luis Chamberlain, Klaus Jensen, linux-nvme
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3/3] nvme-pci: disable namespace identifiers for Qemu controllers
2022-04-12 6:33 ` Klaus Jensen
@ 2022-04-12 11:45 ` Christoph Hellwig
2022-04-12 20:43 ` Klaus Jensen
0 siblings, 1 reply; 15+ messages in thread
From: Christoph Hellwig @ 2022-04-12 11:45 UTC (permalink / raw)
To: Klaus Jensen
Cc: Christoph Hellwig, Keith Busch, Sagi Grimberg, Luis Chamberlain,
linux-nvme
On Tue, Apr 12, 2022 at 08:33:38AM +0200, Klaus Jensen wrote:
> > + { PCI_VDEVICE(REDHAT, 0x0010), /* Qemu emulated controller */
> > + .driver_data = NVME_QUIRK_BOGUS_NID, },
> > { PCI_DEVICE(0x126f, 0x2263), /* Silicon Motion unidentified */
> > .driver_data = NVME_QUIRK_NO_NS_DESC_LIST, },
> > { PCI_DEVICE(0x1bb1, 0x0100), /* Seagate Nytro Flash Storage */
> > --
> > 2.30.2
> >
>
> When I fix this in QEMU properly, can we move this quirk to the
> core_quirks and match on firmware revision? That way I don't have to
> request a new DID.
Do we known that only one firmware revision reported by Qemu is actually
broken? For now I'd like to get the regression fixed ASAP, and I don't
think Qemu ever fully got identifiers right so far. We can always
change it later if needed.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/3] nvme: add a quirk to disable namespace identifiers
2022-04-12 6:11 ` [PATCH 1/3] nvme: add a quirk to disable " Christoph Hellwig
2022-04-12 6:56 ` Chaitanya Kulkarni
2022-04-12 10:25 ` Sagi Grimberg
@ 2022-04-12 14:16 ` Keith Busch
2 siblings, 0 replies; 15+ messages in thread
From: Keith Busch @ 2022-04-12 14:16 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Sagi Grimberg, Luis Chamberlain, Klaus Jensen, linux-nvme
On Tue, Apr 12, 2022 at 08:11:24AM +0200, Christoph Hellwig wrote:
> @@ -1282,6 +1282,8 @@ static int nvme_process_ns_desc(struct nvme_ctrl *ctrl, struct nvme_ns_ids *ids,
>
> switch (cur->nidt) {
> case NVME_NIDT_EUI64:
> + if (ctrl->quirks & NVME_QUIRK_BOGUS_NID)
> + return NVME_NIDT_EUI64_LEN;
> if (cur->nidl != NVME_NIDT_EUI64_LEN) {
> dev_warn(ctrl->device, "%s %d for NVME_NIDT_EUI64\n",
> warn_str, cur->nidl);
Shouldn't we still verify that cur->nidl is accurate rather than assume the
length? If it is the wrong length, then we have a corrupt descriptor list and
should abort the process.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3/3] nvme-pci: disable namespace identifiers for Qemu controllers
2022-04-12 11:45 ` Christoph Hellwig
@ 2022-04-12 20:43 ` Klaus Jensen
0 siblings, 0 replies; 15+ messages in thread
From: Klaus Jensen @ 2022-04-12 20:43 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Keith Busch, Sagi Grimberg, Luis Chamberlain, linux-nvme
[-- Attachment #1: Type: text/plain, Size: 1095 bytes --]
On Apr 12 13:45, Christoph Hellwig wrote:
> On Tue, Apr 12, 2022 at 08:33:38AM +0200, Klaus Jensen wrote:
> > > + { PCI_VDEVICE(REDHAT, 0x0010), /* Qemu emulated controller */
> > > + .driver_data = NVME_QUIRK_BOGUS_NID, },
> > > { PCI_DEVICE(0x126f, 0x2263), /* Silicon Motion unidentified */
> > > .driver_data = NVME_QUIRK_NO_NS_DESC_LIST, },
> > > { PCI_DEVICE(0x1bb1, 0x0100), /* Seagate Nytro Flash Storage */
> > > --
> > > 2.30.2
> > >
> >
> > When I fix this in QEMU properly, can we move this quirk to the
> > core_quirks and match on firmware revision? That way I don't have to
> > request a new DID.
>
> Do we known that only one firmware revision reported by Qemu is actually
> broken? For now I'd like to get the regression fixed ASAP, and I don't
> think Qemu ever fully got identifiers right so far. We can always
> change it later if needed.
>
To my knowledge, QEMU has only ever used 1.0 in FR, but I will check.
In any case, I did not want you to change this *now*, so I am totally
fine with this getting changed later if required.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 1/3] nvme: add a quirk to disable namespace identifiers
2022-04-13 4:49 quirk broken namespace identifiers v2 Christoph Hellwig
@ 2022-04-13 4:49 ` Christoph Hellwig
0 siblings, 0 replies; 15+ messages in thread
From: Christoph Hellwig @ 2022-04-13 4:49 UTC (permalink / raw)
To: Keith Busch, Sagi Grimberg
Cc: Luis Chamberlain, Klaus Jensen, linux-nvme, Chaitanya Kulkarni
Add a quirk to disable using and exporting namespace identifiers for
controllers where they are broken beyond repair.
The most directly visible problem with non-unique namespace identifiers
is that they break the /dev/disk/by-id/ links, with the link for a
supposedly unique identifier now pointing to one of multiple possible
namespaces that share the same ID, and a somewhat random selection of
which one actually shows up.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
---
drivers/nvme/host/core.c | 24 ++++++++++++++++++------
drivers/nvme/host/nvme.h | 5 +++++
2 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index be9fc9818e650..e1846d04817f3 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -1288,6 +1288,8 @@ static int nvme_process_ns_desc(struct nvme_ctrl *ctrl, struct nvme_ns_ids *ids,
warn_str, cur->nidl);
return -1;
}
+ if (ctrl->quirks & NVME_QUIRK_BOGUS_NID)
+ return NVME_NIDT_EUI64_LEN;
memcpy(ids->eui64, data + sizeof(*cur), NVME_NIDT_EUI64_LEN);
return NVME_NIDT_EUI64_LEN;
case NVME_NIDT_NGUID:
@@ -1296,6 +1298,8 @@ static int nvme_process_ns_desc(struct nvme_ctrl *ctrl, struct nvme_ns_ids *ids,
warn_str, cur->nidl);
return -1;
}
+ if (ctrl->quirks & NVME_QUIRK_BOGUS_NID)
+ return NVME_NIDT_NGUID_LEN;
memcpy(ids->nguid, data + sizeof(*cur), NVME_NIDT_NGUID_LEN);
return NVME_NIDT_NGUID_LEN;
case NVME_NIDT_UUID:
@@ -1304,6 +1308,8 @@ static int nvme_process_ns_desc(struct nvme_ctrl *ctrl, struct nvme_ns_ids *ids,
warn_str, cur->nidl);
return -1;
}
+ if (ctrl->quirks & NVME_QUIRK_BOGUS_NID)
+ return NVME_NIDT_UUID_LEN;
uuid_copy(&ids->uuid, data + sizeof(*cur));
return NVME_NIDT_UUID_LEN;
case NVME_NIDT_CSI:
@@ -1400,12 +1406,18 @@ static int nvme_identify_ns(struct nvme_ctrl *ctrl, unsigned nsid,
if ((*id)->ncap == 0) /* namespace not allocated or attached */
goto out_free_id;
- if (ctrl->vs >= NVME_VS(1, 1, 0) &&
- !memchr_inv(ids->eui64, 0, sizeof(ids->eui64)))
- memcpy(ids->eui64, (*id)->eui64, sizeof(ids->eui64));
- if (ctrl->vs >= NVME_VS(1, 2, 0) &&
- !memchr_inv(ids->nguid, 0, sizeof(ids->nguid)))
- memcpy(ids->nguid, (*id)->nguid, sizeof(ids->nguid));
+
+ if (ctrl->quirks & NVME_QUIRK_BOGUS_NID) {
+ dev_info(ctrl->device,
+ "Ignoring bogus Namespace Identifiers\n");
+ } else {
+ if (ctrl->vs >= NVME_VS(1, 1, 0) &&
+ !memchr_inv(ids->eui64, 0, sizeof(ids->eui64)))
+ memcpy(ids->eui64, (*id)->eui64, sizeof(ids->eui64));
+ if (ctrl->vs >= NVME_VS(1, 2, 0) &&
+ !memchr_inv(ids->nguid, 0, sizeof(ids->nguid)))
+ memcpy(ids->nguid, (*id)->nguid, sizeof(ids->nguid));
+ }
return 0;
diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h
index 1393bbf82d71e..a2b53ca633359 100644
--- a/drivers/nvme/host/nvme.h
+++ b/drivers/nvme/host/nvme.h
@@ -144,6 +144,11 @@ enum nvme_quirks {
* encoding the generation sequence number.
*/
NVME_QUIRK_SKIP_CID_GEN = (1 << 17),
+
+ /*
+ * Reports garbage in the namespace identifiers (eui64, nguid, uuid).
+ */
+ NVME_QUIRK_BOGUS_NID = (1 << 18),
};
/*
--
2.30.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
end of thread, other threads:[~2022-04-13 4:49 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-04-12 6:11 quirk broken namespace identifiers Christoph Hellwig
2022-04-12 6:11 ` [PATCH 1/3] nvme: add a quirk to disable " Christoph Hellwig
2022-04-12 6:56 ` Chaitanya Kulkarni
2022-04-12 7:01 ` Christoph Hellwig
2022-04-12 10:25 ` Sagi Grimberg
2022-04-12 14:16 ` Keith Busch
2022-04-12 6:11 ` [PATCH 2/3] nvme-pci: disable namespace identifiers for the MAXIO MAP1202 Christoph Hellwig
2022-04-12 6:57 ` Chaitanya Kulkarni
2022-04-12 10:25 ` Sagi Grimberg
2022-04-12 6:11 ` [PATCH 3/3] nvme-pci: disable namespace identifiers for Qemu controllers Christoph Hellwig
2022-04-12 6:33 ` Klaus Jensen
2022-04-12 11:45 ` Christoph Hellwig
2022-04-12 20:43 ` Klaus Jensen
2022-04-12 10:25 ` Sagi Grimberg
-- strict thread matches above, loose matches on Subject: below --
2022-04-13 4:49 quirk broken namespace identifiers v2 Christoph Hellwig
2022-04-13 4:49 ` [PATCH 1/3] nvme: add a quirk to disable namespace identifiers Christoph Hellwig
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox