2007-05-18 Jeroen Dekkers <jeroen@dekkers.cx>
* util/getroot.c (grub_util_get_grub_dev): Support partitionable arrays. * disk/raid.c (grub_raid_open): Likewise.
This commit is contained in:
parent
1ecb6cf2b4
commit
260ba823e6
3 changed files with 56 additions and 7 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
2007-05-18 Jeroen Dekkers <jeroen@dekkers.cx>
|
||||||
|
|
||||||
|
* util/getroot.c (grub_util_get_grub_dev): Support partitionable
|
||||||
|
arrays.
|
||||||
|
* disk/raid.c (grub_raid_open): Likewise.
|
||||||
|
|
||||||
2007-05-17 Jeroen Dekkers <jeroen@dekkers.cx>
|
2007-05-17 Jeroen Dekkers <jeroen@dekkers.cx>
|
||||||
|
|
||||||
* util/biosdisk.c (linux_find_partition): Allocate real_dev on the
|
* util/biosdisk.c (linux_find_partition): Allocate real_dev on the
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* raid.c - module to read RAID arrays. */
|
/* raid.c - module to read RAID arrays. */
|
||||||
/*
|
/*
|
||||||
* GRUB -- GRand Unified Bootloader
|
* GRUB -- GRand Unified Bootloader
|
||||||
* Copyright (C) 2006 Free Software Foundation, Inc.
|
* Copyright (C) 2006, 2007 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* GRUB is free software; you can redistribute it and/or modify
|
* GRUB is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -83,8 +83,7 @@ grub_raid_open (const char *name, grub_disk_t disk)
|
||||||
if (!array)
|
if (!array)
|
||||||
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "Unknown device");
|
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "Unknown device");
|
||||||
|
|
||||||
/* FIXME: superblock version 1 supports partitions. */
|
disk->has_partitions = 1;
|
||||||
disk->has_partitions = 0;
|
|
||||||
disk->id = array->number;
|
disk->id = array->number;
|
||||||
disk->data = array;
|
disk->data = array;
|
||||||
|
|
||||||
|
|
|
@ -256,11 +256,55 @@ grub_util_get_grub_dev (const char *os_dev)
|
||||||
/* Check for RAID. */
|
/* Check for RAID. */
|
||||||
if (!strncmp (os_dev, "/dev/md", 7))
|
if (!strncmp (os_dev, "/dev/md", 7))
|
||||||
{
|
{
|
||||||
char *p, *grub_dev = xmalloc (8);
|
const char *p;
|
||||||
|
char *grub_dev = xmalloc (20);
|
||||||
|
|
||||||
|
if (os_dev[7] == '_' && os_dev[8] == 'd')
|
||||||
|
{
|
||||||
|
/* 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++;
|
||||||
|
}
|
||||||
|
|
||||||
|
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')
|
||||||
|
{
|
||||||
|
p = os_dev + 5;
|
||||||
|
memcpy (grub_dev, p, 7);
|
||||||
|
grub_dev[7] = '\0';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
grub_util_error ("Unknown kind of RAID device `%s'", os_dev);
|
||||||
|
|
||||||
p = strchr (os_dev, 'm');
|
|
||||||
memcpy (grub_dev, p, 7);
|
|
||||||
grub_dev[7] = '\0';
|
|
||||||
|
|
||||||
return grub_dev;
|
return grub_dev;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue