diff --git a/ChangeLog b/ChangeLog index 8b76b58..31f33f7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2009-08-14 Vladimir Serbinenko + * 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 + * 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`"