Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 1 May 2023 21:04:16 GMT
From:      Warner Losh <imp@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 43f7eeff0d45 - main - stand/boot1.efi: Implement bootonce for ZFS
Message-ID:  <202305012104.341L4GLq051829@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by imp:

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

commit 43f7eeff0d45769e1deaf0a6879bc807fdafaf4c
Author:     Warner Losh <imp@FreeBSD.org>
AuthorDate: 2023-05-01 15:27:14 +0000
Commit:     Warner Losh <imp@FreeBSD.org>
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,
 };



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202305012104.341L4GLq051829>