=== modified file 'disk/dmraid_nvidia.c' --- disk/dmraid_nvidia.c 2010-07-23 05:25:00 +0000 +++ disk/dmraid_nvidia.c 2010-07-29 02:36:07 +0000 @@ -156,6 +156,7 @@ { .name = "dmraid_nv", .detect = grub_dmraid_nv_detect, + .uuid = 0, .next = 0 }; === modified file 'disk/mdraid_linux.c' --- disk/mdraid_linux.c 2010-07-28 03:18:33 +0000 +++ disk/mdraid_linux.c 2010-07-29 02:38:44 +0000 @@ -475,9 +475,32 @@ return grub_error (GRUB_ERR_OUT_OF_RANGE, "not raid"); } +static char * +grub_mdraid_uuid (struct grub_raid_array *array) +{ + char *uuid; + grub_uint16_t *data; + + if (!array || !array->uuid_len || !array->uuid) + return 0; + + data = (grub_uint16_t *)array->uuid; + uuid = grub_xasprintf ("%04x%04x-%04x-%04x-%04x-%04x%04x%04x", + grub_be_to_cpu16 (data[0]), + grub_be_to_cpu16 (data[1]), + grub_be_to_cpu16 (data[2]), + grub_be_to_cpu16 (data[3]), + grub_be_to_cpu16 (data[4]), + grub_be_to_cpu16 (data[5]), + grub_be_to_cpu16 (data[6]), + grub_be_to_cpu16 (data[7])); + return uuid; +} + static struct grub_raid grub_mdraid_dev = { .name = "mdraid", .detect = grub_mdraid_detect, + .uuid = grub_mdraid_uuid, .next = 0 }; === modified file 'disk/raid.c' --- disk/raid.c 2010-07-28 07:55:56 +0000 +++ disk/raid.c 2010-07-29 02:20:47 +0000 @@ -726,6 +726,40 @@ } } +struct grub_raid_array * +grub_raid_probe(grub_device_t dev, int *index, char **uuid) +{ + struct grub_raid *p; + + if (!dev->disk) + return 0; + + for (p = grub_raid_list; p; p = p->next) + { + struct grub_raid_array array; + + if (p->detect && !p->detect(dev->disk, &array, 0)) + { + struct grub_raid_array *a; + + for (a = array_list; a != NULL; a = a->next) + if ((a->uuid_len == array.uuid_len) && + (! grub_memcmp (a->uuid, array.uuid, a->uuid_len))) + { + if (index) + *index = array.index; + if (uuid && p->uuid) + *uuid = p->uuid(a); + return a; + } + } + + grub_errno = 0; + } + + return 0; +} + static struct grub_disk_dev grub_raid_dev = { .name = "raid", === modified file 'include/grub/raid.h' --- include/grub/raid.h 2010-07-23 05:25:00 +0000 +++ include/grub/raid.h 2010-07-29 02:17:04 +0000 @@ -64,6 +64,7 @@ grub_err_t (*detect) (grub_disk_t disk, struct grub_raid_array *array, grub_disk_addr_t *start_sector); + char * (*uuid) (struct grub_raid_array *array); struct grub_raid *next; }; @@ -74,6 +75,8 @@ void grub_raid_block_xor (char *buf1, const char *buf2, int size); +struct grub_raid_array * grub_raid_probe(grub_device_t dev, int *index, char **uuid); + typedef grub_err_t (*grub_raid5_recover_func_t) (struct grub_raid_array *array, int disknr, char *buf, grub_disk_addr_t sector, === modified file 'normal/misc.c' --- normal/misc.c 2010-03-15 10:49:27 +0000 +++ normal/misc.c 2010-07-29 02:37:44 +0000 @@ -26,6 +26,7 @@ #include #include #include +#include /* Print the information on the device NAME. */ grub_err_t @@ -53,12 +54,30 @@ else if (dev->disk) { grub_fs_t fs; - - fs = grub_fs_probe (dev); - /* Ignore all errors. */ - grub_errno = 0; - - if (fs) + struct grub_raid_array *array; + int disk_index; + char *array_uuid = 0; + + array = grub_raid_probe(dev, &disk_index, &array_uuid); + if (!array) + { + fs = grub_fs_probe (dev); + /* Ignore all errors. */ + grub_errno = 0; + } + + if (array) + { + grub_printf ("RAID%u %s - Disk %u/%u", + array->level, array->name, + disk_index, array->total_devs); + if (array_uuid) + { + grub_printf (", UUID %s", array_uuid); + grub_free (array_uuid); + } + } + else if (fs) { grub_printf_ (N_("Filesystem type %s"), fs->name); if (fs->label)