diff options
Diffstat (limited to 'drivers/nvdimm/pmem.c')
| -rw-r--r-- | drivers/nvdimm/pmem.c | 29 | 
1 files changed, 25 insertions, 4 deletions
diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c index 4c121dd03dd9..f9f76f6ba07b 100644 --- a/drivers/nvdimm/pmem.c +++ b/drivers/nvdimm/pmem.c @@ -490,6 +490,7 @@ static int pmem_attach_disk(struct device *dev,  static int nd_pmem_probe(struct device *dev)  { +	int ret;  	struct nd_namespace_common *ndns;  	ndns = nvdimm_namespace_common_probe(dev); @@ -505,12 +506,32 @@ static int nd_pmem_probe(struct device *dev)  	if (is_nd_pfn(dev))  		return pmem_attach_disk(dev, ndns); -	/* if we find a valid info-block we'll come back as that personality */ -	if (nd_btt_probe(dev, ndns) == 0 || nd_pfn_probe(dev, ndns) == 0 -			|| nd_dax_probe(dev, ndns) == 0) +	ret = nd_btt_probe(dev, ndns); +	if (ret == 0)  		return -ENXIO; -	/* ...otherwise we're just a raw pmem device */ +	/* +	 * We have two failure conditions here, there is no +	 * info reserver block or we found a valid info reserve block +	 * but failed to initialize the pfn superblock. +	 * +	 * For the first case consider namespace as a raw pmem namespace +	 * and attach a disk. +	 * +	 * For the latter, consider this a success and advance the namespace +	 * seed. +	 */ +	ret = nd_pfn_probe(dev, ndns); +	if (ret == 0) +		return -ENXIO; +	else if (ret == -EOPNOTSUPP) +		return ret; + +	ret = nd_dax_probe(dev, ndns); +	if (ret == 0) +		return -ENXIO; +	else if (ret == -EOPNOTSUPP) +		return ret;  	return pmem_attach_disk(dev, ndns);  }  |