From 0dcf7495d97963f1d4a5803754ad6986a96f4670 Mon Sep 17 00:00:00 2001 From: davem Date: Fri, 24 Apr 2009 12:05:54 +0000 Subject: [PATCH] * disk/ieee1275/nand.c (grub_nand_iterate): Return grub_devalias_iterate() result instead of unconditional 0. * disk/ieee1275/ofdisk.c (grub_ofdisk_iterate): Likewise. Also, capture hook return value, either directly or via grub_children_iterate(), and propagate to caller. * include/grub/ieee1275/ieee1275.h (grub_devalias_iterate, grub_children_iterate): Return value is now 'int' instead of 'grub_err_t'. * kern/ieee1275/openfw.c (grub_children_iterate): Fix to behave like a proper iterator, stopping when hooks return non-zero. (grub_devalias_iterate): Likewise. --- ChangeLog | 12 ++++++++++ disk/ieee1275/nand.c | 3 +-- disk/ieee1275/ofdisk.c | 11 +++++---- include/grub/ieee1275/ieee1275.h | 4 ++-- kern/ieee1275/openfw.c | 40 ++++++++++++++++++-------------- 5 files changed, 44 insertions(+), 26 deletions(-) diff --git a/ChangeLog b/ChangeLog index 19e43f953..1c490ee51 100644 --- a/ChangeLog +++ b/ChangeLog @@ -9,6 +9,18 @@ * disk/fs_uuid.c (grub_fs_uuid_close): Call grub_disk_close() on disk->data. + * disk/ieee1275/nand.c (grub_nand_iterate): Return + grub_devalias_iterate() result instead of unconditional 0. + * disk/ieee1275/ofdisk.c (grub_ofdisk_iterate): Likewise. + Also, capture hook return value, either directly or via + grub_children_iterate(), and propagate to caller. + * include/grub/ieee1275/ieee1275.h (grub_devalias_iterate, + grub_children_iterate): Return value is now 'int' instead of + 'grub_err_t'. + * kern/ieee1275/openfw.c (grub_children_iterate): Fix to behave + like a proper iterator, stopping when hooks return non-zero. + (grub_devalias_iterate): Likewise. + 2009-04-23 David S. Miller * kern/sparc64/ieee1275/openfw.c: Unused, delete. diff --git a/disk/ieee1275/nand.c b/disk/ieee1275/nand.c index ed50768a8..37427f884 100644 --- a/disk/ieee1275/nand.c +++ b/disk/ieee1275/nand.c @@ -44,8 +44,7 @@ grub_nand_iterate (int (*hook) (const char *name)) return 0; } - grub_devalias_iterate (dev_iterate); - return 0; + return grub_devalias_iterate (dev_iterate); } static grub_err_t diff --git a/disk/ieee1275/ofdisk.c b/disk/ieee1275/ofdisk.c index a56433d3e..202be2455 100644 --- a/disk/ieee1275/ofdisk.c +++ b/disk/ieee1275/ofdisk.c @@ -77,6 +77,8 @@ grub_ofdisk_iterate (int (*hook) (const char *name)) int dev_iterate (struct grub_ieee1275_devalias *alias) { + int ret = 0; + grub_dprintf ("disk", "disk name = %s\n", alias->name); if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_OFDISK_SDCARD_ONLY)) @@ -105,17 +107,16 @@ grub_ofdisk_iterate (int (*hook) (const char *name)) } if (! grub_strcmp (alias->type, "block")) - hook (alias->name); + ret = hook (alias->name); else if ((! grub_strcmp (alias->type, "scsi")) || (! grub_strcmp (alias->type, "ide")) || (! grub_strcmp (alias->type, "ata"))) /* Search for block-type children of these bus controllers. */ - grub_children_iterate (alias->name, dev_iterate); - return 0; + ret = grub_children_iterate (alias->name, dev_iterate); + return ret; } - grub_devalias_iterate (dev_iterate); - return 0; + return grub_devalias_iterate (dev_iterate); } static grub_err_t diff --git a/include/grub/ieee1275/ieee1275.h b/include/grub/ieee1275/ieee1275.h index ed02f5214..751055fc1 100644 --- a/include/grub/ieee1275/ieee1275.h +++ b/include/grub/ieee1275/ieee1275.h @@ -166,9 +166,9 @@ int EXPORT_FUNC(grub_ieee1275_set_color) (grub_ieee1275_ihandle_t ihandle, int EXPORT_FUNC(grub_ieee1275_milliseconds) (grub_uint32_t *msecs); -grub_err_t EXPORT_FUNC(grub_devalias_iterate) +int EXPORT_FUNC(grub_devalias_iterate) (int (*hook) (struct grub_ieee1275_devalias *alias)); -grub_err_t EXPORT_FUNC(grub_children_iterate) (char *devpath, +int EXPORT_FUNC(grub_children_iterate) (char *devpath, int (*hook) (struct grub_ieee1275_devalias *alias)); grub_err_t EXPORT_FUNC(grub_machine_mmap_iterate) (int NESTED_FUNC_ATTR (*hook) (grub_uint64_t, grub_uint64_t, grub_uint32_t)); diff --git a/kern/ieee1275/openfw.c b/kern/ieee1275/openfw.c index 83bac6504..b23149e7e 100644 --- a/kern/ieee1275/openfw.c +++ b/kern/ieee1275/openfw.c @@ -32,36 +32,37 @@ enum grub_ieee1275_parse_type }; /* Walk children of 'devpath', calling hook for each. */ -grub_err_t +int grub_children_iterate (char *devpath, - int (*hook) (struct grub_ieee1275_devalias *alias)) + int (*hook) (struct grub_ieee1275_devalias *alias)) { grub_ieee1275_phandle_t dev; grub_ieee1275_phandle_t child; char *childtype, *childpath; char *childname, *fullname; + int ret = 0; if (grub_ieee1275_finddevice (devpath, &dev)) - return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "Unknown device"); + return 0; if (grub_ieee1275_child (dev, &child)) - return grub_error (GRUB_ERR_BAD_DEVICE, "Device has no children"); + return 0; childtype = grub_malloc (IEEE1275_MAX_PROP_LEN); if (!childtype) - return grub_errno; + return 0; childpath = grub_malloc (IEEE1275_MAX_PATH_LEN); if (!childpath) { grub_free (childtype); - return grub_errno; + return 0; } childname = grub_malloc (IEEE1275_MAX_PROP_LEN); if (!childname) { grub_free (childpath); grub_free (childtype); - return grub_errno; + return 0; } fullname = grub_malloc (IEEE1275_MAX_PATH_LEN); if (!fullname) @@ -69,7 +70,7 @@ grub_children_iterate (char *devpath, grub_free (childname); grub_free (childpath); grub_free (childtype); - return grub_errno; + return 0; } do @@ -94,7 +95,9 @@ grub_children_iterate (char *devpath, alias.type = childtype; alias.path = childpath; alias.name = fullname; - hook (&alias); + ret = hook (&alias); + if (ret) + break; } while (grub_ieee1275_peer (child, &child)); @@ -103,30 +106,31 @@ grub_children_iterate (char *devpath, grub_free (childpath); grub_free (childtype); - return 0; + return ret; } /* Iterate through all device aliases. This function can be used to find a device of a specific type. */ -grub_err_t +int grub_devalias_iterate (int (*hook) (struct grub_ieee1275_devalias *alias)) { grub_ieee1275_phandle_t aliases; char *aliasname, *devtype; grub_ssize_t actual; struct grub_ieee1275_devalias alias; + int ret = 0; if (grub_ieee1275_finddevice ("/aliases", &aliases)) - return -1; + return 0; aliasname = grub_malloc (IEEE1275_MAX_PROP_LEN); if (!aliasname) - return grub_errno; + return 0; devtype = grub_malloc (IEEE1275_MAX_PROP_LEN); if (!devtype) { grub_free (aliasname); - return grub_errno; + return 0; } /* Find the first property. */ @@ -155,7 +159,7 @@ grub_devalias_iterate (int (*hook) (struct grub_ieee1275_devalias *alias)) { grub_free (devtype); grub_free (aliasname); - return grub_errno; + return 0; } if (grub_ieee1275_get_property (aliases, aliasname, devpath, pathlen, @@ -182,15 +186,17 @@ grub_devalias_iterate (int (*hook) (struct grub_ieee1275_devalias *alias)) alias.name = aliasname; alias.path = devpath; alias.type = devtype; - hook (&alias); + ret = hook (&alias); nextprop: grub_free (devpath); + if (ret) + break; } grub_free (devtype); grub_free (aliasname); - return 0; + return ret; } /* Call the "map" method of /chosen/mmu. */