in namespace_devs.c [2587:2669]
int nd_region_register_namespaces(struct nd_region *nd_region, int *err)
{
struct device **devs = NULL;
int i, rc = 0, type;
*err = 0;
nvdimm_bus_lock(&nd_region->dev);
rc = init_active_labels(nd_region);
if (rc) {
nvdimm_bus_unlock(&nd_region->dev);
return rc;
}
type = nd_region_to_nstype(nd_region);
switch (type) {
case ND_DEVICE_NAMESPACE_IO:
devs = create_namespace_io(nd_region);
break;
case ND_DEVICE_NAMESPACE_PMEM:
case ND_DEVICE_NAMESPACE_BLK:
devs = create_namespaces(nd_region);
break;
default:
break;
}
nvdimm_bus_unlock(&nd_region->dev);
if (!devs)
return -ENODEV;
for (i = 0; devs[i]; i++) {
struct device *dev = devs[i];
int id;
if (type == ND_DEVICE_NAMESPACE_BLK) {
struct nd_namespace_blk *nsblk;
nsblk = to_nd_namespace_blk(dev);
id = ida_simple_get(&nd_region->ns_ida, 0, 0,
GFP_KERNEL);
nsblk->id = id;
} else if (type == ND_DEVICE_NAMESPACE_PMEM) {
struct nd_namespace_pmem *nspm;
nspm = to_nd_namespace_pmem(dev);
id = ida_simple_get(&nd_region->ns_ida, 0, 0,
GFP_KERNEL);
nspm->id = id;
} else
id = i;
if (id < 0)
break;
dev_set_name(dev, "namespace%d.%d", nd_region->id, id);
nd_device_register(dev);
}
if (i)
nd_region->ns_seed = devs[0];
if (devs[i]) {
int j;
for (j = i; devs[j]; j++) {
struct device *dev = devs[j];
device_initialize(dev);
put_device(dev);
}
*err = j - i;
/*
* All of the namespaces we tried to register failed, so
* fail region activation.
*/
if (*err == 0)
rc = -ENODEV;
}
kfree(devs);
if (rc == -ENODEV)
return rc;
return i;
}