From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1N1r62-000774-UW for mharc-grub-devel@gnu.org; Sat, 24 Oct 2009 20:36:34 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1N1r61-00075P-3O for grub-devel@gnu.org; Sat, 24 Oct 2009 20:36:33 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1N1r5v-0006w7-EI for grub-devel@gnu.org; Sat, 24 Oct 2009 20:36:32 -0400 Received: from [199.232.76.173] (port=51732 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1N1r5v-0006vt-9s for grub-devel@gnu.org; Sat, 24 Oct 2009 20:36:27 -0400 Received: from smarthost01.mail.zen.net.uk ([212.23.3.140]:55287) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1N1r5u-0005St-MG for grub-devel@gnu.org; Sat, 24 Oct 2009 20:36:26 -0400 Received: from [82.69.40.219] (helo=riva.pelham.vpn.ucam.org) by smarthost01.mail.zen.net.uk with esmtp (Exim 4.63) (envelope-from ) id 1N1r5q-0003kh-Jk for grub-devel@gnu.org; Sun, 25 Oct 2009 00:36:25 +0000 Received: from cjwatson by riva.pelham.vpn.ucam.org with local (Exim 3.36 #1 (Debian)) for grub-devel@gnu.org id 1N1r5m-0001KI-00; Sun, 25 Oct 2009 01:36:18 +0100 Date: Sun, 25 Oct 2009 01:36:18 +0100 From: Colin Watson To: grub-devel@gnu.org Message-ID: <20091025003617.GH28534@riva.ucam.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.18 (2008-05-17) X-Originating-Smarthost01-IP: [82.69.40.219] X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 3) Subject: [PATCH] Support RAID on virtio devices, and others X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GRUB 2 List-Id: The development of GRUB 2 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 25 Oct 2009 00:36:33 -0000 GRUB only supports RAID on a relatively small number of device types, as implemented by grub_util_getdiskname. I received a bug report noting that this doesn't work for RAID arrays with virtio block devices (often used in kvm) as components. This is difficult to support using the approach taken by grub_util_getdiskname, as virtio devices use dynamic major numbers. find_root_device in util/getroot.c seemed to be exactly what I wanted: it just trawls /dev for the appropriate major and minor numbers. This code is not performance-critical, so that should be fine. I made the function naming more consistent, added support for a default directory in its interface (this may have problems on Cygwin; does anyone care about RAID on Cygwin? If so, perhaps they can propose improvements), and changed the RAID code to use it. Bazaar users can merge this from: bzr+ssh://bzr.sv.gnu.org/grub/people/cjwatson/raid-virtio/ === modified file 'ChangeLog' --- ChangeLog 2009-10-21 12:22:05 +0000 +++ ChangeLog 2009-10-25 01:32:02 +0000 @@ -1,3 +1,22 @@ +2009-10-25 Colin Watson + + Support RAID on virtio devices, and others. + + * util/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/util/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. + 2009-10-21 Felix Zielcke * config.guess: Update to latest version from config git === modified file 'include/grub/util/getroot.h' --- include/grub/util/getroot.h 2009-04-11 09:40:39 +0000 +++ include/grub/util/getroot.h 2009-10-25 01:22:15 +0000 @@ -19,12 +19,15 @@ #ifndef GRUB_UTIL_GETROOT_HEADER #define GRUB_UTIL_GETROOT_HEADER 1 +#include + enum grub_dev_abstraction_types { GRUB_DEV_ABSTRACTION_NONE, GRUB_DEV_ABSTRACTION_LVM, GRUB_DEV_ABSTRACTION_RAID, }; +char *grub_find_device (const char *dir, dev_t dev); char *grub_guess_root_device (const char *dir); char *grub_get_prefix (const char *dir); int grub_util_get_dev_abstraction (const char *os_dev); === modified file 'util/getroot.c' --- util/getroot.c 2009-07-20 20:03:18 +0000 +++ util/getroot.c 2009-10-25 01:22:15 +0000 @@ -172,8 +172,8 @@ grub_get_prefix (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; @@ -181,13 +181,22 @@ find_root_device (const char *dir __attr #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; @@ -225,7 +234,7 @@ find_root_device (const char *dir, dev_t /* Find it recursively. */ char *res; - res = find_root_device (ent->d_name, dev); + res = grub_find_device (ent->d_name, dev); if (res) { @@ -328,8 +337,8 @@ get_bootsec_serial (const char *os_dev, 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)) @@ -350,7 +359,7 @@ find_cygwin_root_device (const char *pat /* 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; @@ -386,12 +395,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 return os_dev; === modified file 'util/raid.c' --- util/raid.c 2009-06-10 21:04:23 +0000 +++ util/raid.c 2009-10-25 01:22:15 +0000 @@ -21,40 +21,19 @@ #ifdef __linux__ #include #include +#include #include #include #include #include +#include #include #include #include #include -static char * -grub_util_getdiskname (int major, int minor) -{ - char *name = xmalloc (15); - - if (major == LOOP_MAJOR) - sprintf (name, "/dev/loop%d", minor); - else if (major == IDE0_MAJOR) - sprintf (name, "/dev/hd%c", 'a' + minor / 64); - else if (major == IDE1_MAJOR) - sprintf (name, "/dev/hd%c", 'c' + minor / 64); - else if (major == IDE2_MAJOR) - sprintf (name, "/dev/hd%c", 'e' + minor / 64); - else if (major == IDE3_MAJOR) - sprintf (name, "/dev/hd%c", 'g' + minor / 64); - else if (major == SCSI_DISK0_MAJOR) - sprintf (name, "/dev/sd%c", 'a' + minor / 16); - else - grub_util_error ("Unknown device number: %d, %d", major, minor); - - return name; -} - char ** grub_util_raid_getmembers (char *name) { @@ -99,7 +78,8 @@ grub_util_raid_getmembers (char *name) if (disk.state & (1 << MD_DISK_ACTIVE)) { - devicelist[j] = grub_util_getdiskname (disk.major, disk.minor); + devicelist[j] = grub_find_device (NULL, + makedev (disk.major, disk.minor)); j++; } } -- Colin Watson [cjwatson@ubuntu.com]