From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1N8ajN-0001Ud-22 for mharc-grub-devel@gnu.org; Thu, 12 Nov 2009 09:33:01 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1N8ajL-0001UE-82 for grub-devel@gnu.org; Thu, 12 Nov 2009 09:32:59 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1N8ajH-0001Te-3M for grub-devel@gnu.org; Thu, 12 Nov 2009 09:32:58 -0500 Received: from [199.232.76.173] (port=59055 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1N8ajG-0001Tb-Mc for grub-devel@gnu.org; Thu, 12 Nov 2009 09:32:54 -0500 Received: from moutng.kundenserver.de ([212.227.126.171]:50777) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1N8ajG-0002SU-4e for grub-devel@gnu.org; Thu, 12 Nov 2009 09:32:54 -0500 Received: from [85.180.46.174] (e180046174.adsl.alicedsl.de [85.180.46.174]) by mrelayeu.kundenserver.de (node=mreu2) with ESMTP (Nemesis) id 0MZ9ey-1MnkUg0K8C-00L2x3; Thu, 12 Nov 2009 15:32:50 +0100 From: Felix Zielcke To: The development of GNU GRUB In-Reply-To: <4AFBF433.9@gmail.com> References: <4AFBE146.7090300@gmail.com> <3d64908c272936895f4a8250f3f65262@localhost> <4AFBF433.9@gmail.com> Content-Type: multipart/mixed; boundary="=-cdFmCZcfn6fSZcSSPy1T" Date: Thu, 12 Nov 2009 15:32:49 +0100 Message-ID: <1258036369.4591.2.camel@fz.local> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 X-Provags-ID: V01U2FsdGVkX19ytZcDhsG8MRFaArxvN+wkNkRNtrQmeHiUIB7 l9VnNgDKnJ5OkXhfCMI6l3QEVPHB9uXafLcxcmQbtiCcmvKO48 7L+3MyekiHqVa55Qche6w== X-detected-operating-system: by monty-python.gnu.org: Genre and OS details not recognized. Subject: Re: grub2 (1.97.1) on RAID0 X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 12 Nov 2009 14:32:59 -0000 --=-cdFmCZcfn6fSZcSSPy1T Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Am Donnerstag, den 12.11.2009, 12:40 +0100 schrieb Andr=C3=A9 Fettouhi: > That sucks big time! >=20 > info@dupondje.be skrev: > > To bad :) > > Its not possible to use dmraid with Grub2 yet. > > > > I had to switch bad to grub1 because its not possible to get it working= . > > Hopefully some developper wants to implement this :) > > > > Sincerely, > > Jean-Louis > > If you have some /dev/mapper/nvida_ pdc_ or isw_ device you can try attached patch. But it's a dirty way to implement it and not really tested. I haven't checked it with recent releases but at the time I wrote it it worked with my nvidia dmraid device. isw_ devices seems to have different formats only one of them is supported. And pdc_ worked for Pavel but for someone else on IRC it didn't. --=20 Felix Zielcke Proud Debian Maintainer and GNU GRUB developer --=-cdFmCZcfn6fSZcSSPy1T Content-Disposition: attachment; filename="dmraid.patch.5" Content-Type: text/x-patch; name="dmraid.patch.5"; charset="UTF-8" Content-Transfer-Encoding: 7bit diff --git a/util/getroot.c b/util/getroot.c index 120ab13..f1bfd4c 100644 --- a/util/getroot.c +++ b/util/getroot.c @@ -396,13 +396,38 @@ grub_guess_root_device (const char *dir) return os_dev; } +int +grub_util_is_dmraid (const char *os_dev) +{ + if (! strncmp (os_dev, "/dev/mapper/nvidia_", 19)) + return 1; + else if (! strncmp (os_dev, "/dev/mapper/isw_", 16)) + return 1; + else if (! strncmp (os_dev, "/dev/mapper/hpt37x_", 19)) + return 1; + else if (! strncmp (os_dev, "/dev/mapper/hpt45x_", 19)) + return 1; + else if (! strncmp (os_dev, "/dev/mapper/via_", 16)) + return 1; + else if (! strncmp (os_dev, "/dev/mapper/lsi_", 16)) + return 1; + else if (! strncmp (os_dev, "/dev/mapper/pdc_", 16)) + return 1; + else if (! strncmp (os_dev, "/dev/mapper/jmicron_", 20)) + return 1; + else if (! strncmp (os_dev, "/dev/mapper/asr_", 16)) + return 1; + else if (! strncmp (os_dev, "/dev/mapper/sil_", 16)) + return 1; + return 0; +} int grub_util_get_dev_abstraction (const char *os_dev UNUSED) { #ifdef __linux__ /* Check for LVM. */ - if (!strncmp (os_dev, "/dev/mapper/", 12)) + if (!strncmp (os_dev, "/dev/mapper/", 12) && ! grub_util_is_dmraid (os_dev)) return GRUB_DEV_ABSTRACTION_LVM; /* Check for RAID. */ diff --git a/util/hostdisk.c b/util/hostdisk.c index a06ecca..0d94ccd 100644 --- a/util/hostdisk.c +++ b/util/hostdisk.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -819,6 +820,27 @@ convert_system_partition_to_system_disk (const char *os_dev) p[4] = '\0'; return path; } + /* If this is a Nvidia fake raid. */ + if (strncmp ("mapper/nvidia_", p, 14) == 0 && p[22] >= '0' && p[22] <= '9') + { + p[sizeof ("mapper/nvidia_abcdefgh") - 1] = '\0'; + return path; + } + if (strncmp ("mapper/pdc_", p, 11) == 0 && p[20] >= '0' && p[20] <= '9') + { + p[sizeof ("mapper/pdc_abcdefghi") - 1] = '\0'; + return path; + } + if (strncmp ("mapper/isw_", p, 11) == 0 && p[29] >= '0' && p[29] <= '9') + { + p[sizeof ("mapper/isw_abcdefghij_Volume0") - 1] = '\0'; + return path; + } + if (strncmp ("mapper/isw_", p, 11) == 0 && p[27] >= '0' && p[27] <= '9') + { + p[sizeof ("mapper/isw_abcdefghij_ARRAY") - 1] = '\0'; + return path; + } } return path; @@ -869,6 +891,10 @@ device_is_wholedisk (const char *os_dev) if (os_dev[len - 1] < '0' || os_dev[len - 1] > '9') return 1; + if (strncmp ("/dev/mapper/isw_", os_dev, 16) == 0 && os_dev[34] == '\0') + return 1; + if (strncmp ("/dev/mapper/isw_", os_dev, 16) == 0 && os_dev[32] == '\0') + return 1; return 0; } #endif @@ -935,7 +961,7 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev) does not count the extended partition and missing primary partitions. Use same method as on Linux here. */ { - char *name; + char *name, *os_dev_uuid; grub_disk_t disk; int fd; struct hd_geometry hdg; @@ -985,7 +1011,44 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev) return 0; } + auto int find_partition_by_uuid (const char *name); + int find_partition_by_uuid (const char *name) + { + grub_device_t dev; + + if (name[0] == 'f' && name[1] == 'd' + && name[2] >= '0' && name[2] <= '9') + return 0; + + dev = grub_device_open (name); + if (dev) + { + grub_fs_t fs; + + fs = grub_fs_probe (dev); + + if (fs && fs->uuid) + { + char *uuid, *p; + + (fs->uuid) (dev, &uuid); + if (grub_errno == GRUB_ERR_NONE && uuid) + { + if (grub_strcasecmp (uuid, os_dev_uuid) == 0) + { + p = strchr (name, ','); + dos_part = atoi (p); + free (uuid); + return 1; + } + free (uuid); + } + } + grub_device_close (dev); + } + return 0; + } name = make_device_name (drive, -1, -1); if (MAJOR (st.st_rdev) == FLOPPY_MAJOR) @@ -1015,28 +1078,60 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev) if (hdg.start == 0 && device_is_wholedisk (os_dev)) return name; - grub_util_info ("opening the device %s", name); - disk = grub_disk_open (name); - free (name); - - if (! disk) - return 0; - grub_partition_iterate (disk, find_partition); - if (grub_errno != GRUB_ERR_NONE) + if (hdg.sectors == 0) { - grub_disk_close (disk); - return 0; + FILE *fp; + char *free_ptr, *p, *q; + int len = 512; + + p = xmalloc (strlen (os_dev) + strlen ("blkid ") + 1); + strcpy (p, "blkid "); + strcat (p, os_dev); + fp = popen (p, "r"); + free (p); + do { + p = xmalloc (len); + p = fgets (p, len, fp); + if (! p) + return 0; + len *= 2; + } while (! strchr (p, '\n')); + free_ptr = p; + p = strstr (p , "UUID="); + if (! p) + return 0; + p += strlen ("UUID=\""); + q = strchr (p, '\"'); + if (q) + *q = '\0'; + os_dev_uuid = p; + pclose (fp); + grub_device_iterate (find_partition_by_uuid); + free (free_ptr); } - - if (dos_part < 0) + else { - grub_disk_close (disk); - grub_error (GRUB_ERR_BAD_DEVICE, - "cannot find the partition of `%s'", os_dev); - return 0; - } + grub_util_info ("opening the device %s", name); + disk = grub_disk_open (name); + free (name); + if (! disk) + return 0; + grub_partition_iterate (disk, find_partition); + if (grub_errno != GRUB_ERR_NONE) + { + grub_disk_close (disk); + return 0; + } + if (dos_part < 0) + { + grub_disk_close (disk); + grub_error (GRUB_ERR_BAD_DEVICE, + "cannot find the partition of `%s'", os_dev); + return 0; + } + } return make_device_name (drive, dos_part, bsd_part); } --=-cdFmCZcfn6fSZcSSPy1T--