diff options
Diffstat (limited to 'drivers/nvdimm/pmem.c')
| -rw-r--r-- | drivers/nvdimm/pmem.c | 8 | 
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c index 42b3a8217073..24618431a14b 100644 --- a/drivers/nvdimm/pmem.c +++ b/drivers/nvdimm/pmem.c @@ -47,7 +47,7 @@ static struct nd_region *to_region(struct pmem_device *pmem)  	return to_nd_region(to_dev(pmem)->parent);  } -static void pmem_clear_poison(struct pmem_device *pmem, phys_addr_t offset, +static int pmem_clear_poison(struct pmem_device *pmem, phys_addr_t offset,  		unsigned int len)  {  	struct device *dev = to_dev(pmem); @@ -62,8 +62,12 @@ static void pmem_clear_poison(struct pmem_device *pmem, phys_addr_t offset,  				__func__, (unsigned long long) sector,  				cleared / 512, cleared / 512 > 1 ? "s" : "");  		badblocks_clear(&pmem->bb, sector, cleared / 512); +	} else { +		return -EIO;  	} +  	invalidate_pmem(pmem->virt_addr + offset, len); +	return 0;  }  static void write_pmem(void *pmem_addr, struct page *page, @@ -123,7 +127,7 @@ static int pmem_do_bvec(struct pmem_device *pmem, struct page *page,  		flush_dcache_page(page);  		write_pmem(pmem_addr, page, off, len);  		if (unlikely(bad_pmem)) { -			pmem_clear_poison(pmem, pmem_off, len); +			rc = pmem_clear_poison(pmem, pmem_off, len);  			write_pmem(pmem_addr, page, off, len);  		}  	}  |