Skip to content

Commit 94cd101

Browse files
krzkUlf Hansson
authored andcommitted
mmc: sdio: store owner from modules with sdio_register_driver()
Modules registering driver with sdio_register_driver() might forget to set .owner field. The field is used by some of other kernel parts for reference counting (try_module_get()), so it is expected that drivers will set it. Solve the problem by moving this task away from the drivers to the core code, just like we did for platform_driver in commit 9447057 ("platform_device: use a macro instead of platform_driver_register"). Since many drivers forget to set the .owner, this effectively will fix them. Examples of fixed drivers are: ath6kl, b43, btsdio.c, ks7010, libertas, MediaTek WiFi drivers, Realtek WiFi drivers, rsi, siano, wilc1000, wl1251 and more. Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> Reviewed-by: Francesco Dolcini <francesco.dolcini@toradex.com> Link: https://lore.kernel.org/r/20240329-module-owner-sdio-v1-1-e4010b11ccaa@linaro.org Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
1 parent f9b17ff commit 94cd101

2 files changed

Lines changed: 10 additions & 4 deletions

File tree

drivers/mmc/core/sdio_bus.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -265,16 +265,19 @@ void sdio_unregister_bus(void)
265265
}
266266

267267
/**
268-
* sdio_register_driver - register a function driver
268+
* __sdio_register_driver - register a function driver
269269
* @drv: SDIO function driver
270+
* @owner: owning module/driver
270271
*/
271-
int sdio_register_driver(struct sdio_driver *drv)
272+
int __sdio_register_driver(struct sdio_driver *drv, struct module *owner)
272273
{
273274
drv->drv.name = drv->name;
274275
drv->drv.bus = &sdio_bus_type;
276+
drv->drv.owner = owner;
277+
275278
return driver_register(&drv->drv);
276279
}
277-
EXPORT_SYMBOL_GPL(sdio_register_driver);
280+
EXPORT_SYMBOL_GPL(__sdio_register_driver);
278281

279282
/**
280283
* sdio_unregister_driver - unregister a function driver

include/linux/mmc/sdio_func.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,10 @@ struct sdio_driver {
106106
.class = (dev_class), \
107107
.vendor = SDIO_ANY_ID, .device = SDIO_ANY_ID
108108

109-
extern int sdio_register_driver(struct sdio_driver *);
109+
/* use a macro to avoid include chaining to get THIS_MODULE */
110+
#define sdio_register_driver(drv) \
111+
__sdio_register_driver(drv, THIS_MODULE)
112+
extern int __sdio_register_driver(struct sdio_driver *, struct module *);
110113
extern void sdio_unregister_driver(struct sdio_driver *);
111114

112115
/**

0 commit comments

Comments
 (0)