mmc: sdio: store owner from modules with sdio_register_driver()
authorKrzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Fri, 29 Mar 2024 17:24:31 +0000 (18:24 +0100)
committerUlf Hansson <ulf.hansson@linaro.org>
Tue, 2 Apr 2024 10:50:14 +0000 (12:50 +0200)
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 9447057eaff8 ("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>
drivers/mmc/core/sdio_bus.c
include/linux/mmc/sdio_func.h

index 71d885fbc22876f51a231f8c4a0a143af2326c22..c5fdfe2325f8f49a1f88cf18d510b72e4f6c3753 100644 (file)
@@ -265,16 +265,19 @@ void sdio_unregister_bus(void)
 }
 
 /**
- *     sdio_register_driver - register a function driver
+ *     __sdio_register_driver - register a function driver
  *     @drv: SDIO function driver
+ *     @owner: owning module/driver
  */
-int sdio_register_driver(struct sdio_driver *drv)
+int __sdio_register_driver(struct sdio_driver *drv, struct module *owner)
 {
        drv->drv.name = drv->name;
        drv->drv.bus = &sdio_bus_type;
+       drv->drv.owner = owner;
+
        return driver_register(&drv->drv);
 }
-EXPORT_SYMBOL_GPL(sdio_register_driver);
+EXPORT_SYMBOL_GPL(__sdio_register_driver);
 
 /**
  *     sdio_unregister_driver - unregister a function driver
index 478855b8e406f9267f4ca5702b35343fe8f1042c..fed1f5f4a8d333b396112611cdb37ff325bf117f 100644 (file)
@@ -106,7 +106,10 @@ struct sdio_driver {
        .class = (dev_class), \
        .vendor = SDIO_ANY_ID, .device = SDIO_ANY_ID
 
-extern int sdio_register_driver(struct sdio_driver *);
+/* use a macro to avoid include chaining to get THIS_MODULE */
+#define sdio_register_driver(drv) \
+       __sdio_register_driver(drv, THIS_MODULE)
+extern int __sdio_register_driver(struct sdio_driver *, struct module *);
 extern void sdio_unregister_driver(struct sdio_driver *);
 
 /**