Hello. When search encounters an unknown filesystem or filesystem
without partition it triggers fs module autoload which takes
noticeable time. To improve the situation I propose (after discussing
with Robert Millan) to first search without autoloading modules if we
need to find only one device (with --set ) and retry with autoloading
if without autoloading the search failed. Additionally I modify
grub-mkconfig to load correct module manually before issuing search to
decrease booting time if filesystem is different that our boot one.

-- 
Regards
Vladimir 'phcoder' Serbinenko

Personal git repository: http://repo.or.cz/w/grub2/phcoder.git
diff --git a/ChangeLog b/ChangeLog
index 8b76b58..31f33f7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2009-08-14  Vladimir Serbinenko  <phco...@gmail.com>
 
+       * commands/search.c (search_fs): Try searching without autoload first.
+       * util/grub-mkconfig_lib.in (prepare_grub_to_access_device): Load
+       filesystem module explicitly for faster booting.
+
+2009-08-14  Vladimir Serbinenko  <phco...@gmail.com>
+
        * loader/i386/multiboot.c (grub_multiboot_unload): Don't free mbi and
        mbi->cmdline but free playground.
 
diff --git a/commands/search.c b/commands/search.c
index d10b51a..0cfd0eb 100644
--- a/commands/search.c
+++ b/commands/search.c
@@ -51,6 +51,7 @@ search_fs (const char *key, const char *var, int no_floppy, 
enum options type)
 {
   int count = 0;
   char *buf = NULL;
+  grub_fs_autoload_hook_t saved_autoload;
 
   auto int iterate_device (const char *name);
   int iterate_device (const char *name)
@@ -131,7 +132,22 @@ search_fs (const char *key, const char *var, int 
no_floppy, enum options type)
     return (found && var);
   }
 
-  grub_device_iterate (iterate_device);
+  /* First try without autoloading if we're setting variable. */
+  if (var)
+    {
+      saved_autoload = grub_fs_autoload_hook;
+      grub_fs_autoload_hook = 0;
+      grub_device_iterate (iterate_device);
+
+      /* Restore autoload hook.  */
+      grub_fs_autoload_hook = saved_autoload;
+
+      /* Retry with autoload if nothing found.  */
+      if (grub_errno == GRUB_ERR_NONE && count == 0)
+       grub_device_iterate (iterate_device);
+    }
+  else
+    grub_device_iterate (iterate_device);
 
   grub_free (buf);
 
diff --git a/util/grub-mkconfig_lib.in b/util/grub-mkconfig_lib.in
index 3585a68..2385b08 100644
--- a/util/grub-mkconfig_lib.in
+++ b/util/grub-mkconfig_lib.in
@@ -140,6 +140,11 @@ prepare_grub_to_access_device ()
     echo "insmod ${module}"
   done
 
+  fs="`${grub_probe} --device ${device} --target=fs`"
+  for module in ${fs} ; do
+    echo "insmod ${module}"
+  done
+
   # If there's a filesystem UUID that GRUB is capable of identifying, use it;
   # otherwise set root as per value in device.map.
   echo "set root=`${grub_probe} --device ${device} --target=drive`"
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to