[PATCH] usbcore: Don't call device_release_driver recursively
This patch fixes usb_driver_release_interface() to make it avoid calling device_release_driver() recursively, i.e., when invoked from within the disconnect routine for the same device. The patch applies to your "driver" tree. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
		
							parent
							
								
									c95a6b057b
								
							
						
					
					
						commit
						f409661877
					
				| @ -322,9 +322,15 @@ void usb_driver_release_interface(struct usb_driver *driver, | ||||
| 	if (!dev->driver || dev->driver != &driver->driver) | ||||
| 		return; | ||||
| 
 | ||||
| 	/* don't disconnect from disconnect(), or before dev_add() */ | ||||
| 	if (!klist_node_attached(&dev->knode_driver) && !klist_node_attached(&dev->knode_bus)) | ||||
| 	/* don't release from within disconnect() */ | ||||
| 	if (iface->condition != USB_INTERFACE_BOUND) | ||||
| 		return; | ||||
| 
 | ||||
| 	/* release only after device_add() */ | ||||
| 	if (klist_node_attached(&dev->knode_bus)) { | ||||
| 		iface->condition = USB_INTERFACE_UNBINDING; | ||||
| 		device_release_driver(dev); | ||||
| 	} | ||||
| 
 | ||||
| 	dev->driver = NULL; | ||||
| 	usb_set_intfdata(iface, NULL); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user