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

Configure Feed

Select the types of activity you want to include in your feed.

USB: serial: set driver owner when registering drivers

Modules registering drivers with usb_serial_register_drivers() 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
USB serial 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>
[ johan: amend commit summary ]
Signed-off-by: Johan Hovold <johan@kernel.org>

authored by

Krzysztof Kozlowski and committed by
Johan Hovold
af8a6e65 47ac09b9

+12 -7
+7 -5
drivers/usb/serial/usb-serial.c
··· 1459 1459 } 1460 1460 1461 1461 /** 1462 - * usb_serial_register_drivers - register drivers for a usb-serial module 1462 + * __usb_serial_register_drivers - register drivers for a usb-serial module 1463 1463 * @serial_drivers: NULL-terminated array of pointers to drivers to be registered 1464 + * @owner: owning module 1464 1465 * @name: name of the usb_driver for this set of @serial_drivers 1465 1466 * @id_table: list of all devices this @serial_drivers set binds to 1466 1467 * 1467 1468 * Registers all the drivers in the @serial_drivers array, and dynamically 1468 1469 * creates a struct usb_driver with the name @name and id_table of @id_table. 1469 1470 */ 1470 - int usb_serial_register_drivers(struct usb_serial_driver *const serial_drivers[], 1471 - const char *name, 1472 - const struct usb_device_id *id_table) 1471 + int __usb_serial_register_drivers(struct usb_serial_driver *const serial_drivers[], 1472 + struct module *owner, const char *name, 1473 + const struct usb_device_id *id_table) 1473 1474 { 1474 1475 int rc; 1475 1476 struct usb_driver *udriver; ··· 1515 1514 1516 1515 for (sd = serial_drivers; *sd; ++sd) { 1517 1516 (*sd)->usb_driver = udriver; 1517 + (*sd)->driver.owner = owner; 1518 1518 rc = usb_serial_register(*sd); 1519 1519 if (rc) 1520 1520 goto err_deregister_drivers; ··· 1534 1532 kfree(udriver); 1535 1533 return rc; 1536 1534 } 1537 - EXPORT_SYMBOL_GPL(usb_serial_register_drivers); 1535 + EXPORT_SYMBOL_GPL(__usb_serial_register_drivers); 1538 1536 1539 1537 /** 1540 1538 * usb_serial_deregister_drivers - deregister drivers for a usb-serial module
+5 -2
include/linux/usb/serial.h
··· 311 311 #define to_usb_serial_driver(d) \ 312 312 container_of(d, struct usb_serial_driver, driver) 313 313 314 - int usb_serial_register_drivers(struct usb_serial_driver *const serial_drivers[], 315 - const char *name, const struct usb_device_id *id_table); 314 + #define usb_serial_register_drivers(serial_drivers, name, id_table) \ 315 + __usb_serial_register_drivers(serial_drivers, THIS_MODULE, name, id_table) 316 + int __usb_serial_register_drivers(struct usb_serial_driver *const serial_drivers[], 317 + struct module *owner, const char *name, 318 + const struct usb_device_id *id_table); 316 319 void usb_serial_deregister_drivers(struct usb_serial_driver *const serial_drivers[]); 317 320 void usb_serial_port_softint(struct usb_serial_port *port); 318 321