aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/serial/usb-serial.c
diff options
context:
space:
mode:
authorAlan Stern <stern@rowland.harvard.edu>2008-07-29 12:01:04 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2008-08-13 17:32:50 -0700
commit0282b7f2a874e72c18fcd5a112ccf67f71ba7f5c (patch)
tree85db6db24e0ee5d8c018fa9b58a720d3da521b64 /drivers/usb/serial/usb-serial.c
parente67d70f2f55d90c79dcb384ad5b798f0f9a68085 (diff)
downloadkernel_samsung_smdk4412-0282b7f2a874e72c18fcd5a112ccf67f71ba7f5c.zip
kernel_samsung_smdk4412-0282b7f2a874e72c18fcd5a112ccf67f71ba7f5c.tar.gz
kernel_samsung_smdk4412-0282b7f2a874e72c18fcd5a112ccf67f71ba7f5c.tar.bz2
usb-serial: don't release unregistered minors
This patch (as1121) fixes a bug in the USB serial core. When a device is unregistered, the core will give back its minors -- even if the device hasn't been assigned any! The patch reserves the highest minor value (255) to mean that no minor was assigned. It also removes some dead code and does a small style fixup. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Cc: stable <stable@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/serial/usb-serial.c')
-rw-r--r--drivers/usb/serial/usb-serial.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
index 8c2d531..b157c48 100644
--- a/drivers/usb/serial/usb-serial.c
+++ b/drivers/usb/serial/usb-serial.c
@@ -122,9 +122,6 @@ static void return_serial(struct usb_serial *serial)
dbg("%s", __func__);
- if (serial == NULL)
- return;
-
for (i = 0; i < serial->num_ports; ++i)
serial_table[serial->minor + i] = NULL;
}
@@ -142,7 +139,8 @@ static void destroy_serial(struct kref *kref)
serial->type->shutdown(serial);
/* return the minor range that this device had */
- return_serial(serial);
+ if (serial->minor != SERIAL_TTY_NO_MINOR)
+ return_serial(serial);
for (i = 0; i < serial->num_ports; ++i)
serial->port[i]->port.count = 0;
@@ -575,6 +573,7 @@ static struct usb_serial *create_serial(struct usb_device *dev,
serial->interface = interface;
kref_init(&serial->kref);
mutex_init(&serial->disc_mutex);
+ serial->minor = SERIAL_TTY_NO_MINOR;
return serial;
}