On Sun, Apr 13, 2008 at 06:07:22PM +0200, Guntsche Michael wrote:
> 
> On Apr 13, 2008, at 17:04, Robert Millan wrote:
> >On Sat, Feb 23, 2008 at 09:54:35PM +0100, Michael Guntsche wrote:
> >>Hello,
> >>
> >>While testing a soon to be deployed setup here I noticed that grub-
> >>setup is setting the prefix wrong if you run
> >>LVM on Software RAID
> >>
> >>grub-setup -v /dev/md0
> >>...
> >>grub-setup: info: dos partition is -2, bsd partition is -2, prefix is
> >>(md0)(fatoftheland-main)/boot/grub
> >>...
> >>
> >>As you can see the there is also (md0) in the prefix which does not
> >>work.
> >>Attached a small patch that fixes this problem for me. I am not sure
> >>if it is the best way to fix it so please take a look.
> >>If the root device is on LVM only add the LVM part if it is on RAID
> >>only add the RAID part.
> >
> >Sorry for the delay in repliing.  I think it's more correct this  
> >way.  Does
> >it work for you?
> 
> Hello Robert,
> 
> Take a look at the for loop later on in the MD case, that is not being  
> called with your patch.
> The code gets all RAID disks and calls setup on each of them. I do not  
> think the setup call further down is doing the same thing, haven't  
> checked it though. With my patch "setup" is still called for each RAID  
> member with the correct prefix. In the case of a faulty disk you can  
> still boot from the degraded array, by choosing a different disk.

Ok, second try.

-- 
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 /.)
	* util/i386/pc/grub-setup.c (main): When LVM is used on top of RAID,
	don't prepend the RAID device in setup()'s `prefix'.

diff -x configure -x config.h.in -x CVS -x '*~' -x '*.mk' -urp ../grub2/util/i386/pc/grub-setup.c ./util/i386/pc/grub-setup.c
--- ../grub2/util/i386/pc/grub-setup.c	2008-02-19 15:00:11.000000000 +0100
+++ ./util/i386/pc/grub-setup.c	2008-04-13 18:36:42.000000000 +0200
@@ -609,7 +609,7 @@ main (int argc, char *argv[])
   char *root_dev = 0;
   char *prefix;
   char *dest_dev;
-  int must_embed = 0;
+  int root_in_lvm = 0;
   
   progname = "grub-setup";
 
@@ -741,7 +741,7 @@ main (int argc, char *argv[])
   if (grub_util_lvm_isvolume (root_dev))
     {
       char *newprefix;
-      must_embed = 1;
+      root_in_lvm = 1;
 
       newprefix = xmalloc (1 + strlen (root_dev) + 1 + strlen (prefix) + 1);
       sprintf (newprefix, "(%s)%s", root_dev, prefix);
@@ -753,25 +753,26 @@ main (int argc, char *argv[])
       && dest_dev[2] >= '0' && dest_dev[2] <= '9')
     {
       char **devicelist;
-      char *raid_prefix;
       int i;
 
-      raid_prefix = xmalloc (1 + strlen (dest_dev) + 1 + strlen (prefix) + 1);
+      if (! root_in_lvm)
+	{
+	  char *newprefix = xmalloc (1 + strlen (dest_dev) + 1 + strlen (prefix) + 1);
+	  sprintf (newprefix, "(%s)%s", dest_dev, prefix);
+	  free (prefix);
+	  prefix = newprefix;
+	}
 
-      sprintf (raid_prefix, "(%s)%s", dest_dev, prefix);
-      
       devicelist = grub_util_raid_getmembers (dest_dev);
 
       for (i = 0; devicelist[i]; i++)
 	{
-	  setup (raid_prefix,
+	  setup (prefix,
 		 dir ? : DEFAULT_DIRECTORY,
 		 boot_file ? : DEFAULT_BOOT_FILE,
 		 core_file ? : DEFAULT_CORE_FILE,
 		 root_dev, grub_util_get_grub_dev (devicelist[i]), 1);
 	}
-
-      free (raid_prefix);
     }
   else
 #endif
@@ -780,7 +781,7 @@ main (int argc, char *argv[])
 	   dir ? : DEFAULT_DIRECTORY,
 	   boot_file ? : DEFAULT_BOOT_FILE,
 	   core_file ? : DEFAULT_CORE_FILE,
-	   root_dev, dest_dev, must_embed);
+	   root_dev, dest_dev, root_in_lvm);
 
   /* Free resources.  */
   grub_fini_all ();
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to