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

irvin cote irvincoteg at gmail.com
Sun Jul 2 07:02:27 PDT 2023


Apologies I understand now, no need to check MC if both FLBAS and MS
are checked,
Thanks

On Fri, 30 Jun 2023 at 19:41, irvin cote <irvincoteg at gmail.com> wrote:
>
> >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