User: | Jiri Slaby |
Error type: | Double Lock |
Error type description: | Some lock is locked twice unintentionally in a sequence |
File location: | drivers/usb/serial/digi_acceleport.c |
Line in file: | 790 |
Project: | Linux Kernel |
Project version: | 2.6.28 |
Tools: |
Clang Static Analyzer
(3.0)
Smatch (1.59) |
Entered: | 2012-04-17 12:29:30 UTC |
760 * -EINTR if interrupted while sleeping, or a non-zero error 761 * returned by usb_submit_urb. 762 */ 763 764static int digi_set_modem_signals(struct usb_serial_port *port, 765 unsigned int modem_signals, int interruptible) 766{ 767 768 int ret; 769 struct digi_port *port_priv = usb_get_serial_port_data(port); 770 struct usb_serial_port *oob_port = (struct usb_serial_port *) ((struct digi_serial *)(usb_get_serial_data(port->serial)))->ds_oob_port; 771 struct digi_port *oob_priv = usb_get_serial_port_data(oob_port); 772 unsigned char *data = oob_port->write_urb->transfer_buffer; 773 unsigned long flags = 0; 774 775 776 dbg("digi_set_modem_signals: TOP: port=%d, modem_signals=0x%x", 777 port_priv->dp_port_num, modem_signals); 778 779 spin_lock_irqsave(&oob_priv->dp_port_lock, flags); 780 spin_lock(&port_priv->dp_port_lock); 781 782 while (oob_port->write_urb->status == -EINPROGRESS || 783 oob_priv->dp_write_urb_in_use) { 784 spin_unlock(&port_priv->dp_port_lock); 785 cond_wait_interruptible_timeout_irqrestore( 786 &oob_port->write_wait, DIGI_RETRY_TIMEOUT, 787 &oob_priv->dp_port_lock, flags); 788 if (interruptible && signal_pending(current)) 789 return -EINTR; 790 spin_lock_irqsave(&oob_priv->dp_port_lock, flags); 791 spin_lock(&port_priv->dp_port_lock); 792 } 793 data[0] = DIGI_CMD_SET_DTR_SIGNAL; 794 data[1] = port_priv->dp_port_num; 795 data[2] = (modem_signals & TIOCM_DTR) ? 796 DIGI_DTR_ACTIVE : DIGI_DTR_INACTIVE; 797 data[3] = 0; 798 data[4] = DIGI_CMD_SET_RTS_SIGNAL; 799 data[5] = port_priv->dp_port_num; 800 data[6] = (modem_signals & TIOCM_RTS) ?