Showing error 1097

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


Source:

 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) ?
Show full sources