aboutsummaryrefslogtreecommitdiffstats
path: root/usb.current/usb-serial-fix-leak-of-usb-serial-module-refrence-count.patch
diff options
Diffstat (limited to 'usb.current/usb-serial-fix-leak-of-usb-serial-module-refrence-count.patch')
-rw-r--r--usb.current/usb-serial-fix-leak-of-usb-serial-module-refrence-count.patch117
1 files changed, 0 insertions, 117 deletions
diff --git a/usb.current/usb-serial-fix-leak-of-usb-serial-module-refrence-count.patch b/usb.current/usb-serial-fix-leak-of-usb-serial-module-refrence-count.patch
deleted file mode 100644
index 3e5fed200af458..00000000000000
--- a/usb.current/usb-serial-fix-leak-of-usb-serial-module-refrence-count.patch
+++ /dev/null
@@ -1,117 +0,0 @@
-From tom.leiming@gmail.com Thu Aug 12 13:50:12 2010
-From: tom.leiming@gmail.com
-To: greg@kroah.com,
- stern@rowland.harvard.edu
-Cc: linux-usb@vger.kernel.org, Ming Lei <tom.leiming@gmail.com>, Johan Hovold <jhovold@gmail.com>, Andi Kleen <ak@linux.intel.com>
-Subject: USB: serial: fix leak of usb serial module refrence count
-Date: Sat, 7 Aug 2010 16:20:35 +0800
-Message-Id: <1281169235-4883-1-git-send-email-tom.leiming@gmail.com>
-
-From: Ming Lei <tom.leiming@gmail.com>
-
-The patch with title below makes reference count of usb serial module
-always more than one after driver is bound.
-
- USB-BKL: Remove BKL use for usb serial driver probing
-
-In fact, the patch above only replaces lock_kernel() with try_module_get()
-, and does not use module_put() to do what unlock_kernel() did, so casue leak
-of reference count of usb serial module and the module can not be unloaded
-after serial driver is bound with device.
-
-This patch fixes the issue, also simplifies such things:
- -only call try_module_get() once in the entry of usb_serial_probe()
- -only call module_put() once in the exit of usb_serial_probe
-
-Signed-off-by: Ming Lei <tom.leiming@gmail.com>
-Cc: Johan Hovold <jhovold@gmail.com>
-Cc: Andi Kleen <ak@linux.intel.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-
----
- drivers/usb/serial/usb-serial.c | 23 +++++++----------------
- 1 file changed, 7 insertions(+), 16 deletions(-)
-
---- a/drivers/usb/serial/usb-serial.c
-+++ b/drivers/usb/serial/usb-serial.c
-@@ -736,6 +736,7 @@ int usb_serial_probe(struct usb_interfac
-
- serial = create_serial(dev, interface, type);
- if (!serial) {
-+ module_put(type->driver.owner);
- dev_err(&interface->dev, "%s - out of memory\n", __func__);
- return -ENOMEM;
- }
-@@ -746,11 +747,11 @@ int usb_serial_probe(struct usb_interfac
-
- id = get_iface_id(type, interface);
- retval = type->probe(serial, id);
-- module_put(type->driver.owner);
-
- if (retval) {
- dbg("sub driver rejected device");
- kfree(serial);
-+ module_put(type->driver.owner);
- return retval;
- }
- }
-@@ -822,6 +823,7 @@ int usb_serial_probe(struct usb_interfac
- if (num_bulk_in == 0 || num_bulk_out == 0) {
- dev_info(&interface->dev, "PL-2303 hack: descriptors matched but endpoints did not\n");
- kfree(serial);
-+ module_put(type->driver.owner);
- return -ENODEV;
- }
- }
-@@ -835,22 +837,15 @@ int usb_serial_probe(struct usb_interfac
- dev_err(&interface->dev,
- "Generic device with no bulk out, not allowed.\n");
- kfree(serial);
-+ module_put(type->driver.owner);
- return -EIO;
- }
- }
- #endif
- if (!num_ports) {
- /* if this device type has a calc_num_ports function, call it */
-- if (type->calc_num_ports) {
-- if (!try_module_get(type->driver.owner)) {
-- dev_err(&interface->dev,
-- "module get failed, exiting\n");
-- kfree(serial);
-- return -EIO;
-- }
-+ if (type->calc_num_ports)
- num_ports = type->calc_num_ports(serial);
-- module_put(type->driver.owner);
-- }
- if (!num_ports)
- num_ports = type->num_ports;
- }
-@@ -1039,13 +1034,7 @@ int usb_serial_probe(struct usb_interfac
-
- /* if this device type has an attach function, call it */
- if (type->attach) {
-- if (!try_module_get(type->driver.owner)) {
-- dev_err(&interface->dev,
-- "module get failed, exiting\n");
-- goto probe_error;
-- }
- retval = type->attach(serial);
-- module_put(type->driver.owner);
- if (retval < 0)
- goto probe_error;
- serial->attached = 1;
-@@ -1088,10 +1077,12 @@ int usb_serial_probe(struct usb_interfac
- exit:
- /* success */
- usb_set_intfdata(interface, serial);
-+ module_put(type->driver.owner);
- return 0;
-
- probe_error:
- usb_serial_put(serial);
-+ module_put(type->driver.owner);
- return -EIO;
- }
- EXPORT_SYMBOL_GPL(usb_serial_probe);