summaryrefslogtreecommitdiff
path: root/drivers/base
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2025-03-10 22:24:15 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2025-05-02 07:51:03 +0200
commita55111066205090aec18e1e999155a5dd15f4394 (patch)
tree84cd36ccd8cce369e78196d84327fd20a156259d /drivers/base
parentd29c2d53357fd35f24b7acba594725a5be6404d7 (diff)
downloadlinux-a55111066205090aec18e1e999155a5dd15f4394.tar.gz
linux-a55111066205090aec18e1e999155a5dd15f4394.tar.bz2
linux-a55111066205090aec18e1e999155a5dd15f4394.zip
driver core: introduce device_set_driver() helper
commit 04d3e5461c1f5cf8eec964ab64948ebed826e95e upstream. 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: Dmitry Torokhov <dmitry.torokhov@gmail.com> Reviewed-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> Link: https://lore.kernel.org/r/20250311052417.1846985-2-dmitry.torokhov@gmail.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/base')
-rw-r--r--drivers/base/base.h6
-rw-r--r--drivers/base/core.c2
-rw-r--r--drivers/base/dd.c6
3 files changed, 10 insertions, 4 deletions
diff --git a/drivers/base/base.h b/drivers/base/base.h
index a8e3d8165232..7ac16589af3c 100644
--- a/drivers/base/base.h
+++ b/drivers/base/base.h
@@ -179,6 +179,12 @@ int driver_add_groups(struct device_driver *drv, const struct attribute_group **
void driver_remove_groups(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);
diff --git a/drivers/base/core.c b/drivers/base/core.c
index 197af212ef7e..a5b2db9720a4 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -3688,7 +3688,7 @@ done:
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);
diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index 0c3725c3eefa..7e2fb159bb89 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -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,7 +629,7 @@ static int really_probe(struct device *dev, struct device_driver *drv)
}
re_probe:
- dev->driver = drv;
+ device_set_driver(dev, drv);
/* If using pinctrl, bind pins now before probing */
ret = pinctrl_bind_pins(dev);
@@ -1014,7 +1014,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 {