diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c index e420f773d674..035384b919c1 100644 --- a/drivers/acpi/nfit/core.c +++ b/drivers/acpi/nfit/core.c @@ -3445,6 +3445,8 @@ static void acpi_nfit_unregister(void *data) struct acpi_nfit_desc *acpi_desc = data; nvdimm_bus_unregister(acpi_desc->nvdimm_bus); + /* The nvdimm_bus object may have been freed, so clear the pointer. */ + acpi_desc->nvdimm_bus = NULL; } int acpi_nfit_init(struct acpi_nfit_desc *acpi_desc, void *data, acpi_size sz) @@ -3669,7 +3671,10 @@ static void acpi_nfit_put_table(void *table) void acpi_nfit_shutdown(void *data) { struct acpi_nfit_desc *acpi_desc = data; - struct device *bus_dev = to_nvdimm_bus_dev(acpi_desc->nvdimm_bus); + struct device *bus_dev; + + if (!acpi_desc || !acpi_desc->nvdimm_bus) + return; /* * Destruct under acpi_desc_lock so that nfit_handle_mce does not @@ -3684,6 +3689,7 @@ void acpi_nfit_shutdown(void *data) mutex_unlock(&acpi_desc->init_mutex); cancel_delayed_work_sync(&acpi_desc->dwork); + bus_dev = to_nvdimm_bus_dev(acpi_desc->nvdimm_bus); /* * Bounce the nvdimm bus lock to make sure any in-flight * acpi_nfit_ars_rescan() submissions have had a chance to @@ -3751,13 +3757,14 @@ static int acpi_nfit_add(struct acpi_device *adev) sz - sizeof(struct acpi_table_nfit)); if (rc) - return rc; - return devm_add_action_or_reset(dev, acpi_nfit_shutdown, acpi_desc); + acpi_nfit_shutdown(acpi_desc); + + return rc; } static int acpi_nfit_remove(struct acpi_device *adev) { - /* see acpi_nfit_unregister */ + acpi_nfit_shutdown(dev_get_drvdata(&adev->dev)); return 0; }