diff options
| -rw-r--r-- | drivers/acpi/nfit/core.c | 5 | ||||
| -rw-r--r-- | drivers/nvdimm/dimm.c | 6 | ||||
| -rw-r--r-- | drivers/nvdimm/dimm_devs.c | 22 | ||||
| -rw-r--r-- | drivers/nvdimm/nd.h | 1 | ||||
| -rw-r--r-- | include/linux/libnvdimm.h | 1 |
5 files changed, 24 insertions, 11 deletions
diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c index 5143e11e3b0f..c1fb06654749 100644 --- a/drivers/acpi/nfit/core.c +++ b/drivers/acpi/nfit/core.c | |||
| @@ -2042,11 +2042,6 @@ static int acpi_nfit_register_dimms(struct acpi_nfit_desc *acpi_desc) | |||
| 2042 | if (!nvdimm) | 2042 | if (!nvdimm) |
| 2043 | continue; | 2043 | continue; |
| 2044 | 2044 | ||
| 2045 | rc = nvdimm_security_setup_events(nvdimm); | ||
| 2046 | if (rc < 0) | ||
| 2047 | dev_warn(acpi_desc->dev, | ||
| 2048 | "security event setup failed: %d\n", rc); | ||
| 2049 | |||
| 2050 | nfit_kernfs = sysfs_get_dirent(nvdimm_kobj(nvdimm)->sd, "nfit"); | 2045 | nfit_kernfs = sysfs_get_dirent(nvdimm_kobj(nvdimm)->sd, "nfit"); |
| 2051 | if (nfit_kernfs) | 2046 | if (nfit_kernfs) |
| 2052 | nfit_mem->flags_attr = sysfs_get_dirent(nfit_kernfs, | 2047 | nfit_mem->flags_attr = sysfs_get_dirent(nfit_kernfs, |
diff --git a/drivers/nvdimm/dimm.c b/drivers/nvdimm/dimm.c index 0cf58cabc9ed..3cf50274fadb 100644 --- a/drivers/nvdimm/dimm.c +++ b/drivers/nvdimm/dimm.c | |||
| @@ -26,6 +26,12 @@ static int nvdimm_probe(struct device *dev) | |||
| 26 | struct nvdimm_drvdata *ndd; | 26 | struct nvdimm_drvdata *ndd; |
| 27 | int rc; | 27 | int rc; |
| 28 | 28 | ||
| 29 | rc = nvdimm_security_setup_events(dev); | ||
| 30 | if (rc < 0) { | ||
| 31 | dev_err(dev, "security event setup failed: %d\n", rc); | ||
| 32 | return rc; | ||
| 33 | } | ||
| 34 | |||
| 29 | rc = nvdimm_check_config_data(dev); | 35 | rc = nvdimm_check_config_data(dev); |
| 30 | if (rc) { | 36 | if (rc) { |
| 31 | /* not required for non-aliased nvdimm, ex. NVDIMM-N */ | 37 | /* not required for non-aliased nvdimm, ex. NVDIMM-N */ |
diff --git a/drivers/nvdimm/dimm_devs.c b/drivers/nvdimm/dimm_devs.c index 4890310df874..efe412a6b5b9 100644 --- a/drivers/nvdimm/dimm_devs.c +++ b/drivers/nvdimm/dimm_devs.c | |||
| @@ -578,13 +578,25 @@ struct nvdimm *__nvdimm_create(struct nvdimm_bus *nvdimm_bus, | |||
| 578 | } | 578 | } |
| 579 | EXPORT_SYMBOL_GPL(__nvdimm_create); | 579 | EXPORT_SYMBOL_GPL(__nvdimm_create); |
| 580 | 580 | ||
| 581 | int nvdimm_security_setup_events(struct nvdimm *nvdimm) | 581 | static void shutdown_security_notify(void *data) |
| 582 | { | 582 | { |
| 583 | nvdimm->sec.overwrite_state = sysfs_get_dirent(nvdimm->dev.kobj.sd, | 583 | struct nvdimm *nvdimm = data; |
| 584 | "security"); | 584 | |
| 585 | sysfs_put(nvdimm->sec.overwrite_state); | ||
| 586 | } | ||
| 587 | |||
| 588 | int nvdimm_security_setup_events(struct device *dev) | ||
| 589 | { | ||
| 590 | struct nvdimm *nvdimm = to_nvdimm(dev); | ||
| 591 | |||
| 592 | if (nvdimm->sec.state < 0 || !nvdimm->sec.ops | ||
| 593 | || !nvdimm->sec.ops->overwrite) | ||
| 594 | return 0; | ||
| 595 | nvdimm->sec.overwrite_state = sysfs_get_dirent(dev->kobj.sd, "security"); | ||
| 585 | if (!nvdimm->sec.overwrite_state) | 596 | if (!nvdimm->sec.overwrite_state) |
| 586 | return -ENODEV; | 597 | return -ENOMEM; |
| 587 | return 0; | 598 | |
| 599 | return devm_add_action_or_reset(dev, shutdown_security_notify, nvdimm); | ||
| 588 | } | 600 | } |
| 589 | EXPORT_SYMBOL_GPL(nvdimm_security_setup_events); | 601 | EXPORT_SYMBOL_GPL(nvdimm_security_setup_events); |
| 590 | 602 | ||
diff --git a/drivers/nvdimm/nd.h b/drivers/nvdimm/nd.h index cfde992684e7..379bf4305e61 100644 --- a/drivers/nvdimm/nd.h +++ b/drivers/nvdimm/nd.h | |||
| @@ -250,6 +250,7 @@ long nvdimm_clear_poison(struct device *dev, phys_addr_t phys, | |||
| 250 | void nvdimm_set_aliasing(struct device *dev); | 250 | void nvdimm_set_aliasing(struct device *dev); |
| 251 | void nvdimm_set_locked(struct device *dev); | 251 | void nvdimm_set_locked(struct device *dev); |
| 252 | void nvdimm_clear_locked(struct device *dev); | 252 | void nvdimm_clear_locked(struct device *dev); |
| 253 | int nvdimm_security_setup_events(struct device *dev); | ||
| 253 | #if IS_ENABLED(CONFIG_NVDIMM_KEYS) | 254 | #if IS_ENABLED(CONFIG_NVDIMM_KEYS) |
| 254 | int nvdimm_security_unlock(struct device *dev); | 255 | int nvdimm_security_unlock(struct device *dev); |
| 255 | #else | 256 | #else |
diff --git a/include/linux/libnvdimm.h b/include/linux/libnvdimm.h index 7315977b64da..ad609617aeb8 100644 --- a/include/linux/libnvdimm.h +++ b/include/linux/libnvdimm.h | |||
| @@ -235,7 +235,6 @@ static inline struct nvdimm *nvdimm_create(struct nvdimm_bus *nvdimm_bus, | |||
| 235 | cmd_mask, num_flush, flush_wpq, NULL, NULL); | 235 | cmd_mask, num_flush, flush_wpq, NULL, NULL); |
| 236 | } | 236 | } |
| 237 | 237 | ||
| 238 | int nvdimm_security_setup_events(struct nvdimm *nvdimm); | ||
| 239 | const struct nd_cmd_desc *nd_cmd_dimm_desc(int cmd); | 238 | const struct nd_cmd_desc *nd_cmd_dimm_desc(int cmd); |
| 240 | const struct nd_cmd_desc *nd_cmd_bus_desc(int cmd); | 239 | const struct nd_cmd_desc *nd_cmd_bus_desc(int cmd); |
| 241 | u32 nd_cmd_in_size(struct nvdimm *nvdimm, int cmd, | 240 | u32 nd_cmd_in_size(struct nvdimm *nvdimm, int cmd, |
