linux-2.6.21.5-006-wait-for-async-scanned-block-devices.patch 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. diff --git a/init/do_mounts.c b/init/do_mounts.c
  2. index 46fe407..efc134c 100644
  3. --- a/init/do_mounts.c
  4. +++ b/init/do_mounts.c
  5. @@ -25,6 +25,7 @@ int __initdata rd_doload; /* 1 = load RAM disk, 0 = don't load */
  6. int root_mountflags = MS_RDONLY | MS_SILENT;
  7. char * __initdata root_device_name;
  8. static char __initdata saved_root_name[64];
  9. +int __initdata root_wait;
  10. dev_t ROOT_DEV;
  11. @@ -216,6 +217,14 @@ static int __init root_dev_setup(char *line)
  12. __setup("root=", root_dev_setup);
  13. +static int __init rootwait_setup(char *line)
  14. +{
  15. + root_wait = simple_strtol(line,NULL,0);
  16. + return 1;
  17. +}
  18. +
  19. +__setup("rootwait=", rootwait_setup);
  20. +
  21. static char * __initdata root_mount_data;
  22. static int __init root_data_setup(char *str)
  23. {
  24. @@ -438,11 +447,24 @@ void __init prepare_namespace(void)
  25. root_device_name += 5;
  26. }
  27. - is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR;
  28. -
  29. if (initrd_load())
  30. goto out;
  31. + /* wait for any asynchronous scanning to complete */
  32. + if ((ROOT_DEV == 0) && root_wait) {
  33. + printk(KERN_INFO "Waiting for root device %s...\n",
  34. + saved_root_name);
  35. + do {
  36. + while (driver_probe_done() != 0)
  37. + msleep(100);
  38. + ROOT_DEV = name_to_dev_t(saved_root_name);
  39. + if (ROOT_DEV == 0)
  40. + msleep(100);
  41. + } while (ROOT_DEV == 0);
  42. + }
  43. +
  44. + is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR;
  45. +
  46. if (is_floppy && rd_doload && rd_load_disk(0))
  47. ROOT_DEV = Root_RAM0;