@@ -1860,16 +1860,58 @@ static struct device *nd_namespace_blk_create(struct nd_region *nd_region)
18601860 return & nsblk -> common .dev ;
18611861}
18621862
1863- void nd_region_create_blk_seed (struct nd_region * nd_region )
1863+ static struct device * nd_namespace_pmem_create (struct nd_region * nd_region )
1864+ {
1865+ struct nd_namespace_pmem * nspm ;
1866+ struct resource * res ;
1867+ struct device * dev ;
1868+
1869+ if (!is_nd_pmem (& nd_region -> dev ))
1870+ return NULL ;
1871+
1872+ nspm = kzalloc (sizeof (* nspm ), GFP_KERNEL );
1873+ if (!nspm )
1874+ return NULL ;
1875+
1876+ dev = & nspm -> nsio .common .dev ;
1877+ dev -> type = & namespace_pmem_device_type ;
1878+ dev -> parent = & nd_region -> dev ;
1879+ res = & nspm -> nsio .res ;
1880+ res -> name = dev_name (& nd_region -> dev );
1881+ res -> flags = IORESOURCE_MEM ;
1882+
1883+ nspm -> id = ida_simple_get (& nd_region -> ns_ida , 0 , 0 , GFP_KERNEL );
1884+ if (nspm -> id < 0 ) {
1885+ kfree (nspm );
1886+ return NULL ;
1887+ }
1888+ dev_set_name (dev , "namespace%d.%d" , nd_region -> id , nspm -> id );
1889+ dev -> parent = & nd_region -> dev ;
1890+ dev -> groups = nd_namespace_attribute_groups ;
1891+ nd_namespace_pmem_set_resource (nd_region , nspm , 0 );
1892+
1893+ return dev ;
1894+ }
1895+
1896+ void nd_region_create_ns_seed (struct nd_region * nd_region )
18641897{
18651898 WARN_ON (!is_nvdimm_bus_locked (& nd_region -> dev ));
1866- nd_region -> ns_seed = nd_namespace_blk_create (nd_region );
1899+
1900+ if (nd_region_to_nstype (nd_region ) == ND_DEVICE_NAMESPACE_IO )
1901+ return ;
1902+
1903+ if (is_nd_blk (& nd_region -> dev ))
1904+ nd_region -> ns_seed = nd_namespace_blk_create (nd_region );
1905+ else
1906+ nd_region -> ns_seed = nd_namespace_pmem_create (nd_region );
1907+
18671908 /*
18681909 * Seed creation failures are not fatal, provisioning is simply
18691910 * disabled until memory becomes available
18701911 */
18711912 if (!nd_region -> ns_seed )
1872- dev_err (& nd_region -> dev , "failed to create blk namespace\n" );
1913+ dev_err (& nd_region -> dev , "failed to create %s namespace\n" ,
1914+ is_nd_blk (& nd_region -> dev ) ? "blk" : "pmem" );
18731915 else
18741916 nd_device_register (nd_region -> ns_seed );
18751917}
0 commit comments