On Fri, 2016-11-18 at 10:06 -0700, Dave Jiang wrote:
> Clearing out the poison in the metadata block of the namespace before
> we use it. Range from start + 8k to pfn_sb->dataoff.
>
> Signed-off-by: Dave Jiang <[email protected]>
> ---
> drivers/nvdimm/pfn_devs.c | 30 ++++++++++++++++++++++++++++++
> 1 file changed, 30 insertions(+)
>
> diff --git a/drivers/nvdimm/pfn_devs.c b/drivers/nvdimm/pfn_devs.c
> index cea8350..30c7eaf 100644
> --- a/drivers/nvdimm/pfn_devs.c
> +++ b/drivers/nvdimm/pfn_devs.c
> @@ -527,11 +527,41 @@ static struct vmem_altmap
> *__nvdimm_setup_pfn(struct nd_pfn *nd_pfn,
> .base_pfn = init_altmap_base(base),
> .reserve = init_altmap_reserve(base),
> };
> + sector_t sector;
> + resource_size_t meta_start, meta_size;
> + long cleared;
> + unsigned int sz_align;
>
> memcpy(res, &nsio->res, sizeof(*res));
> res->start += start_pad;
> res->end -= end_trunc;
>
> + meta_start = res->start + SZ_8K;
> + meta_size = offset - meta_start + 1;
> +
> + if (meta_start + meta_size > offset)
> + return ERR_PTR(-EINVAL);
> +
> + sector = meta_start >> 9;
> + sz_align = ALIGN(meta_size + (meta_start & (512 - 1)), 512);
> +
> + if (unlikely(is_bad_pmem(&nsio->bb, sector, sz_align))) {
> + if (IS_ALIGNED(meta_start, 512) &&
> IS_ALIGNED(meta_size, 512)) {
> + cleared = nvdimm_clear_poison(&nd_pfn->dev,
> + meta_start,
> meta_size);
> + if (cleared <= 0)
> + return ERR_PTR(-EIO);
> + else {
> + badblocks_clear(&nsio->bb, sector,
> + cleared >> 9);
> + if (cleared != meta_size)
> + return ERR_PTR(-EIO);
> +
> + }
> + } else
> + return ERR_PTR(-EIO);
> + }
The above nested if-statements can be changed to:
if (!IS_ALIGNED...)
return ERR_PTR(-EIO);
cleared = nvdimm_clear_poison(...);
if (cleared <= 0)
return ERR_PTR(-EIO);
badblocks_clear(...)
if (cleared != meta_size)
return ERR_PTR(-EIO);
Thanks,
-Toshi
_______________________________________________
Linux-nvdimm mailing list
[email protected]
https://lists.01.org/mailman/listinfo/linux-nvdimm