diff options
author | Tilman Schmidt <tilman@imap.cc> | 2010-09-30 09:34:30 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-10-01 03:33:32 -0400 |
commit | b33ffa5cbf52ee751bb8068218ebb3c742c5a515 (patch) | |
tree | b97dc8afef26b82c8064cf1eff63710d028434a2 /drivers/isdn | |
parent | c7ebfdaca0b89fe9d846e93b249303313612d0e3 (diff) |
isdn/gigaset: bas_gigaset locking fix
Unlock cs->lock before calling error_hangup() which is marked
"cs->lock must not be held".
Signed-off-by: Tilman Schmidt <tilman@imap.cc>
CC: stable <stable@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/isdn')
-rw-r--r-- | drivers/isdn/gigaset/bas-gigaset.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/drivers/isdn/gigaset/bas-gigaset.c b/drivers/isdn/gigaset/bas-gigaset.c index 707d9c94cf9e..e143050e1b5c 100644 --- a/drivers/isdn/gigaset/bas-gigaset.c +++ b/drivers/isdn/gigaset/bas-gigaset.c | |||
@@ -1598,13 +1598,13 @@ static int gigaset_init_bchannel(struct bc_state *bcs) | |||
1598 | 1598 | ||
1599 | ret = starturbs(bcs); | 1599 | ret = starturbs(bcs); |
1600 | if (ret < 0) { | 1600 | if (ret < 0) { |
1601 | spin_unlock_irqrestore(&cs->lock, flags); | ||
1601 | dev_err(cs->dev, | 1602 | dev_err(cs->dev, |
1602 | "could not start isochronous I/O for channel B%d: %s\n", | 1603 | "could not start isochronous I/O for channel B%d: %s\n", |
1603 | bcs->channel + 1, | 1604 | bcs->channel + 1, |
1604 | ret == -EFAULT ? "null URB" : get_usb_rcmsg(ret)); | 1605 | ret == -EFAULT ? "null URB" : get_usb_rcmsg(ret)); |
1605 | if (ret != -ENODEV) | 1606 | if (ret != -ENODEV) |
1606 | error_hangup(bcs); | 1607 | error_hangup(bcs); |
1607 | spin_unlock_irqrestore(&cs->lock, flags); | ||
1608 | return ret; | 1608 | return ret; |
1609 | } | 1609 | } |
1610 | 1610 | ||
@@ -1614,11 +1614,11 @@ static int gigaset_init_bchannel(struct bc_state *bcs) | |||
1614 | dev_err(cs->dev, "could not open channel B%d\n", | 1614 | dev_err(cs->dev, "could not open channel B%d\n", |
1615 | bcs->channel + 1); | 1615 | bcs->channel + 1); |
1616 | stopurbs(bcs->hw.bas); | 1616 | stopurbs(bcs->hw.bas); |
1617 | if (ret != -ENODEV) | ||
1618 | error_hangup(bcs); | ||
1619 | } | 1617 | } |
1620 | 1618 | ||
1621 | spin_unlock_irqrestore(&cs->lock, flags); | 1619 | spin_unlock_irqrestore(&cs->lock, flags); |
1620 | if (ret < 0 && ret != -ENODEV) | ||
1621 | error_hangup(bcs); | ||
1622 | return ret; | 1622 | return ret; |
1623 | } | 1623 | } |
1624 | 1624 | ||