===== hcd.c 1.123 vs edited =====
--- 1.123/drivers/usb/core/hcd.c	Sun Dec  7 04:29:05 2003
+++ edited/hcd.c	Wed Dec 10 13:06:19 2003
@@ -588,6 +588,9 @@
 
 	if (bus->release)
 		bus->release(bus);
+	/* FIXME change this when the driver core gets the
+	 * class_device_unregister_wait() call */
+	complete(&bus->released);
 }
 
 static struct class usb_host_class = {
@@ -724,7 +727,11 @@
 
 	clear_bit (bus->busnum, busmap.busmap);
 
+	/* FIXME change this when the driver core gets the
+	 * class_device_unregister_wait() call */
+	init_completion(&bus->released);
 	class_device_unregister(&bus->class_dev);
+	wait_for_completion(&bus->released);
 }
 EXPORT_SYMBOL (usb_deregister_bus);
 
===== usb.h 1.164 vs edited =====
--- 1.164/include/linux/usb.h	Mon Oct  6 10:46:13 2003
+++ edited/usb.h	Wed Dec 10 13:07:27 2003
@@ -210,6 +210,8 @@
 
 	struct class_device class_dev;	/* class device for this bus */
 	void (*release)(struct usb_bus *bus);	/* function to destroy this bus's memory */
+	/* FIXME, remove this when the driver core gets class_device_unregister_wait */
+	struct completion released;
 };
 #define	to_usb_bus(d) container_of(d, struct usb_bus, class_dev)