Commit 04d3e546 authored by Dmitry Torokhov's avatar Dmitry Torokhov Committed by Greg Kroah-Hartman
Browse files

driver core: introduce device_set_driver() helper



In preparation to closing a race when reading driver pointer in
dev_uevent() code, instead of setting device->driver pointer directly
introduce device_set_driver() helper.

Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Reviewed-by: default avatarMasami Hiramatsu (Google) <mhiramat@kernel.org>
Link: https://lore.kernel.org/r/20250311052417.1846985-2-dmitry.torokhov@gmail.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent dc1771f7
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -180,6 +180,12 @@ int driver_add_groups(const struct device_driver *drv, const struct attribute_gr
void driver_remove_groups(const struct device_driver *drv, const struct attribute_group **groups);
void device_driver_detach(struct device *dev);

static inline void device_set_driver(struct device *dev, const struct device_driver *drv)
{
	// FIXME - this cast should not be needed "soon"
	dev->driver = (struct device_driver *)drv;
}

int devres_release_all(struct device *dev);
void device_block_probing(void);
void device_unblock_probing(void);
+1 −1
Original line number Diff line number Diff line
@@ -3697,7 +3697,7 @@ int device_add(struct device *dev)
	device_pm_remove(dev);
	dpm_sysfs_remove(dev);
 DPMError:
	dev->driver = NULL;
	device_set_driver(dev, NULL);
	bus_remove_device(dev);
 BusError:
	device_remove_attrs(dev);
+3 −4
Original line number Diff line number Diff line
@@ -550,7 +550,7 @@ static void device_unbind_cleanup(struct device *dev)
	arch_teardown_dma_ops(dev);
	kfree(dev->dma_range_map);
	dev->dma_range_map = NULL;
	dev->driver = NULL;
	device_set_driver(dev, NULL);
	dev_set_drvdata(dev, NULL);
	if (dev->pm_domain && dev->pm_domain->dismiss)
		dev->pm_domain->dismiss(dev);
@@ -629,8 +629,7 @@ static int really_probe(struct device *dev, const struct device_driver *drv)
	}

re_probe:
	// FIXME - this cast should not be needed "soon"
	dev->driver = (struct device_driver *)drv;
	device_set_driver(dev, drv);

	/* If using pinctrl, bind pins now before probing */
	ret = pinctrl_bind_pins(dev);
@@ -1014,7 +1013,7 @@ static int __device_attach(struct device *dev, bool allow_async)
		if (ret == 0)
			ret = 1;
		else {
			dev->driver = NULL;
			device_set_driver(dev, NULL);
			ret = 0;
		}
	} else {