Committed. On Thu, Jan 10, 2008 at 01:43:17PM +0100, Robert Millan wrote: > > New patch, a bit simpler (after giving it a though, I don't think the gained > speed is worth the extra complication) > > -- > Robert Millan > > <GPLv2> I know my rights; I want my phone call! > <DRM> What use is a phone call, if you are unable to speak? > (as seen on /.)
> > * include/grub/util/getroot.h (grub_dev_abstraction_types): New enum. > (grub_util_get_dev_abstraction): New function prototype. > > * util/getroot.c: Include `<grub/util/getroot.h>' > (grub_util_get_grub_dev): Move detection of abstraction type to ... > (grub_util_get_dev_abstraction): ... here (new function). > > * util/grub-probe.c: Convert PRINT_* to an enum. Add > `PRINT_ABSTRACTION'. > (probe): Probe for abstraction type when requested. > (main): Understand `--target=abstraction'. > > * util/i386/efi/grub-install.in: Add abstraction module to core > image when it is found to be necessary. > * util/i386/pc/grub-install.in: Likewise. > * util/powerpc/ieee1275/grub-install.in: Likewise. > > * util/update-grub_lib.in (font_path): Return system path without > converting to GRUB path. > * util/update-grub.in: Convert system path returned by font_path() > to a GRUB path. Use `grub-probe -t abstraction' to determine what > abstraction module is needed for loading fonts (if any). Export > that as `GRUB_PRELOAD_MODULES'. > * util/grub.d/00_header.in: Process `GRUB_PRELOAD_MODULES' (print > insmod commands). > > diff -x configure -x config.h.in -urp grub2/include/grub/util/getroot.h > lvmraid/include/grub/util/getroot.h > --- grub2/include/grub/util/getroot.h 2007-07-22 01:32:25.000000000 +0200 > +++ lvmraid/include/grub/util/getroot.h 2008-01-10 13:34:40.000000000 > +0100 > @@ -1,6 +1,6 @@ > /* > * GRUB -- GRand Unified Bootloader > - * Copyright (C) 2003, 2007 Free Software Foundation, Inc. > + * Copyright (C) 2003, 2007, 2008 Free Software Foundation, Inc. > * > * GRUB is free software: you can redistribute it and/or modify > * it under the terms of the GNU General Public License as published by > @@ -19,8 +19,15 @@ > #ifndef GRUB_UTIL_GETROOT_HEADER > #define GRUB_UTIL_GETROOT_HEADER 1 > > +enum grub_dev_abstraction_types { > + GRUB_DEV_ABSTRACTION_NONE, > + GRUB_DEV_ABSTRACTION_LVM, > + GRUB_DEV_ABSTRACTION_RAID, > +}; > + > char *grub_guess_root_device (const char *dir); > char *grub_get_prefix (const char *dir); > +int grub_util_get_dev_abstraction (const char *os_dev); > char *grub_util_get_grub_dev (const char *os_dev); > > #endif /* ! GRUB_UTIL_GETROOT_HEADER */ > diff -x configure -x config.h.in -urp grub2/util/getroot.c > lvmraid/util/getroot.c > --- grub2/util/getroot.c 2007-07-22 01:32:31.000000000 +0200 > +++ lvmraid/util/getroot.c 2008-01-10 13:33:02.000000000 +0100 > @@ -1,7 +1,7 @@ > /* getroot.c - Get root device */ > /* > * GRUB -- GRand Unified Bootloader > - * Copyright (C) 1999,2000,2001,2002,2003,2006,2007 Free Software > Foundation, Inc. > + * Copyright (C) 1999,2000,2001,2002,2003,2006,2007,2008 Free Software > Foundation, Inc. > * > * GRUB is free software: you can redistribute it and/or modify > * it under the terms of the GNU General Public License as published by > @@ -24,6 +24,7 @@ > > #include <grub/util/misc.h> > #include <grub/util/biosdisk.h> > +#include <grub/util/getroot.h> > > static void > strip_extra_slashes (char *dir) > @@ -239,27 +240,42 @@ grub_guess_root_device (const char *dir) > return os_dev; > } > > -char * > -grub_util_get_grub_dev (const char *os_dev) > +int > +grub_util_get_dev_abstraction (const char *os_dev) > { > /* Check for LVM. */ > if (!strncmp (os_dev, "/dev/mapper/", 12)) > - { > - char *grub_dev = xmalloc (strlen (os_dev) - 12 + 1); > - > - strcpy (grub_dev, os_dev+12); > - > - return grub_dev; > - } > + return GRUB_DEV_ABSTRACTION_LVM; > > /* Check for RAID. */ > if (!strncmp (os_dev, "/dev/md", 7)) > + return GRUB_DEV_ABSTRACTION_RAID; > + > + /* No abstraction found. */ > + return GRUB_DEV_ABSTRACTION_NONE; > +} > + > +char * > +grub_util_get_grub_dev (const char *os_dev) > +{ > + char *grub_dev; > + > + switch (grub_util_get_dev_abstraction (os_dev)) > { > - const char *p; > - char *grub_dev = xmalloc (20); > + case GRUB_DEV_ABSTRACTION_LVM: > + grub_dev = xmalloc (strlen (os_dev) - 12 + 1); > + > + strcpy (grub_dev, os_dev + 12); > + > + break; > + > + case GRUB_DEV_ABSTRACTION_RAID: > + grub_dev = xmalloc (20); > > if (os_dev[7] == '_' && os_dev[8] == 'd') > { > + const char *p; > + > /* This a partitionable RAID device of the form /dev/md_dNNpMM. */ > int i; > > @@ -297,17 +313,17 @@ grub_util_get_grub_dev (const char *os_d > } > else if (os_dev[7] >= '0' && os_dev[7] <= '9') > { > - p = os_dev + 5; > - memcpy (grub_dev, p, 7); > + memcpy (grub_dev, os_dev + 5, 7); > grub_dev[7] = '\0'; > } > else > grub_util_error ("Unknown kind of RAID device `%s'", os_dev); > > + break; > > - return grub_dev; > + default: /* GRUB_DEV_ABSTRACTION_NONE */ > + grub_dev = grub_util_biosdisk_get_grub_dev (os_dev); > } > > - /* If it's not RAID or LVM, it should be a biosdisk. */ > - return grub_util_biosdisk_get_grub_dev (os_dev); > + return grub_dev; > } > diff -x configure -x config.h.in -urp grub2/util/grub.d/00_header.in > lvmraid/util/grub.d/00_header.in > --- grub2/util/grub.d/00_header.in 2007-07-22 01:32:31.000000000 +0200 > +++ lvmraid/util/grub.d/00_header.in 2008-01-10 12:26:16.000000000 +0100 > @@ -1,7 +1,7 @@ > #! /bin/sh -e > > # update-grub helper script. > -# Copyright (C) 2006,2007 Free Software Foundation, Inc. > +# Copyright (C) 2006,2007,2008 Free Software Foundation, Inc. > # > # GRUB is free software: you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > @@ -24,6 +24,12 @@ [EMAIL PROTECTED]@ > # for convert_system_path_to_grub_path() > . ${libdir}/grub/update-grub_lib > > +# Do this as early as possible, since other commands might depend on it. > +# (e.g. the `font' command might need lvm or raid modules) > +for i in ${GRUB_PRELOAD_MODULES} ; do > + echo "insmod $i" > +done > + > if [ "x${GRUB_DEFAULT}" = "x" ] ; then GRUB_DEFAULT=0 ; fi > if [ "x${GRUB_TIMEOUT}" = "x" ] ; then GRUB_TIMEOUT=5 ; fi > > diff -x configure -x config.h.in -urp grub2/util/grub-probe.c > lvmraid/util/grub-probe.c > --- grub2/util/grub-probe.c 2007-07-22 21:17:26.000000000 +0200 > +++ lvmraid/util/grub-probe.c 2008-01-10 13:33:17.000000000 +0100 > @@ -1,7 +1,7 @@ > /* grub-probe.c - probe device information for a given path */ > /* > * GRUB -- GRand Unified Bootloader > - * Copyright (C) 2005,2006,2007 Free Software Foundation, Inc. > + * Copyright (C) 2005,2006,2007,2008 Free Software Foundation, Inc. > * > * GRUB is free software: you can redistribute it and/or modify > * it under the terms of the GNU General Public License as published by > @@ -39,10 +39,13 @@ > #define _GNU_SOURCE 1 > #include <getopt.h> > > -#define PRINT_FS 0 > -#define PRINT_DRIVE 1 > -#define PRINT_DEVICE 2 > -#define PRINT_PARTMAP 3 > +enum { > + PRINT_FS, > + PRINT_DRIVE, > + PRINT_DEVICE, > + PRINT_PARTMAP, > + PRINT_ABSTRACTION, > +}; > > int print = PRINT_FS; > > @@ -74,6 +77,7 @@ probe (const char *path) > { > char *device_name; > char *drive_name = NULL; > + int abstraction_type; > grub_device_t dev; > grub_fs_t fs; > > @@ -87,6 +91,28 @@ probe (const char *path) > goto end; > } > > + abstraction_type = grub_util_get_dev_abstraction (device_name); > + /* No need to check for errors; lack of abstraction is permissible. */ > + > + if (print == PRINT_ABSTRACTION) > + { > + char *abstraction_name; > + switch (abstraction_type) > + { > + case GRUB_DEV_ABSTRACTION_NONE: > + grub_util_info ("did not find LVM/RAID in %s, assuming raw device", > device_name); > + goto end; > + case GRUB_DEV_ABSTRACTION_LVM: > + abstraction_name = "lvm"; > + break; > + case GRUB_DEV_ABSTRACTION_RAID: > + abstraction_name = "raid"; > + break; > + } > + printf ("%s\n", abstraction_name); > + goto end; > + } > + > drive_name = grub_util_get_grub_dev (device_name); > if (! drive_name) > grub_util_error ("cannot find a GRUB drive for %s.\n", device_name); > @@ -159,8 +185,8 @@ Usage: grub-probe [OPTION]... PATH\n\ > Probe device information for a given path.\n\ > \n\ > -m, --device-map=FILE use FILE as the device map [default=%s]\n\ > - -t, --target=(fs|drive|device|partmap)\n\ > - print filesystem module, GRUB drive, system > device or partition map module [default=fs]\n\ > + -t, --target=(fs|drive|device|partmap|abstraction)\n\ > + print filesystem module, GRUB drive, system > device, partition map module or abstraction module [default=fs]\n\ > -h, --help display this message and exit\n\ > -V, --version print version information and exit\n\ > -v, --verbose print verbose messages\n\ > @@ -206,6 +232,8 @@ main (int argc, char *argv[]) > print = PRINT_DEVICE; > else if (!strcmp (optarg, "partmap")) > print = PRINT_PARTMAP; > + else if (!strcmp (optarg, "abstraction")) > + print = PRINT_ABSTRACTION; > else > usage (1); > break; > diff -x configure -x config.h.in -urp grub2/util/i386/efi/grub-install.in > lvmraid/util/i386/efi/grub-install.in > --- grub2/util/i386/efi/grub-install.in 2007-12-30 09:52:06.000000000 > +0100 > +++ lvmraid/util/i386/efi/grub-install.in 2008-01-10 12:26:16.000000000 > +0100 > @@ -1,7 +1,7 @@ > #! /bin/sh > > # Install GRUB on your EFI partition. > -# Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007 Free Software > Foundation, Inc. > +# Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007,2008 Free > Software Foundation, Inc. > # > # GRUB is free software: you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > @@ -190,8 +190,11 @@ fi > # filesystem will be accessible). > partmap_module=`$grub_probe --target=partmap --device-map=${device_map} > ${grubdir} 2> /dev/null` > > +# Device abstraction module, if any (lvm, raid). > +devabstraction_module=`$grub_probe --target=abstraction > --device-map=${device_map} ${grubdir}` > + > # _chain is often useful > -modules="$modules $fs_module $partmap_module _chain" > +modules="$modules $fs_module $partmap_module $devabstraction_module _chain" > > $grub_mkimage --output=${grubdir}/grub.efi $modules || exit 1 > > diff -x configure -x config.h.in -urp grub2/util/i386/pc/grub-install.in > lvmraid/util/i386/pc/grub-install.in > --- grub2/util/i386/pc/grub-install.in 2007-12-30 09:52:06.000000000 > +0100 > +++ lvmraid/util/i386/pc/grub-install.in 2008-01-10 12:26:16.000000000 > +0100 > @@ -1,7 +1,7 @@ > #! /bin/sh > > # Install GRUB on your drive. > -# Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007 Free Software > Foundation, Inc. > +# Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007,2008 Free > Software Foundation, Inc. > # > # GRUB is free software: you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > @@ -223,8 +223,11 @@ fi > # filesystem will be accessible). > partmap_module=`$grub_probe --target=partmap --device-map=${device_map} > ${grubdir} 2> /dev/null` > > +# Device abstraction module, if any (lvm, raid). > +devabstraction_module=`$grub_probe --target=abstraction > --device-map=${device_map} ${grubdir}` > + > # _chain is often useful > -modules="$modules $fs_module $partmap_module biosdisk _chain" > +modules="$modules $fs_module $partmap_module biosdisk $devabstraction_module > _chain" > > $grub_mkimage --output=${grubdir}/core.img > --prefix=`make_system_path_relative_to_its_root ${grubdir}` $modules || exit 1 > > diff -x configure -x config.h.in -urp > grub2/util/powerpc/ieee1275/grub-install.in > lvmraid/util/powerpc/ieee1275/grub-install.in > --- grub2/util/powerpc/ieee1275/grub-install.in 2007-12-30 > 09:52:06.000000000 +0100 > +++ lvmraid/util/powerpc/ieee1275/grub-install.in 2008-01-10 > 12:26:16.000000000 +0100 > @@ -1,7 +1,7 @@ > #! /bin/sh > > # Install GRUB on your drive. > -# Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007 Free Software > Foundation, Inc. > +# Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007,2008 Free > Software Foundation, Inc. > # > # GRUB is free software: you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > @@ -176,7 +176,10 @@ fi > # filesystem will be accessible). > partmap_module=`$grub_probe --target=partmap --device-map=${device_map} > ${grubdir} 2> /dev/null` > > -modules="$modules $fs_module $partmap_module" > +# Device abstraction module, if any (lvm, raid). > +devabstraction_module=`$grub_probe --target=abstraction > --device-map=${device_map} ${grubdir}` > + > +modules="$modules $fs_module $partmap_module $devabstraction_module" > > # Now perform the installation. > "$grub_mkimage" --output=${grubdir}/grub $modules || exit 1 > diff -x configure -x config.h.in -urp grub2/util/update-grub.in > lvmraid/util/update-grub.in > --- grub2/util/update-grub.in 2007-12-30 09:52:06.000000000 +0100 > +++ lvmraid/util/update-grub.in 2008-01-10 12:26:16.000000000 +0100 > @@ -1,7 +1,7 @@ > #! /bin/sh -e > > # Generate grub.cfg by inspecting /boot contents. > -# Copyright (C) 2006,2007 Free Software Foundation, Inc. > +# Copyright (C) 2006,2007,2008 Free Software Foundation, Inc. > # > # GRUB is free software: you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > @@ -103,7 +103,10 @@ esac > # check for terminals that require fonts > case ${GRUB_TERMINAL} in > gfxterm) > - if GRUB_FONT_PATH=`font_path` ; then : ; else > + if path=`font_path` ; then > + GRUB_FONT_PATH="`convert_system_path_to_grub_path ${path}`" > + GRUB_PRELOAD_MODULES="`${GRUB_PRELOAD_MODULES} ${grub_probe} -t > abstraction ${path}`" > + else > # fallback to console > GRUB_TERMINAL=console > fi > @@ -121,7 +124,7 @@ esac > > # These are defined in this script, export them here so that user can > # override them. > -export GRUB_DEVICE GRUB_FS GRUB_DRIVE GRUB_DRIVE_BOOT GRUB_DRIVE_BOOT_GRUB > GRUB_FONT_PATH > +export GRUB_DEVICE GRUB_FS GRUB_DRIVE GRUB_DRIVE_BOOT GRUB_DRIVE_BOOT_GRUB > GRUB_FONT_PATH GRUB_PRELOAD_MODULES > > # These are optional, user-defined variables. > export GRUB_DEFAULT GRUB_TIMEOUT GRUB_DISTRIBUTOR GRUB_CMDLINE_LINUX > GRUB_TERMINAL GRUB_SERIAL_COMMAND > diff -x configure -x config.h.in -urp grub2/util/update-grub_lib.in > lvmraid/util/update-grub_lib.in > --- grub2/util/update-grub_lib.in 2007-12-25 10:09:43.000000000 +0100 > +++ lvmraid/util/update-grub_lib.in 2008-01-10 12:26:16.000000000 +0100 > @@ -1,5 +1,5 @@ > # Helper library for update-grub > -# Copyright (C) 2007 Free Software Foundation, Inc. > +# Copyright (C) 2007,2008 Free Software Foundation, Inc. > # > # GRUB is free software: you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > @@ -93,19 +93,14 @@ convert_system_path_to_grub_path () > > font_path () > { > - if [ "x${GRUB_FONT_PATH}" = "x" ] ; then : ; else > - echo "${GRUB_FONT_PATH}" > - return 0 > - fi > - > # Prefer system path for space reasons (/boot/grub might be a very small > # partition in case of OpenFirmware, etc). > for dir in ${pkgdatadir} /usr/share/grub /boot/grub ; do > # Prefer complete fonts over incomplete ones. > for basename in unicode unifont ascii ; do > - if path=`convert_system_path_to_grub_path ${dir}/${basename}.pff` ; > then > - GRUB_FONT_PATH="${path}" > - echo "${GRUB_FONT_PATH}" > + path="${dir}/${basename}.pff" > + if convert_system_path_to_grub_path ${path} > /dev/null ; then > + echo "${path}" > return 0 > fi > done > _______________________________________________ > Grub-devel mailing list > Grub-devel@gnu.org > http://lists.gnu.org/mailman/listinfo/grub-devel -- Robert Millan <GPLv2> I know my rights; I want my phone call! <DRM> What use is a phone call, if you are unable to speak? (as seen on /.) _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel