summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomas Chvatal <scarabeus@gentoo.org>2011-09-04 09:17:44 +0000
committerTomas Chvatal <scarabeus@gentoo.org>2011-09-04 09:17:44 +0000
commit9a876b24db0be3ac724ca1135fe6ee7590a41ea2 (patch)
tree8eb9af44f464b07b7cac506d63eee99f0495858e /sys-boot/grub
parentFix compilation on Solaris (diff)
downloadhistorical-9a876b24db0be3ac724ca1135fe6ee7590a41ea2.tar.gz
historical-9a876b24db0be3ac724ca1135fe6ee7590a41ea2.tar.bz2
historical-9a876b24db0be3ac724ca1135fe6ee7590a41ea2.zip
Backport patches to fix esissues with non-existant /dev/root. Fixes bug #381491.
Package-Manager: portage-2.2.0_alpha53/cvs/Linux x86_64
Diffstat (limited to 'sys-boot/grub')
-rw-r--r--sys-boot/grub/ChangeLog11
-rw-r--r--sys-boot/grub/Manifest36
-rw-r--r--sys-boot/grub/files/1.99-do_not_stat_so_often.patch65
-rw-r--r--sys-boot/grub/files/1.99-improve_devmapper.patch279
-rw-r--r--sys-boot/grub/files/1.99-stat_root_device_properly-p1.patch21
-rw-r--r--sys-boot/grub/files/1.99-stat_root_device_properly-p2.patch21
-rw-r--r--sys-boot/grub/grub-1.99-r2.ebuild (renamed from sys-boot/grub/grub-1.99-r1.ebuild)8
7 files changed, 422 insertions, 19 deletions
diff --git a/sys-boot/grub/ChangeLog b/sys-boot/grub/ChangeLog
index 554ea6e2cfa3..d54995d987a2 100644
--- a/sys-boot/grub/ChangeLog
+++ b/sys-boot/grub/ChangeLog
@@ -1,6 +1,15 @@
# ChangeLog for sys-boot/grub
# Copyright 1999-2011 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/sys-boot/grub/ChangeLog,v 1.163 2011/08/31 11:27:51 alexxy Exp $
+# $Header: /var/cvsroot/gentoo-x86/sys-boot/grub/ChangeLog,v 1.164 2011/09/04 09:17:44 scarabeus Exp $
+
+*grub-1.99-r2 (04 Sep 2011)
+
+ 04 Sep 2011; Tomáš Chvátal <scarabeus@gentoo.org>
+ +files/1.99-do_not_stat_so_often.patch, +files/1.99-improve_devmapper.patch,
+ +files/1.99-stat_root_device_properly-p1.patch, -grub-1.99-r1.ebuild,
+ +files/1.99-stat_root_device_properly-p2.patch, +grub-1.99-r2.ebuild:
+ Backport patches to fix esissues with non-existant /dev/root. Fixes bug
+ #381491.
31 Aug 2011; Alexey Shvetsov <alexxy@gentoo.org> grub-1.99-r1.ebuild,
grub-9999.ebuild:
diff --git a/sys-boot/grub/Manifest b/sys-boot/grub/Manifest
index 9f1d7b7552c5..0bf0517a10c4 100644
--- a/sys-boot/grub/Manifest
+++ b/sys-boot/grub/Manifest
@@ -1,7 +1,11 @@
-----BEGIN PGP SIGNED MESSAGE-----
-Hash: SHA256
+Hash: SHA1
AUX 1.99-call_proper_grub_probe.patch 536 RMD160 28e914f6ef8e2d9eb73316fa8e5d29b6541d806f SHA1 91237ebbe574baf48d05302c01422c0f0b5c8b49 SHA256 0e27b4ba6a0deedef2f65822e3b76aea4a817cb7219b01c29c8f682c450bd5e8
+AUX 1.99-do_not_stat_so_often.patch 1731 RMD160 ed04af18876c27ca6a85d627d2082a773add19c8 SHA1 ee1936e26f2a3f564195385465752ccee7d29713 SHA256 a33fdbcab7fa4ad66b26598d9a6f1703f419229058c1e9c9c14edb6272783727
+AUX 1.99-improve_devmapper.patch 7134 RMD160 a8dbf91626c607f5fec85235a2042b7e82ffd8d2 SHA1 d3684f80d5f319059ccee1f6822b5a96dd467258 SHA256 b12624944d129820966146d55693b325d48d5d56901727142e386be082661778
+AUX 1.99-stat_root_device_properly-p1.patch 698 RMD160 f28b945c2342a2a95e67357c5387cadf16d8e34f SHA1 3872ccd325e8f4f4693984f0abf26b935c475dae SHA256 1facf84e5195eb98b390e43e0a0d6f791e9500ef678b025e95f96d5a2769da5a
+AUX 1.99-stat_root_device_properly-p2.patch 621 RMD160 2b52c8cbddf95def3fcc77ec8a2cb3524891fd1e SHA1 280dafa0d0c93905a850b17e9a9f09cea1357a05 SHA256 431876459562c0aae6e854a97eeaf0cacdad8ceb5477788a4d691e4e6fa613eb
AUX grub-0.97-gpt.patch 10682 RMD160 53dd38d52f2b38fb28dfb670d6fd27e47a562bbb SHA1 6057a076110d469fb63e56e57711d281221f9b42 SHA256 5e38046cfb727420e5b4b19d71c7fb4ddff22cbcc356c9f888763b0c1963d389
AUX grub.conf.gentoo 627 RMD160 d90fb4373bad476f98ec9c5065d6cdfd9e3b706f SHA1 004f2fc04605ec9190de0a87e7df8bbc33daff89 SHA256 914b15af252210a32776196437cd8013e10e57d5780e66877ef3fe9a2b4b9776
AUX grub.default 1229 RMD160 457cd4cac9c8d8a6edf5ae347c13f5f3feeea734 SHA1 cdeb5d577df33d340bf233fec76fdefa6251d25f SHA256 1ca3065f28c72043036fdc19565e66b1315928c725765463b2c6037e04deb1c5
@@ -37,24 +41,24 @@ EBUILD grub-0.97-r6.ebuild 8801 RMD160 3da0ba7ea62758c9fd352f7290b441c3e9f08fb6
EBUILD grub-0.97-r8.ebuild 8941 RMD160 4caee80e02de14e6a88a3ab016df32f90c258f09 SHA1 be1f73938f4763cf6413afee97062abb8666ffbb SHA256 5876009e82e6556be90d2355defd3039d244f5a53313ba29ce937e9c14e169ff
EBUILD grub-0.97-r9.ebuild 9045 RMD160 5db30743506d7ae274695a94bd1c7c5fea8003e2 SHA1 4796cd56c8e77239719bd31a0542b11129e7922f SHA256 153939f732549503f08dd2acff27325b3e398ffc065e16c1749281c6c66a97d5
EBUILD grub-0.97.ebuild 4494 RMD160 f798b7101af90add6d45725e34aeb7f219e0b748 SHA1 fbb215b293127635ba41e7fa952518e5e07f118a SHA256 d08c03989b1cd6ad91fa2e1a098e0230994570472d0f11a6d926e21e06071c58
-EBUILD grub-1.99-r1.ebuild 7338 RMD160 3aadc2a4618f577b9fc68364592ead32463a59be SHA1 8a70a4b8fa2d6ea21eb13946aa2be5e476fcfc6d SHA256 6ff5faec027266f5daa2b83c4358f8ff8482e982995cad50587911c7f00b9d7a
+EBUILD grub-1.99-r2.ebuild 7554 RMD160 91db4744ac5d8c488aeb486d2e124e1226669a05 SHA1 664023fbe97f4fc6be3955cf23f636a8708a5de4 SHA256 c3fb04f4006528c084895c0567012556135a9d6a3d7247ce344585d9473f05a4
EBUILD grub-9999.ebuild 7336 RMD160 896a695954a8e3d1eaffd2675ddeca8bb360e2aa SHA1 e467a2e4438a7e9d1b8b32749e0819d03bd779e4 SHA256 a9858a80fbaf3b83e7b585c0ea6e75acd7bb109b4557bf222b6e89327603c52d
-MISC ChangeLog 33450 RMD160 86dfe680dc7e1a18d5f6e1abbc6f912523ad02cd SHA1 e0b6b98cbb3392279c551c69db06559cddf8fbd3 SHA256 b40d568aecb8931683a19dd3d63fe1fdc75883d544ef2e68f192c721c400cfc6
+MISC ChangeLog 33846 RMD160 2d726dcc0775c694ec929333c4052e57b61f74bd SHA1 8ef3268a3982503074f533c91d888b2ad1e9ef9c SHA256 fa42e5c247722ec23713eb83a2ae71b2cf740a016fccc777d59558b95bb41a57
MISC metadata.xml 515 RMD160 7ff103974a6e301b4ba14c55c674c1bf35b1a045 SHA1 05d70f211a5f37e1368b74f7a74b0830d8198787 SHA256 dc713fb7db877b0d8405ac8dba28c4253347205a46d677ffe71901c2f017fb0c
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.18 (GNU/Linux)
-iQIcBAEBCAAGBQJOXhq4AAoJEOf+E+/4L5LmM3kP/3hsFtxsB07hInbndKnZh5v+
-CSfl/2feW2ymPQWQWRaDonVXOLczYkbL0qIhbGz7Qj3oajIU/aRG8jf3NDZ9QloC
-CQv5lnr5kD8z/n5yJb9kPm2zMQWGu1BRZlRSEoqjv+tx/81RAxgRvkCw2MfJRQn0
-zjgCbrODvPpufolMceYq4ZG0RYU9Bo6EKec9Gl7fPMXQGtccJyQUoEEOAgdREse/
-bLQCX8kdmqC0XaKONvcTXLlEmz0WLaoP8JllZS0Wu1TvBvrwQNdxUVObjPSpUFMK
-l7PU1KjBTzq37r92QD2yujHsjmpWuMC4yEiHETumk9e725+gJXUIjJYKHxYfDOZf
-d9j9UNUpQif/DNi0Nr1GbksTt7767asAwisO2vUuwGhM92EQMyZZ7+6vKfcdlb9F
-EqvFppxuUNDkkmJmJOIdqCG0YaMpjU0Wi671WTsvjBMaQ+JWn7ziWEC9nGjkGQBC
-EaXA9OdRcybyO+wzeitEYAXsf5aux/2lxK4wOfHB6xChq2bBawdDkogBponjxfP3
-jpGUrGIGlUOhyEeI+4/E3/yE6YJdx+//h4vRMylQVWd6vEYra38VA+/R+bn1wnqW
-IUrW7Qat6fXHClGC9rSPju+vu2BOgo2BxIZLj3/5A2AO8uG+dhu2B5b3Cs3BmoN9
-jjolHdyLJ1bLkeZbvut2
-=3Z39
+iQIcBAEBAgAGBQJOY0JRAAoJEOSiRoyO7jvopbEP/0E+YMAsEgUSiiUMOKTiNpY3
+ytMPD+bTNMq11oZUqpY/syJvqVZZRiDZ1RJOcPin9UnI6vsOy4BkL/0umzAPyJOA
+Aaul38B7kamqO/FZiXWLnGwN+mG+80YaT0UEFL7feTd1PfveosLsg97s5ixGdX/d
+3MFIWgZz8fPGDRDc3G6zUWCfHVtwbe1DqYjN4JUGeEuy6hANZyebm3nkYBDoGqk2
+JOC8y2VJAsSWHAhoo/98/ayiL4/Z/IIOtnJkN5XS0W4W9vraJWVE61r61gQGep0f
+1aayiLNmbcSwpxMPCj9KEUIx2lOrtxc9BnCZcTJfwNX4bfOidSNTVGZiVdDRNyHK
+ozkIZU8Jg9ROvOkMKH65en3G8X5BLNzcWIar13MAoJJqft4NJlvZN3pzL7NCvf70
+FJ8RDOxoMFnlJvM39CLOjrkYGy+KQvzSccUX0VTw0x2upzJDoduIqXHg1KewDHM6
+yQhXPVOL3yhKMP0DJSpF3E5BZe1wYb/SDFfAPJO3OINcsM8ACeh1fl9eX6Y/9Pbi
+0i9hooJVPNehyvyOAhPMzJzcHzgfHx6wIwRexHbnHZKoiFRju8228qVOzJKnjzN3
+xr45LM/gcH95LqqXEsnpQ6+plylUK7MFFD3QuAb0QFXx5qLtOb/3OnynyPQHMbXp
+rR9bL6xYxO6Znwq5TWv+
+=AJ+M
-----END PGP SIGNATURE-----
diff --git a/sys-boot/grub/files/1.99-do_not_stat_so_often.patch b/sys-boot/grub/files/1.99-do_not_stat_so_often.patch
new file mode 100644
index 000000000000..ca8a0239003b
--- /dev/null
+++ b/sys-boot/grub/files/1.99-do_not_stat_so_often.patch
@@ -0,0 +1,65 @@
+--- grub-core/kern/emu/getroot.c 2011-05-18 07:35:47 +0000
++++ grub-core/kern/emu/getroot.c 2011-05-21 05:03:55 +0000
+@@ -358,7 +358,7 @@
+
+ if (S_ISLNK (st.st_mode)) {
+ #ifdef __linux__
+- if (strcmp (dir, "mapper") == 0) {
++ if (strcmp (dir, "mapper") == 0 || strcmp (dir, "/dev/mapper") == 0) {
+ /* Follow symbolic links under /dev/mapper/; the canonical name
+ may be something like /dev/dm-0, but the names under
+ /dev/mapper/ are more human-readable and so we prefer them if
+@@ -609,20 +609,27 @@
+
+ if (os_dev)
+ {
+- if (stat (os_dev, &st) >= 0)
+- dev = st.st_rdev;
+- else
++ char *tmp = os_dev;
++ os_dev = canonicalize_file_name (os_dev);
++ free (tmp);
++ }
++
++ if (os_dev)
++ {
++ if (strncmp (os_dev, "/dev/dm-", sizeof ("/dev/dm-") - 1) != 0)
++ return os_dev;
++ if (stat (os_dev, &st) < 0)
+ grub_util_error ("cannot stat `%s'", os_dev);
+ free (os_dev);
+- }
+- else
+- {
+- if (stat (dir, &st) >= 0)
+- dev = st.st_dev;
+- else
+- grub_util_error ("cannot stat `%s'", dir);
+- }
+-
++ dev = st.st_rdev;
++ return grub_find_device ("/dev/mapper", dev);
++ }
++
++ if (stat (dir, &st) < 0)
++ grub_util_error ("cannot stat `%s'", dir);
++
++ dev = st.st_dev;
++
+ #ifdef __CYGWIN__
+ /* Cygwin specific function. */
+ os_dev = grub_find_device (dir, dev);
+
+--- grub-core/kern/emu/hostdisk.c 2011-05-18 07:35:47 +0000
++++ grub-core/kern/emu/hostdisk.c 2011-05-21 05:03:55 +0000
+@@ -1408,7 +1408,8 @@
+ if (tree)
+ dm_tree_free (tree);
+ free (path);
+- char *ret = grub_find_device (NULL, (major << 8) | minor);
++ char *ret = grub_find_device ("/dev/mapper",
++ (major << 8) | minor);
+ return ret;
+ }
+
+
diff --git a/sys-boot/grub/files/1.99-improve_devmapper.patch b/sys-boot/grub/files/1.99-improve_devmapper.patch
new file mode 100644
index 000000000000..5f0a930e3773
--- /dev/null
+++ b/sys-boot/grub/files/1.99-improve_devmapper.patch
@@ -0,0 +1,279 @@
+--- grub-core/kern/emu/getroot.c 2011-04-21 09:26:29 +0000
++++ grub-core/kern/emu/getroot.c 2011-05-18 07:35:47 +0000
+@@ -34,6 +34,10 @@
+ #include <stdint.h>
+ #include <grub/util/misc.h>
+
++#ifdef HAVE_DEVICE_MAPPER
++# include <libdevmapper.h>
++#endif
++
+ #ifdef __GNU__
+ #include <hurd.h>
+ #include <hurd/lookup.h>
+@@ -634,32 +638,65 @@
+ }
+
+ static int
+-grub_util_is_dmraid (const char *os_dev)
++grub_util_is_lvm (const char *os_dev)
+ {
+- if (! strncmp (os_dev, "/dev/mapper/nvidia_", 19))
+- return 1;
+- else if (! strncmp (os_dev, "/dev/mapper/isw_", 16))
+- return 1;
+- else if (! strncmp (os_dev, "/dev/mapper/hpt37x_", 19))
+- return 1;
+- else if (! strncmp (os_dev, "/dev/mapper/hpt45x_", 19))
+- return 1;
+- else if (! strncmp (os_dev, "/dev/mapper/via_", 16))
+- return 1;
+- else if (! strncmp (os_dev, "/dev/mapper/lsi_", 16))
+- return 1;
+- else if (! strncmp (os_dev, "/dev/mapper/pdc_", 16))
+- return 1;
+- else if (! strncmp (os_dev, "/dev/mapper/jmicron_", 20))
+- return 1;
+- else if (! strncmp (os_dev, "/dev/mapper/asr_", 16))
+- return 1;
+- else if (! strncmp (os_dev, "/dev/mapper/sil_", 16))
+- return 1;
+- else if (! strncmp (os_dev, "/dev/mapper/ddf1_", 17))
+- return 1;
+-
+- return 0;
++ if ((strncmp ("/dev/mapper/", os_dev, 12) != 0))
++ return 0;
++
++#ifdef HAVE_DEVICE_MAPPER
++ {
++ struct dm_tree *tree;
++ uint32_t maj, min;
++ struct dm_tree_node *node = NULL;
++ const char *node_uuid;
++ struct stat st;
++
++ if (stat (os_dev, &st) < 0)
++ return 0;
++
++ tree = dm_tree_create ();
++ if (! tree)
++ {
++ grub_printf ("Failed to create tree\n");
++ grub_dprintf ("hostdisk", "dm_tree_create failed\n");
++ return 0;
++ }
++
++ maj = major (st.st_rdev);
++ min = minor (st.st_rdev);
++
++ if (! dm_tree_add_dev (tree, maj, min))
++ {
++ grub_dprintf ("hostdisk", "dm_tree_add_dev failed\n");
++ dm_tree_free (tree);
++ return 0;
++ }
++
++ node = dm_tree_find_node (tree, maj, min);
++ if (! node)
++ {
++ grub_dprintf ("hostdisk", "dm_tree_find_node failed\n");
++ dm_tree_free (tree);
++ return 0;
++ }
++ node_uuid = dm_tree_node_get_uuid (node);
++ if (! node_uuid)
++ {
++ grub_dprintf ("hostdisk", "%s has no DM uuid\n", os_dev);
++ dm_tree_free (tree);
++ return 0;
++ }
++ if (strncmp (node_uuid, "LVM-", 4) != 0)
++ {
++ dm_tree_free (tree);
++ return 0;
++ }
++ dm_tree_free (tree);
++ return 1;
++ }
++#else
++ return 1;
++#endif /* HAVE_DEVICE_MAPPER */
+ }
+
+ int
+@@ -671,13 +708,11 @@
+ return GRUB_DEV_ABSTRACTION_NONE;
+
+ /* Check for LVM. */
+- if (!strncmp (os_dev, "/dev/mapper/", 12)
+- && ! grub_util_is_dmraid (os_dev)
+- && strncmp (os_dev, "/dev/mapper/mpath", 17) != 0)
++ if (grub_util_is_lvm (os_dev))
+ return GRUB_DEV_ABSTRACTION_LVM;
+
+ /* Check for RAID. */
+- if (!strncmp (os_dev, "/dev/md", 7))
++ if (!strncmp (os_dev, "/dev/md", 7) && ! grub_util_device_is_mapped (os_dev))
+ return GRUB_DEV_ABSTRACTION_RAID;
+ #endif
+
+
+=== modified file 'grub-core/kern/emu/hostdisk.c'
+--- grub-core/kern/emu/hostdisk.c 2011-05-09 16:59:35 +0000
++++ grub-core/kern/emu/hostdisk.c 2011-05-18 07:35:47 +0000
+@@ -24,6 +24,7 @@
+ #include <grub/err.h>
+ #include <grub/emu/misc.h>
+ #include <grub/emu/hostdisk.h>
++#include <grub/emu/getroot.h>
+ #include <grub/misc.h>
+ #include <grub/i18n.h>
+ #include <grub/list.h>
+@@ -331,18 +332,23 @@
+ return GRUB_ERR_NONE;
+ }
+
++int
++grub_util_device_is_mapped (const char *dev)
++{
+ #ifdef HAVE_DEVICE_MAPPER
+-static int
+-device_is_mapped (const char *dev)
+-{
+ struct stat st;
+
++ if (!grub_device_mapper_supported ())
++ return 0;
++
+ if (stat (dev, &st) < 0)
+ return 0;
+
+ return dm_is_dm_major (major (st.st_rdev));
++#else
++ return 0;
++#endif /* HAVE_DEVICE_MAPPER */
+ }
+-#endif /* HAVE_DEVICE_MAPPER */
+
+ #if defined (__FreeBSD__) || defined(__FreeBSD_kernel__)
+ /* FIXME: geom actually gives us the whole container hierarchy.
+@@ -418,7 +424,7 @@
+ # endif /* !defined(HAVE_DIOCGDINFO) */
+
+ # ifdef HAVE_DEVICE_MAPPER
+- if (grub_device_mapper_supported () && device_is_mapped (dev)) {
++ if (grub_util_device_is_mapped (dev)) {
+ struct dm_task *task = NULL;
+ grub_uint64_t start, length;
+ char *target_type, *params, *space;
+@@ -1149,6 +1155,54 @@
+ return ret;
+ }
+
++#ifdef HAVE_DEVICE_MAPPER
++static int
++grub_util_get_dm_node_linear_info (const char *dev,
++ int *maj, int *min)
++{
++ struct dm_task *dmt;
++ void *next = NULL;
++ uint64_t length, start;
++ char *target, *params;
++ char *ptr;
++ int major, minor;
++
++ dmt = dm_task_create(DM_DEVICE_TABLE);
++ if (!dmt)
++ return 0;
++
++ if (!dm_task_set_name(dmt, dev))
++ return 0;
++ dm_task_no_open_count(dmt);
++ if (!dm_task_run(dmt))
++ return 0;
++ next = dm_get_next_target(dmt, next, &start, &length,
++ &target, &params);
++ if (grub_strcmp (target, "linear") != 0)
++ return 0;
++ major = grub_strtoul (params, &ptr, 10);
++ if (grub_errno)
++ {
++ grub_errno = GRUB_ERR_NONE;
++ return 0;
++ }
++ if (*ptr != ':')
++ return 0;
++ ptr++;
++ minor = grub_strtoul (ptr, 0, 10);
++ if (grub_errno)
++ {
++ grub_errno = GRUB_ERR_NONE;
++ return 0;
++ }
++ if (maj)
++ *maj = major;
++ if (min)
++ *min = minor;
++ return 1;
++}
++#endif
++
+ static char *
+ convert_system_partition_to_system_disk (const char *os_dev, struct stat *st)
+ {
+@@ -1325,9 +1379,39 @@
+ node = NULL;
+ goto devmapper_out;
+ }
+- else if (strncmp (node_uuid, "DMRAID-", 7) != 0)
+- {
++ if (strncmp (node_uuid, "LVM-", 4) == 0)
++ {
++ grub_dprintf ("hostdisk", "%s is an LVM\n", path);
++ node = NULL;
++ goto devmapper_out;
++ }
++ if (strncmp (node_uuid, "mpath-", 6) == 0)
++ {
++ /* Multipath partitions have partN-mpath-* UUIDs, and are
++ linear mappings so are handled by
++ grub_util_get_dm_node_linear_info. Multipath disks are not
++ linear mappings and must be handled specially. */
++ grub_dprintf ("hostdisk", "%s is a multipath disk\n", path);
++ mapper_name = dm_tree_node_get_name (node);
++ goto devmapper_out;
++ }
++ if (strncmp (node_uuid, "DMRAID-", 7) != 0)
++ {
++ int major, minor;
++ const char *node_name;
+ grub_dprintf ("hostdisk", "%s is not DM-RAID\n", path);
++
++ if ((node_name = dm_tree_node_get_name (node))
++ && grub_util_get_dm_node_linear_info (node_name,
++ &major, &minor))
++ {
++ if (tree)
++ dm_tree_free (tree);
++ free (path);
++ char *ret = grub_find_device (NULL, (major << 8) | minor);
++ return ret;
++ }
++
+ node = NULL;
+ goto devmapper_out;
+ }
+
+--- include/grub/emu/misc.h 2010-12-02 13:26:46 +0000
++++ include/grub/emu/misc.h 2011-05-18 07:35:47 +0000
+@@ -54,6 +54,8 @@
+
+ char *grub_make_system_path_relative_to_its_root (const char *path)
+ __attribute__ ((warn_unused_result));
++int
++grub_util_device_is_mapped (const char *dev);
+
+ void * EXPORT_FUNC(xmalloc) (grub_size_t size) __attribute__ ((warn_unused_result));
+ void * EXPORT_FUNC(xrealloc) (void *ptr, grub_size_t size) __attribute__ ((warn_unused_result));
+
diff --git a/sys-boot/grub/files/1.99-stat_root_device_properly-p1.patch b/sys-boot/grub/files/1.99-stat_root_device_properly-p1.patch
new file mode 100644
index 000000000000..fc14c536b879
--- /dev/null
+++ b/sys-boot/grub/files/1.99-stat_root_device_properly-p1.patch
@@ -0,0 +1,21 @@
+--- grub-core/kern/emu/getroot.c 2011-05-21 05:03:55 +0000
++++ grub-core/kern/emu/getroot.c 2011-06-23 17:50:41 +0000
+@@ -616,13 +616,15 @@
+
+ if (os_dev)
+ {
+- if (strncmp (os_dev, "/dev/dm-", sizeof ("/dev/dm-") - 1) != 0)
++ int dm = (strncmp (os_dev, "/dev/dm-", sizeof ("/dev/dm-") - 1) == 0);
++ int root = (strcmp (os_dev, "/dev/root") == 0);
++ if (!dm && !root)
+ return os_dev;
+ if (stat (os_dev, &st) < 0)
+ grub_util_error ("cannot stat `%s'", os_dev);
+ free (os_dev);
+ dev = st.st_rdev;
+- return grub_find_device ("/dev/mapper", dev);
++ return grub_find_device (dm ? "/dev/mapper" : "/dev", dev);
+ }
+
+ if (stat (dir, &st) < 0)
+
diff --git a/sys-boot/grub/files/1.99-stat_root_device_properly-p2.patch b/sys-boot/grub/files/1.99-stat_root_device_properly-p2.patch
new file mode 100644
index 000000000000..aa7fd1867560
--- /dev/null
+++ b/sys-boot/grub/files/1.99-stat_root_device_properly-p2.patch
@@ -0,0 +1,21 @@
+--- grub-core/kern/emu/getroot.c 2011-06-23 17:50:41 +0000
++++ grub-core/kern/emu/getroot.c 2011-06-24 02:32:54 +0000
+@@ -620,11 +620,13 @@
+ int root = (strcmp (os_dev, "/dev/root") == 0);
+ if (!dm && !root)
+ return os_dev;
+- if (stat (os_dev, &st) < 0)
+- grub_util_error ("cannot stat `%s'", os_dev);
++ if (stat (os_dev, &st) >= 0)
++ {
++ free (os_dev);
++ dev = st.st_rdev;
++ return grub_find_device (dm ? "/dev/mapper" : "/dev", dev);
++ }
+ free (os_dev);
+- dev = st.st_rdev;
+- return grub_find_device (dm ? "/dev/mapper" : "/dev", dev);
+ }
+
+ if (stat (dir, &st) < 0)
+
diff --git a/sys-boot/grub/grub-1.99-r1.ebuild b/sys-boot/grub/grub-1.99-r2.ebuild
index 7d48192597aa..641f91e69282 100644
--- a/sys-boot/grub/grub-1.99-r1.ebuild
+++ b/sys-boot/grub/grub-1.99-r2.ebuild
@@ -1,6 +1,6 @@
# Copyright 1999-2011 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
-# $Header: /var/cvsroot/gentoo-x86/sys-boot/grub/grub-1.99-r1.ebuild,v 1.2 2011/08/31 11:27:51 alexxy Exp $
+# $Header: /var/cvsroot/gentoo-x86/sys-boot/grub/grub-1.99-r2.ebuild,v 1.1 2011/09/04 09:17:44 scarabeus Exp $
EAPI=4
@@ -157,7 +157,11 @@ src_prepare() {
local i j archs
epatch \
- "${FILESDIR}/1.99-call_proper_grub_probe.patch"
+ "${FILESDIR}/1.99-call_proper_grub_probe.patch" \
+ "${FILESDIR}/1.99-improve_devmapper.patch" \
+ "${FILESDIR}/1.99-do_not_stat_so_often.patch" \
+ "${FILESDIR}/1.99-stat_root_device_properly-p1.patch" \
+ "${FILESDIR}/1.99-stat_root_device_properly-p2.patch"
epatch_user