diff options
author | Fengwei Yin <xaityyy@gmail.com> | 2005-11-18 03:35:36 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-01-04 22:48:34 +0100 |
commit | 949bf6431189c62eeebd3b52201406ba9978f525 (patch) | |
tree | 50f4798f574d1c88828726e6b1f929361f10a6d5 /drivers/usb/gadget/serial.c | |
parent | [PATCH] USB: small cleanups (diff) | |
download | linux-949bf6431189c62eeebd3b52201406ba9978f525.tar.xz linux-949bf6431189c62eeebd3b52201406ba9978f525.zip |
[PATCH] USB: One potential problem in gadget/serial.c
It looks like that the gs_serial module maybe sleep with spinlock in gs_close.
Sometimes, system hang when I remove the gs_serial module.
From: Fengwei Yin <xaityyy@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/gadget/serial.c')
-rw-r--r-- | drivers/usb/gadget/serial.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/usb/gadget/serial.c b/drivers/usb/gadget/serial.c index b35ac6d334f8..65e084a2c87e 100644 --- a/drivers/usb/gadget/serial.c +++ b/drivers/usb/gadget/serial.c @@ -890,10 +890,12 @@ static void gs_close(struct tty_struct *tty, struct file *file) /* wait for write buffer to drain, or */ /* at most GS_CLOSE_TIMEOUT seconds */ if (gs_buf_data_avail(port->port_write_buf) > 0) { + spin_unlock_irqrestore(&port->port_lock, flags); wait_cond_interruptible_timeout(port->port_write_wait, port->port_dev == NULL || gs_buf_data_avail(port->port_write_buf) == 0, &port->port_lock, flags, GS_CLOSE_TIMEOUT * HZ); + spin_lock_irqsave(&port->port_lock, flags); } /* free disconnected port on final close */ |