diff options
Diffstat (limited to 'drivers/usb/core/file.c')
-rw-r--r-- | drivers/usb/core/file.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/drivers/usb/core/file.c b/drivers/usb/core/file.c index 65de6f73b672..558890ada0e5 100644 --- a/drivers/usb/core/file.c +++ b/drivers/usb/core/file.c | |||
@@ -193,9 +193,10 @@ int usb_register_dev(struct usb_interface *intf, | |||
193 | intf->minor = minor; | 193 | intf->minor = minor; |
194 | break; | 194 | break; |
195 | } | 195 | } |
196 | up_write(&minor_rwsem); | 196 | if (intf->minor < 0) { |
197 | if (intf->minor < 0) | 197 | up_write(&minor_rwsem); |
198 | return -EXFULL; | 198 | return -EXFULL; |
199 | } | ||
199 | 200 | ||
200 | /* create a usb class device for this usb interface */ | 201 | /* create a usb class device for this usb interface */ |
201 | snprintf(name, sizeof(name), class_driver->name, minor - minor_base); | 202 | snprintf(name, sizeof(name), class_driver->name, minor - minor_base); |
@@ -203,12 +204,11 @@ int usb_register_dev(struct usb_interface *intf, | |||
203 | MKDEV(USB_MAJOR, minor), class_driver, | 204 | MKDEV(USB_MAJOR, minor), class_driver, |
204 | "%s", kbasename(name)); | 205 | "%s", kbasename(name)); |
205 | if (IS_ERR(intf->usb_dev)) { | 206 | if (IS_ERR(intf->usb_dev)) { |
206 | down_write(&minor_rwsem); | ||
207 | usb_minors[minor] = NULL; | 207 | usb_minors[minor] = NULL; |
208 | intf->minor = -1; | 208 | intf->minor = -1; |
209 | up_write(&minor_rwsem); | ||
210 | retval = PTR_ERR(intf->usb_dev); | 209 | retval = PTR_ERR(intf->usb_dev); |
211 | } | 210 | } |
211 | up_write(&minor_rwsem); | ||
212 | return retval; | 212 | return retval; |
213 | } | 213 | } |
214 | EXPORT_SYMBOL_GPL(usb_register_dev); | 214 | EXPORT_SYMBOL_GPL(usb_register_dev); |
@@ -234,12 +234,12 @@ void usb_deregister_dev(struct usb_interface *intf, | |||
234 | return; | 234 | return; |
235 | 235 | ||
236 | dev_dbg(&intf->dev, "removing %d minor\n", intf->minor); | 236 | dev_dbg(&intf->dev, "removing %d minor\n", intf->minor); |
237 | device_destroy(usb_class->class, MKDEV(USB_MAJOR, intf->minor)); | ||
237 | 238 | ||
238 | down_write(&minor_rwsem); | 239 | down_write(&minor_rwsem); |
239 | usb_minors[intf->minor] = NULL; | 240 | usb_minors[intf->minor] = NULL; |
240 | up_write(&minor_rwsem); | 241 | up_write(&minor_rwsem); |
241 | 242 | ||
242 | device_destroy(usb_class->class, MKDEV(USB_MAJOR, intf->minor)); | ||
243 | intf->usb_dev = NULL; | 243 | intf->usb_dev = NULL; |
244 | intf->minor = -1; | 244 | intf->minor = -1; |
245 | destroy_usb_class(); | 245 | destroy_usb_class(); |