[U-Boot] [PATCH 1/1][for v2018.03] efi_loader: correct efi_disk_register

Alexander Graf agraf at suse.de
Fri Feb 9 18:32:23 UTC 2018



On 09.02.18 17:39, 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).
> 
> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
> ---
>  include/efi_loader.h      |  2 +-
>  lib/efi_loader/efi_disk.c | 71 ++++++++++++++++++++++++++++++-----------------
>  2 files changed, 46 insertions(+), 27 deletions(-)
> 
> diff --git a/include/efi_loader.h b/include/efi_loader.h
> index 7caae97ea70..c70706955e6 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..a33c819a8cc 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(&diskobj->parent);
> @@ -262,11 +263,11 @@ static struct efi_disk_obj *efi_disk_add_dev(
>  	ret = efi_add_protocol(diskobj->parent.handle, &efi_block_io_guid,
>  			       &diskobj->ops);
>  	if (ret != EFI_SUCCESS)
> -		goto out_of_memory;
> +		return ret;
>  	ret = efi_add_protocol(diskobj->parent.handle, &efi_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(
>  				       &efi_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 = &diskobj->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);
> +			continue;
> +		}
>  		disks++;
>  	}
>  
> @@ -349,26 +353,32 @@ int efi_disk_create_partitions(efi_handle_t parent, struct blk_desc *desc,
>   *
>   * This gets called from do_bootefi_exec().
>   */
> -int efi_disk_register(void)
> +efi_status_t efi_disk_register(void)
>  {
>  	struct efi_disk_obj *disk;
>  	int disks = 0;
> +	efi_status_t ret;
>  #ifdef CONFIG_BLK
>  	struct udevice *dev;
>  
> -	for (uclass_first_device_check(UCLASS_BLK, &dev);
> -	     dev;
> +	for (uclass_first_device_check(UCLASS_BLK, &dev); dev;
>  	     uclass_next_device_check(&dev)) {
>  		struct blk_desc *desc = dev_get_uclass_platdata(dev);
>  		const char *if_typename = blk_get_if_type_name(desc->if_type);
>  
> -		printf("Scanning disk %s...\n", dev->name);
> -
>  		/* Add block device for the full device */
> -		disk = efi_disk_add_dev(NULL, NULL, if_typename,
> -					desc, desc->devnum, 0, 0);
> -		if (!disk)
> -			return -ENOMEM;
> +		printf("Scanning disk %s...\n", dev->name);
> +		ret = efi_disk_add_dev(NULL, NULL, if_typename,
> +					desc, desc->devnum, 0, 0, &disk);
> +		if (ret == EFI_NOT_READY) {
> +			printf("Disk %s not ready\n", dev->name);
> +			continue;
> +		}
> +		if (ret) {
> +			printf("ERROR: failure to add disk device %s, r = %lu\n",
> +			       dev->name, ret & ~EFI_ERROR_MASK);
> +			return ret;
> +		}
>  		disks++;
>  
>  		/* Partitions show up as block devices in EFI */
> @@ -404,10 +414,19 @@ int efi_disk_register(void)
>  				 if_typename, i);
>  
>  			/* Add block device for the full device */
> -			disk = efi_disk_add_dev(NULL, NULL, if_typename, desc,
> -						i, 0, 0);
> +			ret = efi_disk_add_dev(NULL, NULL, if_typename, desc,
> +					       i, 0, 0, &disk);
>  			if (!disk)

This could potentially refer to stale memory, no? Better check for ret
first, then disk.


Alex

> -				return -ENOMEM;
> +				continue;
> +			if (ret == EFI_NOT_READY) {
> +				printf("Disk %s not ready\n", devname);
> +				continue;
> +			}
> +			if (ret) {
> +				printf("ERROR: failure to add disk device %s, r = %lu\n",
> +				       devname, ret & ~EFI_ERROR_MASK);
> +				return ret;
> +			}
>  			disks++;
>  
>  			/* Partitions show up as block devices in EFI */
> @@ -419,5 +438,5 @@ int efi_disk_register(void)
>  #endif
>  	printf("Found %d disks\n", disks);
>  
> -	return 0;
> +	return EFI_SUCCESS;
>  }
> 


More information about the U-Boot mailing list