[PATCH] nvme-core: check id->mc before setting NVME_NS_METADATA_SUPPORTED

irvin cote irvincoteg at gmail.com
Fri Jun 30 10:41:27 PDT 2023


>The MC field is primarily for use when sending a format command to know
>what are valid possibilities. If the reported MS and FLBAS are out of
>sync with metadata capabilities, then the controller is broken.

Beware having MC and FLBAS out of sync does not necessarily mean we
have a broken controller :
MC could be 0 (no metadata support at all) and FLBAS has no way to
express that, it can only indicate which metadata type was selected by
the user.
In such a case we could wrongfully signal metadata as supported when it is not

On Tue, 27 Jun 2023 at 18:02, Max Gurtovoy <mgurtovoy at nvidia.com> wrote:
>
>
>
> On 24/06/2023 13:35, Irvin Cote wrote:
> > The NVM Command set Identify Namespace Data Structure defines
> > the metadata capabilities field (mc) that determines support for
> > metadata. Check for the value of this field before enabling the
> > NVME_NS_METADATA_SUPPORTED in the nvme_ns data structure.
> >
> > Signed-off-by: Irvin Cote <irvincoteg at gmail.com>
> > ---
> >   drivers/nvme/host/core.c | 5 +++--
> >   1 file changed, 3 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
> > index 3ec38e2b9173..465206b5cf6f 100644
> > --- a/drivers/nvme/host/core.c
> > +++ b/drivers/nvme/host/core.c
> > @@ -1841,7 +1841,8 @@ static void nvme_configure_metadata(struct nvme_ns *ns, struct nvme_id_ns *id)
> >                * Note, this check will need to be modified if any drivers
> >                * gain the ability to use other metadata formats.
> >                */
> > -             if (ctrl->max_integrity_segments && nvme_ns_has_pi(ns))
> > +             if (ctrl->max_integrity_segments && nvme_ns_has_pi(ns)
> > +                             && (id->mc & NVME_MC_EXTENDED_LBA))
> >                       ns->features |= NVME_NS_METADATA_SUPPORTED;
>
> this probably should go into the WARN_ON_ONCE above since it violate the
> spec.
>
> >       } else {
> >               /*
> > @@ -1852,7 +1853,7 @@ static void nvme_configure_metadata(struct nvme_ns *ns, struct nvme_id_ns *id)
> >                */
> >               if (id->flbas & NVME_NS_FLBAS_META_EXT)
> >                       ns->features |= NVME_NS_EXT_LBAS;
>
> we can check the NVME_MC_EXTENDED_LBA here and WARN_ON_ONCE if there is
> a spec violation.
>
> > -             else
> > +             else if (id->mc & NVME_MC_METADATA_PTR)
> >                       ns->features |= NVME_NS_METADATA_SUPPORTED;
>
> same here.
>
> >       }
> >   }



More information about the Linux-nvme mailing list