diff options
Diffstat (limited to 'drivers/nvdimm/region_devs.c')
-rw-r--r-- | drivers/nvdimm/region_devs.c | 29 |
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 | } |
307 | static DEVICE_ATTR_RO(pfn_seed); | 307 | static DEVICE_ATTR_RO(pfn_seed); |
308 | 308 | ||
309 | static 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 | } | ||
324 | static DEVICE_ATTR_RO(dax_seed); | ||
325 | |||
309 | static ssize_t read_only_show(struct device *dev, | 326 | static 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 | ||
446 | void nd_region_probe_success(struct nvdimm_bus *nvdimm_bus, struct device *dev) | 474 | void 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; |