@ -360,7 +360,7 @@ struct device *nd_pfn_create(struct nd_region *nd_region)
return dev ;
}
int nd_pfn_validate ( struct nd_pfn * nd_pfn )
int nd_pfn_validate ( struct nd_pfn * nd_pfn , const char * sig )
{
u64 checksum , offset ;
struct nd_namespace_io * nsio ;
@ -377,7 +377,7 @@ int nd_pfn_validate(struct nd_pfn *nd_pfn)
if ( nvdimm_read_bytes ( ndns , SZ_4K , pfn_sb , sizeof ( * pfn_sb ) ) )
return - ENXIO ;
if ( memcmp ( pfn_sb - > signature , PFN_SIG , PFN_SIG_LEN ) ! = 0 )
if ( memcmp ( pfn_sb - > signature , sig , PFN_SIG_LEN ) ! = 0 )
return - ENODEV ;
checksum = le64_to_cpu ( pfn_sb - > checksum ) ;
@ -467,7 +467,7 @@ int nd_pfn_probe(struct device *dev, struct nd_namespace_common *ndns)
pfn_sb = devm_kzalloc ( dev , sizeof ( * pfn_sb ) , GFP_KERNEL ) ;
nd_pfn = to_nd_pfn ( pfn_dev ) ;
nd_pfn - > pfn_sb = pfn_sb ;
rc = nd_pfn_validate ( nd_pfn ) ;
rc = nd_pfn_validate ( nd_pfn , PFN_SIG ) ;
dev_dbg ( dev , " %s: pfn: %s \n " , __func__ ,
rc = = 0 ? dev_name ( pfn_dev ) : " <none> " ) ;
if ( rc < 0 ) {
@ -552,6 +552,7 @@ static int nd_pfn_init(struct nd_pfn *nd_pfn)
struct nd_pfn_sb * pfn_sb ;
unsigned long npfns ;
phys_addr_t offset ;
const char * sig ;
u64 checksum ;
int rc ;
@ -560,7 +561,11 @@ static int nd_pfn_init(struct nd_pfn *nd_pfn)
return - ENOMEM ;
nd_pfn - > pfn_sb = pfn_sb ;
rc = nd_pfn_validate ( nd_pfn ) ;
if ( is_nd_dax ( & nd_pfn - > dev ) )
sig = DAX_SIG ;
else
sig = PFN_SIG ;
rc = nd_pfn_validate ( nd_pfn , sig ) ;
if ( rc ! = - ENODEV )
return rc ;
@ -628,7 +633,7 @@ static int nd_pfn_init(struct nd_pfn *nd_pfn)
pfn_sb - > mode = cpu_to_le32 ( nd_pfn - > mode ) ;
pfn_sb - > dataoff = cpu_to_le64 ( offset ) ;
pfn_sb - > npfns = cpu_to_le64 ( npfns ) ;
memcpy ( pfn_sb - > signature , PFN_SIG , PFN_SIG_LEN ) ;
memcpy ( pfn_sb - > signature , sig , PFN_SIG_LEN ) ;
memcpy ( pfn_sb - > uuid , nd_pfn - > uuid , 16 ) ;
memcpy ( pfn_sb - > parent_uuid , nd_dev_to_uuid ( & ndns - > dev ) , 16 ) ;
pfn_sb - > version_major = cpu_to_le16 ( 1 ) ;