handle DM-RAID disks in convert_system_partition_to_system_disk

This commit is contained in:
Colin Watson 2010-01-31 19:37:37 +00:00
parent b769a37b6e
commit b9c4f55b6f
2 changed files with 20 additions and 7 deletions

View file

@ -1,4 +1,4 @@
2010-01-26 Colin Watson <cjwatson@ubuntu.com> 2010-01-31 Colin Watson <cjwatson@ubuntu.com>
* configure.ac: Check for Linux device-mapper support. * configure.ac: Check for Linux device-mapper support.

View file

@ -937,7 +937,7 @@ convert_system_partition_to_system_disk (const char *os_dev, struct stat *st)
uint32_t maj, min; uint32_t maj, min;
struct dm_tree_node *node, *child; struct dm_tree_node *node, *child;
void *handle; void *handle;
const char *node_uuid, *child_uuid, *child_name; const char *node_uuid, *mapper_name, *child_uuid, *child_name;
if (! tree) if (! tree)
tree = dm_tree_create (); tree = dm_tree_create ();
@ -975,6 +975,7 @@ convert_system_partition_to_system_disk (const char *os_dev, struct stat *st)
} }
handle = NULL; handle = NULL;
mapper_name = NULL;
/* Counter-intuitively, device-mapper refers to the disk-like /* Counter-intuitively, device-mapper refers to the disk-like
device containing a DM-RAID partition device as a "child" of device containing a DM-RAID partition device as a "child" of
the partition device. */ the partition device. */
@ -982,27 +983,39 @@ convert_system_partition_to_system_disk (const char *os_dev, struct stat *st)
if (! child) if (! child)
{ {
grub_dprintf ("hostdisk", "%s has no DM children\n", path); grub_dprintf ("hostdisk", "%s has no DM children\n", path);
return NULL; goto devmapper_out;
} }
child_uuid = dm_tree_node_get_uuid (child); child_uuid = dm_tree_node_get_uuid (child);
if (! child_uuid) if (! child_uuid)
{ {
grub_dprintf ("hostdisk", "%s child has no DM uuid\n", path); grub_dprintf ("hostdisk", "%s child has no DM uuid\n", path);
return NULL; goto devmapper_out;
} }
else if (strncmp (child_uuid, "DMRAID-", 7) != 0) else if (strncmp (child_uuid, "DMRAID-", 7) != 0)
{ {
grub_dprintf ("hostdisk", "%s child is not DM-RAID\n", path); grub_dprintf ("hostdisk", "%s child is not DM-RAID\n", path);
return NULL; goto devmapper_out;
} }
child_name = dm_tree_node_get_name (child); child_name = dm_tree_node_get_name (child);
if (! child_name) if (! child_name)
{ {
grub_dprintf ("hostdisk", "%s child has no DM name\n", path); grub_dprintf ("hostdisk", "%s child has no DM name\n", path);
goto devmapper_out;
}
mapper_name = child_name;
devmapper_out:
if (! mapper_name)
{
/* This is a DM-RAID disk, not a partition. */
mapper_name = dm_tree_node_get_name (node);
if (! mapper_name)
{
grub_dprintf ("hostdisk", "%s has no DM name\n", path);
return NULL; return NULL;
} }
}
return xasprintf ("/dev/mapper/%s", child_name); return xasprintf ("/dev/mapper/%s", mapper_name);
} }
#endif /* HAVE_DEVICE_MAPPER */ #endif /* HAVE_DEVICE_MAPPER */
} }