* See driver_probe_device() in driver/base/dd.c
                 */
                rc = -ENODEV;
-               goto sdev_free;
+               if (!busid_priv)
+                       goto sdev_free;
+
+               goto call_put_busid_priv;
        }
 
        if (udev->descriptor.bDeviceClass == USB_CLASS_HUB) {
                dev_dbg(&udev->dev, "%s is a usb hub device... skip!\n",
                         udev_busid);
                rc = -ENODEV;
-               goto sdev_free;
+               goto call_put_busid_priv;
        }
 
        if (!strcmp(udev->bus->bus_name, "vhci_hcd")) {
                        udev_busid);
 
                rc = -ENODEV;
-               goto sdev_free;
+               goto call_put_busid_priv;
        }
 
 
        save_status = busid_priv->status;
        busid_priv->status = STUB_BUSID_ALLOC;
 
+       /* release the busid_lock */
+       put_busid_priv(busid_priv);
+
        /*
         * Claim this hub port.
         * It doesn't matter what value we pass as owner
                goto err_port;
        }
 
-       /* release the busid_lock */
-       put_busid_priv(busid_priv);
-
        rc = stub_add_files(&udev->dev);
        if (rc) {
                dev_err(&udev->dev, "stub_add_files for %s\n", udev_busid);
        spin_lock(&busid_priv->busid_lock);
        busid_priv->sdev = NULL;
        busid_priv->status = save_status;
-sdev_free:
-       stub_device_free(sdev);
+       spin_unlock(&busid_priv->busid_lock);
+       /* lock is released - go to free */
+       goto sdev_free;
+
+call_put_busid_priv:
        /* release the busid_lock */
        put_busid_priv(busid_priv);
 
+sdev_free:
+       stub_device_free(sdev);
+
        return rc;
 }
 
        /* get stub_device */
        if (!sdev) {
                dev_err(&udev->dev, "could not get device");
-               goto call_put_busid_priv;
+               /* release busid_lock */
+               put_busid_priv(busid_priv);
+               return;
        }
 
        dev_set_drvdata(&udev->dev, NULL);
        if (!busid_priv->shutdown_busid)
                busid_priv->shutdown_busid = 1;
        /* release busid_lock */
-       put_busid_priv(busid_priv);
+       spin_unlock(&busid_priv->busid_lock);
 
        /* shutdown the current connection */
        shutdown_busid(busid_priv);
 
        if (busid_priv->status == STUB_BUSID_ALLOC)
                busid_priv->status = STUB_BUSID_ADDED;
-
-call_put_busid_priv:
        /* release busid_lock */
-       put_busid_priv(busid_priv);
+       spin_unlock(&busid_priv->busid_lock);
+       return;
 }
 
 #ifdef CONFIG_PM