Provide a more direct interface to tell ZFS what the preferred handle

is. We tell the ZFS code now, and it checks rather than having a
callback to do the checks.

This will allow us to have a more graceful fallback code. In the
future, it's anticipated that we may fallback to a more global search
(or implement a command to do so) when reqeusted by the user, or we
detect a violation of the UEFI Boot Manager protocol severe enough to
warrant this backstop. For now, it just allows us to get rid of img as
a global.

Sponsored by: Netflix
This commit is contained in:
Warner Losh 2018-06-15 19:07:26 +00:00
parent c0626257af
commit c2bac3e1ba
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=335229
3 changed files with 23 additions and 24 deletions

View File

@ -44,11 +44,11 @@ typedef struct zfsinfo
extern uint64_t pool_guid;
extern void efi_zfs_probe(void);
extern zfsinfo_list_t *efizfs_get_zfsinfo_list(void);
extern bool efi_zfs_is_preferred(EFI_HANDLE *h);
extern EFI_HANDLE efizfs_get_handle_by_guid(uint64_t);
extern bool efizfs_get_guid_by_handle(EFI_HANDLE, uint64_t *);
void efi_zfs_probe(void);
EFI_HANDLE efizfs_get_handle_by_guid(uint64_t);
bool efizfs_get_guid_by_handle(EFI_HANDLE, uint64_t *);
zfsinfo_list_t *efizfs_get_zfsinfo_list(void);
void efizfs_set_preferred(EFI_HANDLE);
#endif

View File

@ -45,6 +45,14 @@ static zfsinfo_list_t zfsinfo;
uint64_t pool_guid;
static EFI_HANDLE preferred;
void
efizfs_set_preferred(EFI_HANDLE h)
{
preferred = h;
}
zfsinfo_list_t *
efizfs_get_zfsinfo_list(void)
{
@ -110,16 +118,13 @@ efi_zfs_probe(void)
*/
STAILQ_FOREACH(hd, hdi, pd_link) {
STAILQ_FOREACH(pd, &hd->pd_part, pd_link) {
snprintf(devname, sizeof(devname), "%s%dp%d:",
efipart_hddev.dv_name, hd->pd_unit, pd->pd_unit);
if (zfs_probe_dev(devname, &guid) == 0) {
insert_zfs(pd->pd_handle, guid);
if (efi_zfs_is_preferred(pd->pd_handle))
pool_guid = guid;
}
if (zfs_probe_dev(devname, &guid) == 0) {
insert_zfs(pd->pd_handle, guid);
if (pd->pd_handle == preferred)
pool_guid = guid;
}
}
}

View File

@ -47,7 +47,6 @@ __FBSDID("$FreeBSD$");
#ifdef EFI_ZFS_BOOT
#include <libzfs.h>
#include "efizfs.h"
#endif
@ -73,8 +72,6 @@ EFI_GUID debugimg = DEBUG_IMAGE_INFO_TABLE_GUID;
EFI_GUID fdtdtb = FDT_TABLE_GUID;
EFI_GUID inputid = SIMPLE_TEXT_INPUT_PROTOCOL;
static EFI_LOADED_IMAGE *img;
/*
* Number of seconds to wait for a keystroke before exiting with failure
* in the event no currdev is found. -2 means always break, -1 means
@ -84,14 +81,6 @@ static EFI_LOADED_IMAGE *img;
*/
static int fail_timeout = 5;
#ifdef EFI_ZFS_BOOT
bool
efi_zfs_is_preferred(EFI_HANDLE *h)
{
return (h == img->DeviceHandle);
}
#endif
static bool
has_keyboard(void)
{
@ -424,6 +413,7 @@ main(int argc, CHAR16 *argv[])
UINT16 boot_current;
size_t sz;
UINT16 boot_order[100];
EFI_LOADED_IMAGE *img;
#if !defined(__arm__)
char buf[40];
#endif
@ -441,6 +431,10 @@ main(int argc, CHAR16 *argv[])
/* Get our loaded image protocol interface structure. */
BS->HandleProtocol(IH, &imgid, (VOID**)&img);
#ifdef EFI_ZFS_BOOT
/* Tell ZFS probe code where we booted from */
efizfs_set_preferred(img->DeviceHandle);
#endif
/* Init the time source */
efi_time_init();