efi_loader: disk: Fix CONFIG_BLK breakage
When using CONFIG_BLK, there were 2 issues: 1) The name we generate the device with has to match the name we set in efi_set_bootdev() 2) The device we pass into our block functions was wrong, we should not rediscover it but just use the already known pointer. This patch fixes both issues. Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
45313e83b8
commit
f9d334bdfc
|
@ -8,6 +8,7 @@
|
|||
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <dm/device.h>
|
||||
#include <efi_loader.h>
|
||||
#include <errno.h>
|
||||
#include <libfdt.h>
|
||||
|
@ -265,18 +266,30 @@ void efi_set_bootdev(const char *dev, const char *devnr, const char *path)
|
|||
char devname[32] = { 0 }; /* dp->str is u16[32] long */
|
||||
char *colon;
|
||||
|
||||
/* Assemble the condensed device name we use in efi_disk.c */
|
||||
snprintf(devname, sizeof(devname), "%s%s", dev, devnr);
|
||||
#if defined(CONFIG_BLK) || defined(CONFIG_ISO_PARTITION)
|
||||
desc = blk_get_dev(dev, simple_strtol(devnr, NULL, 10));
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_BLK
|
||||
if (desc) {
|
||||
snprintf(devname, sizeof(devname), "%s", desc->bdev->name);
|
||||
} else
|
||||
#endif
|
||||
|
||||
{
|
||||
/* Assemble the condensed device name we use in efi_disk.c */
|
||||
snprintf(devname, sizeof(devname), "%s%s", dev, devnr);
|
||||
}
|
||||
|
||||
colon = strchr(devname, ':');
|
||||
|
||||
#ifdef CONFIG_ISO_PARTITION
|
||||
/* For ISOs we create partition block devices */
|
||||
desc = blk_get_dev(dev, simple_strtol(devnr, NULL, 10));
|
||||
if (desc && (desc->type != DEV_TYPE_UNKNOWN) &&
|
||||
(desc->part_type == PART_TYPE_ISO)) {
|
||||
if (!colon)
|
||||
snprintf(devname, sizeof(devname), "%s%s:1", dev,
|
||||
devnr);
|
||||
snprintf(devname, sizeof(devname), "%s:1", devname);
|
||||
|
||||
colon = NULL;
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -31,6 +31,8 @@ struct efi_disk_obj {
|
|||
struct efi_device_path_file_path *dp;
|
||||
/* Offset into disk for simple partitions */
|
||||
lbaint_t offset;
|
||||
/* Internal block device */
|
||||
const struct blk_desc *desc;
|
||||
};
|
||||
|
||||
static efi_status_t efi_disk_open_block(void *handle, efi_guid_t *protocol,
|
||||
|
@ -78,8 +80,7 @@ static efi_status_t EFIAPI efi_disk_rw_blocks(struct efi_block_io *this,
|
|||
unsigned long n;
|
||||
|
||||
diskobj = container_of(this, struct efi_disk_obj, ops);
|
||||
if (!(desc = blk_get_dev(diskobj->ifname, diskobj->dev_index)))
|
||||
return EFI_EXIT(EFI_DEVICE_ERROR);
|
||||
desc = (struct blk_desc *) diskobj->desc;
|
||||
blksz = desc->blksz;
|
||||
blocks = buffer_size / blksz;
|
||||
lba += diskobj->offset;
|
||||
|
@ -213,6 +214,7 @@ static void efi_disk_add_dev(const char *name,
|
|||
diskobj->ifname = if_typename;
|
||||
diskobj->dev_index = dev_index;
|
||||
diskobj->offset = offset;
|
||||
diskobj->desc = desc;
|
||||
|
||||
/* Fill in EFI IO Media info (for read/write callbacks) */
|
||||
diskobj->media.removable_media = desc->removable;
|
||||
|
@ -240,7 +242,8 @@ static void efi_disk_add_dev(const char *name,
|
|||
|
||||
static int efi_disk_create_eltorito(struct blk_desc *desc,
|
||||
const char *if_typename,
|
||||
int diskid)
|
||||
int diskid,
|
||||
const char *pdevname)
|
||||
{
|
||||
int disks = 0;
|
||||
#ifdef CONFIG_ISO_PARTITION
|
||||
|
@ -252,8 +255,8 @@ static int efi_disk_create_eltorito(struct blk_desc *desc,
|
|||
return 0;
|
||||
|
||||
while (!part_get_info(desc, part, &info)) {
|
||||
snprintf(devname, sizeof(devname), "%s%d:%d", if_typename,
|
||||
diskid, part);
|
||||
snprintf(devname, sizeof(devname), "%s:%d", pdevname,
|
||||
part);
|
||||
efi_disk_add_dev(devname, if_typename, desc, diskid,
|
||||
info.start);
|
||||
part++;
|
||||
|
@ -296,7 +299,7 @@ int efi_disk_register(void)
|
|||
* so let's create them here
|
||||
*/
|
||||
disks += efi_disk_create_eltorito(desc, if_typename,
|
||||
desc->devnum);
|
||||
desc->devnum, dev->name);
|
||||
}
|
||||
#else
|
||||
int i, if_type;
|
||||
|
@ -331,7 +334,8 @@ int efi_disk_register(void)
|
|||
* El Torito images show up as block devices
|
||||
* in an EFI world, so let's create them here
|
||||
*/
|
||||
disks += efi_disk_create_eltorito(desc, if_typename, i);
|
||||
disks += efi_disk_create_eltorito(desc, if_typename,
|
||||
i, devname);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue