All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: Bug#494383: grub-pc: Grub2 cannot find LVM volume groups with a dash (-) in the name
       [not found] <20080808202337.3440.57502.reportbug@sylvester.jejik.com.jejik.com>
@ 2008-08-09 10:26 ` Felix Zielcke
  2008-08-09 12:55   ` Felix Zielcke
  2008-08-10 13:19   ` Sander Marechal
  0 siblings, 2 replies; 21+ messages in thread
From: Felix Zielcke @ 2008-08-09 10:26 UTC (permalink / raw)
  To: The development of GRUB 2; +Cc: root, 494383

Hello,

Am Freitag, den 08.08.2008, 22:23 +0200 schrieb root:

> grub-probe: error: Unknown device linux--vg-boot
> Autodetection of a file system module failed
> Please specify the module with the option "--modules" explicitly
> 

I never used LVM before so maybe I did something wrong,
but I think the lvm2 Debian package has a bug:

fz-vm:~# pvcreate /dev/sdb
  Physical volume "/dev/sdb" successfully created
fz-vm:~# vgcreate linux-vg /dev/sdb
  Volume group "linux-vg" successfully created
fz-vm:~# lvcreate -L 1M linux-vg 
  Rounding up size to full physical extent 4,00 MB
  Logical volume "lvol0" created
fz-vm:~# ls /dev/mapper/
control  linux--vg-lvol0






^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Bug#494383: grub-pc: Grub2 cannot find LVM volume groups with a dash (-) in the name
  2008-08-09 10:26 ` Bug#494383: grub-pc: Grub2 cannot find LVM volume groups with a dash (-) in the name Felix Zielcke
@ 2008-08-09 12:55   ` Felix Zielcke
  2008-08-10 13:19   ` Sander Marechal
  1 sibling, 0 replies; 21+ messages in thread
From: Felix Zielcke @ 2008-08-09 12:55 UTC (permalink / raw)
  To: The development of GRUB 2; +Cc: root, 494383

Hi,

Am Samstag, den 09.08.2008, 12:26 +0200 schrieb Felix Zielcke:

> fz-vm:~# ls /dev/mapper/
> control  linux--vg-lvol0
> 
And again it wasn't that clear with my first mail :(

fz-vm:~# l /dev/linux* /dev/mapper/
/dev/linux-vg:
insgesamt 0
lrwxrwxrwx 1 root root 27  9. Aug 14:49 lvol0
-> /dev/mapper/linux--vg-lvol0

/dev/linuxvg:
insgesamt 0
lrwxrwxrwx 1 root root 25  9. Aug 14:49 lvol0
-> /dev/mapper/linuxvg-lvol0

/dev/mapper/:
insgesamt 0
crw-rw---- 1 root root  10, 60  9. Aug 14:49 control
brw-rw---- 1 root disk 253,  1  9. Aug 14:49 linux--vg-lvol0
brw-rw---- 1 root disk 253,  0  9. Aug 14:49 linuxvg-lvol0

Current upstream SVN shows me:

fz-vm:/dev/mapper# grub-probe /mnt/
error: no mapping exists for `linux--vg-lvol0'
grub-probe: error: no mapping exists for `linux--vg-lvol0'

If I change the double dash to one and mount it again then it works
fine.

This bug happens at least with recent udev/lvm2 from Debian unstable
with kernel.org 2.6.27-rc2

I failed to find out how to workaround this in GRUB and I'm a bit unsure
if we even should do this.
What happens if this is fixed in lvm2/udev/kernel (wherever it belongs
too) and what is with people who like to have 2 dashes in there vg name?

(Robert: In this LVM case I think it's not that bad that
debian-installer currently prefers LILO over GRUB 2 ;))




^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Bug#494383: grub-pc: Grub2 cannot find LVM volume groups with a dash (-) in the name
  2008-08-09 10:26 ` Bug#494383: grub-pc: Grub2 cannot find LVM volume groups with a dash (-) in the name Felix Zielcke
  2008-08-09 12:55   ` Felix Zielcke
@ 2008-08-10 13:19   ` Sander Marechal
  2008-08-11 16:18     ` [PATCH] " Felix Zielcke
  1 sibling, 1 reply; 21+ messages in thread
From: Sander Marechal @ 2008-08-10 13:19 UTC (permalink / raw)
  To: Felix Zielcke; +Cc: The development of GRUB 2, 494383

Felix Zielcke wrote:
> Hello,
> 
> Am Freitag, den 08.08.2008, 22:23 +0200 schrieb root:
> 
>> grub-probe: error: Unknown device linux--vg-boot
>> Autodetection of a file system module failed
>> Please specify the module with the option "--modules" explicitly
>>
> 
> I never used LVM before so maybe I did something wrong,
> but I think the lvm2 Debian package has a bug:

That's not a bug. See for example this old Ubuntu bug:
https://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/19631

LVM and /dev/mapper keep names like this:

vgname-lvname

When there's a dash in either the vgname or the lvname, it is doubled to
excape it. So "my-volume-group" and "my-logical-volume" becomes:

my--volume--group-my--logical--volume

I think Grub2 should be able to cope with that.

-- 
Sander Marechal



^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH] Grub2 cannot find LVM volume groups with a dash (-) in the name
  2008-08-10 13:19   ` Sander Marechal
@ 2008-08-11 16:18     ` Felix Zielcke
  2008-08-11 21:48       ` Sander Marechal
  2008-08-14 17:34       ` Felix Zielcke
  0 siblings, 2 replies; 21+ messages in thread
From: Felix Zielcke @ 2008-08-11 16:18 UTC (permalink / raw)
  To: The development of GRUB 2

[-- Attachment #1: Type: text/plain, Size: 920 bytes --]

I still can't see any use in this `escape a dash with a dash because we
use a dash to seperate the vg part from the lv one' from LVM.
As I already wrote, grub-probe works fine if you remove that double
escaping from the file name and remount it.
LVM (lv* vg* commands) shouldn't use the filename to get the vg and lv
part ...

fz-vm:/dev# lvdisplay
  --- Logical volume ---
  LV Name                /dev/m-y--vg/l-vol--0
  VG Name                m-y--vg

lvdisplay is even showing the unescaped directory + symlink

Well attached is now my cute little asprintf patch with a very ugly LVM
part.

It works for

volumegroup: linuxvg
logicalvolume: lvol0
/dev/mapper/linuxvg-lvol0

volume group: m-y--vg
logical volume: l-vol--0
/dev/mapper/m--y----vg-l--vol----0


Please comment this, please give me hints how to make it better.
I don't like the code myself but it seems like we should handle this
double dash problem :(


[-- Attachment #2: getroot.diff --]
[-- Type: text/x-patch, Size: 2864 bytes --]

Index: util/getroot.c
===================================================================
--- util/getroot.c	(Revision 1799)
+++ util/getroot.c	(Arbeitskopie)
@@ -17,6 +17,7 @@
  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <config.h>
 #include <sys/stat.h>
 #include <unistd.h>
 #include <string.h>
@@ -406,67 +407,56 @@
 
   switch (grub_util_get_dev_abstraction (os_dev))
     {
-    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')
+      case GRUB_DEV_ABSTRACTION_LVM:
+	
 	{
-	  const char *p;
+	  unsigned char i, j, k, l;
 
-	  /* This a partitionable RAID device of the form /dev/md_dNNpMM. */
-	  int i;
+	  j = sizeof ("/dev/mapper/") -1;
+	  l = strlen (os_dev) - j + 1;
 
-	  grub_dev[0] = 'm';
-	  grub_dev[1] = 'd';
-	  i = 2;
-	  
-	  p = os_dev + 9;
-	  while (*p >= '0' && *p <= '9')
+	  grub_dev = xmalloc (strlen (os_dev) - strlen ("/dev/mapper/") + 1);
+	
+	  for (i = 0, k = 0; i < l; i++)
 	    {
-	      grub_dev[i] = *p;
-	      i++;
-	      p++;
+	       grub_dev[k] = os_dev[j + i];
+	       k++;
+	       if (os_dev[j + i] == '-' && os_dev[j + i + 1] == '-')
+		 i++;
 	    }
+	}
 
-	  if (*p == '\0')
-	    grub_dev[i] = '\0';
-	  else if (*p == 'p')
-	    {
-	      p++;
-	      grub_dev[i] = ',';
-	      i++;
+      break;
 
-	      while (*p >= '0' && *p <= '9')
-		{
-		  grub_dev[i] = *p;
-		  i++;
-		  p++;
-		}
+      case GRUB_DEV_ABSTRACTION_RAID:
 
-	      grub_dev[i] = '\0';
-	    }
-	  else
-	    grub_util_error ("Unknown kind of RAID device `%s'", os_dev);
-	}
-      else if (os_dev[7] >= '0' && os_dev[7] <= '9')
-	{
-	  memcpy (grub_dev, os_dev + 5, 7);
-	  grub_dev[7] = '\0';
-	}
-      else
-	grub_util_error ("Unknown kind of RAID device `%s'", os_dev);
+	if (os_dev[7] == '_' && os_dev[8] == 'd')
+	  {
+	    /* This a partitionable RAID device of the form /dev/md_dNNpMM. */
 
-      break;
+	    char *p;
 
-    default:  /* GRUB_DEV_ABSTRACTION_NONE */
-      grub_dev = grub_util_biosdisk_get_grub_dev (os_dev);
+	    p = strchr (os_dev, 'p');
+	    if (p)
+	      *p = ',';
+
+	    asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md_d") - 1);
+	  }
+	else if (os_dev[7] >= '0' && os_dev[7] <= '9')
+	  {
+	    asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md") - 1);
+	  }
+	else if (os_dev[7] == '/' && os_dev[8] >= '0' && os_dev[8] <= '9')
+	  {
+	    asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md/") - 1);
+	  }
+	else
+	  grub_util_error ("Unknown kind of RAID device `%s'", os_dev);
+
+	break;
+
+      default:  /* GRUB_DEV_ABSTRACTION_NONE */
+	grub_dev = grub_util_biosdisk_get_grub_dev (os_dev);
     }
 
   return grub_dev;

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Grub2 cannot find LVM volume groups with a dash (-) in the  name
  2008-08-11 16:18     ` [PATCH] " Felix Zielcke
@ 2008-08-11 21:48       ` Sander Marechal
  2008-08-14 17:34       ` Felix Zielcke
  1 sibling, 0 replies; 21+ messages in thread
From: Sander Marechal @ 2008-08-11 21:48 UTC (permalink / raw)
  To: The development of GRUB 2

Felix Zielcke wrote:
> Well attached is now my cute little asprintf patch with a very ugly LVM
> part.
> 
> It works for
> 
> volumegroup: linuxvg
> logicalvolume: lvol0
> /dev/mapper/linuxvg-lvol0
> 
> volume group: m-y--vg
> logical volume: l-vol--0
> /dev/mapper/m--y----vg-l--vol----0
> 
> 
> Please comment this, please give me hints how to make it better.
> I don't like the code myself but it seems like we should handle this
> double dash problem :(

I commented on this on #grub but will post here as well, to preserve it
for posterity :-)

I tested the patch against grub 20080724 in Debian Lenny and it works
great :-) I can't comment on the rest of the code. I'm not a grub developer.

-- 
Sander Marechal



^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Grub2 cannot find LVM volume groups with a dash (-) in the name
  2008-08-11 16:18     ` [PATCH] " Felix Zielcke
  2008-08-11 21:48       ` Sander Marechal
@ 2008-08-14 17:34       ` Felix Zielcke
  2008-08-14 18:03         ` Robert Millan
  1 sibling, 1 reply; 21+ messages in thread
From: Felix Zielcke @ 2008-08-14 17:34 UTC (permalink / raw)
  To: The development of GRUB 2

[-- Attachment #1: Type: text/plain, Size: 948 bytes --]

Am Montag, den 11.08.2008, 18:18 +0200 schrieb Felix Zielcke:
> 
> Please comment this, please give me hints how to make it better.
> I don't like the code myself but it seems like we should handle this
> double dash problem :(
> 

Now that a bit time has passed, I think it isn't that ugly.
But I still don't like it.
I still haven't yet an idea how to make it better, I don't think it's
that great to introduce 4 variables just to remove every 2nd dash.

Unfortunately nobody commented on this new LVM part.

Idention was still not that right I think and I moved the `grub_dev =
xmalloc ()' line above the 2 `j = ..' and `l = ..'.

Marco, I know that you think this is a bit lazy, but I think mentioning
the double dash escaping and that it now uses asprintf for the RAID
cases would be a bit too verbose.

2008-08-14  Felix Zielcke  <fzielcke@z-51.de>

        * util/getroot.c: Include <config.h>.
        (grub_util_get_grub_dev): Rewritten.


[-- Attachment #2: getroot.diff --]
[-- Type: text/x-patch, Size: 2900 bytes --]

Index: util/getroot.c
===================================================================
--- util/getroot.c	(Revision 1804)
+++ util/getroot.c	(Arbeitskopie)
@@ -17,6 +17,7 @@
  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <config.h>
 #include <sys/stat.h>
 #include <unistd.h>
 #include <string.h>
@@ -406,67 +407,56 @@ grub_util_get_grub_dev (const char *os_d
 
   switch (grub_util_get_dev_abstraction (os_dev))
     {
-    case GRUB_DEV_ABSTRACTION_LVM:
-      grub_dev = xmalloc (strlen (os_dev) - 12 + 1);
+      case GRUB_DEV_ABSTRACTION_LVM:
 
-      strcpy (grub_dev, os_dev + 12);
+ 	{
+	  unsigned char i, j, k, l;
 
-      break;
+	  grub_dev = xmalloc (strlen (os_dev) - strlen ("/dev/mapper/") + 1);
 
-    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;
-
-	  grub_dev[0] = 'm';
-	  grub_dev[1] = 'd';
-	  i = 2;
-	  
-	  p = os_dev + 9;
-	  while (*p >= '0' && *p <= '9')
+	  j = sizeof ("/dev/mapper/") -1;
+	  l = strlen (os_dev) - j + 1;
+	
+	  for (i = 0, k = 0; i < l; i++)
 	    {
-	      grub_dev[i] = *p;
-	      i++;
-	      p++;
+	      grub_dev[k] = os_dev[j + i];
+	      k++;
+	      if (os_dev[j + i] == '-' && os_dev[j + i + 1] == '-')
+		i++;
 	    }
+	}
 
-	  if (*p == '\0')
-	    grub_dev[i] = '\0';
-	  else if (*p == 'p')
-	    {
-	      p++;
-	      grub_dev[i] = ',';
-	      i++;
-
-	      while (*p >= '0' && *p <= '9')
-		{
-		  grub_dev[i] = *p;
-		  i++;
-		  p++;
-		}
+	break;
 
-	      grub_dev[i] = '\0';
-	    }
-	  else
-	    grub_util_error ("Unknown kind of RAID device `%s'", os_dev);
-	}
-      else if (os_dev[7] >= '0' && os_dev[7] <= '9')
-	{
-	  memcpy (grub_dev, os_dev + 5, 7);
-	  grub_dev[7] = '\0';
-	}
-      else
-	grub_util_error ("Unknown kind of RAID device `%s'", os_dev);
+      case GRUB_DEV_ABSTRACTION_RAID:
+
+	if (os_dev[7] == '_' && os_dev[8] == 'd')
+	  {
+	    /* This a partitionable RAID device of the form /dev/md_dNNpMM. */
+
+	    char *p;
+
+	    p = strchr (os_dev, 'p');
+	    if (p)
+	      *p = ',';
+
+	    asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md_d") - 1);
+	  }
+	else if (os_dev[7] >= '0' && os_dev[7] <= '9')
+	  {
+	    asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md") - 1);
+	  }
+	else if (os_dev[7] == '/' && os_dev[8] >= '0' && os_dev[8] <= '9')
+	  {
+	    asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md/") - 1);
+	  }
+	else
+	  grub_util_error ("Unknown kind of RAID device `%s'", os_dev);
 
-      break;
+	break;
 
-    default:  /* GRUB_DEV_ABSTRACTION_NONE */
-      grub_dev = grub_util_biosdisk_get_grub_dev (os_dev);
+      default:  /* GRUB_DEV_ABSTRACTION_NONE */
+	grub_dev = grub_util_biosdisk_get_grub_dev (os_dev);
     }
 
   return grub_dev;

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Grub2 cannot find LVM volume groups with a dash (-) in the name
  2008-08-14 17:34       ` Felix Zielcke
@ 2008-08-14 18:03         ` Robert Millan
  2008-08-14 19:32           ` Felix Zielcke
  0 siblings, 1 reply; 21+ messages in thread
From: Robert Millan @ 2008-08-14 18:03 UTC (permalink / raw)
  To: The development of GRUB 2

On Thu, Aug 14, 2008 at 07:34:05PM +0200, Felix Zielcke wrote:
> 2008-08-14  Felix Zielcke  <fzielcke@z-51.de>
> 
>         * util/getroot.c: Include <config.h>.
>         (grub_util_get_grub_dev): Rewritten.

Please explain the actual changes (or what they're for).

>    switch (grub_util_get_dev_abstraction (os_dev))
>      {
> -    case GRUB_DEV_ABSTRACTION_LVM:
> -      grub_dev = xmalloc (strlen (os_dev) - 12 + 1);
> +      case GRUB_DEV_ABSTRACTION_LVM:

Try to ommit big indentation changes from the patch.  If you change something
that requires a big chunk of code to be reindented, I think it's better if you
leave that out for readability (and mention so if you like).

-- 
Robert Millan

  The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
  how) you may access your data; but nobody's threatening your freedom: we
  still allow you to remove your data and not access it at all."



^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Grub2 cannot find LVM volume groups with a dash (-) in the name
  2008-08-14 18:03         ` Robert Millan
