aboutsummaryrefslogtreecommitdiff
path: root/grub-core/disk
diff options
context:
space:
mode:
authorFathi Boudra <fathi.boudra@linaro.org>2013-01-31 02:47:37 +0200
committerFathi Boudra <fathi.boudra@linaro.org>2013-03-30 17:41:06 +0200
commita658a0c5e3a4fe5c61fc9ae26417a33e0f69efff (patch)
treea2cad6d1cf96e429cdc26567fd65a906495a5143 /grub-core/disk
parent51429b4eded131e21c7b20475e9f3da6c2c77907 (diff)
parentf4243e63fd6e9588757edb1cca3cc3d88bc22faf (diff)
Imported Debian patch 2.00+bzr4617+20130130-0linaro4debian/2.00+bzr4617+20130130-0linaro4
Diffstat (limited to 'grub-core/disk')
-rw-r--r--grub-core/disk/ahci.c13
-rw-r--r--grub-core/disk/arc/arcdisk.c36
-rw-r--r--grub-core/disk/ata.c118
-rw-r--r--grub-core/disk/cryptodisk.c13
-rw-r--r--grub-core/disk/diskfilter.c116
-rw-r--r--grub-core/disk/efi/efidisk.c69
-rw-r--r--grub-core/disk/host.c4
-rw-r--r--grub-core/disk/i386/pc/biosdisk.c15
-rw-r--r--grub-core/disk/ieee1275/nand.c7
-rw-r--r--grub-core/disk/ieee1275/ofdisk.c4
-rw-r--r--grub-core/disk/ldm.c50
-rw-r--r--grub-core/disk/loopback.c9
-rw-r--r--grub-core/disk/memdisk.c4
-rw-r--r--grub-core/disk/pata.c12
-rw-r--r--grub-core/disk/scsi.c81
-rw-r--r--grub-core/disk/uboot/ubootdisk.c9
-rw-r--r--grub-core/disk/usbms.c5
17 files changed, 318 insertions, 247 deletions
diff --git a/grub-core/disk/ahci.c b/grub-core/disk/ahci.c
index 4ab2d18..f9258fd 100644
--- a/grub-core/disk/ahci.c
+++ b/grub-core/disk/ahci.c
@@ -254,9 +254,10 @@ init_port (struct grub_ahci_device *dev)
return 1;
}
-static int NESTED_FUNC_ATTR
+static int
grub_ahci_pciinit (grub_pci_device_t dev,
- grub_pci_id_t pciid __attribute__ ((unused)))
+ grub_pci_id_t pciid __attribute__ ((unused)),
+ void *data __attribute__ ((unused)))
{
grub_pci_address_t addr;
grub_uint32_t class;
@@ -394,7 +395,7 @@ grub_ahci_pciinit (grub_pci_device_t dev,
static grub_err_t
grub_ahci_initialize (void)
{
- grub_pci_iterate (grub_ahci_pciinit);
+ grub_pci_iterate (grub_ahci_pciinit, NULL);
return grub_errno;
}
@@ -454,8 +455,8 @@ grub_ahci_restore_hw (void)
static int
-grub_ahci_iterate (int (*hook) (int id, int bus),
- grub_disk_pull_t pull)
+grub_ahci_iterate (grub_ata_dev_iterate_hook_t hook, void *hook_data,
+ grub_disk_pull_t pull)
{
struct grub_ahci_device *dev;
@@ -463,7 +464,7 @@ grub_ahci_iterate (int (*hook) (int id, int bus),
return 0;
FOR_LIST_ELEMENTS(dev, grub_ahci_devices)
- if (hook (GRUB_SCSI_SUBSYSTEM_AHCI, dev->num))
+ if (hook (GRUB_SCSI_SUBSYSTEM_AHCI, dev->num, hook_data))
return 1;
return 0;
diff --git a/grub-core/disk/arc/arcdisk.c b/grub-core/disk/arc/arcdisk.c
index 10cbc87..5d12128 100644
--- a/grub-core/disk/arc/arcdisk.c
+++ b/grub-core/disk/arc/arcdisk.c
@@ -80,23 +80,37 @@ arcdisk_hash_add (char *devpath)
}
+/* Context for grub_arcdisk_iterate. */
+struct grub_arcdisk_iterate_ctx
+{
+ grub_disk_dev_iterate_hook_t hook;
+ void *hook_data;
+};
+
+/* Helper for grub_arcdisk_iterate. */
static int
-grub_arcdisk_iterate (int (*hook_in) (const char *name),
+grub_arcdisk_iterate_iter (const char *name,
+ const struct grub_arc_component *comp, void *data)
+{
+ struct grub_arcdisk_iterate_ctx *ctx = data;
+
+ if (!(comp->type == GRUB_ARC_COMPONENT_TYPE_DISK
+ || comp->type == GRUB_ARC_COMPONENT_TYPE_DISK
+ || comp->type == GRUB_ARC_COMPONENT_TYPE_TAPE))
+ return 0;
+ return ctx->hook (name, ctx->hook_data);
+}
+
+static int
+grub_arcdisk_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
grub_disk_pull_t pull)
{
- auto int hook (const char *name, const struct grub_arc_component *comp);
- int hook (const char *name, const struct grub_arc_component *comp)
- {
- if (!(comp->type == GRUB_ARC_COMPONENT_TYPE_DISK
- || comp->type == GRUB_ARC_COMPONENT_TYPE_DISK
- || comp->type == GRUB_ARC_COMPONENT_TYPE_TAPE))
- return 0;
- return hook_in (name);
- }
+ struct grub_arcdisk_iterate_ctx ctx = { hook, hook_data };
+
if (pull != GRUB_DISK_PULL_NONE)
return 0;
- return grub_arc_iterate_devs (hook, 1);
+ return grub_arc_iterate_devs (grub_arcdisk_iterate_iter, &ctx, 1);
}
#define RAW_SUFFIX "partition(10)"
diff --git a/grub-core/disk/ata.c b/grub-core/disk/ata.c
index c0d378c..c84d316 100644
--- a/grub-core/disk/ata.c
+++ b/grub-core/disk/ata.c
@@ -392,40 +392,50 @@ grub_ata_real_open (int id, int bus)
return NULL;
}
+/* Context for grub_ata_iterate. */
+struct grub_ata_iterate_ctx
+{
+ grub_disk_dev_iterate_hook_t hook;
+ void *hook_data;
+};
+
+/* Helper for grub_ata_iterate. */
static int
-grub_ata_iterate (int (*hook_in) (const char *name),
- grub_disk_pull_t pull)
+grub_ata_iterate_iter (int id, int bus, void *data)
{
- auto int hook (int id, int bus);
- int hook (int id, int bus)
- {
- struct grub_ata *ata;
- int ret;
- char devname[40];
+ struct grub_ata_iterate_ctx *ctx = data;
+ struct grub_ata *ata;
+ int ret;
+ char devname[40];
- ata = grub_ata_real_open (id, bus);
+ ata = grub_ata_real_open (id, bus);
- if (!ata)
- {
- grub_errno = GRUB_ERR_NONE;
- return 0;
- }
- if (ata->atapi)
- {
- grub_ata_real_close (ata);
- return 0;
- }
- grub_snprintf (devname, sizeof (devname),
- "%s%d", grub_scsi_names[id], bus);
- ret = hook_in (devname);
- grub_ata_real_close (ata);
- return ret;
- }
+ if (!ata)
+ {
+ grub_errno = GRUB_ERR_NONE;
+ return 0;
+ }
+ if (ata->atapi)
+ {
+ grub_ata_real_close (ata);
+ return 0;
+ }
+ grub_snprintf (devname, sizeof (devname),
+ "%s%d", grub_scsi_names[id], bus);
+ ret = ctx->hook (devname, ctx->hook_data);
+ grub_ata_real_close (ata);
+ return ret;
+}
+static int
+grub_ata_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
+ grub_disk_pull_t pull)
+{
+ struct grub_ata_iterate_ctx ctx = { hook, hook_data };
grub_ata_dev_t p;
for (p = grub_ata_dev_list; p; p = p->next)
- if (p->iterate && p->iterate (hook, pull))
+ if (p->iterate && p->iterate (grub_ata_iterate_iter, &ctx, pull))
return 1;
return 0;
}
@@ -561,37 +571,47 @@ grub_atapi_open (int id, int bus, struct grub_scsi *scsi)
return GRUB_ERR_NONE;
}
+/* Context for grub_atapi_iterate. */
+struct grub_atapi_iterate_ctx
+{
+ grub_scsi_dev_iterate_hook_t hook;
+ void *hook_data;
+};
+
+/* Helper for grub_atapi_iterate. */
static int
-grub_atapi_iterate (int NESTED_FUNC_ATTR (*hook_in) (int id, int bus, int luns),
- grub_disk_pull_t pull)
+grub_atapi_iterate_iter (int id, int bus, void *data)
{
- auto int hook (int id, int bus);
- int hook (int id, int bus)
- {
- struct grub_ata *ata;
- int ret;
+ struct grub_atapi_iterate_ctx *ctx = data;
+ struct grub_ata *ata;
+ int ret;
- ata = grub_ata_real_open (id, bus);
+ ata = grub_ata_real_open (id, bus);
- if (!ata)
- {
- grub_errno = GRUB_ERR_NONE;
- return 0;
- }
- if (!ata->atapi)
- {
- grub_ata_real_close (ata);
- return 0;
- }
- ret = hook_in (id, bus, 1);
- grub_ata_real_close (ata);
- return ret;
- }
+ if (!ata)
+ {
+ grub_errno = GRUB_ERR_NONE;
+ return 0;
+ }
+ if (!ata->atapi)
+ {
+ grub_ata_real_close (ata);
+ return 0;
+ }
+ ret = ctx->hook (id, bus, 1, ctx->hook_data);
+ grub_ata_real_close (ata);
+ return ret;
+}
+static int
+grub_atapi_iterate (grub_scsi_dev_iterate_hook_t hook, void *hook_data,
+ grub_disk_pull_t pull)
+{
+ struct grub_atapi_iterate_ctx ctx = { hook, hook_data };
grub_ata_dev_t p;
for (p = grub_ata_dev_list; p; p = p->next)
- if (p->iterate && p->iterate (hook, pull))
+ if (p->iterate && p->iterate (grub_atapi_iterate_iter, &ctx, pull))
return 1;
return 0;
}
diff --git a/grub-core/disk/cryptodisk.c b/grub-core/disk/cryptodisk.c
index 3de3b86..ce755c3 100644
--- a/grub-core/disk/cryptodisk.c
+++ b/grub-core/disk/cryptodisk.c
@@ -448,8 +448,8 @@ grub_cryptodisk_setkey (grub_cryptodisk_t dev, grub_uint8_t *key, grub_size_t ke
}
static int
-grub_cryptodisk_iterate (int (*hook) (const char *name),
- grub_disk_pull_t pull)
+grub_cryptodisk_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
+ grub_disk_pull_t pull)
{
grub_cryptodisk_t i;
@@ -460,7 +460,7 @@ grub_cryptodisk_iterate (int (*hook) (const char *name),
{
char buf[30];
grub_snprintf (buf, sizeof (buf), "crypto%lu", i->id);
- if (hook (buf))
+ if (hook (buf, hook_data))
return 1;
}
@@ -866,7 +866,8 @@ grub_cryptodisk_cheat_mount (const char *sourcedev, const char *cheat)
#endif
static int
-grub_cryptodisk_scan_device (const char *name)
+grub_cryptodisk_scan_device (const char *name,
+ void *data __attribute__ ((unused)))
{
grub_err_t err;
grub_disk_t source;
@@ -908,7 +909,7 @@ grub_cmd_cryptomount (grub_extcmd_context_t ctxt, int argc, char **args)
check_boot = state[2].set;
search_uuid = args[0];
- grub_device_iterate (&grub_cryptodisk_scan_device);
+ grub_device_iterate (&grub_cryptodisk_scan_device, NULL);
search_uuid = NULL;
if (!have_it)
@@ -919,7 +920,7 @@ grub_cmd_cryptomount (grub_extcmd_context_t ctxt, int argc, char **args)
{
search_uuid = NULL;
check_boot = state[2].set;
- grub_device_iterate (&grub_cryptodisk_scan_device);
+ grub_device_iterate (&grub_cryptodisk_scan_device, NULL);
search_uuid = NULL;
return GRUB_ERR_NONE;
}
diff --git a/grub-core/disk/diskfilter.c b/grub-core/disk/diskfilter.c
index ce4c706..2ff47e9 100644
--- a/grub-core/disk/diskfilter.c
+++ b/grub-core/disk/diskfilter.c
@@ -120,65 +120,68 @@ is_valid_diskfilter_name (const char *name)
|| grub_memcmp (name, "ldm/", sizeof ("ldm/") - 1) == 0);
}
+/* Helper for scan_disk. */
static int
-scan_disk (const char *name, int accept_diskfilter)
+scan_disk_partition_iter (grub_disk_t disk, grub_partition_t p, void *data)
{
- auto int hook (grub_disk_t disk, grub_partition_t p);
- int hook (grub_disk_t disk, grub_partition_t p)
- {
- struct grub_diskfilter_vg *arr;
- grub_disk_addr_t start_sector;
- struct grub_diskfilter_pv_id id;
- grub_diskfilter_t diskfilter;
-
- grub_dprintf ("diskfilter", "Scanning for DISKFILTER devices on disk %s\n",
- name);
+ const char *name = data;
+ struct grub_diskfilter_vg *arr;
+ grub_disk_addr_t start_sector;
+ struct grub_diskfilter_pv_id id;
+ grub_diskfilter_t diskfilter;
+
+ grub_dprintf ("diskfilter", "Scanning for DISKFILTER devices on disk %s\n",
+ name);
#ifdef GRUB_UTIL
- grub_util_info ("Scanning for DISKFILTER devices on disk %s", name);
+ grub_util_info ("Scanning for DISKFILTER devices on disk %s", name);
#endif
- disk->partition = p;
-
- for (arr = array_list; arr != NULL; arr = arr->next)
- {
- struct grub_diskfilter_pv *m;
- for (m = arr->pvs; m; m = m->next)
- if (m->disk && m->disk->id == disk->id
- && m->disk->dev->id == disk->dev->id
- && m->part_start == grub_partition_get_start (disk->partition)
- && m->part_size == grub_disk_get_size (disk))
- return 0;
- }
+ disk->partition = p;
+
+ for (arr = array_list; arr != NULL; arr = arr->next)
+ {
+ struct grub_diskfilter_pv *m;
+ for (m = arr->pvs; m; m = m->next)
+ if (m->disk && m->disk->id == disk->id
+ && m->disk->dev->id == disk->dev->id
+ && m->part_start == grub_partition_get_start (disk->partition)
+ && m->part_size == grub_disk_get_size (disk))
+ return 0;
+ }
- for (diskfilter = grub_diskfilter_list; diskfilter; diskfilter = diskfilter->next)
- {
+ for (diskfilter = grub_diskfilter_list; diskfilter; diskfilter = diskfilter->next)
+ {
#ifdef GRUB_UTIL
- grub_util_info ("Scanning for %s devices on disk %s",
- diskfilter->name, name);
+ grub_util_info ("Scanning for %s devices on disk %s",
+ diskfilter->name, name);
#endif
- id.uuid = 0;
- id.uuidlen = 0;
- arr = diskfilter->detect (disk, &id, &start_sector);
- if (arr &&
- (! insert_array (disk, &id, arr, start_sector, diskfilter)))
- {
- if (id.uuidlen)
- grub_free (id.uuid);
- return 0;
- }
- if (arr && id.uuidlen)
+ id.uuid = 0;
+ id.uuidlen = 0;
+ arr = diskfilter->detect (disk, &id, &start_sector);
+ if (arr &&
+ (! insert_array (disk, &id, arr, start_sector, diskfilter)))
+ {
+ if (id.uuidlen)
grub_free (id.uuid);
-
- /* This error usually means it's not diskfilter, no need to display
- it. */
- if (grub_errno != GRUB_ERR_OUT_OF_RANGE)
- grub_print_error ();
-
- grub_errno = GRUB_ERR_NONE;
+ return 0;
}
+ if (arr && id.uuidlen)
+ grub_free (id.uuid);
- return 0;
+ /* This error usually means it's not diskfilter, no need to display
+ it. */
+ if (grub_errno != GRUB_ERR_OUT_OF_RANGE)
+ grub_print_error ();
+
+ grub_errno = GRUB_ERR_NONE;
}
+
+ return 0;
+}
+
+static int
+scan_disk (const char *name, int accept_diskfilter)
+{
grub_disk_t disk;
static int scan_depth = 0;
@@ -196,12 +199,12 @@ scan_disk (const char *name, int accept_diskfilter)
scan_depth--;
return 0;
}
- if (hook (disk, 0))
+ if (scan_disk_partition_iter (disk, 0, (void *) name))
{
scan_depth--;
return 1;
}
- if (grub_partition_iterate (disk, hook))
+ if (grub_partition_iterate (disk, scan_disk_partition_iter, (void *) name))
{
scan_depth--;
return 1;
@@ -212,7 +215,7 @@ scan_disk (const char *name, int accept_diskfilter)
}
static int
-scan_disk_hook (const char *name)
+scan_disk_hook (const char *name, void *data __attribute__ ((unused)))
{
return scan_disk (name, 0);
}
@@ -230,7 +233,7 @@ scan_devices (const char *arname)
if (p->id != GRUB_DISK_DEVICE_DISKFILTER_ID
&& p->iterate)
{
- if ((p->iterate) (scan_disk_hook, pull))
+ if ((p->iterate) (scan_disk_hook, NULL, pull))
return;
if (arname && is_lv_readable (find_lv (arname), 1))
return;
@@ -249,8 +252,8 @@ scan_devices (const char *arname)
}
static int
-grub_diskfilter_iterate (int (*hook) (const char *name),
- grub_disk_pull_t pull)
+grub_diskfilter_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
+ grub_disk_pull_t pull)
{
struct grub_diskfilter_vg *array;
int islcnt = 0;
@@ -271,7 +274,7 @@ grub_diskfilter_iterate (int (*hook) (const char *name),
for (lv = array->lvs; lv; lv = lv->next)
if (lv->visible && lv->fullname && lv->became_readable_at >= islcnt)
{
- if (hook (lv->fullname))
+ if (hook (lv->fullname, hook_data))
return 1;
}
}
@@ -303,7 +306,7 @@ grub_diskfilter_memberlist (grub_disk_t disk)
if (p->id != GRUB_DISK_DEVICE_DISKFILTER_ID
&& p->iterate)
{
- (p->iterate) (scan_disk_hook, pull);
+ (p->iterate) (scan_disk_hook, NULL, pull);
while (pv && pv->disk)
pv = pv->next;
}
@@ -831,7 +834,8 @@ grub_diskfilter_write (grub_disk_t disk __attribute ((unused)),
grub_size_t size __attribute ((unused)),
const char *buf __attribute ((unused)))
{
- return GRUB_ERR_NOT_IMPLEMENTED_YET;
+ return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
+ "diskfilter writes are not supported");
}
struct grub_diskfilter_vg *
diff --git a/grub-core/disk/efi/efidisk.c b/grub-core/disk/efi/efidisk.c
index d9d788c..98cd226 100644
--- a/grub-core/disk/efi/efidisk.c
+++ b/grub-core/disk/efi/efidisk.c
@@ -404,7 +404,7 @@ enumerate_disks (void)
}
static int
-grub_efidisk_iterate (int (*hook) (const char *name),
+grub_efidisk_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
grub_disk_pull_t pull)
{
struct grub_efidisk_data *d;
@@ -418,7 +418,7 @@ grub_efidisk_iterate (int (*hook) (const char *name),
{
grub_snprintf (buf, sizeof (buf), "hd%d", count);
grub_dprintf ("efidisk", "iterating %s\n", buf);
- if (hook (buf))
+ if (hook (buf, hook_data))
return 1;
}
break;
@@ -427,7 +427,7 @@ grub_efidisk_iterate (int (*hook) (const char *name),
{
grub_snprintf (buf, sizeof (buf), "fd%d", count);
grub_dprintf ("efidisk", "iterating %s\n", buf);
- if (hook (buf))
+ if (hook (buf, hook_data))
return 1;
}
@@ -435,7 +435,7 @@ grub_efidisk_iterate (int (*hook) (const char *name),
{
grub_snprintf (buf, sizeof (buf), "cd%d", count);
grub_dprintf ("efidisk", "iterating %s\n", buf);
- if (hook (buf))
+ if (hook (buf, hook_data))
return 1;
}
break;
@@ -736,6 +736,31 @@ get_diskname_from_path (const grub_efi_device_path_t *path,
return 0;
}
+/* Context for grub_efidisk_get_device_name. */
+struct grub_efidisk_get_device_name_ctx
+{
+ char *partition_name;
+ grub_efi_hard_drive_device_path_t hd;
+};
+
+/* Helper for grub_efidisk_get_device_name.
+ Find the identical partition. */
+static int
+grub_efidisk_get_device_name_iter (grub_disk_t disk __attribute__ ((unused)),
+ const grub_partition_t part, void *data)
+{
+ struct grub_efidisk_get_device_name_ctx *ctx = data;
+
+ if (grub_partition_get_start (part) == ctx->hd.partition_start
+ && grub_partition_get_len (part) == ctx->hd.partition_size)
+ {
+ ctx->partition_name = grub_partition_get_name (part);
+ return 1;
+ }
+
+ return 0;
+}
+
char *
grub_efidisk_get_device_name (grub_efi_handle_t *handle)
{
@@ -754,28 +779,11 @@ grub_efidisk_get_device_name (grub_efi_handle_t *handle)
&& (GRUB_EFI_DEVICE_PATH_SUBTYPE (ldp)
== GRUB_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE))
{
- char *partition_name = NULL;
+ struct grub_efidisk_get_device_name_ctx ctx;
char *dev_name;
grub_efi_device_path_t *dup_dp, *dup_ldp;
- grub_efi_hard_drive_device_path_t hd;
grub_disk_t parent = 0;
- auto int find_partition (grub_disk_t disk, const grub_partition_t part);
-
- /* Find the identical partition. */
- int find_partition (grub_disk_t disk __attribute__ ((unused)),
- const grub_partition_t part)
- {
- if (grub_partition_get_start (part) == hd.partition_start
- && grub_partition_get_len (part) == hd.partition_size)
- {
- partition_name = grub_partition_get_name (part);
- return 1;
- }
-
- return 0;
- }
-
/* It is necessary to duplicate the device path so that GRUB
can overwrite it. */
dup_dp = duplicate_device_path (dp);
@@ -797,24 +805,27 @@ grub_efidisk_get_device_name (grub_efi_handle_t *handle)
return 0;
/* Find a partition which matches the hard drive device path. */
- grub_memcpy (&hd, ldp, sizeof (hd));
- if (hd.partition_start == 0
- && hd.partition_size == grub_disk_get_size (parent))
+ ctx.partition_name = NULL;
+ grub_memcpy (&ctx.hd, ldp, sizeof (ctx.hd));
+ if (ctx.hd.partition_start == 0
+ && ctx.hd.partition_size == grub_disk_get_size (parent))
{
dev_name = grub_strdup (parent->name);
}
else
{
- grub_partition_iterate (parent, find_partition);
+ grub_partition_iterate (parent, grub_efidisk_get_device_name_iter,
+ &ctx);
- if (! partition_name)
+ if (! ctx.partition_name)
{
grub_disk_close (parent);
return 0;
}
- dev_name = grub_xasprintf ("%s,%s", parent->name, partition_name);
- grub_free (partition_name);
+ dev_name = grub_xasprintf ("%s,%s", parent->name,
+ ctx.partition_name);
+ grub_free (ctx.partition_name);
}
grub_disk_close (parent);
diff --git a/grub-core/disk/host.c b/grub-core/disk/host.c
index 5ee0d2e..959211b 100644
--- a/grub-core/disk/host.c
+++ b/grub-core/disk/host.c
@@ -27,13 +27,13 @@
int grub_disk_host_i_want_a_reference;
static int
-grub_host_iterate (int (*hook) (const char *name),
+grub_host_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
grub_disk_pull_t pull)
{
if (pull != GRUB_DISK_PULL_NONE)
return 0;
- if (hook ("host"))
+ if (hook ("host", hook_data))
return 1;
return 0;
}
diff --git a/grub-core/disk/i386/pc/biosdisk.c b/grub-core/disk/i386/pc/biosdisk.c
index 7ca89e3..7c8dca3 100644
--- a/grub-core/disk/i386/pc/biosdisk.c
+++ b/grub-core/disk/i386/pc/biosdisk.c
@@ -272,20 +272,21 @@ grub_biosdisk_get_drive (const char *name)
}
static int
-grub_biosdisk_call_hook (int (*hook) (const char *name), int drive)
+grub_biosdisk_call_hook (grub_disk_dev_iterate_hook_t hook, void *hook_data,
+ int drive)
{
char name[10];
if (cd_drive && drive == cd_drive)
- return hook ("cd");
+ return hook ("cd", hook_data);
grub_snprintf (name, sizeof (name),
(drive & 0x80) ? "hd%d" : "fd%d", drive & (~0x80));
- return hook (name);
+ return hook (name, hook_data);
}
static int
-grub_biosdisk_iterate (int (*hook) (const char *name),
+grub_biosdisk_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
grub_disk_pull_t pull __attribute__ ((unused)))
{
int num_floppies;
@@ -304,7 +305,7 @@ grub_biosdisk_iterate (int (*hook) (const char *name),
break;
}
- if (grub_biosdisk_call_hook (hook, drive))
+ if (grub_biosdisk_call_hook (hook, hook_data, drive))
return 1;
}
return 0;
@@ -312,14 +313,14 @@ grub_biosdisk_iterate (int (*hook) (const char *name),
case GRUB_DISK_PULL_REMOVABLE:
if (cd_drive)
{
- if (grub_biosdisk_call_hook (hook, cd_drive))
+ if (grub_biosdisk_call_hook (hook, hook_data, cd_drive))
return 1;
}
/* For floppy disks, we can get the number safely. */
num_floppies = grub_biosdisk_get_num_floppies ();
for (drive = 0; drive < num_floppies; drive++)
- if (grub_biosdisk_call_hook (hook, drive))
+ if (grub_biosdisk_call_hook (hook, hook_data, drive))
return 1;
return 0;
default:
diff --git a/grub-core/disk/ieee1275/nand.c b/grub-core/disk/ieee1275/nand.c
index ad30852..b2844b1 100644
--- a/grub-core/disk/ieee1275/nand.c
+++ b/grub-core/disk/ieee1275/nand.c
@@ -33,7 +33,7 @@ struct grub_nand_data
};
static int
-grub_nand_iterate (int (*hook) (const char *name),
+grub_nand_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
grub_disk_pull_t pull)
{
auto int dev_iterate (struct grub_ieee1275_devalias *alias);
@@ -41,7 +41,7 @@ grub_nand_iterate (int (*hook) (const char *name),
{
if (grub_strcmp (alias->name, "nand") == 0)
{
- hook (alias->name);
+ hook (alias->name, hook_data);
return 1;
}
@@ -203,7 +203,8 @@ grub_nand_write (grub_disk_t disk __attribute ((unused)),
grub_size_t size __attribute ((unused)),
const char *buf __attribute ((unused)))
{
- return GRUB_ERR_NOT_IMPLEMENTED_YET;
+ return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
+ "nand write is not supported");
}
static struct grub_disk_dev grub_nand_dev =
diff --git a/grub-core/disk/ieee1275/ofdisk.c b/grub-core/disk/ieee1275/ofdisk.c
index c9535a0..644bbd2 100644
--- a/grub-core/disk/ieee1275/ofdisk.c
+++ b/grub-core/disk/ieee1275/ofdisk.c
@@ -218,7 +218,7 @@ scan (void)
}
static int
-grub_ofdisk_iterate (int (*hook) (const char *name),
+grub_ofdisk_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
grub_disk_pull_t pull)
{
unsigned i;
@@ -276,7 +276,7 @@ grub_ofdisk_iterate (int (*hook) (const char *name),
*optr++ = *iptr++;
}
*optr = 0;
- if (hook (buffer))
+ if (hook (buffer, hook_data))
return 1;
}
}
diff --git a/grub-core/disk/ldm.c b/grub-core/disk/ldm.c
index 0e4761b..b92433d 100644
--- a/grub-core/disk/ldm.c
+++ b/grub-core/disk/ldm.c
@@ -105,35 +105,39 @@ read_int (grub_uint8_t *in, grub_size_t s)
static const grub_gpt_part_type_t ldm_type = GRUB_GPT_PARTITION_TYPE_LDM;
+/* Helper for gpt_ldm_sector. */
+static int
+gpt_ldm_sector_iter (grub_disk_t disk, const grub_partition_t p, void *data)
+{
+ grub_disk_addr_t *sector = data;
+ struct grub_gpt_partentry gptdata;
+ grub_partition_t p2;
+
+ p2 = disk->partition;
+ disk->partition = p->parent;
+ if (grub_disk_read (disk, p->offset, p->index,
+ sizeof (gptdata), &gptdata))
+ {
+ disk->partition = p2;
+ return 0;
+ }
+ disk->partition = p2;
+
+ if (! grub_memcmp (&gptdata.type, &ldm_type, 16))
+ {
+ *sector = p->start + p->len - 1;
+ return 1;
+ }
+ return 0;
+}
+
static grub_disk_addr_t
gpt_ldm_sector (grub_disk_t dsk)
{
grub_disk_addr_t sector = 0;
grub_err_t err;
- auto int hook (grub_disk_t disk, const grub_partition_t p);
- int hook (grub_disk_t disk, const grub_partition_t p)
- {
- struct grub_gpt_partentry gptdata;
- grub_partition_t p2;
-
- p2 = disk->partition;
- disk->partition = p->parent;
- if (grub_disk_read (disk, p->offset, p->index,
- sizeof (gptdata), &gptdata))
- {
- disk->partition = p2;
- return 0;
- }
- disk->partition = p2;
- if (! grub_memcmp (&gptdata.type, &ldm_type, 16))
- {
- sector = p->start + p->len - 1;
- return 1;
- }
- return 0;
- }
- err = grub_gpt_partition_map_iterate (dsk, hook);
+ err = grub_gpt_partition_map_iterate (dsk, gpt_ldm_sector_iter, &sector);
if (err)
{
grub_errno = GRUB_ERR_NONE;
diff --git a/grub-core/disk/loopback.c b/grub-core/disk/loopback.c
index f3b19ef..fed88de 100644
--- a/grub-core/disk/loopback.c
+++ b/grub-core/disk/loopback.c
@@ -135,15 +135,15 @@ fail:
static int
-grub_loopback_iterate (int (*hook) (const char *name),
- grub_disk_pull_t pull)
+grub_loopback_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
+ grub_disk_pull_t pull)
{
struct grub_loopback *d;
if (pull != GRUB_DISK_PULL_NONE)
return 0;
for (d = loopback_list; d; d = d->next)
{
- if (hook (d->devname))
+ if (hook (d->devname, hook_data))
return 1;
}
return 0;
@@ -206,7 +206,8 @@ grub_loopback_write (grub_disk_t disk __attribute ((unused)),
grub_size_t size __attribute ((unused)),
const char *buf __attribute ((unused)))
{
- return GRUB_ERR_NOT_IMPLEMENTED_YET;
+ return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
+ "loopback write is not supported");
}
static struct grub_disk_dev grub_loopback_dev =
diff --git a/grub-core/disk/memdisk.c b/grub-core/disk/memdisk.c
index 4de0971..4ad1cb1 100644
--- a/grub-core/disk/memdisk.c
+++ b/grub-core/disk/memdisk.c
@@ -30,13 +30,13 @@ static char *memdisk_addr;
static grub_off_t memdisk_size = 0;
static int
-grub_memdisk_iterate (int (*hook) (const char *name),
+grub_memdisk_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
grub_disk_pull_t pull)
{
if (pull != GRUB_DISK_PULL_NONE)
return 0;
- return hook ("memdisk");
+ return hook ("memdisk", hook_data);
}
static grub_err_t
diff --git a/grub-core/disk/pata.c b/grub-core/disk/pata.c
index 00b04e2..75e5deb 100644
--- a/grub-core/disk/pata.c
+++ b/grub-core/disk/pata.c
@@ -338,9 +338,10 @@ grub_pata_device_initialize (int port, int device, int addr)
}
#ifndef GRUB_MACHINE_MIPS_QEMU_MIPS
-static int NESTED_FUNC_ATTR
+static int
grub_pata_pciinit (grub_pci_device_t dev,
- grub_pci_id_t pciid)
+ grub_pci_id_t pciid,
+ void *data __attribute__ ((unused)))
{
static int compat_use[2] = { 0 };
grub_pci_address_t addr;
@@ -446,7 +447,7 @@ grub_pata_pciinit (grub_pci_device_t dev,
static grub_err_t
grub_pata_initialize (void)
{
- grub_pci_iterate (grub_pata_pciinit);
+ grub_pci_iterate (grub_pata_pciinit, NULL);
return 0;
}
#else
@@ -500,7 +501,7 @@ grub_pata_open (int id, int devnum, struct grub_ata *ata)
}
static int
-grub_pata_iterate (int (*hook) (int id, int bus),
+grub_pata_iterate (grub_ata_dev_iterate_hook_t hook, void *hook_data,
grub_disk_pull_t pull)
{
struct grub_pata_device *dev;
@@ -509,7 +510,8 @@ grub_pata_iterate (int (*hook) (int id, int bus),
return 0;
for (dev = grub_pata_devices; dev; dev = dev->next)
- if (hook (GRUB_SCSI_SUBSYSTEM_PATA, dev->port * 2 + dev->device))
+ if (hook (GRUB_SCSI_SUBSYSTEM_PATA, dev->port * 2 + dev->device,
+ hook_data))
return 1;
return 0;
diff --git a/grub-core/disk/scsi.c b/grub-core/disk/scsi.c
index 29dd0d3..90ac379 100644
--- a/grub-core/disk/scsi.c
+++ b/grub-core/disk/scsi.c
@@ -423,50 +423,59 @@ grub_scsi_write16 (grub_disk_t disk, grub_disk_addr_t sector,
-static int
-grub_scsi_iterate (int (*hook) (const char *name),
- grub_disk_pull_t pull)
+/* Context for grub_scsi_iterate. */
+struct grub_scsi_iterate_ctx
{
- grub_scsi_dev_t p;
+ grub_disk_dev_iterate_hook_t hook;
+ void *hook_data;
+};
- auto int NESTED_FUNC_ATTR scsi_iterate (int id, int bus, int luns);
+/* Helper for grub_scsi_iterate. */
+static int
+scsi_iterate (int id, int bus, int luns, void *data)
+{
+ struct grub_scsi_iterate_ctx *ctx = data;
+ int i;
- int NESTED_FUNC_ATTR scsi_iterate (int id, int bus, int luns)
+ /* In case of a single LUN, just return `usbX'. */
+ if (luns == 1)
{
- int i;
-
- /* In case of a single LUN, just return `usbX'. */
- if (luns == 1)
- {
- char *sname;
- int ret;
- sname = grub_xasprintf ("%s%d", grub_scsi_names[id], bus);
- if (!sname)
- return 1;
- ret = hook (sname);
- grub_free (sname);
- return ret;
- }
+ char *sname;
+ int ret;
+ sname = grub_xasprintf ("%s%d", grub_scsi_names[id], bus);
+ if (!sname)
+ return 1;
+ ret = ctx->hook (sname, ctx->hook_data);
+ grub_free (sname);
+ return ret;
+ }
- /* In case of multiple LUNs, every LUN will get a prefix to
- distinguish it. */
- for (i = 0; i < luns; i++)
- {
- char *sname;
- int ret;
- sname = grub_xasprintf ("%s%d%c", grub_scsi_names[id], bus, 'a' + i);
- if (!sname)
- return 1;
- ret = hook (sname);
- grub_free (sname);
- if (ret)
- return 1;
- }
- return 0;
+ /* In case of multiple LUNs, every LUN will get a prefix to
+ distinguish it. */
+ for (i = 0; i < luns; i++)
+ {
+ char *sname;
+ int ret;
+ sname = grub_xasprintf ("%s%d%c", grub_scsi_names[id], bus, 'a' + i);
+ if (!sname)
+ return 1;
+ ret = ctx->hook (sname, ctx->hook_data);
+ grub_free (sname);
+ if (ret)
+ return 1;
}
+ return 0;
+}
+
+static int
+grub_scsi_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
+ grub_disk_pull_t pull)
+{
+ struct grub_scsi_iterate_ctx ctx = { hook, hook_data };
+ grub_scsi_dev_t p;
for (p = grub_scsi_dev_list; p; p = p->next)
- if (p->iterate && (p->iterate) (scsi_iterate, pull))
+ if (p->iterate && (p->iterate) (scsi_iterate, &ctx, pull))
return 1;
return 0;
diff --git a/grub-core/disk/uboot/ubootdisk.c b/grub-core/disk/uboot/ubootdisk.c
index 2ef4359..54659b5 100644
--- a/grub-core/disk/uboot/ubootdisk.c
+++ b/grub-core/disk/uboot/ubootdisk.c
@@ -100,7 +100,8 @@ grub_ubootdisk_register (struct device_info *newdev, int handle)
* Itarator over enumerated disk devices.
*/
static int
-uboot_disk_iterate (int (*hook) (const char *name), grub_disk_pull_t pull)
+uboot_disk_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
+ grub_disk_pull_t pull)
{
struct ubootdisk_data *d;
char buf[16];
@@ -114,7 +115,7 @@ uboot_disk_iterate (int (*hook) (const char *name), grub_disk_pull_t pull)
{
grub_snprintf (buf, sizeof (buf) - 1, "hd%d", count);
grub_dprintf ("ubootdisk", "iterating %s\n", buf);
- if (hook (buf))
+ if (hook (buf, hook_data))
return 1;
}
break;
@@ -124,7 +125,7 @@ uboot_disk_iterate (int (*hook) (const char *name), grub_disk_pull_t pull)
{
grub_snprintf (buf, sizeof (buf) - 1, "fd%d", count);
grub_dprintf ("ubootdisk", "iterating %s\n", buf);
- if (hook (buf))
+ if (hook (buf, hook_data))
return 1;
}
@@ -133,7 +134,7 @@ uboot_disk_iterate (int (*hook) (const char *name), grub_disk_pull_t pull)
{
grub_snprintf (buf, sizeof (buf) - 1, "cd%d", count);
grub_dprintf ("ubootdisk", "iterating %s\n", buf);
- if (hook (buf))
+ if (hook (buf, hook_data))
return 1;
}
break;
diff --git a/grub-core/disk/usbms.c b/grub-core/disk/usbms.c
index 52cc33e..50f0caf 100644
--- a/grub-core/disk/usbms.c
+++ b/grub-core/disk/usbms.c
@@ -265,7 +265,7 @@ grub_usbms_attach (grub_usb_device_t usbdev, int configno, int interfno)
static int
-grub_usbms_iterate (int NESTED_FUNC_ATTR (*hook) (int id, int bus, int luns),
+grub_usbms_iterate (grub_scsi_dev_iterate_hook_t hook, void *hook_data,
grub_disk_pull_t pull)
{
unsigned i;
@@ -278,7 +278,8 @@ grub_usbms_iterate (int NESTED_FUNC_ATTR (*hook) (int id, int bus, int luns),
for (i = 0; i < ARRAY_SIZE (grub_usbms_devices); i++)
if (grub_usbms_devices[i])
{
- if (hook (GRUB_SCSI_SUBSYSTEM_USBMS, i, grub_usbms_devices[i]->luns))
+ if (hook (GRUB_SCSI_SUBSYSTEM_USBMS, i, grub_usbms_devices[i]->luns,
+ hook_data))
return 1;
}