grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] Handle partition devices without corresponding disk devices


From: Colin Watson
Subject: [PATCH] Handle partition devices without corresponding disk devices
Date: Fri, 10 Sep 2010 18:33:29 +0100
User-agent: Mutt/1.5.18 (2008-05-17)

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  <address@hidden>

        * 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                                       address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]