Support RAID on virtio devices, and others.

* grub-core/kern/emu/getroot.c [__MINGW32__] (find_root_device):
Rename to ...
[__MINGW32__] (grub_find_device): ... this.
[! __MINGW32__ && ! __CYGWIN__] (find_root_device): Rename to ...
[! __MINGW32__ && ! __CYGWIN__] (grub_find_device): ... this.  Use a
reasonable default if dir is NULL.
[! __MINGW32__ && __CYGWIN__] (find_cygwin_root_device): Rename to
...
[! __MINGW32__ && __CYGWIN__] (grub_find_device): ... this.
(grub_guess_root_device): Update callers.
* include/grub/emu/getroot.h (grub_find_device): Add prototype.
* util/raid.c (grub_util_getdiskname): Remove.
(grub_util_raid_getmembers): Use grub_find_device rather than
grub_util_getdiskname.
This commit is contained in:
Colin Watson 2010-09-16 14:55:28 +01:00
parent e5bfc130a4
commit 108538d8ff
4 changed files with 46 additions and 34 deletions

View file

@ -228,8 +228,8 @@ find_root_device_from_libzfs (const char *dir)
#ifdef __MINGW32__
static char *
find_root_device (const char *dir __attribute__ ((unused)),
char *
grub_find_device (const char *dir __attribute__ ((unused)),
dev_t dev __attribute__ ((unused)))
{
return 0;
@ -237,13 +237,22 @@ find_root_device (const char *dir __attribute__ ((unused)),
#elif ! defined(__CYGWIN__)
static char *
find_root_device (const char *dir, dev_t dev)
char *
grub_find_device (const char *dir, dev_t dev)
{
DIR *dp;
char *saved_cwd;
struct dirent *ent;
if (! dir)
{
#ifdef __CYGWIN__
return NULL;
#else
dir = "/dev";
#endif
}
dp = opendir (dir);
if (! dp)
return 0;
@ -292,7 +301,7 @@ find_root_device (const char *dir, dev_t dev)
/* Find it recursively. */
char *res;
res = find_root_device (ent->d_name, dev);
res = grub_find_device (ent->d_name, dev);
if (res)
{
@ -402,8 +411,8 @@ get_bootsec_serial (const char *os_dev, int mbr)
return serial;
}
static char *
find_cygwin_root_device (const char *path, dev_t dev)
char *
grub_find_device (const char *path, dev_t dev)
{
/* No root device for /cygdrive. */
if (dev == (DEV_CYGDRIVE_MAJOR << 16))
@ -424,7 +433,7 @@ find_cygwin_root_device (const char *path, dev_t dev)
/* Cygwin returns the partition serial number in stat.st_dev.
This is never identical to the device number of the emulated
/dev/sdXN device, so above find_root_device () does not work.
/dev/sdXN device, so above grub_find_device () does not work.
Search the partition with the same serial in boot sector instead. */
char devpath[sizeof ("/dev/sda15") + 13]; /* Size + Paranoia. */
int d;
@ -529,12 +538,12 @@ grub_guess_root_device (const char *dir)
#ifdef __CYGWIN__
/* Cygwin specific function. */
os_dev = find_cygwin_root_device (dir, st.st_dev);
os_dev = grub_find_device (dir, st.st_dev);
#else
/* This might be truly slow, but is there any better way? */
os_dev = find_root_device ("/dev", st.st_dev);
os_dev = grub_find_device ("/dev", st.st_dev);
#endif
#endif /* !__GNU__ */