diff options
Diffstat (limited to 'drivers/nvdimm/pmem.c')
| -rw-r--r-- | drivers/nvdimm/pmem.c | 14 | 
1 files changed, 14 insertions, 0 deletions
| diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c index 8e09c544d892..f798899338ed 100644 --- a/drivers/nvdimm/pmem.c +++ b/drivers/nvdimm/pmem.c @@ -103,6 +103,20 @@ static int pmem_do_bvec(struct pmem_device *pmem, struct page *page,  			flush_dcache_page(page);  		}  	} else { +		/* +		 * Note that we write the data both before and after +		 * clearing poison.  The write before clear poison +		 * handles situations where the latest written data is +		 * preserved and the clear poison operation simply marks +		 * the address range as valid without changing the data. +		 * In this case application software can assume that an +		 * interrupted write will either return the new good +		 * data or an error. +		 * +		 * However, if pmem_clear_poison() leaves the data in an +		 * indeterminate state we need to perform the write +		 * after clear poison. +		 */  		flush_dcache_page(page);  		memcpy_to_pmem(pmem_addr, mem + off, len);  		if (unlikely(bad_pmem)) { | 
