]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
more linux-like name for LVM volumes
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Thu, 21 Apr 2011 23:10:24 +0000 (01:10 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Thu, 21 Apr 2011 23:10:24 +0000 (01:10 +0200)
grub-core/disk/lvm.c
grub-core/kern/emu/getroot.c
include/grub/lvm.h

index 72f493540d461e4d13e87c05af1f4beeca59b886..c430f596deeb43f40132e30c1270652b1ff49e2a 100644 (file)
@@ -172,7 +172,9 @@ find_lv (const char *name)
     {
       if (vg->lvs)
        for (lv = vg->lvs; lv; lv = lv->next)
-         if (! grub_strcmp (lv->name, name) && is_lv_readable (lv))
+         if ((grub_strcmp (lv->fullname, name) == 0
+              || grub_strcmp (lv->compatname, name) == 0)
+             && is_lv_readable (lv))
            return lv;
     }
   return NULL;
@@ -188,10 +190,7 @@ grub_lvm_open (const char *name, grub_disk_t disk,
   int explicit = 0;
 
   if (grub_memcmp (name, "lvm/", sizeof ("lvm/") - 1) == 0)
-    {
-      name += sizeof ("lvm/") - 1;
-      explicit = 1;
-    }
+    explicit = 1;
 
   lv = find_lv (name);
 
@@ -685,11 +684,34 @@ grub_lvm_scan_device (const char *name)
                q++;
 
              s = q - p;
-             lv->name = grub_malloc (vgname_len + 1 + s + 1);
-             grub_memcpy (lv->name, vgname, vgname_len);
-             lv->name[vgname_len] = '-';
-             grub_memcpy (lv->name + vgname_len + 1, p, s);
-             lv->name[vgname_len + 1 + s] = '\0';
+             lv->name = grub_strndup (p, s);
+             lv->compatname = grub_malloc (vgname_len + 1 + s + 1);
+             grub_memcpy (lv->compatname, vgname, vgname_len);
+             lv->compatname[vgname_len] = '-';
+             grub_memcpy (lv->compatname + vgname_len + 1, p, s);
+             lv->compatname[vgname_len + 1 + s] = '\0';
+
+             {
+               const char *iptr;
+               char *optr;
+               lv->fullname = grub_malloc (sizeof("lvm/") + 2 * vgname_len
+                                           + 1 + 2 * s + 1);
+               optr = lv->fullname;
+               for (iptr = vgname; iptr < vgname + vgname_len; iptr++)
+                 {
+                   *optr++ = *iptr;
+                   if (*iptr == '-')
+                     *optr++ = '-';
+                 }
+               *optr++ = '-';
+               for (iptr = p; iptr < p + s; iptr++)
+                 {
+                   *optr++ = *iptr;
+                   if (*iptr == '-')
+                     *optr++ = '-';
+                 }
+               *optr++ = 0;
+             }
 
              lv->size = 0;
 
index f836a66257be91a43f06c815b358c2d60c7c4b67..c780fd94d900f963e057b990e82b47d96e2c88fe 100644 (file)
@@ -783,14 +783,10 @@ grub_util_get_grub_dev (const char *os_dev)
        grub_size_t offset = sizeof ("/dev/mapper/") - 1;
 
        len = strlen (os_dev) - offset + 1;
-       grub_dev = xmalloc (len);
+       grub_dev = xmalloc (len + sizeof ("lvm/"));
 
-       for (i = 0; i < len; i++, offset++)
-         {
-           grub_dev[i] = os_dev[offset];
-           if (os_dev[offset] == '-' && os_dev[offset + 1] == '-')
-             offset++;
-         }
+       grub_memcpy (grub_dev, "lvm/", sizeof ("lvm/") - 1);
+       grub_memcpy (grub_dev + sizeof ("lvm/") - 1, os_dev + offset, len);
       }
 
       break;
index b962dfd6c42f25032c15858e5fc35e7734f1fbd1..b5352c75c72f06d9770c469a9f867761a5c5ba13 100644 (file)
@@ -44,6 +44,8 @@ struct grub_lvm_pv {
 
 struct grub_lvm_lv {
   char *name;
+  char *fullname;
+  char *compatname;
   unsigned int number;
   unsigned int segment_count;
   grub_uint64_t size;