|
|
@@ -193,9 +193,10 @@ int usb_register_dev(struct usb_interface *intf,
|
|
|
intf->minor = minor;
|
|
|
break;
|
|
|
}
|
|
|
- up_write(&minor_rwsem);
|
|
|
- if (intf->minor < 0)
|
|
|
+ if (intf->minor < 0) {
|
|
|
+ up_write(&minor_rwsem);
|
|
|
return -EXFULL;
|
|
|
+ }
|
|
|
|
|
|
/* create a usb class device for this usb interface */
|
|
|
snprintf(name, sizeof(name), class_driver->name, minor - minor_base);
|
|
|
@@ -203,12 +204,11 @@ int usb_register_dev(struct usb_interface *intf,
|
|
|
MKDEV(USB_MAJOR, minor), class_driver,
|
|
|
"%s", kbasename(name));
|
|
|
if (IS_ERR(intf->usb_dev)) {
|
|
|
- down_write(&minor_rwsem);
|
|
|
usb_minors[minor] = NULL;
|
|
|
intf->minor = -1;
|
|
|
- up_write(&minor_rwsem);
|
|
|
retval = PTR_ERR(intf->usb_dev);
|
|
|
}
|
|
|
+ up_write(&minor_rwsem);
|
|
|
return retval;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(usb_register_dev);
|
|
|
@@ -234,12 +234,12 @@ void usb_deregister_dev(struct usb_interface *intf,
|
|
|
return;
|
|
|
|
|
|
dev_dbg(&intf->dev, "removing %d minor\n", intf->minor);
|
|
|
+ device_destroy(usb_class->class, MKDEV(USB_MAJOR, intf->minor));
|
|
|
|
|
|
down_write(&minor_rwsem);
|
|
|
usb_minors[intf->minor] = NULL;
|
|
|
up_write(&minor_rwsem);
|
|
|
|
|
|
- device_destroy(usb_class->class, MKDEV(USB_MAJOR, intf->minor));
|
|
|
intf->usb_dev = NULL;
|
|
|
intf->minor = -1;
|
|
|
destroy_usb_class();
|