On Mon, 27 Jul 2009 14:46:35 -0400 (EDT) Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> wrote: > [CC: list trimmed] > > Alan: > > I just tried testing this under 2.6.31-rc4 plus > gregkh-all-2.6.31-rc4.patch, and the results were pretty nasty. All I > did was plug in my pl2303-based USB serial device and type "cat > /dev/ttyUSB0". > > In serial_open(), the call to tty_port_block_til_ready() returned > -512, whatever that means. The error path at the end of serial_open() > then failed because it tried to release some mutexes that had already > been released. Okay, I fixed that, and then tty_open() died trying to > access deallocated memory. > > Do you have any idea what's going on or should I look more closely? I think this should whack the remaining usb serial problems. The tty_vhangup change I'll defer - its not critical and it's a late -rc. The other stuff should fix the both the port number leak and the crash - which was hidden by the other tty_port_block_until_wait bug when I was testing this stuff. Gak, pass the paper bags. commit 3f40612e940971ecec29d5375cdcc9f9c9a9f46e Author: Alan Cox <alan@xxxxxxxxxxxxxxx> Date: Tue Jul 28 00:23:39 2009 +0100 tty: USB lock/refcounting fixes This fixes - locking bug that was hidden by ecc2e05e739c30870c8e4f252b63a0c4041f2724 - Regression #13821 - Spurious warning when closing and blocking for data write out With these changes my PL2303 always ends up as ttyUSB0 when it should and the module refcounts stay correct. I'll do a more wholesale split & tidy of _open in the next release or two as we get a standard tty_port_open and port->ops->init port->ops->shutdown call backs. Signed-off-by: Alan Cox <alan@xxxxxxxxxxxxxxx> diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 3c8923f..99188c9 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c @@ -32,6 +32,7 @@ #include <linux/mutex.h> #include <linux/list.h> #include <linux/uaccess.h> +#include <linux/serial.h> #include <linux/usb.h> #include <linux/usb/serial.h> #include "pl2303.h" @@ -184,6 +185,7 @@ static int serial_open (struct tty_struct *tty, struct file *filp) struct usb_serial_port *port; unsigned int portNumber; int retval = 0; + int first = 0; dbg("%s", __func__); @@ -223,7 +225,7 @@ static int serial_open (struct tty_struct *tty, struct file *filp) /* If the console is attached, the device is already open */ if (port->port.count == 1 && !port->console) { - + first = 1; /* lock this module before we call it * this may fail, which means we must bail out, * safe because we are called with BKL held */ @@ -246,13 +248,21 @@ static int serial_open (struct tty_struct *tty, struct file *filp) if (retval) goto bailout_interface_put; mutex_unlock(&serial->disc_mutex); + set_bit(ASYNCB_INITIALIZED, &port->port.flags); } mutex_unlock(&port->mutex); /* Now do the correct tty layer semantics */ retval = tty_port_block_til_ready(&port->port, tty, filp); - if (retval == 0) + if (retval == 0) { + if (!first) + usb_serial_put(serial); return 0; - + } + mutex_lock(&port->mutex); + if (first == 0) + goto bailout_mutex_unlock; + /* Undo the initial port actions */ + mutex_lock(&serial->disc_mutex); bailout_interface_put: usb_autopm_put_interface(serial->interface); bailout_module_put: @@ -411,7 +421,6 @@ static int serial_chars_in_buffer(struct tty_struct *tty) struct usb_serial_port *port = tty->driver_data; dbg("%s = port %d", __func__, port->number); - WARN_ON(!port->port.count); /* if the device was unplugged then any remaining characters fell out of the connector ;) */ if (port->serial->disconnected) -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html