Messages in this thread Patch in this message | | | From | Toshi Kani <> | Subject | [PATCH 2/2] libnvdimm: clear region badblock in nvdimm_clear_poison() | Date | Thu, 27 Apr 2017 16:57:06 -0600 |
| |
Badblocks are tracked at both region and device levels. pmem_clear_poison() and nsio_rw_bytes() call nvdimm_clear_poison() and then badblocks_clear() to clear badblocks at the device level. However, it does not update badblocks at the region level, which makes them inconsistent.
Change nvdimm_clear_poison() to update backblocks at the region level to keep them consistent.
Signed-off-by: Toshi Kani <toshi.kani@hpe.com> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Dave Jiang <dave.jiang@intel.com> Cc: Vishal Verma <vishal.l.verma@intel.com> --- Based on 'libnvdimm-for-next'. --- drivers/nvdimm/bus.c | 9 +++++++++ 1 file changed, 9 insertions(+)
diff --git a/drivers/nvdimm/bus.c b/drivers/nvdimm/bus.c index 43ddfd4..998332d 100644 --- a/drivers/nvdimm/bus.c +++ b/drivers/nvdimm/bus.c @@ -179,6 +179,7 @@ long nvdimm_clear_poison(struct device *dev, phys_addr_t phys, struct nvdimm_bus_descriptor *nd_desc; struct nd_cmd_clear_error clear_err; struct nd_cmd_ars_cap ars_cap; + struct resource res; u32 clear_err_unit, mask; int cmd_rc, rc; @@ -222,6 +223,14 @@ long nvdimm_clear_poison(struct device *dev, phys_addr_t phys, if (clear_err.cleared > 0) nvdimm_forget_poison(nvdimm_bus, phys, clear_err.cleared); + if (clear_err.cleared > 0 && clear_err.cleared / 512) { + nvdimm_bus_lock(&nvdimm_bus->dev); + res.start = phys; + res.end = phys + clear_err.cleared - 1; + __nvdimm_bus_badblocks_clear(nvdimm_bus, &res); + nvdimm_bus_unlock(&nvdimm_bus->dev); + } + return clear_err.cleared; } EXPORT_SYMBOL_GPL(nvdimm_clear_poison);
| |