[Top][All Lists]
[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
- [PATCH] Handle partition devices without corresponding disk devices,
Colin Watson <=