grub-devel.gnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Handle partition devices without corresponding disk devices
@ 2010-09-10 17:33 Colin Watson
  2010-09-15 18:55 ` grub-setup inflexibility Joey Korkames
  0 siblings, 1 reply; 6+ messages in thread
From: Colin Watson @ 2010-09-10 17:33 UTC (permalink / raw)
  To: grub-devel

On Xen (I'm told), it's possible to assign disk images in the host to
things that are named rather like partitions in the guest (e.g.
/dev/sda1), but that don't have an associated disk (e.g. /dev/sda);
indeed, the latter device is nonexistent.  This confuses
grub_util_biosdisk_get_grub_dev.

There's really no other situation in which I think it's terribly
plausible that you might have /dev/sda1 but not /dev/sda, so it seems to
me that in this case we can reasonably treat the apparent "partition" as
a disk in its own right.

2010-09-10  Colin Watson  <cjwatson@ubuntu.com>

	* grub-core/kern/emu/hostdisk.c (find_system_device): Only try
	to convert partition names to disk names if the new `convert'
	parameter is set.
	(grub_util_biosdisk_get_grub_dev): If opening the disk device
	returns GRUB_ERR_UNKNOWN_DEVICE, treat the partition device as a
	disk in its own right.  This can happen with Xen disk images.

=== modified file 'grub-core/kern/emu/hostdisk.c'
--- grub-core/kern/emu/hostdisk.c	2010-07-12 19:13:28 +0000
+++ grub-core/kern/emu/hostdisk.c	2010-09-10 17:24:11 +0000
@@ -1334,12 +1334,15 @@ device_is_wholedisk (const char *os_dev)
 #endif /* defined(__NetBSD__) */
 
 static int
-find_system_device (const char *os_dev, struct stat *st)
+find_system_device (const char *os_dev, struct stat *st, int convert)
 {
   unsigned int i;
   char *os_disk;
 
-  os_disk = convert_system_partition_to_system_disk (os_dev, st);
+  if (convert)
+    os_disk = convert_system_partition_to_system_disk (os_dev, st);
+  else
+    os_disk = xstrdup (os_dev);
   if (! os_disk)
     return -1;
 
@@ -1373,7 +1376,7 @@ grub_util_biosdisk_get_grub_dev (const c
       return 0;
     }
 
-  drive = find_system_device (os_dev, &st);
+  drive = find_system_device (os_dev, &st, 1);
   if (drive < 0)
     {
       grub_error (GRUB_ERR_UNKNOWN_DEVICE,
@@ -1456,7 +1459,32 @@ grub_util_biosdisk_get_grub_dev (const c
     free (name);
 
     if (! disk)
-      return 0;
+      {
+	/* We already know that the partition exists.  Given that we already
+	   checked the device map above, we can only get
+	   GRUB_ERR_UNKNOWN_DEVICE at this point if the disk does not exist.
+	   This can happen on Xen, where disk images in the host can be
+	   assigned to devices that have partition-like names in the guest
+	   but are really more like disks.  */
+	if (grub_errno == GRUB_ERR_UNKNOWN_DEVICE)
+	  {
+	    grub_util_info
+	      ("disk does not exist, so falling back to partition device %s",
+	       os_dev);
+
+	    drive = find_system_device (os_dev, &st, 0);
+	    if (drive < 0)
+	      {
+		grub_error (GRUB_ERR_UNKNOWN_DEVICE,
+			    "no mapping exists for `%s'", os_dev);
+		return 0;
+	      }
+
+	    return make_device_name (drive, -1, -1);
+	  }
+	else
+	  return 0;
+      }
 
     partname = NULL;
     grub_partition_iterate (disk, find_partition);

-- 
Colin Watson                                       [cjwatson@ubuntu.com]


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2010-11-18  2:28 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-09-10 17:33 [PATCH] Handle partition devices without corresponding disk devices Colin Watson
2010-09-15 18:55 ` grub-setup inflexibility Joey Korkames
2010-09-15 23:00   ` Vladimir 'φ-coder/phcoder' Serbinenko
2010-09-16  2:02     ` Joey Korkames
2010-09-16  7:40       ` Vladimir 'φ-coder/phcoder' Serbinenko
2010-11-18  2:28       ` Vladimir 'φ-coder/phcoder' Serbinenko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).