Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

scsi: core: Store owner from modules with scsi_register_driver()

Modules registering driver with scsi_driver_register() 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
scsi code, just like we did for platform_driver in commit 9447057eaff8
("platform_device: use a macro instead of platform_driver_register").

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Link: https://lore.kernel.org/r/20240328-b4-module-owner-scsi-v1-1-c86cb4f6e91c@linaro.org
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

authored by

Krzysztof Kozlowski and committed by
Martin K. Petersen
65a09ba2 4e64bbba

+6 -3
+3 -2
drivers/scsi/scsi_sysfs.c
··· 1609 1609 } 1610 1610 EXPORT_SYMBOL(scsi_remove_target); 1611 1611 1612 - int scsi_register_driver(struct device_driver *drv) 1612 + int __scsi_register_driver(struct device_driver *drv, struct module *owner) 1613 1613 { 1614 1614 drv->bus = &scsi_bus_type; 1615 + drv->owner = owner; 1615 1616 1616 1617 return driver_register(drv); 1617 1618 } 1618 - EXPORT_SYMBOL(scsi_register_driver); 1619 + EXPORT_SYMBOL(__scsi_register_driver); 1619 1620 1620 1621 int scsi_register_interface(struct class_interface *intf) 1621 1622 {
+3 -1
include/scsi/scsi_driver.h
··· 22 22 #define to_scsi_driver(drv) \ 23 23 container_of((drv), struct scsi_driver, gendrv) 24 24 25 - extern int scsi_register_driver(struct device_driver *); 25 + #define scsi_register_driver(drv) \ 26 + __scsi_register_driver(drv, THIS_MODULE) 27 + int __scsi_register_driver(struct device_driver *, struct module *); 26 28 #define scsi_unregister_driver(drv) \ 27 29 driver_unregister(drv); 28 30