{
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;
int explicit = 0;
if (grub_memcmp (name, "lvm/", sizeof ("lvm/") - 1) == 0)
- {
- name += sizeof ("lvm/") - 1;
- explicit = 1;
- }
+ explicit = 1;
lv = find_lv (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;
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;