git: 4dcae288fe63 - main - stand/zfs: Refactor zfs_set_bootenv

From: Warner Losh <imp_at_FreeBSD.org>
Date: Mon, 01 May 2023 21:04:14 UTC
The branch main has been updated by imp:

URL: https://cgit.FreeBSD.org/src/commit/?id=4dcae288fe63667bdf930258b94e0e51a2d05787

commit 4dcae288fe63667bdf930258b94e0e51a2d05787
Author:     Warner Losh <imp@FreeBSD.org>
AuthorDate: 2023-05-01 15:26:59 +0000
Commit:     Warner Losh <imp@FreeBSD.org>
CommitDate: 2023-05-01 21:02:53 +0000

    stand/zfs: Refactor zfs_set_bootenv
    
    Refactor zfs_set_bootenv to split out the lookup of spa from the
    rest. zfs_set_bootenv_spa flushes the benv to the vdevs and updates the
    cached benv.
    
    Sponsored by:           Netflix
    Reviewed by:            tsoome, kevans
    Differential Revision:  https://reviews.freebsd.org/D39410
---
 stand/libsa/zfs/zfs.c     | 14 ++------------
 stand/libsa/zfs/zfsimpl.c | 16 ++++++++++++++++
 2 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/stand/libsa/zfs/zfs.c b/stand/libsa/zfs/zfs.c
index 17f213fe833c..7cdfa1a06df9 100644
--- a/stand/libsa/zfs/zfs.c
+++ b/stand/libsa/zfs/zfs.c
@@ -812,22 +812,12 @@ zfs_get_bootenv(void *vdev, nvlist_t **benvp)
 int
 zfs_set_bootenv(void *vdev, nvlist_t *benv)
 {
-	struct zfs_devdesc *dev = (struct zfs_devdesc *)vdev;
 	spa_t *spa;
-	vdev_t *vd;
 
-	if (dev->dd.d_dev->dv_type != DEVT_ZFS)
-		return (ENOTSUP);
-
-	if ((spa = spa_find_by_dev(dev)) == NULL)
+	if ((spa = spa_find_by_dev((struct zfs_devdesc *)vdev)) == NULL)
 		return (ENXIO);
 
-	STAILQ_FOREACH(vd, &spa->spa_root_vdev->v_children, v_childlink) {
-		vdev_write_bootenv(vd, benv);
-	}
-
-	spa->spa_bootenv = benv;
-	return (0);
+	return (zfs_set_bootenv_spa(spa, benv));
 }
 
 /*
diff --git a/stand/libsa/zfs/zfsimpl.c b/stand/libsa/zfs/zfsimpl.c
index 40a1448a0c9f..3b093dea3c41 100644
--- a/stand/libsa/zfs/zfsimpl.c
+++ b/stand/libsa/zfs/zfsimpl.c
@@ -3883,3 +3883,19 @@ zfs_get_bootenv_spa(spa_t *spa, nvlist_t **benvp)
 	*benvp = benv;
 	return (0);
 }
+
+/*
+ * Store nvlist to pool label bootenv area. Also updates cached pointer in spa.
+ */
+static int
+zfs_set_bootenv_spa(spa_t *spa, nvlist_t *benv)
+{
+	vdev_t *vd;
+
+	STAILQ_FOREACH(vd, &spa->spa_root_vdev->v_children, v_childlink) {
+		vdev_write_bootenv(vd, benv);
+	}
+
+	spa->spa_bootenv = benv;
+	return (0);
+}