Commit fd14602d authored by Dan Williams's avatar Dan Williams
Browse files

libnvdimm: Export nvdimm shutdown helper, nvdimm_delete()



CXL is a hotplug bus and arranges for nvdimm devices to be dynamically
discovered and removed. The libnvdimm core manages shutdown of nvdimm
security operations when the device is unregistered. That functionality
is moved to nvdimm_delete() and invoked by the CXL-to-nvdimm glue code.

Reviewed-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Link: https://lore.kernel.org/r/162379910271.2993820.2955889139842401250.stgit@dwillia2-desk3.amr.corp.intel.com


Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 8fdcb170
Loading
Loading
Loading
Loading
+4 −15
Original line number Original line Diff line number Diff line
@@ -396,20 +396,9 @@ static int child_unregister(struct device *dev, void *data)
	if (dev->class)
	if (dev->class)
		return 0;
		return 0;


	if (is_nvdimm(dev)) {
	if (is_nvdimm(dev))
		struct nvdimm *nvdimm = to_nvdimm(dev);
		nvdimm_delete(to_nvdimm(dev));
		bool dev_put = false;
	else

		/* We are shutting down. Make state frozen artificially. */
		nvdimm_bus_lock(dev);
		set_bit(NVDIMM_SECURITY_FROZEN, &nvdimm->sec.flags);
		if (test_and_clear_bit(NDD_WORK_PENDING, &nvdimm->flags))
			dev_put = true;
		nvdimm_bus_unlock(dev);
		cancel_delayed_work_sync(&nvdimm->dwork);
		if (dev_put)
			put_device(dev);
	}
		nd_device_unregister(dev, ND_SYNC);
		nd_device_unregister(dev, ND_SYNC);


	return 0;
	return 0;
+18 −0
Original line number Original line Diff line number Diff line
@@ -642,6 +642,24 @@ struct nvdimm *__nvdimm_create(struct nvdimm_bus *nvdimm_bus,
}
}
EXPORT_SYMBOL_GPL(__nvdimm_create);
EXPORT_SYMBOL_GPL(__nvdimm_create);


void nvdimm_delete(struct nvdimm *nvdimm)
{
	struct device *dev = &nvdimm->dev;
	bool dev_put = false;

	/* We are shutting down. Make state frozen artificially. */
	nvdimm_bus_lock(dev);
	set_bit(NVDIMM_SECURITY_FROZEN, &nvdimm->sec.flags);
	if (test_and_clear_bit(NDD_WORK_PENDING, &nvdimm->flags))
		dev_put = true;
	nvdimm_bus_unlock(dev);
	cancel_delayed_work_sync(&nvdimm->dwork);
	if (dev_put)
		put_device(dev);
	nd_device_unregister(dev, ND_SYNC);
}
EXPORT_SYMBOL_GPL(nvdimm_delete);

static void shutdown_security_notify(void *data)
static void shutdown_security_notify(void *data)
{
{
	struct nvdimm *nvdimm = data;
	struct nvdimm *nvdimm = data;
+1 −0
Original line number Original line Diff line number Diff line
@@ -278,6 +278,7 @@ static inline struct nvdimm *nvdimm_create(struct nvdimm_bus *nvdimm_bus,
	return __nvdimm_create(nvdimm_bus, provider_data, groups, flags,
	return __nvdimm_create(nvdimm_bus, provider_data, groups, flags,
			cmd_mask, num_flush, flush_wpq, NULL, NULL, NULL);
			cmd_mask, num_flush, flush_wpq, NULL, NULL, NULL);
}
}
void nvdimm_delete(struct nvdimm *nvdimm);


const struct nd_cmd_desc *nd_cmd_dimm_desc(int cmd);
const struct nd_cmd_desc *nd_cmd_dimm_desc(int cmd);
const struct nd_cmd_desc *nd_cmd_bus_desc(int cmd);
const struct nd_cmd_desc *nd_cmd_bus_desc(int cmd);