this fixes a race between open and disconnect in the CDC ACM driver.
Signed-off-by: Oliver Neukum <oneukum@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
           otherwise it is scheduled, and with high data rates data can get lost. */
        tty->low_latency = 1;
 
-       if (usb_autopm_get_interface(acm->control)) {
-               mutex_unlock(&open_mutex);
-               return -EIO;
-       }
+       if (usb_autopm_get_interface(acm->control) < 0)
+               goto early_bail;
 
        mutex_lock(&acm->mutex);
-       mutex_unlock(&open_mutex);
        if (acm->used++) {
                usb_autopm_put_interface(acm->control);
                goto done;
 done:
 err_out:
        mutex_unlock(&acm->mutex);
+       mutex_unlock(&open_mutex);
        return rv;
 
 full_bailout:
        usb_autopm_put_interface(acm->control);
        acm->used--;
        mutex_unlock(&acm->mutex);
+early_bail:
+       mutex_unlock(&open_mutex);
        return -EIO;
 }