aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/nvdimm/region_devs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/nvdimm/region_devs.c')
-rw-r--r--drivers/nvdimm/region_devs.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/drivers/nvdimm/region_devs.c b/drivers/nvdimm/region_devs.c
index 139bf71ca549..9e1b054e0e61 100644
--- a/drivers/nvdimm/region_devs.c
+++ b/drivers/nvdimm/region_devs.c
@@ -306,6 +306,23 @@ static ssize_t pfn_seed_show(struct device *dev,
306} 306}
307static DEVICE_ATTR_RO(pfn_seed); 307static DEVICE_ATTR_RO(pfn_seed);
308 308
309static ssize_t dax_seed_show(struct device *dev,
310 struct device_attribute *attr, char *buf)
311{
312 struct nd_region *nd_region = to_nd_region(dev);
313 ssize_t rc;
314
315 nvdimm_bus_lock(dev);
316 if (nd_region->dax_seed)
317 rc = sprintf(buf, "%s\n", dev_name(nd_region->dax_seed));
318 else
319 rc = sprintf(buf, "\n");
320 nvdimm_bus_unlock(dev);
321
322 return rc;
323}
324static DEVICE_ATTR_RO(dax_seed);
325
309static ssize_t read_only_show(struct device *dev, 326static ssize_t read_only_show(struct device *dev,
310 struct device_attribute *attr, char *buf) 327 struct device_attribute *attr, char *buf)
311{ 328{
@@ -335,6 +352,7 @@ static struct attribute *nd_region_attributes[] = {
335 &dev_attr_mappings.attr, 352 &dev_attr_mappings.attr,
336 &dev_attr_btt_seed.attr, 353 &dev_attr_btt_seed.attr,
337 &dev_attr_pfn_seed.attr, 354 &dev_attr_pfn_seed.attr,
355 &dev_attr_dax_seed.attr,
338 &dev_attr_read_only.attr, 356 &dev_attr_read_only.attr,
339 &dev_attr_set_cookie.attr, 357 &dev_attr_set_cookie.attr,
340 &dev_attr_available_size.attr, 358 &dev_attr_available_size.attr,
@@ -353,6 +371,9 @@ static umode_t region_visible(struct kobject *kobj, struct attribute *a, int n)
353 if (!is_nd_pmem(dev) && a == &dev_attr_pfn_seed.attr) 371 if (!is_nd_pmem(dev) && a == &dev_attr_pfn_seed.attr)
354 return 0; 372 return 0;
355 373
374 if (!is_nd_pmem(dev) && a == &dev_attr_dax_seed.attr)
375 return 0;
376
356 if (a != &dev_attr_set_cookie.attr 377 if (a != &dev_attr_set_cookie.attr
357 && a != &dev_attr_available_size.attr) 378 && a != &dev_attr_available_size.attr)
358 return a->mode; 379 return a->mode;
@@ -441,6 +462,13 @@ static void nd_region_notify_driver_action(struct nvdimm_bus *nvdimm_bus,
441 nd_region_create_pfn_seed(nd_region); 462 nd_region_create_pfn_seed(nd_region);
442 nvdimm_bus_unlock(dev); 463 nvdimm_bus_unlock(dev);
443 } 464 }
465 if (is_nd_dax(dev) && probe) {
466 nd_region = to_nd_region(dev->parent);
467 nvdimm_bus_lock(dev);
468 if (nd_region->dax_seed == dev)
469 nd_region_create_dax_seed(nd_region);
470 nvdimm_bus_unlock(dev);
471 }
444} 472}
445 473
446void nd_region_probe_success(struct nvdimm_bus *nvdimm_bus, struct device *dev) 474void nd_region_probe_success(struct nvdimm_bus *nvdimm_bus, struct device *dev)
@@ -718,6 +746,7 @@ static struct nd_region *nd_region_create(struct nvdimm_bus *nvdimm_bus,
718 ida_init(&nd_region->ns_ida); 746 ida_init(&nd_region->ns_ida);
719 ida_init(&nd_region->btt_ida); 747 ida_init(&nd_region->btt_ida);
720 ida_init(&nd_region->pfn_ida); 748 ida_init(&nd_region->pfn_ida);
749 ida_init(&nd_region->dax_ida);
721 dev = &nd_region->dev; 750 dev = &nd_region->dev;
722 dev_set_name(dev, "region%d", nd_region->id); 751 dev_set_name(dev, "region%d", nd_region->id);
723 dev->parent = &nvdimm_bus->dev; 752 dev->parent = &nvdimm_bus->dev;