@ 2008-08-14 19:32           ` Felix Zielcke
  2008-08-14 20:38             ` Robert Millan
  0 siblings, 1 reply; 21+ messages in thread
From: Felix Zielcke @ 2008-08-14 19:32 UTC (permalink / raw)
  To: The development of GRUB 2

Am Donnerstag, den 14.08.2008, 20:03 +0200 schrieb Robert Millan:
> 
> Please explain the actual changes (or what they're for).
As I wrote that, I just saw before that Marco did just Rewritten. in a
commit, but with searching for Rewritten in the ChangeLog reveals much
more verbose entrys

So:

2008-08-14  Felix Zielcke  <fzielcke@z-51.de>

        * util/getroot.c: Include <config.h>.
        (grub_util_get_grub_dev): Rewritten to use asprintf for mdraid devices, added
        support for /dev/md/N devices and handles LVM double dash escaping.

> 
> >    switch (grub_util_get_dev_abstraction (os_dev))
> >      {
> > -    case GRUB_DEV_ABSTRACTION_LVM:
> > -      grub_dev = xmalloc (strlen (os_dev) - 12 + 1);
> > +      case GRUB_DEV_ABSTRACTION_LVM:
> 
> Try to ommit big indentation changes from the patch.  If you change something
> that requires a big chunk of code to be reindented, I think it's better if you
> leave that out for readability (and mention so if you like).

Unfortunately I couldn't get the -w option working to ignore white space
changes
svn diff --diff-cmd diff -x -up -x -w doestn't produce an unified diff,
< and > are used instead of - and +
with -x -w -x up the -w is ignored :(

So I just need to remember this now that I either change the indention,
before commiting or I directly make 2 patches.
Luckly I can commit this now myself so I really don't need to include
this in the patches I send :)




^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Grub2 cannot find LVM volume groups with a dash (-) in the name
  2008-08-14 19:32           ` Felix Zielcke
@ 2008-08-14 20:38             ` Robert Millan
  2008-08-14 21:15               ` Felix Zielcke
  0 siblings, 1 reply; 21+ messages in thread
From: Robert Millan @ 2008-08-14 20:38 UTC (permalink / raw)
  To: The development of GRUB 2

On Thu, Aug 14, 2008 at 09:32:04PM +0200, Felix Zielcke wrote:
> > Try to ommit big indentation changes from the patch.  If you change something
> > that requires a big chunk of code to be reindented, I think it's better if you
> > leave that out for readability (and mention so if you like).
> 
> Unfortunately I couldn't get the -w option working to ignore white space
> changes
> svn diff --diff-cmd diff -x -up -x -w doestn't produce an unified diff,
> < and > are used instead of - and +
> with -x -w -x up the -w is ignored :(
> 
> So I just need to remember this now that I either change the indention,
> before commiting or I directly make 2 patches.
> Luckly I can commit this now myself so I really don't need to include
> this in the patches I send :)

Okay, but please send the patch without indentation first, so your changes can
be reviewed.

-- 
Robert Millan

  The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
  how) you may access your data; but nobody's threatening your freedom: we
  still allow you to remove your data and not access it at all."



^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Grub2 cannot find LVM volume groups with a dash (-) in the name
  2008-08-14 20:38             ` Robert Millan
@ 2008-08-14 21:15               ` Felix Zielcke
  2008-08-18 15:05                 ` Felix Zielcke
  0 siblings, 1 reply; 21+ messages in thread
From: Felix Zielcke @ 2008-08-14 21:15 UTC (permalink / raw)
  To: The development of GRUB 2

[-- Attachment #1: Type: text/plain, Size: 429 bytes --]

Am Donnerstag, den 14.08.2008, 22:38 +0200 schrieb Robert Millan:

> Okay, but please send the patch without indentation first, so your changes can
> be reviewed.


svn diff --diff-cmd diff -x -upw

That way it works, the attached getroot_w.diff is made with it.
But I think it doestn't look that good to review it, with wrong
indentation.
So I made now the getroot.diff new without indenting the whole switch
block by 2 spaces.

[-- Attachment #2: getroot.diff --]
[-- Type: text/x-patch, Size: 2289 bytes --]

Index: util/getroot.c
===================================================================
--- util/getroot.c	(Revision 1807)
+++ util/getroot.c	(Arbeitskopie)
@@ -17,6 +17,7 @@
  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <config.h>
 #include <sys/stat.h>
 #include <unistd.h>
 #include <string.h>
@@ -407,58 +408,47 @@ grub_util_get_grub_dev (const char *os_d
   switch (grub_util_get_dev_abstraction (os_dev))
     {
     case GRUB_DEV_ABSTRACTION_LVM:
-      grub_dev = xmalloc (strlen (os_dev) - 12 + 1);
 
-      strcpy (grub_dev, os_dev + 12);
+      {
+	unsigned char i, j, k, l;
 
-      break;
+	grub_dev = xmalloc (strlen (os_dev) - strlen ("/dev/mapper/") + 1);
+
+	j = sizeof ("/dev/mapper/") -1;
+	l = strlen (os_dev) - j + 1;
+	  
+	for (i = 0, k = 0; i < l; i++)
+	  {
+	    grub_dev[k] = os_dev[j + i];
+	    k++;
+	    if (os_dev[j + i] == '-' && os_dev[j + i + 1] == '-')
+	      i++;
+	  }
+      }
+
+    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;
-
-	  grub_dev[0] = 'm';
-	  grub_dev[1] = 'd';
-	  i = 2;
-	  
-	  p = os_dev + 9;
-	  while (*p >= '0' && *p <= '9')
-	    {
-	      grub_dev[i] = *p;
-	      i++;
-	      p++;
-	    }
 
-	  if (*p == '\0')
-	    grub_dev[i] = '\0';
-	  else if (*p == 'p')
-	    {
-	      p++;
-	      grub_dev[i] = ',';
-	      i++;
+	  char *p;
 
-	      while (*p >= '0' && *p <= '9')
-		{
-		  grub_dev[i] = *p;
-		  i++;
-		  p++;
-		}
+	  p = strchr (os_dev, 'p');
+	  if (p)
+	    *p = ',';
 
-	      grub_dev[i] = '\0';
-	    }
-	  else
-	    grub_util_error ("Unknown kind of RAID device `%s'", os_dev);
+	  asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md_d") - 1);
 	}
       else if (os_dev[7] >= '0' && os_dev[7] <= '9')
 	{
-	  memcpy (grub_dev, os_dev + 5, 7);
-	  grub_dev[7] = '\0';
+	  asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md") - 1);
+	}
+      else if (os_dev[7] == '/' && os_dev[8] >= '0' && os_dev[8] <= '9')
+	{
+	  asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md/") - 1);
 	}
       else
 	grub_util_error ("Unknown kind of RAID device `%s'", os_dev);

[-- Attachment #3: getroot_w.diff --]
[-- Type: text/x-patch, Size: 2433 bytes --]

Index: util/getroot.c
===================================================================
--- util/getroot.c	(Revision 1807)
+++ util/getroot.c	(Arbeitskopie)
@@ -17,6 +17,7 @@
  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <config.h>
 #include <sys/stat.h>
 #include <unistd.h>
 #include <string.h>
@@ -407,58 +408,47 @@ grub_util_get_grub_dev (const char *os_d
   switch (grub_util_get_dev_abstraction (os_dev))
     {
     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;
+	  unsigned char i, j, k, l;
 
-	  /* This a partitionable RAID device of the form /dev/md_dNNpMM. */
-	  int i;
+	  grub_dev = xmalloc (strlen (os_dev) - strlen ("/dev/mapper/") + 1);
 
-	  grub_dev[0] = 'm';
-	  grub_dev[1] = 'd';
-	  i = 2;
+	  j = sizeof ("/dev/mapper/") -1;
+	  l = strlen (os_dev) - j + 1;
 	  
-	  p = os_dev + 9;
-	  while (*p >= '0' && *p <= '9')
+	  for (i = 0, k = 0; i < l; i++)
 	    {
-	      grub_dev[i] = *p;
+	      grub_dev[k] = os_dev[j + i];
+	      k++;
+	      if (os_dev[j + i] == '-' && os_dev[j + i + 1] == '-')
 	      i++;
-	      p++;
+	    }
 	    }
 
-	  if (*p == '\0')
-	    grub_dev[i] = '\0';
-	  else if (*p == 'p')
-	    {
-	      p++;
-	      grub_dev[i] = ',';
-	      i++;
+	break;
 
-	      while (*p >= '0' && *p <= '9')
+      case GRUB_DEV_ABSTRACTION_RAID:
+
+	if (os_dev[7] == '_' && os_dev[8] == 'd')
 		{
-		  grub_dev[i] = *p;
-		  i++;
-		  p++;
-		}
+	    /* This a partitionable RAID device of the form /dev/md_dNNpMM. */
 
-	      grub_dev[i] = '\0';
-	    }
-	  else
-	    grub_util_error ("Unknown kind of RAID device `%s'", os_dev);
+	    char *p;
+
+	    p = strchr (os_dev, 'p');
+	    if (p)
+	      *p = ',';
+
+	    asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md_d") - 1);
 	}
       else if (os_dev[7] >= '0' && os_dev[7] <= '9')
 	{
-	  memcpy (grub_dev, os_dev + 5, 7);
-	  grub_dev[7] = '\0';
+	    asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md") - 1);
+	  }
+	else if (os_dev[7] == '/' && os_dev[8] >= '0' && os_dev[8] <= '9')
+	  {
+	    asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md/") - 1);
 	}
       else
 	grub_util_error ("Unknown kind of RAID device `%s'", os_dev);

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Grub2 cannot find LVM volume groups with a dash (-) in the name
  2008-08-14 21:15               ` Felix Zielcke
@ 2008-08-18 15:05                 ` Felix Zielcke
  2008-08-18 15:16                   ` Felix Zielcke
  2008-09-01 22:14                   ` Robert Millan
  0 siblings, 2 replies; 21+ messages in thread
From: Felix Zielcke @ 2008-08-18 15:05 UTC (permalink / raw)
  To: The development of GRUB 2

[-- Attachment #1: Type: text/plain, Size: 613 bytes --]

Am Donnerstag, den 14.08.2008, 23:15 +0200 schrieb Felix Zielcke:
> So I made now the getroot.diff new without indenting the whole switch
> block by 2 spaces.

Thanks to Marco and Emacs, I know now that the `case' on `switch' is a
special case :)
GCS isn't talking about this and I just assumed on seeing it that it's
wrong without bothering to look at other code :)

Thanks to Robert for the idea to make one of the variables a macro.

So the difference between this and last are:

I used Emacs instead of vi :D
j and k are swapped
new k is now #define
l is const

Changelog (in attached file) is still the same

[-- Attachment #2: getroot.diff --]
[-- Type: text/x-patch, Size: 2525 bytes --]

2008-08-14  Felix Zielcke  <fzielcke@z-51.de>

	* util/getroot.c: Include <config.h>.
	(grub_util_get_grub_dev): Rewritten to use asprintf for mdraid devices,
	added support for /dev/md/N devices and handles LVM double dash
	escaping.

Index: util/getroot.c
===================================================================
--- util/getroot.c	(Revision 1807)
+++ util/getroot.c	(Arbeitskopie)
@@ -17,6 +17,7 @@
  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <config.h>
 #include <sys/stat.h>
 #include <unistd.h>
 #include <string.h>
@@ -407,58 +408,47 @@ grub_util_get_grub_dev (const char *os_d
   switch (grub_util_get_dev_abstraction (os_dev))
     {
     case GRUB_DEV_ABSTRACTION_LVM:
-      grub_dev = xmalloc (strlen (os_dev) - 12 + 1);
 
-      strcpy (grub_dev, os_dev + 12);
+      {
+	unsigned char i, j, k, l;
 
-      break;
+	grub_dev = xmalloc (strlen (os_dev) - strlen ("/dev/mapper/") + 1);
+
+	j = sizeof ("/dev/mapper/") -1;
+	l = strlen (os_dev) - j + 1;
+	  
+	for (i = 0, k = 0; i < l; i++)
+	  {
+	    grub_dev[k] = os_dev[j + i];
+	    k++;
+	    if (os_dev[j + i] == '-' && os_dev[j + i + 1] == '-')
+	      i++;
+	  }
+      }
+
+    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;
-
-	  grub_dev[0] = 'm';
-	  grub_dev[1] = 'd';
-	  i = 2;
-	  
-	  p = os_dev + 9;
-	  while (*p >= '0' && *p <= '9')
-	    {
-	      grub_dev[i] = *p;
-	      i++;
-	      p++;
-	    }
 
-	  if (*p == '\0')
-	    grub_dev[i] = '\0';
-	  else if (*p == 'p')
-	    {
-	      p++;
-	      grub_dev[i] = ',';
-	      i++;
+	  char *p;
 
-	      while (*p >= '0' && *p <= '9')
-		{
-		  grub_dev[i] = *p;
-		  i++;
-		  p++;
-		}
+	  p = strchr (os_dev, 'p');
+	  if (p)
+	    *p = ',';
 
-	      grub_dev[i] = '\0';
-	    }
-	  else
-	    grub_util_error ("Unknown kind of RAID device `%s'", os_dev);
+	  asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md_d") - 1);
 	}
       else if (os_dev[7] >= '0' && os_dev[7] <= '9')
 	{
-	  memcpy (grub_dev, os_dev + 5, 7);
-	  grub_dev[7] = '\0';
+	  asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md") - 1);
+	}
+      else if (os_dev[7] == '/' && os_dev[8] >= '0' && os_dev[8] <= '9')
+	{
+	  asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md/") - 1);
 	}
       else
 	grub_util_error ("Unknown kind of RAID device `%s'", os_dev);

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Grub2 cannot find LVM volume groups with a dash (-) in the name
  2008-08-18 15:05                 ` Felix Zielcke
@ 2008-08-18 15:16                   ` Felix Zielcke
  2008-09-01  7:08                     ` Felix Zielcke
  2008-09-01 22:14                   ` Robert Millan
  1 sibling, 1 reply; 21+ messages in thread
From: Felix Zielcke @ 2008-08-18 15:16 UTC (permalink / raw)
  To: The development of GRUB 2

[-- Attachment #1: Type: text/plain, Size: 869 bytes --]

Am Montag, den 18.08.2008, 17:05 +0200 schrieb Felix Zielcke:
> Am Donnerstag, den 14.08.2008, 23:15 +0200 schrieb Felix Zielcke:
> > So I made now the getroot.diff new without indenting the whole switch
> > block by 2 spaces.
> 
> Thanks to Marco and Emacs, I know now that the `case' on `switch' is a
> special case :)
> GCS isn't talking about this and I just assumed on seeing it that it's
> wrong without bothering to look at other code :)
> 
> Thanks to Robert for the idea to make one of the variables a macro.
> 
> So the difference between this and last are:
> 
> I used Emacs instead of vi :D
> j and k are swapped
> new k is now #define
> l is const
> 
> Changelog (in attached file) is still the same

/me screams load.
I even open the file again to put the changelog in it and then don't
notice that it's the old one :(
Well attached is now the right one.

[-- Attachment #2: getroot.diff --]
[-- Type: text/x-patch, Size: 2592 bytes --]

2008-08-14  Felix Zielcke  <fzielcke@z-51.de>

	* util/getroot.c: Include <config.h>.
	(grub_util_get_grub_dev): Rewritten to use asprintf for mdraid devices,
	added support for /dev/md/N devices and handles LVM double dash
	escaping.

Index: util/getroot.c
===================================================================
--- util/getroot.c	(Revision 1820)
+++ util/getroot.c	(Arbeitskopie)
@@ -17,6 +17,7 @@
  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <config.h>
 #include <sys/stat.h>
 #include <unistd.h>
 #include <string.h>
@@ -407,58 +408,47 @@ grub_util_get_grub_dev (const char *os_d
   switch (grub_util_get_dev_abstraction (os_dev))
     {
     case GRUB_DEV_ABSTRACTION_LVM:
-      grub_dev = xmalloc (strlen (os_dev) - 12 + 1);
 
-      strcpy (grub_dev, os_dev + 12);
+      {
+#define k sizeof ("/dev/mapper/") - 1
 
-      break;
+	unsigned char i, j;
+	const unsigend char l = strlen (os_dev) - j + 1;
 
-    case GRUB_DEV_ABSTRACTION_RAID:
-      grub_dev = xmalloc (20);
+	grub_dev = xmalloc (strlen (os_dev) - strlen ("/dev/mapper/") + 1);
+	  
+	for (i = 0, j = 0; i < l; i++)
+	  {
+	    grub_dev[j] = os_dev[k + i];
+	    j++;
+	    if (os_dev[k + i] == '-' && os_dev[k + i + 1] == '-')
+	      i++;
+	  }
+      }
+
+    break;
 
+    case GRUB_DEV_ABSTRACTION_RAID:
+      
       if (os_dev[7] == '_' && os_dev[8] == 'd')
 	{
-	  const char *p;
-
 	  /* This a partitionable RAID device of the form /dev/md_dNNpMM. */
-	  int i;
-
-	  grub_dev[0] = 'm';
-	  grub_dev[1] = 'd';
-	  i = 2;
 	  
-	  p = os_dev + 9;
-	  while (*p >= '0' && *p <= '9')
-	    {
-	      grub_dev[i] = *p;
-	      i++;
-	      p++;
-	    }
-
-	  if (*p == '\0')
-	    grub_dev[i] = '\0';
-	  else if (*p == 'p')
-	    {
-	      p++;
-	      grub_dev[i] = ',';
-	      i++;
-
-	      while (*p >= '0' && *p <= '9')
-		{
-		  grub_dev[i] = *p;
-		  i++;
-		  p++;
-		}
+	  char *p;
+	  
+	  p = strchr (os_dev, 'p');
+	  if (p)
+	    *p = ',';
 
-	      grub_dev[i] = '\0';
-	    }
-	  else
-	    grub_util_error ("Unknown kind of RAID device `%s'", os_dev);
+	  asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md_d") - 1);
 	}
       else if (os_dev[7] >= '0' && os_dev[7] <= '9')
 	{
-	  memcpy (grub_dev, os_dev + 5, 7);
-	  grub_dev[7] = '\0';
+	  asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md") - 1);
+	}
+      else if (os_dev[7] == '/' && os_dev[8] >= '0' && os_dev[8] <= '9')
+	{
+	  asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md/") - 1);
 	}
       else
 	grub_util_error ("Unknown kind of RAID device `%s'", os_dev);

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Grub2 cannot find LVM volume groups with a dash (-) in the name
  2008-08-18 15:16                   ` Felix Zielcke
@ 2008-09-01  7:08                     ` Felix Zielcke
  0 siblings, 0 replies; 21+ messages in thread
From: Felix Zielcke @ 2008-09-01  7:08 UTC (permalink / raw)
  To: The development of GRUB 2

Am Montag, den 18.08.2008, 17:16 +0200 schrieb Felix Zielcke:

> Well attached is now the right one.

I want to bring the topic up again, so that this hopefully, so that this
hopefully won't get forgotten for a while again.

I have just noticed that we have a regression in our new debian
experimental upload, i.e. this /dev/md/N and LVM dash thing isn't
included there because I just hoped that it will be commited first
upstream before we do the upload :(

-- 
Felix Zielcke




^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Grub2 cannot find LVM volume groups with a dash (-) in the name
  2008-08-18 15:05                 ` Felix Zielcke
  2008-08-18 15:16                   ` Felix Zielcke
@ 2008-09-01 22:14                   ` Robert Millan
  2008-09-01 22:46                     ` Felix Zielcke
  1 sibling, 1 reply; 21+ messages in thread
From: Robert Millan @ 2008-09-01 22:14 UTC (permalink / raw)
  To: The development of GRUB 2

On Mon, Aug 18, 2008 at 05:05:26PM +0200, Felix Zielcke wrote:
> +	unsigned char i, j, k, l;

I think using unsigned chars to store "integers" is counter-intuitive, and in
some cases possibly dangerous (overflow).

> +	grub_dev = xmalloc (strlen (os_dev) - strlen ("/dev/mapper/") + 1);
> +
> +	j = sizeof ("/dev/mapper/") -1;

                                     ^

Missing space here :-)

> +	for (i = 0, k = 0; i < l; i++)
> +	  {
> +	    grub_dev[k] = os_dev[j + i];
> +	    k++;

i already counts from 0 and increments by-one.  Can it be used instead of k?

The rest of the code I mostly don't understand well.  If you feel confident
that it's right, I suggest you check it in unless someone else also wants to
review it.

-- 
Robert Millan

  The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
  how) you may access your data; but nobody's threatening your freedom: we
  still allow you to remove your data and not access it at all."



^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Grub2 cannot find LVM volume groups with a dash (-) in the name
  2008-09-01 22:14                   ` Robert Millan
@ 2008-09-01 22:46                     ` Felix Zielcke
  2008-09-02  8:28                       ` Felix Zielcke
  2008-09-02 13:37                       ` Robert Millan
  0 siblings, 2 replies; 21+ messages in thread
From: Felix Zielcke @ 2008-09-01 22:46 UTC (permalink / raw)
  To: The development of GRUB 2

Am Dienstag, den 02.09.2008, 00:14 +0200 schrieb Robert Millan:
> On Mon, Aug 18, 2008 at 05:05:26PM +0200, Felix Zielcke wrote:
> > +	unsigned char i, j, k, l;
> 
> I think using unsigned chars to store "integers" is counter-intuitive, and in
> some cases possibly dangerous (overflow).

I should have probable even used grub_uintN_t types.
16bit should be enough for them I think
255 chars in /dev/mapper/filename could be maybe a problem if people do
such weird things :)


> > +	grub_dev = xmalloc (strlen (os_dev) - strlen ("/dev/mapper/") + 1);
> > +
> > +	j = sizeof ("/dev/mapper/") -1;
> 
>                                      ^
> 
> Missing space here :-)

Yep and I even corrected this already in my last patch
http://lists.gnu.org/archive/html/grub-devel/2008-08/msg00523.htmlhttp://lists.gnu.org/archive/html/grub-devel/2008-08/msg00523.html

I'm now not that sure if that #define k would be okay, seems like Vesa
isn't liking macros.
But I could just use const for that too.

> > +	for (i = 0, k = 0; i < l; i++)
> > +	  {
> > +	    grub_dev[k] = os_dev[j + i];
> > +	    k++;
> 
> i already counts from 0 and increments by-one.  Can it be used instead of k?

Oh I just noticed again that in my last patch it's now j
i is used as the source count and get's incremented twice for a dash so
one dash is skipped.
whereas k (new j) is used as the destination count so it's always only
incremented by one.

That's the whole problem, skip the next dash on a dash but don't skip a
single dash.
It's always
/dev/mapper/vg-lv
but if vg and lv part has a single dash then it's for example
v--g-l--v
for grub this has to be v-g-l-v

> The rest of the code I mostly don't understand well.  If you feel confident
> that it's right, I suggest you check it in unless someone else also wants to
> review it.
> 

Honestly I'm happy that the LVM part seems to work and didn't introduce
any problem.

I'm too lazy now to make a new patch and go sleeping now.
But the changes I do make tomorrow now on the last patch above is
making k a const instead of #define, i think it just looks better
and using grub_uint16_t for all 4 variables.

I hope that Marco could have a quick look over it especially the
changelog part :)

-- 
Felix Zielcke




^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Grub2 cannot find LVM volume groups with a dash (-) in the name
  2008-09-01 22:46                     ` Felix Zielcke
@ 2008-09-02  8:28                       ` Felix Zielcke
  2008-09-02 14:59                         ` Vesa Jääskeläinen
  2008-09-02 13:37                       ` Robert Millan
  1 sibling, 1 reply; 21+ messages in thread
From: Felix Zielcke @ 2008-09-02  8:28 UTC (permalink / raw)
  To: The development of GRUB 2

[-- Attachment #1: Type: text/plain, Size: 470 bytes --]

Am Dienstag, den 02.09.2008, 00:46 +0200 schrieb Felix Zielcke:

> I'm too lazy now to make a new patch and go sleeping now.
> [...]
> 
> I hope that Marco could have a quick look over it especially the
> changelog part :)

Final patch attached.
In changelog I had again past and present mixed and I just use now the
`normal' types instead of grub_uintN_t, seems like that's more used on
util/
So if there are no objections I'd like to commit this :)

-- 
Felix Zielcke

[-- Attachment #2: getroot.diff.2 --]
[-- Type: text/plain, Size: 2598 bytes --]

2008-08-14  Felix Zielcke  <fzielcke@z-51.de>

        * util/getroot.c: Include <config.h>.
        (grub_util_get_grub_dev): Rewritten to use asprintf for mdraid devices,
        add support for /dev/md/N devices and handles LVM double dash escaping.

Index: util/getroot.c
===================================================================
--- util/getroot.c	(Revision 1845)
+++ util/getroot.c	(Arbeitskopie)
@@ -17,6 +17,7 @@
  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <config.h>
 #include <sys/stat.h>
 #include <unistd.h>
 #include <string.h>
@@ -417,58 +418,45 @@ grub_util_get_grub_dev (const char *os_d
   switch (grub_util_get_dev_abstraction (os_dev))
     {
     case GRUB_DEV_ABSTRACTION_LVM:
-      grub_dev = xmalloc (strlen (os_dev) - 12 + 1);
 
-      strcpy (grub_dev, os_dev + 12);
+      {
+	unsigned short i, j;
+	const unsigned char k = sizeof ("/dev/mapper/") - 1;
+	const unsigned short l = strlen (os_dev) - k + 1;
 
-      break;
+	grub_dev = xmalloc (strlen (os_dev) - k + 1);
+	  
+	for (i = 0, j = 0; i < l; i++, j++)
+	  {
+	    grub_dev[j] = os_dev[k + i];
+	    if (os_dev[k + i] == '-' && os_dev[k + i + 1] == '-')
+	      i++;
+	  }
+      }
 
-    case GRUB_DEV_ABSTRACTION_RAID:
-      grub_dev = xmalloc (20);
+    break;
 
+    case GRUB_DEV_ABSTRACTION_RAID:
+      
       if (os_dev[7] == '_' && os_dev[8] == 'd')
 	{
-	  const char *p;
-
 	  /* This a partitionable RAID device of the form /dev/md_dNNpMM. */
-	  int i;
-
-	  grub_dev[0] = 'm';
-	  grub_dev[1] = 'd';
-	  i = 2;
 	  
-	  p = os_dev + 9;
-	  while (*p >= '0' && *p <= '9')
-	    {
-	      grub_dev[i] = *p;
-	      i++;
-	      p++;
-	    }
-
-	  if (*p == '\0')
-	    grub_dev[i] = '\0';
-	  else if (*p == 'p')
-	    {
-	      p++;
-	      grub_dev[i] = ',';
-	      i++;
-
-	      while (*p >= '0' && *p <= '9')
-		{
-		  grub_dev[i] = *p;
-		  i++;
-		  p++;
-		}
+	  char *p;
+	  
+	  p = strchr (os_dev, 'p');
+	  if (p)
+	    *p = ',';
 
-	      grub_dev[i] = '\0';
-	    }
-	  else
-	    grub_util_error ("Unknown kind of RAID device `%s'", os_dev);
+	  asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md_d") - 1);
 	}
       else if (os_dev[7] >= '0' && os_dev[7] <= '9')
 	{
-	  memcpy (grub_dev, os_dev + 5, 7);
-	  grub_dev[7] = '\0';
+	  asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md") - 1);
+	}
+      else if (os_dev[7] == '/' && os_dev[8] >= '0' && os_dev[8] <= '9')
+	{
+	  asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md/") - 1);
 	}
       else
 	grub_util_error ("Unknown kind of RAID device `%s'", os_dev);

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Grub2 cannot find LVM volume groups with a dash (-) in the name
  2008-09-01 22:46                     ` Felix Zielcke
  2008-09-02  8:28                       ` Felix Zielcke
@ 2008-09-02 13:37                       ` Robert Millan
  1 sibling, 0 replies; 21+ messages in thread
From: Robert Millan @ 2008-09-02 13:37 UTC (permalink / raw)
  To: The development of GRUB 2

On Tue, Sep 02, 2008 at 12:46:11AM +0200, Felix Zielcke wrote:
> 
> I'm now not that sure if that #define k would be okay, seems like Vesa
> isn't liking macros.

If you use macros, please give them meaningful names.  But a macro just for
sizeof("foo") isn't much of an improvemtn, since the resulting code is the
same, and it just makes it less readable.

-- 
Robert Millan

  The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
  how) you may access your data; but nobody's threatening your freedom: we
  still allow you to remove your data and not access it at all."



^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Grub2 cannot find LVM volume groups with a dash (-) in the name
  2008-09-02  8:28                       ` Felix Zielcke
@ 2008-09-02 14:59                         ` Vesa Jääskeläinen
  2008-09-02 15:59                           ` Felix Zielcke
  0 siblings, 1 reply; 21+ messages in thread
From: Vesa Jääskeläinen @ 2008-09-02 14:59 UTC (permalink / raw)
  To: The development of GRUB 2

Felix Zielcke wrote:
> Am Dienstag, den 02.09.2008, 00:46 +0200 schrieb Felix Zielcke:
> 
>> I'm too lazy now to make a new patch and go sleeping now.
>> [...]
>>
>> I hope that Marco could have a quick look over it especially the
>> changelog part :)
> 
> Final patch attached.
> In changelog I had again past and present mixed and I just use now the
> `normal' types instead of grub_uintN_t, seems like that's more used on
> util/
> So if there are no objections I'd like to commit this :)

> +	unsigned short i, j;
> +	const unsigned char k = sizeof ("/dev/mapper/") - 1;
> +	const unsigned short l = strlen (os_dev) - k + 1;

sizeof returns type of size_t so it would be good that char k uses that.
I am a bit surprised that this didn't generate compiler warning? And
there is no reason to define integers as constants unless you really
want to make sure they don't change :)

I assume we have grub_size_t or comparable there.

> +	const unsigned short l = strlen (os_dev) - k + 1;
>  
> -      break;
> +	grub_dev = xmalloc (strlen (os_dev) - k + 1);

if you already calculate something to variable it would be nice to
re-use that calculation again.

> +	for (i = 0, j = 0; i < l; i++, j++)
> +	  {
> +	    grub_dev[j] = os_dev[k + i];
> +	    if (os_dev[k + i] == '-' && os_dev[k + i + 1] == '-')
> +	      i++;
> +	  }

Can't you index i: k <= i < strlen(os_dev)? Would make this a bit more
readable. Or as you could just increment k in every loop and use that to
index. Your 0 <= j < l should limit char array.

You could use a bit more descriptive names like l->len, k->start/offset.
For indexes we quite often use i,j,k.

> +	  p = strchr (os_dev, 'p');
> +	  if (p)
> +	    *p = ',';

It is usually a bad idea to modify source string.



^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Grub2 cannot find LVM volume groups with a dash (-) in the name
  2008-09-02 14:59                         ` Vesa Jääskeläinen
@ 2008-09-02 15:59                           ` Felix Zielcke
  2008-09-02 16:21                             ` Vesa Jääskeläinen
  2008-09-04 19:56                             ` Felix Zielcke
  0 siblings, 2 replies; 21+ messages in thread
From: Felix Zielcke @ 2008-09-02 15:59 UTC (permalink / raw)
  To: The development of GRUB 2

[-- Attachment #1: Type: text/plain, Size: 1273 bytes --]

Am Dienstag, den 02.09.2008, 17:59 +0300 schrieb Vesa Jääskeläinen: 
> Felix Zielcke wrote:
> 
> sizeof returns type of size_t so it would be good that char k uses that.
> I am a bit surprised that this didn't generate compiler warning?

Well somewhere hidden in a mail from me, I think I already wrote that I
already got the idea to make these warnings more visible :)
I didn't look yet further into it, maybe even a [RFC] topic should be
made for this.
I'm thinking about how linux kernel compiling works.

Actually I haven't checked that code ;)

> And there is no reason to define integers as constants unless you really
> want to make sure they don't change :)

This is just a thing left from my previous coding experience.
As I started to code I personally just prefer that, but yeah gcc is so
nice and optimizes (almost) everything for us and this code is so little
anyway :)

> > +	  p = strchr (os_dev, 'p');
> > +	  if (p)
> > +	    *p = ',';
> 
> It is usually a bad idea to modify source string.

Urm right this is util/ no need to save a few bytes :)

Thanks for your suggestions Vesa.
It really looks now better compared to the first code I sent about this
problem and it only uses now 3 variables :)

-- 
Felix Zielcke

[-- Attachment #2: getroot.diff.3 --]
[-- Type: text/plain, Size: 2621 bytes --]

2008-09-02  Felix Zielcke  <fzielcke@z-51.de>

        * util/getroot.c: Include <config.h>.
        (grub_util_get_grub_dev): Rewritten to use asprintf for mdraid devices,
        add support for /dev/md/N devices and handle LVM double dash escaping.

Index: util/getroot.c
===================================================================
--- util/getroot.c	(Revision 1845)
+++ util/getroot.c	(Arbeitskopie)
@@ -17,6 +17,7 @@
  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <config.h>
 #include <sys/stat.h>
 #include <unistd.h>
 #include <string.h>
@@ -417,62 +418,52 @@ grub_util_get_grub_dev (const char *os_d
   switch (grub_util_get_dev_abstraction (os_dev))
     {
     case GRUB_DEV_ABSTRACTION_LVM:
-      grub_dev = xmalloc (strlen (os_dev) - 12 + 1);
-
-      strcpy (grub_dev, os_dev + 12);
 
+      {
+	unsigned short i, len;
+	grub_size_t offset = sizeof ("/dev/mapper/") - 1;
+
+	len = strlen (os_dev) - offset;
+	grub_dev = xmalloc (len);
+
+	for (i = 0; i <= len; i++, offset++)
+	  {
+	    grub_dev[i] = os_dev[offset];
+	    if (os_dev[offset] == '-' && os_dev[offset + 1] == '-')
+	      offset++;
+	  }
+      }
+      
       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;
-
-	  grub_dev[0] = 'm';
-	  grub_dev[1] = 'd';
-	  i = 2;
 	  
-	  p = os_dev + 9;
-	  while (*p >= '0' && *p <= '9')
-	    {
-	      grub_dev[i] = *p;
-	      i++;
-	      p++;
-	    }
+	  char *p , *q;
 
-	  if (*p == '\0')
-	    grub_dev[i] = '\0';
-	  else if (*p == 'p')
-	    {
-	      p++;
-	      grub_dev[i] = ',';
-	      i++;
-
-	      while (*p >= '0' && *p <= '9')
-		{
-		  grub_dev[i] = *p;
-		  i++;
-		  p++;
-		}
+	  p = strdup (os_dev + sizeof ("/dev/md_d") - 1);
 
-	      grub_dev[i] = '\0';
-	    }
-	  else
-	    grub_util_error ("Unknown kind of RAID device `%s'", os_dev);
+	  q = strchr (p, 'p');
+	  if (q)
+	    *q = ',';
+
+	  asprintf (&grub_dev, "md%s", p);
+	  free (p);
 	}
       else if (os_dev[7] >= '0' && os_dev[7] <= '9')
 	{
-	  memcpy (grub_dev, os_dev + 5, 7);
-	  grub_dev[7] = '\0';
+	  asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md") - 1);
+	}
+      else if (os_dev[7] == '/' && os_dev[8] >= '0' && os_dev[8] <= '9')
+	{
+	  asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md/") - 1);
 	}
       else
 	grub_util_error ("Unknown kind of RAID device `%s'", os_dev);
-
+      
       break;
 
     default:  /* GRUB_DEV_ABSTRACTION_NONE */

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Grub2 cannot find LVM volume groups with a dash (-) in the name
  2008-09-02 15:59                           ` Felix Zielcke
@ 2008-09-02 16:21                             ` Vesa Jääskeläinen
  2008-09-04 19:56                             ` Felix Zielcke
  1 sibling, 0 replies; 21+ messages in thread
From: Vesa Jääskeläinen @ 2008-09-02 16:21 UTC (permalink / raw)
  To: The development of GRUB 2

Felix Zielcke wrote:
> Am Dienstag, den 02.09.2008, 17:59 +0300 schrieb Vesa Jääskeläinen: 
>> Felix Zielcke wrote:
>>
>> sizeof returns type of size_t so it would be good that char k uses that.
>> I am a bit surprised that this didn't generate compiler warning?
> 
> Well somewhere hidden in a mail from me, I think I already wrote that I
> already got the idea to make these warnings more visible :)
> I didn't look yet further into it, maybe even a [RFC] topic should be
> made for this.

I think Colin had patch already in list archives... That would be
suitable for this. Perhaps you guys could review that and get that in.



^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Grub2 cannot find LVM volume groups with a dash (-) in the name
  2008-09-02 15:59                           ` Felix Zielcke
  2008-09-02 16:21                             ` Vesa Jääskeläinen
@ 2008-09-04 19:56                             ` Felix Zielcke
  1 sibling, 0 replies; 21+ messages in thread
From: Felix Zielcke @ 2008-09-04 19:56 UTC (permalink / raw)
  To: The development of GRUB 2

Commited in the hope that Marco isn't angry with me ;)

and I noticed I used still past once and there was a reason for len = +1
and if < len not <= len

Am Dienstag, den 02.09.2008, 17:59 +0200 schrieb Felix Zielcke:
> Am Dienstag, den 02.09.2008, 17:59 +0300 schrieb Vesa Jääskeläinen: 
> > Felix Zielcke wrote:
> > 
> > sizeof returns type of size_t so it would be good that char k uses that.
> > I am a bit surprised that this didn't generate compiler warning?
> 
> Well somewhere hidden in a mail from me, I think I already wrote that I
> already got the idea to make these warnings more visible :)
> I didn't look yet further into it, maybe even a [RFC] topic should be
> made for this.
> I'm thinking about how linux kernel compiling works.
> 
> Actually I haven't checked that code ;)
> 
> > And there is no reason to define integers as constants unless you really
> > want to make sure they don't change :)
> 
> This is just a thing left from my previous coding experience.
> As I started to code I personally just prefer that, but yeah gcc is so
> nice and optimizes (almost) everything for us and this code is so little
> anyway :)
> 
> > > +	  p = strchr (os_dev, 'p');
> > > +	  if (p)
> > > +	    *p = ',';
> > 
> > It is usually a bad idea to modify source string.
> 
> Urm right this is util/ no need to save a few bytes :)
> 
> Thanks for your suggestions Vesa.
> It really looks now better compared to the first code I sent about this
> problem and it only uses now 3 variables :)
> 
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> http://lists.gnu.org/mailman/listinfo/grub-devel
-- 
Felix Zielcke




