Commit fb9f0854 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull libnvdimm and device-dax updates from Dan Williams:

 - Fix the error code polarity for the device-dax/mapping attribute

 - For the device-dax and libnvdimm bus implementations stop
   implementing a useless return code for the remove() callback.

 - Miscellaneous cleanups

* tag 'libnvdimm-for-5.12' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm:
  dax-device: Make remove callback return void
  device-dax: Drop an empty .remove callback
  device-dax: Fix error path in dax_driver_register
  device-dax: Properly handle drivers without remove callback
  device-dax: Prevent registering drivers without probe callback
  libnvdimm: Make remove callback return void
  libnvdimm/dimm: Simplify nvdimm_remove()
  device-dax: Fix default return code of range_parse()
parents b866bc5f 64ffe843
Loading
Loading
Loading
Loading
+21 −3
Original line number Diff line number Diff line
@@ -179,7 +179,10 @@ static int dax_bus_remove(struct device *dev)
	struct dax_device_driver *dax_drv = to_dax_drv(dev->driver);
	struct dev_dax *dev_dax = to_dev_dax(dev);

	return dax_drv->remove(dev_dax);
	if (dax_drv->remove)
		dax_drv->remove(dev_dax);

	return 0;
}

static struct bus_type dax_bus_type = {
@@ -1038,7 +1041,7 @@ static ssize_t range_parse(const char *opt, size_t len, struct range *range)
{
	unsigned long long addr = 0;
	char *start, *end, *str;
	ssize_t rc = EINVAL;
	ssize_t rc = -EINVAL;

	str = kstrdup(opt, GFP_KERNEL);
	if (!str)
@@ -1392,6 +1395,13 @@ int __dax_driver_register(struct dax_device_driver *dax_drv,
	struct device_driver *drv = &dax_drv->drv;
	int rc = 0;

	/*
	 * dax_bus_probe() calls dax_drv->probe() unconditionally.
	 * So better be safe than sorry and ensure it is provided.
	 */
	if (!dax_drv->probe)
		return -EINVAL;

	INIT_LIST_HEAD(&dax_drv->ids);
	drv->owner = module;
	drv->name = mod_name;
@@ -1409,7 +1419,15 @@ int __dax_driver_register(struct dax_device_driver *dax_drv,
	mutex_unlock(&dax_bus_lock);
	if (rc)
		return rc;
	return driver_register(drv);

	rc = driver_register(drv);
	if (rc && dax_drv->match_always) {
		mutex_lock(&dax_bus_lock);
		match_always_count -= dax_drv->match_always;
		mutex_unlock(&dax_bus_lock);
	}

	return rc;
}
EXPORT_SYMBOL_GPL(__dax_driver_register);

+1 −1
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@ struct dax_device_driver {
	struct list_head ids;
	int match_always;
	int (*probe)(struct dev_dax *dev);
	int (*remove)(struct dev_dax *dev);
	void (*remove)(struct dev_dax *dev);
};

int __dax_driver_register(struct dax_device_driver *dax_drv,
+1 −7
Original line number Diff line number Diff line
@@ -452,15 +452,9 @@ int dev_dax_probe(struct dev_dax *dev_dax)
}
EXPORT_SYMBOL_GPL(dev_dax_probe);

static int dev_dax_remove(struct dev_dax *dev_dax)
{
	/* all probe actions are unwound by devm */
	return 0;
}

static struct dax_device_driver device_dax_driver = {
	.probe = dev_dax_probe,
	.remove = dev_dax_remove,
	/* all probe actions are unwound by devm, so .remove isn't necessary */
	.match_always = 1,
};

+2 −5
Original line number Diff line number Diff line
@@ -136,7 +136,7 @@ static int dev_dax_kmem_probe(struct dev_dax *dev_dax)
}

#ifdef CONFIG_MEMORY_HOTREMOVE
static int dev_dax_kmem_remove(struct dev_dax *dev_dax)
static void dev_dax_kmem_remove(struct dev_dax *dev_dax)
{
	int i, success = 0;
	struct device *dev = &dev_dax->dev;
@@ -176,11 +176,9 @@ static int dev_dax_kmem_remove(struct dev_dax *dev_dax)
		kfree(data);
		dev_set_drvdata(dev, NULL);
	}

	return 0;
}
#else
static int dev_dax_kmem_remove(struct dev_dax *dev_dax)
static void dev_dax_kmem_remove(struct dev_dax *dev_dax)
{
	/*
	 * Without hotremove purposely leak the request_mem_region() for the
@@ -190,7 +188,6 @@ static int dev_dax_kmem_remove(struct dev_dax *dev_dax)
	 * request_mem_region().
	 */
	any_hotremove_failed = true;
	return 0;
}
#endif /* CONFIG_MEMORY_HOTREMOVE */

+1 −2
Original line number Diff line number Diff line
@@ -41,10 +41,9 @@ static int dax_pmem_compat_release(struct device *dev, void *data)
	return 0;
}

static int dax_pmem_compat_remove(struct device *dev)
static void dax_pmem_compat_remove(struct device *dev)
{
	device_for_each_child(dev, NULL, dax_pmem_compat_release);
	return 0;
}

static struct nd_device_driver dax_pmem_compat_driver = {
Loading