| From adf6895754e2503d994a765535fd1813f8834674 Mon Sep 17 00:00:00 2001 |
| From: Dan Williams <dan.j.williams@intel.com> |
| Date: Thu, 30 Nov 2017 19:42:52 -0800 |
| Subject: acpi, nfit: fix health event notification |
| |
| From: Dan Williams <dan.j.williams@intel.com> |
| |
| commit adf6895754e2503d994a765535fd1813f8834674 upstream. |
| |
| Integration testing with a BIOS that generates injected health event |
| notifications fails to communicate those events to userspace. The nfit |
| driver neglects to link the ACPI DIMM device with the necessary driver |
| data so acpi_nvdimm_notify() fails this lookup: |
| |
| nfit_mem = dev_get_drvdata(dev); |
| if (nfit_mem && nfit_mem->flags_attr) |
| sysfs_notify_dirent(nfit_mem->flags_attr); |
| |
| Add the necessary linkage when installing the notification handler and |
| clean it up when the nfit driver instance is torn down. |
| |
| Cc: Toshi Kani <toshi.kani@hpe.com> |
| Cc: Vishal Verma <vishal.l.verma@intel.com> |
| Fixes: ba9c8dd3c222 ("acpi, nfit: add dimm device notification support") |
| Reported-by: Daniel Osawa <daniel.k.osawa@intel.com> |
| Tested-by: Daniel Osawa <daniel.k.osawa@intel.com> |
| Signed-off-by: Dan Williams <dan.j.williams@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/acpi/nfit/core.c | 9 ++++++++- |
| 1 file changed, 8 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/acpi/nfit/core.c |
| +++ b/drivers/acpi/nfit/core.c |
| @@ -1390,6 +1390,11 @@ static int acpi_nfit_add_dimm(struct acp |
| dev_name(&adev_dimm->dev)); |
| return -ENXIO; |
| } |
| + /* |
| + * Record nfit_mem for the notification path to track back to |
| + * the nfit sysfs attributes for this dimm device object. |
| + */ |
| + dev_set_drvdata(&adev_dimm->dev, nfit_mem); |
| |
| /* |
| * Until standardization materializes we need to consider 4 |
| @@ -1446,9 +1451,11 @@ static void shutdown_dimm_notify(void *d |
| sysfs_put(nfit_mem->flags_attr); |
| nfit_mem->flags_attr = NULL; |
| } |
| - if (adev_dimm) |
| + if (adev_dimm) { |
| acpi_remove_notify_handler(adev_dimm->handle, |
| ACPI_DEVICE_NOTIFY, acpi_nvdimm_notify); |
| + dev_set_drvdata(&adev_dimm->dev, NULL); |
| + } |
| } |
| mutex_unlock(&acpi_desc->init_mutex); |
| } |