^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2008-09-04 19:57 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <20080808202337.3440.57502.reportbug@sylvester.jejik.com.jejik.com>
2008-08-09 10:26 ` Bug#494383: grub-pc: Grub2 cannot find LVM volume groups with a dash (-) in the name Felix Zielcke
2008-08-09 12:55   ` Felix Zielcke
2008-08-10 13:19   ` Sander Marechal
2008-08-11 16:18     ` [PATCH] " Felix Zielcke
2008-08-11 21:48       ` Sander Marechal
2008-08-14 17:34       ` Felix Zielcke
2008-08-14 18:03         ` Robert Millan
2008-08-14 19:32           ` Felix Zielcke
2008-08-14 20:38             ` Robert Millan
2008-08-14 21:15               ` Felix Zielcke
2008-08-18 15:05                 ` Felix Zielcke
2008-08-18 15:16                   ` Felix Zielcke
2008-09-01  7:08                     ` Felix Zielcke
2008-09-01 22:14                   ` Robert Millan
2008-09-01 22:46                     ` Felix Zielcke
2008-09-02  8:28                       ` Felix Zielcke
2008-09-02 14:59                         ` Vesa Jääskeläinen
2008-09-02 15:59                           ` Felix Zielcke
2008-09-02 16:21                             ` Vesa Jääskeläinen
2008-09-04 19:56                             ` Felix Zielcke
2008-09-02 13:37                       ` Robert Millan

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.