The branch main has been updated by imp:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=43f7eeff0d45769e1deaf0a6879bc807fdafaf4c

commit 43f7eeff0d45769e1deaf0a6879bc807fdafaf4c
Author:     Warner Losh <[email protected]>
AuthorDate: 2023-05-01 15:27:14 +0000
Commit:     Warner Losh <[email protected]>
CommitDate: 2023-05-01 21:02:53 +0000

    stand/boot1.efi: Implement bootonce for ZFS
    
    Implement ZFS bootonce protocol. We pass zfs-bootonce=t to the next boot
    stage as a command line argument. Unlike zfsboot -> loader handoff in
    the BIOS case, we don't use the OS_BOOTONCE_USED. This would require
    modifications to loader.efi which would only server to make it more
    complicated. Instead, use the command line parsing interface for the
    boot1.efi -> loader.efi to pass in the zfs-bootonce kenv that will be
    needed by rc.d/zfsbe to activate the BE if boot progresses that far.
    
    Sponsored by:           Netflix
    Reviewed by:            tsoome, kevans
    Differential Revision:  https://reviews.freebsd.org/D39412
---
 stand/efi/boot1/zfs_module.c | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/stand/efi/boot1/zfs_module.c b/stand/efi/boot1/zfs_module.c
index 7aaca72e30f1..234b50084839 100644
--- a/stand/efi/boot1/zfs_module.c
+++ b/stand/efi/boot1/zfs_module.c
@@ -40,6 +40,8 @@
 
 static dev_info_t *devices;
 
+static char zfs_bootonce[VDEV_PAD_SIZE];
+
 uint64_t
 ldi_get_size(void *priv)
 {
@@ -165,6 +167,16 @@ load(const char *filepath, dev_info_t *devinfo, void 
**bufp, size_t *bufsize)
                return (EFI_NOT_FOUND);
        }
 
+       /*
+        * OK. We've found a filesystem. Any attempt to use it should clear the
+        * 'once' flag. Prior to now, we'd not be able to clear it anyway. We
+        * don't care if we can't find the files to boot, or if there's a
+        * problem with it: we've tried to use it once we're able to mount the
+        * ZFS dataset.
+        */
+       *zfs_bootonce = '\0';
+       zfs_get_bootonce_spa(spa, OS_BOOTONCE, zfs_bootonce, 
sizeof(zfs_bootonce));
+
        if ((err = zfs_lookup(&zmount, filepath, &dn)) != 0) {
                if (err == ENOENT) {
                        DPRINTF("Failed to find '%s' on pool '%s' (%d)\n",
@@ -220,6 +232,18 @@ status(void)
        printf("\n");
 }
 
+static const char *
+extra_env(void)
+{
+       char *rv = NULL;        /* So we return NULL if asprintf fails */
+
+       if (*zfs_bootonce == '\0')
+               return NULL;
+       asprintf(&rv, "zfs-bootonce=%s", zfs_bootonce);
+       return (rv);
+}
+
+
 static void
 init(void)
 {
@@ -241,5 +265,6 @@ const boot_module_t zfs_module =
        .probe = probe,
        .load = load,
        .status = status,
-       .devices = _devices
+       .devices = _devices,
+       .extra_env = extra_env,
 };

Reply via email to