Index: drivers/usb/class/cdc-acm.c |
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c |
index 5fb31170ddf02220ce333e763f2839261dfc1ae7..fc74de7455578d49ccccb21300e64a370641a3a4 100644 |
--- a/drivers/usb/class/cdc-acm.c |
+++ b/drivers/usb/class/cdc-acm.c |
@@ -556,7 +556,7 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp) |
acm = acm_table[tty->index]; |
if (!acm || !acm->dev) |
- goto err_out; |
+ goto out; |
else |
rv = 0; |
@@ -572,8 +572,9 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp) |
mutex_lock(&acm->mutex); |
if (acm->port.count++) { |
+ mutex_unlock(&acm->mutex); |
usb_autopm_put_interface(acm->control); |
- goto done; |
+ goto out; |
} |
acm->ctrlurb->dev = acm->dev; |
@@ -602,18 +603,18 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp) |
set_bit(ASYNCB_INITIALIZED, &acm->port.flags); |
rv = tty_port_block_til_ready(&acm->port, tty, filp); |
tasklet_schedule(&acm->urb_task); |
-done: |
+ |
mutex_unlock(&acm->mutex); |
-err_out: |
+out: |
mutex_unlock(&open_mutex); |
return rv; |
full_bailout: |
usb_kill_urb(acm->ctrlurb); |
bail_out: |
- usb_autopm_put_interface(acm->control); |
acm->port.count--; |
mutex_unlock(&acm->mutex); |
+ usb_autopm_put_interface(acm->control); |
early_bail: |
mutex_unlock(&open_mutex); |
tty_port_tty_set(&acm->port, NULL); |