Showing error 1698

User: Jiri Slaby
Error type: Double Unlock
Error type description: Some lock is unlocked twice unintentionally in a sequence
File location: drivers/char/specialix.c
Line in file: 1840
Project: Linux Kernel
Project version: 2.6.28
Confirmation: Fixed by 254702568da63ce6f5ad68e77d83b427da693654
Tools: Smatch (1.59)
Entered: 2013-09-10 15:16:58 UTC


Source:

1810        }
1811        spin_lock_irqsave(&bp->lock, flags);
1812        sx_out(bp, CD186x_CAR, port_No(port));
1813        sx_out(bp, CD186x_MSVR, port->MSVR);
1814        spin_unlock_irqrestore(&bp->lock, flags);
1815        spin_unlock_irqrestore(&port->lock, flags);
1816        func_exit();
1817        return 0;
1818}
1819
1820
1821static int sx_send_break(struct tty_struct *tty, int length)
1822{
1823        struct specialix_port *port = (struct specialix_port *)tty->driver_data;
1824        struct specialix_board *bp = port_Board(port);
1825        unsigned long flags;
1826
1827        func_enter();
1828        if (length == 0 || length == -1)
1829                return -EOPNOTSUPP;
1830
1831        spin_lock_irqsave(&port->lock, flags);
1832        port->break_length = SPECIALIX_TPS / HZ * length;
1833        port->COR2 |= COR2_ETC;
1834        port->IER  |= IER_TXRDY;
1835        spin_lock_irqsave(&bp->lock, flags);
1836        sx_out(bp, CD186x_CAR, port_No(port));
1837        sx_out(bp, CD186x_COR2, port->COR2);
1838        sx_out(bp, CD186x_IER, port->IER);
1839        spin_unlock_irqrestore(&bp->lock, flags);
1840        spin_unlock_irqrestore(&port->lock, flags);
1841        sx_wait_CCR(bp);
1842        spin_lock_irqsave(&bp->lock, flags);
1843        sx_out(bp, CD186x_CCR, CCR_CORCHG2);
1844        spin_unlock_irqrestore(&bp->lock, flags);
1845        sx_wait_CCR(bp);
1846
1847        func_exit();
1848        return 0;
1849}
1850
Show full sources