* disk/lvm.c [GRUB_UTIL] (grub_lvm_memberlist): New function. Construct
and return a grub_diskmemberlist_t composed of LVM physical volumes.
[GRUB_UTIL] (grub_lvm_dev): Add `memberlist' member.
* disk/raid.c [GRUB_UTIL] (grub_raid_memberlist): New function. Construct
and return a grub_diskmemberlist_t composed of physical array members.
[GRUB_UTIL] (grub_raid_dev): Add `memberlist' member.
* include/grub/disk.h [GRUB_UTIL] (grub_disk_memberlist): New struct
prototype.
[GRUB_UTIL] (struct grub_disk_dev): Add `memberlist' function pointer.
[GRUB_UTIL] (struct grub_disk_memberlist): New struct declaration.
[GRUB_UTIL] (grub_disk_memberlist_t): New typedef.
* util/grub-probe.c (probe): Move partmap probing code from here ...
(probe_partmap): ... to here.
(probe): Use probe_partmap() once for the disk we're probing, and
additionally, when such disk contains a memberlist() struct member,
once for each disk that is contained in the structure returned by
memberlist().
+2008-02-09 Robert Millan <rmh@aybabtu.com>
+
+ * disk/lvm.c [GRUB_UTIL] (grub_lvm_memberlist): New function. Construct
+ and return a grub_diskmemberlist_t composed of LVM physical volumes.
+ [GRUB_UTIL] (grub_lvm_dev): Add `memberlist' member.
+
+ * disk/raid.c [GRUB_UTIL] (grub_raid_memberlist): New function. Construct
+ and return a grub_diskmemberlist_t composed of physical array members.
+ [GRUB_UTIL] (grub_raid_dev): Add `memberlist' member.
+
+ * include/grub/disk.h [GRUB_UTIL] (grub_disk_memberlist): New struct
+ prototype.
+ [GRUB_UTIL] (struct grub_disk_dev): Add `memberlist' function pointer.
+ [GRUB_UTIL] (struct grub_disk_memberlist): New struct declaration.
+ [GRUB_UTIL] (grub_disk_memberlist_t): New typedef.
+
+ * util/grub-probe.c (probe): Move partmap probing code from here ...
+ (probe_partmap): ... to here.
+ (probe): Use probe_partmap() once for the disk we're probing, and
+ additionally, when such disk contains a memberlist() struct member,
+ once for each disk that is contained in the structure returned by
+ memberlist().
+
2008-02-09 Robert Millan <rmh@aybabtu.com>
* util/grub-probe.c (main): When `verbosity > 1', set `debug'
return 0;
}
+#ifdef GRUB_UTIL
+static grub_disk_memberlist_t
+grub_lvm_memberlist (grub_disk_t disk)
+{
+ struct grub_lvm_lv *lv = disk->data;
+ grub_disk_memberlist_t list = NULL, tmp;
+ struct grub_lvm_pv *pv;
+
+ for (pv = lv->vg->pvs; pv; pv = pv->next)
+ {
+ tmp = grub_malloc (sizeof (*tmp));
+ tmp->disk = pv->disk;
+ tmp->next = list;
+ list = tmp;
+ }
+
+ return list;
+}
+#endif
+
static grub_err_t
grub_lvm_open (const char *name, grub_disk_t disk)
{
.close = grub_lvm_close,
.read = grub_lvm_read,
.write = grub_lvm_write,
+#ifdef GRUB_UTIL
+ .memberlist = grub_lvm_memberlist,
+#endif
.next = 0
};
return 0;
}
+#ifdef GRUB_UTIL
+static grub_disk_memberlist_t
+grub_raid_memberlist (grub_disk_t disk)
+{
+ struct grub_raid_array *array = disk->data;
+ grub_disk_memberlist_t list = NULL, tmp;
+ int i;
+
+ for (i = 0; i < array->total_devs; i++)
+ {
+ tmp = grub_malloc (sizeof (*tmp));
+ tmp->disk = array->device[i];
+ tmp->next = list;
+ list = tmp;
+ }
+
+ return list;
+}
+#endif
+
static grub_err_t
grub_raid_open (const char *name, grub_disk_t disk)
{
.close = grub_raid_close,
.read = grub_raid_read,
.write = grub_raid_write,
+#ifdef GRUB_UTIL
+ .memberlist = grub_raid_memberlist,
+#endif
.next = 0
};
};
struct grub_disk;
+#ifdef GRUB_UTIL
+struct grub_disk_memberlist;
+#endif
/* Disk device. */
struct grub_disk_dev
grub_err_t (*write) (struct grub_disk *disk, grub_disk_addr_t sector,
grub_size_t size, const char *buf);
+#ifdef GRUB_UTIL
+ struct grub_disk_memberlist *(*memberlist) (struct grub_disk *disk);
+#endif
+
/* The next disk device. */
struct grub_disk_dev *next;
};
};
typedef struct grub_disk *grub_disk_t;
+#ifdef GRUB_UTIL
+struct grub_disk_memberlist
+{
+ grub_disk_t disk;
+ struct grub_disk_memberlist *next;
+};
+typedef struct grub_disk_memberlist *grub_disk_memberlist_t;
+#endif
+
/* The sector size. */
#define GRUB_DISK_SECTOR_SIZE 0x200
#define GRUB_DISK_SECTOR_BITS 9
{
}
+static void
+probe_partmap (grub_disk_t disk)
+{
+ char *name;
+ char *underscore;
+
+ if (disk->partition == NULL)
+ {
+ grub_util_info ("No partition map found for %s", disk->name);
+ return;
+ }
+
+ name = strdup (disk->partition->partmap->name);
+ if (! name)
+ grub_util_error ("Not enough memory");
+
+ underscore = strchr (name, '_');
+ if (! underscore)
+ grub_util_error ("Invalid partition map %s", name);
+
+ *underscore = '\0';
+ printf ("%s\n", name);
+ free (name);
+}
+
static void
probe (const char *path)
{
if (print == PRINT_PARTMAP)
{
- char *name;
- char *underscore;
-
- if (dev->disk->partition == NULL)
- grub_util_error ("Cannot detect partition map for %s", drive_name);
+ grub_disk_memberlist_t list = NULL, tmp;
- name = strdup (dev->disk->partition->partmap->name);
- if (! name)
- grub_util_error ("not enough memory");
+ /* Check if dev->disk itself is contained in a partmap. */
+ probe_partmap (dev->disk);
- underscore = strchr (name, '_');
- if (! underscore)
- grub_util_error ("Invalid partition map %s", name);
-
- *underscore = '\0';
- printf ("%s\n", name);
- free (name);
+ /* In case of LVM/RAID, check the member devices as well. */
+ if (dev->disk->dev->memberlist)
+ list = dev->disk->dev->memberlist (dev->disk);
+ while (list)
+ {
+ probe_partmap (list->disk);
+ tmp = list->next;
+ free (list);
+ list = tmp;
+ }
goto end;
}