Backport patches to fix esissues with non-existant /dev/root. Fixes bug #381491.
authorTomas Chvatal <scarabeus@gentoo.org>
Sun, 4 Sep 2011 09:17:44 +0000 (09:17 +0000)
committerTomas Chvatal <scarabeus@gentoo.org>
Sun, 4 Sep 2011 09:17:44 +0000 (09:17 +0000)
Package-Manager: portage-2.2.0_alpha53/cvs/Linux x86_64

sys-boot/grub/ChangeLog
sys-boot/grub/Manifest
sys-boot/grub/files/1.99-do_not_stat_so_often.patch [new file with mode: 0644]
sys-boot/grub/files/1.99-improve_devmapper.patch [new file with mode: 0644]
sys-boot/grub/files/1.99-stat_root_device_properly-p1.patch [new file with mode: 0644]
sys-boot/grub/files/1.99-stat_root_device_properly-p2.patch [new file with mode: 0644]
sys-boot/grub/grub-1.99-r2.ebuild [moved from sys-boot/grub/grub-1.99-r1.ebuild with 95% similarity]

index 554ea6e2cfa303f001af0022ae58bedddb52647b..d54995d987a27e86ac09753c85a1c1bc194e2544 100644 (file)
@@ -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:
index 9f1d7b7552c5ba56485f9d1528d03bf97d1e57a6..0bf0517a10c45c4854cb8ea0ffac13e57fdac51b 100644 (file)
@@ -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 (file)
index 0000000..ca8a023
--- /dev/null
@@ -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 (file)
index 0000000..5f0a930
--- /dev/null
@@ -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 (file)
index 0000000..fc14c53
--- /dev/null
@@ -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 (file)
index 0000000..aa7fd18
--- /dev/null
@@ -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)
+
similarity index 95%
rename from sys-boot/grub/grub-1.99-r1.ebuild
rename to sys-boot/grub/grub-1.99-r2.ebuild
index 7d48192597aa05d5933a6a7116d51f3244925770..641f91e6928259291eec60e29fef6af618d7c989 100644 (file)
@@ -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