diff options
Diffstat (limited to 'drivers/nvdimm/region_devs.c')
| -rw-r--r-- | drivers/nvdimm/region_devs.c | 16 | 
1 files changed, 14 insertions, 2 deletions
| diff --git a/drivers/nvdimm/region_devs.c b/drivers/nvdimm/region_devs.c index ef23119db574..9ccf3d608799 100644 --- a/drivers/nvdimm/region_devs.c +++ b/drivers/nvdimm/region_devs.c @@ -518,6 +518,12 @@ static ssize_t read_only_show(struct device *dev,  	return sprintf(buf, "%d\n", nd_region->ro);  } +static int revalidate_read_only(struct device *dev, void *data) +{ +	nd_device_notify(dev, NVDIMM_REVALIDATE_REGION); +	return 0; +} +  static ssize_t read_only_store(struct device *dev,  		struct device_attribute *attr, const char *buf, size_t len)  { @@ -529,6 +535,7 @@ static ssize_t read_only_store(struct device *dev,  		return rc;  	nd_region->ro = ro; +	device_for_each_child(dev, NULL, revalidate_read_only);  	return len;  }  static DEVICE_ATTR_RW(read_only); @@ -1239,6 +1246,11 @@ int nvdimm_has_flush(struct nd_region *nd_region)  			|| !IS_ENABLED(CONFIG_ARCH_HAS_PMEM_API))  		return -ENXIO; +	/* Test if an explicit flush function is defined */ +	if (test_bit(ND_REGION_ASYNC, &nd_region->flags) && nd_region->flush) +		return 1; + +	/* Test if any flush hints for the region are available */  	for (i = 0; i < nd_region->ndr_mappings; i++) {  		struct nd_mapping *nd_mapping = &nd_region->mapping[i];  		struct nvdimm *nvdimm = nd_mapping->nvdimm; @@ -1249,8 +1261,8 @@ int nvdimm_has_flush(struct nd_region *nd_region)  	}  	/* -	 * The platform defines dimm devices without hints, assume -	 * platform persistence mechanism like ADR +	 * The platform defines dimm devices without hints nor explicit flush, +	 * assume platform persistence mechanism like ADR  	 */  	return 0;  } | 
