Commit af8a6e65 authored by Krzysztof Kozlowski's avatar Krzysztof Kozlowski Committed by Johan Hovold
Browse files

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 9447057e ("platform_device: use a macro instead of
platform_driver_register").

Signed-off-by: default avatarKrzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
[ johan: amend commit summary ]
Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
parent 47ac09b9
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -1459,16 +1459,17 @@ static void usb_serial_deregister(struct usb_serial_driver *device)
}

/**
 * usb_serial_register_drivers - register drivers for a usb-serial module
 * __usb_serial_register_drivers - register drivers for a usb-serial module
 * @serial_drivers: NULL-terminated array of pointers to drivers to be registered
 * @owner: owning module
 * @name: name of the usb_driver for this set of @serial_drivers
 * @id_table: list of all devices this @serial_drivers set binds to
 *
 * Registers all the drivers in the @serial_drivers array, and dynamically
 * creates a struct usb_driver with the name @name and id_table of @id_table.
 */
int usb_serial_register_drivers(struct usb_serial_driver *const serial_drivers[],
				const char *name,
int __usb_serial_register_drivers(struct usb_serial_driver *const serial_drivers[],
				  struct module *owner, const char *name,
				  const struct usb_device_id *id_table)
{
	int rc;
@@ -1514,6 +1515,7 @@ int usb_serial_register_drivers(struct usb_serial_driver *const serial_drivers[]

	for (sd = serial_drivers; *sd; ++sd) {
		(*sd)->usb_driver = udriver;
		(*sd)->driver.owner = owner;
		rc = usb_serial_register(*sd);
		if (rc)
			goto err_deregister_drivers;
@@ -1532,7 +1534,7 @@ int usb_serial_register_drivers(struct usb_serial_driver *const serial_drivers[]
	kfree(udriver);
	return rc;
}
EXPORT_SYMBOL_GPL(usb_serial_register_drivers);
EXPORT_SYMBOL_GPL(__usb_serial_register_drivers);

/**
 * usb_serial_deregister_drivers - deregister drivers for a usb-serial module
+5 −2
Original line number Diff line number Diff line
@@ -311,8 +311,11 @@ struct usb_serial_driver {
#define to_usb_serial_driver(d) \
	container_of(d, struct usb_serial_driver, driver)

int usb_serial_register_drivers(struct usb_serial_driver *const serial_drivers[],
		const char *name, const struct usb_device_id *id_table);
#define usb_serial_register_drivers(serial_drivers, name, id_table) \
	__usb_serial_register_drivers(serial_drivers, THIS_MODULE, name, id_table)
int __usb_serial_register_drivers(struct usb_serial_driver *const serial_drivers[],
				  struct module *owner, const char *name,
				  const struct usb_device_id *id_table);
void usb_serial_deregister_drivers(struct usb_serial_driver *const serial_drivers[]);
void usb_serial_port_softint(struct usb_serial_port *port);