2009/5/5 Ming Lei <tom.leiming@xxxxxxxxx>: > On Mon, 4 May 2009 11:07:52 -0400 (EDT) > Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> wrote: > >> On Mon, 4 May 2009, Arjan van de Ven wrote: >> >> > > > for normal device probing we already have infrastructure >> > > > though... wait_for_device_probe, driver_probe_done and >> > > > friends... (the scsi scanning thread is being converted to the >> > > > async infrastructure btw) >> > > > >> > > > do we need to invent more ? >> > > >> > > I suppose the usb-storage scanning thread could also be converted >> > > to the async infrastructure, although I haven't heard of anybody >> > > working on it. >> > > >> > > But the USB hub driver's thread (khubd) cannot be converted. It >> > > is central to the discovery of USB-based block devices. How >> > > would you handle that? >> > >> > take a ref in the driver_probe_done() sense, and release it when you >> > know you're done probing.... >> > >> > at that point all existing infrastructure will just work. >> >> Isn't there still something missing? The wait_for_device_probe() >> routine would wait until all attached devices had been probed. But >> why should prepare_namespace() have to wait that long? Wouldn't it be >> better to wait only until the root device has been registered? > > Yes, maybe David should merge the following patch into the patch > No.5(initdev:kernel: USB and SCSI block init device notification, v3). > > Right? Also need all block device drivers use initdev_*, much work to do,:-) > > diff --git a/init/do_mounts.c b/init/do_mounts.c > index dd7ee5f..22fd773 100644 > --- a/init/do_mounts.c > +++ b/init/do_mounts.c > @@ -358,6 +358,12 @@ void __init mount_root(void) > #endif > } > > +static int root_dev_done() > +{ > + return !!(ROOT_DEV = name_to_dev_t(saved_root_name)); > +} > + > + > /* > * Prepare the namespace - decide what/where to mount, load ramdisks, > etc. */ > @@ -398,12 +404,12 @@ void __init prepare_namespace(void) > goto out; > > /* wait for any asynchronous scanning to complete */ > - if ((ROOT_DEV == 0) && root_wait) { > + if (ROOT_DEV == 0 && root_wait) { > printk(KERN_INFO "Waiting for root device %s...\n", > saved_root_name); > - while (driver_probe_done() != 0 || > - (ROOT_DEV = name_to_dev_t(saved_root_name)) == > 0) > - msleep(100); > + do { > + initdev_wait(BOOTDEV_BLOCK, root_dev_done); > + } while (!ROOT_DEV); > async_synchronize_full(); > } > > > > > -- > Lei Ming > -- Lei Ming -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html