Use root_mount_hold and root_mount_rel to allow the USB bus to be explored

before trying to mount root. Unlike USB1 the busses are not explored at attach
but rather after threads are running.
This commit is contained in:
thompsa 2009-02-22 01:02:25 +00:00
parent 3bc203445d
commit 8f77bce477
2 changed files with 13 additions and 0 deletions

View File

@ -53,6 +53,7 @@ struct usb2_bus {
struct usb2_bus_stat stats_ok;
struct usb2_process explore_proc;
struct usb2_process roothub_proc;
struct root_hold_token *bus_roothold;
/*
* There are two callback processes. One for Giant locked
* callbacks. One for non-Giant locked callbacks. This should

View File

@ -126,6 +126,10 @@ usb2_attach(device_t dev)
DPRINTFN(0, "USB device has no ivars\n");
return (ENXIO);
}
/* delay vfs_mountroot until the bus is explored */
bus->bus_roothold = root_mount_hold(device_get_nameunit(dev));
if (usb2_post_init_called) {
mtx_lock(&Giant);
usb2_attach_sub(dev, bus);
@ -153,6 +157,10 @@ usb2_detach(device_t dev)
usb2_callout_drain(&bus->power_wdog);
/* Let the USB explore process detach all devices. */
if (bus->bus_roothold != NULL) {
root_mount_rel(bus->bus_roothold);
bus->bus_roothold = NULL;
}
USB_BUS_LOCK(bus);
if (usb2_proc_msignal(&bus->explore_proc,
@ -225,6 +233,10 @@ usb2_bus_explore(struct usb2_proc_msg *pm)
USB_BUS_LOCK(bus);
}
if (bus->bus_roothold != NULL) {
root_mount_rel(bus->bus_roothold);
bus->bus_roothold = NULL;
}
}
/*------------------------------------------------------------------------*