> On Wed, Sep 6, 2017 at 11:25 PM, Dan Williams <dan.j.willi...@intel.com> 
> wrote:
> > On Wed, Sep 6, 2017 at 11:21 PM, Yasunori Goto <y-g...@jp.fujitsu.com> 
> > wrote:
> >>> On Wed, Sep 6, 2017 at 10:08 PM, Yasunori Goto <y-g...@jp.fujitsu.com> 
> >>> wrote:
> >>> >
> >>> > Show dimm's name which has badblock by ndctl list command.
> >>> > This patch uses translate SPA interface to get bad dimm info.
> >>> >
> >>> > Signed-off-by: Yasunori Goto <y-g...@jp.fujitsu.com>
> >>> > ---
> >>> >  util/json.c | 37 +++++++++++++++++++++++++++++++++++++
> >>> >  1 file changed, 37 insertions(+)
> >>> >
> >>> > diff --git a/util/json.c b/util/json.c
> >>> > index 98165b7..639f0ff 100644
> >>> > --- a/util/json.c
> >>> > +++ b/util/json.c
> >>> > @@ -366,6 +366,15 @@ struct json_object 
> >>> > *util_daxctl_region_to_json(struct daxctl_region *region,
> >>> >         return NULL;
> >>> >  }
> >>> >
> >>> > +static struct ndctl_dimm *badblock_to_dimm(struct ndctl_region *region,
> >>> > +               unsigned long long spa)
> >>> > +{
> >>> > +       struct ndctl_bus *bus;
> >>> > +
> >>> > +       bus = ndctl_region_get_bus(region);
> >>> > +       return ndctl_bus_get_dimm_by_physical_address(bus, spa);
> >>> > +}
> >>> > +
> >>> >  struct json_object *util_region_badblocks_to_json(struct ndctl_region 
> >>> > *region,
> >>> >                 unsigned int *bb_count, unsigned long flags)
> >>> >  {
> >>> > @@ -381,6 +390,18 @@ struct json_object 
> >>> > *util_region_badblocks_to_json(struct ndctl_region *region,
> >>> >
> >>> >         ndctl_region_badblock_foreach(region, bb) {
> >>> >                 if (flags & UTIL_JSON_MEDIA_ERRORS) {
> >>> > +                       struct ndctl_dimm *dimm = NULL;
> >>> > +                       unsigned long long spa;
> >>> > +
> >>> > +                       /* get start address of region */
> >>> > +                       spa = ndctl_region_get_resource(region);
> >>> > +                       if (spa == ULONG_MAX)
> >>> > +                               goto err_array;
> >>> > +
> >>> > +                       /* get address of bad block */
> >>> > +                       spa += bb->offset << 9;
> >>> > +                       dimm = badblock_to_dimm(region, spa);
> >>>
> >>> Ok the libndctl pieces are looking good, but I have question about
> >>> this. We only return the first DIMM that has the error... what if the
> >>> length of the record causes us to span more than one dimm?
> >>>
> >>> > +
> >>> >                         jbb = json_object_new_object();
> >>> >                         if (!jbb)
> >>> >                                 goto err_array;
> >>> > @@ -395,6 +416,12 @@ struct json_object 
> >>> > *util_region_badblocks_to_json(struct ndctl_region *region,
> >>> >                                 goto err;
> >>> >                         json_object_object_add(jbb, "length", jobj);
> >>> >
> >>> > +                       if (dimm) {
> >>> > +                               jobj = 
> >>> > json_object_new_string(ndctl_dimm_get_devname(dimm));
> >>>
> >>> We probably need to make this an array of DIMMs and call badblock() to
> >>> DIMM for every 512 byte block in the range.
> >>
> >> Hmmmmm, Ok.
> >>
> >>
> >>>
> >>> > +                               if (!jobj)
> >>> > +                                       goto err;
> >>> > +                               json_object_object_add(jbb, "dimm", 
> >>> > jobj);
> >>> > +                       }
> >>> >                         json_object_array_add(jbbs, jbb);
> >>> >                 }
> >>> >
> >>> > @@ -436,6 +463,7 @@ static struct json_object 
> >>> > *dev_badblocks_to_json(struct ndctl_region *region,
> >>> >
> >>> >         ndctl_region_badblock_foreach(region, bb) {
> >>> >                 unsigned long long bb_begin, bb_end, begin, end;
> >>> > +               struct ndctl_dimm *dimm = NULL;
> >>> >
> >>> >                 bb_begin = region_begin + (bb->offset << 9);
> >>> >                 bb_end = bb_begin + (bb->len << 9) - 1;
> >>> > @@ -456,6 +484,8 @@ static struct json_object 
> >>> > *dev_badblocks_to_json(struct ndctl_region *region,
> >>> >                 offset = (begin - dev_begin) >> 9;
> >>> >                 len = (end - begin + 1) >> 9;
> >>> >
> >>> > +               dimm = badblock_to_dimm(region, begin);
> >>> > +
> >>> >                 if (flags & UTIL_JSON_MEDIA_ERRORS) {
> >>> >                         /* add to json */
> >>> >                         jbb = json_object_new_object();
> >>> > @@ -472,6 +502,13 @@ static struct json_object 
> >>> > *dev_badblocks_to_json(struct ndctl_region *region,
> >>> >                                 goto err;
> >>> >                         json_object_object_add(jbb, "length", jobj);
> >>> >
> >>> > +                       if (dimm) {
> >>> > +                               jobj = 
> >>> > json_object_new_string(ndctl_dimm_get_devname(dimm));
> >>>
> >>> Since this will eventually be the same code as above lets turn it into
> >>> a common badblocks_to_jdimms() helper that returns a json array.
> >>>
> >>
> >> Ok. I'll make next version.
> >>
> >> BTW, should I send this No.5 patch for v6?
> >> Otherwise, should I re-send all of this patch set again?
> >
> > Just this one is fine, the others I'll get applied and pushed out tomorrow.
> 
> Since this is the last feature I'm waiting for to cut the v58 release,
> I'll go ahead and send incremental patches to fix this up.
> 


Wow, thanks!

Since I was off from office at Friday,
This is great help for me.

Anyway, I'll review your patches.





_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

Reply via email to