On Fri, Feb 09, 2018 at 08:55:47PM +0100, Heinrich Schuchardt wrote:
> efi_disk_register should return as status code (efi_status_t).
>
> Disks with zero blocks should be reported as 'not ready' without throwing
> an error.
>
> This patch solves a problem running OpenBSD on system configured with
> CONFIG_BLK=n (e.g. i.MX6).
>
> Reported-by: Jonathan Gray
> Signed-off-by: Heinrich Schuchardt
Thanks, this change resolves the problems I was seeing with
master as of e24bd1e79e223aa89854c0be95a53e2d538144a5 on
both mx6cuboxi and rpi_3.
Tested-by: Jonathan Gray
> ---
> v2
> remove superfluous check
> ---
> include/efi_loader.h | 2 +-
> lib/efi_loader/efi_disk.c | 71
> +--
> 2 files changed, 45 insertions(+), 28 deletions(-)
>
> diff --git a/include/efi_loader.h b/include/efi_loader.h
> index a2d82e1db73..07730c3f394 100644
> --- a/include/efi_loader.h
> +++ b/include/efi_loader.h
> @@ -173,7 +173,7 @@ extern struct list_head efi_obj_list;
> /* Called by bootefi to make console interface available */
> int efi_console_register(void);
> /* Called by bootefi to make all disk storage accessible as EFI objects */
> -int efi_disk_register(void);
> +efi_status_t efi_disk_register(void);
> /* Create handles and protocols for the partitions of a block device */
> int efi_disk_create_partitions(efi_handle_t parent, struct blk_desc *desc,
> const char *if_typename, int diskid,
> diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c
> index ac39a65ee89..825a6d86de8 100644
> --- a/lib/efi_loader/efi_disk.c
> +++ b/lib/efi_loader/efi_disk.c
> @@ -226,25 +226,26 @@ efi_fs_from_path(struct efi_device_path *full_path)
> * @offset offset into disk for simple partitions
> * @return disk object
> */
> -static struct efi_disk_obj *efi_disk_add_dev(
> +static efi_status_t efi_disk_add_dev(
> efi_handle_t parent,
> struct efi_device_path *dp_parent,
> const char *if_typename,
> struct blk_desc *desc,
> int dev_index,
> lbaint_t offset,
> - unsigned int part)
> + unsigned int part,
> + struct efi_disk_obj **disk)
> {
> struct efi_disk_obj *diskobj;
> efi_status_t ret;
>
> /* Don't add empty devices */
> if (!desc->lba)
> - return NULL;
> + return EFI_NOT_READY;
>
> diskobj = calloc(1, sizeof(*diskobj));
> if (!diskobj)
> - goto out_of_memory;
> + return EFI_OUT_OF_RESOURCES;
>
> /* Hook up to the device list */
> efi_add_handle(>parent);
> @@ -262,11 +263,11 @@ static struct efi_disk_obj *efi_disk_add_dev(
> ret = efi_add_protocol(diskobj->parent.handle, _block_io_guid,
> >ops);
> if (ret != EFI_SUCCESS)
> - goto out_of_memory;
> + return ret;
> ret = efi_add_protocol(diskobj->parent.handle, _guid_device_path,
> diskobj->dp);
> if (ret != EFI_SUCCESS)
> - goto out_of_memory;
> + return ret;
> if (part >= 1) {
> diskobj->volume = efi_simple_file_system(desc, part,
>diskobj->dp);
> @@ -274,7 +275,7 @@ static struct efi_disk_obj *efi_disk_add_dev(
> _simple_file_system_protocol_guid,
> diskobj->volume);
> if (ret != EFI_SUCCESS)
> - goto out_of_memory;
> + return ret;
> }
> diskobj->ops = block_io_disk_template;
> diskobj->ifname = if_typename;
> @@ -291,10 +292,9 @@ static struct efi_disk_obj *efi_disk_add_dev(
> if (part != 0)
> diskobj->media.logical_partition = 1;
> diskobj->ops.media = >media;
> - return diskobj;
> -out_of_memory:
> - printf("ERROR: Out of memory\n");
> - return NULL;
> + if (disk)
> + *disk = diskobj;
> + return EFI_SUCCESS;
> }
>
> /*
> @@ -330,8 +330,12 @@ int efi_disk_create_partitions(efi_handle_t parent,
> struct blk_desc *desc,
> continue;
> snprintf(devname, sizeof(devname), "%s:%d", pdevname,
>part);
> - efi_disk_add_dev(parent, dp, if_typename, desc, diskid,
> - info.start, part);
> + ret = efi_disk_add_dev(parent, dp, if_typename, desc, diskid,
> +info.start, part, NULL);
> + if (ret != EFI_SUCCESS) {
> + printf("Adding partition %s failed\n", pdevname);
> +