Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 17 Jul 2023 19:08:53 GMT
From:      Kyle Evans <kevans@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 4b426cf3a46a - main - libbe: recursively promote deep BE datasets
Message-ID:  <202307171908.36HJ8rdL014212@gitrepo.freebsd.org>

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

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

commit 4b426cf3a46a429474e2a138d3360acc23411563
Author:     R. Christian McDonald <rcm@rcm.sh>
AuthorDate: 2023-07-17 19:06:28 +0000
Commit:     Kyle Evans <kevans@FreeBSD.org>
CommitDate: 2023-07-17 19:08:32 +0000

    libbe: recursively promote deep BE datasets
    
    beadm will recursively promote deep BE datasets. In order to match the
    beadm behavior, we need to recursively iterate over child filesystems
    and promote them along the way.
    
    This patch further refines the work from D40903, completing the fix for
    promotion.
    
    Reviewed by:    kevans, rew
    Sponsored by:   Rubicon Communications, LLC ("Netgate")
    Differential Revision:  https://reviews.freebsd.org/D40972
---
 lib/libbe/be.c                 | 40 +++++++++++++++++++++++++++++++---------
 sbin/bectl/tests/bectl_test.sh | 12 +++++-------
 2 files changed, 36 insertions(+), 16 deletions(-)

diff --git a/lib/libbe/be.c b/lib/libbe/be.c
index 31836c623c4a..e607ab12215b 100644
--- a/lib/libbe/be.c
+++ b/lib/libbe/be.c
@@ -1266,12 +1266,38 @@ be_deactivate(libbe_handle_t *lbh, const char *ds, bool temporary)
 	return (0);
 }
 
+static int
+be_zfs_promote_cb(zfs_handle_t *zhp, void *data)
+{
+	char origin[BE_MAXPATHLEN];
+	bool *found_origin = (bool *)data;
+	int err;
+
+	if (zfs_prop_get(zhp, ZFS_PROP_ORIGIN, origin, sizeof(origin),
+	    NULL, NULL, 0, true) == 0) {
+		*found_origin = true;
+		err = zfs_promote(zhp);
+		if (err)
+			return (err);
+	}
+
+	return (zfs_iter_filesystems(zhp, be_zfs_promote_cb, data));
+}
+
+static int
+be_zfs_promote(zfs_handle_t *zhp, bool *found_origin)
+{
+	*found_origin = false;
+	return (be_zfs_promote_cb(zhp, (void *)found_origin));
+}
+
 int
 be_activate(libbe_handle_t *lbh, const char *bootenv, bool temporary)
 {
-	char be_path[BE_MAXPATHLEN], origin[BE_MAXPATHLEN];
+	char be_path[BE_MAXPATHLEN];
 	zfs_handle_t *zhp;
 	int err;
+	bool found_origin;
 
 	be_root_concat(lbh, bootenv, be_path);
 
@@ -1297,19 +1323,15 @@ be_activate(libbe_handle_t *lbh, const char *bootenv, bool temporary)
 			if (zhp == NULL)
 				return (-1);
 
-			if (zfs_prop_get(zhp, ZFS_PROP_ORIGIN, origin, sizeof(origin),
-				NULL, NULL, 0, 1) != 0) {
-				zfs_close(zhp);
-				break;
-			}
+			err = be_zfs_promote(zhp, &found_origin);
 
-			err = zfs_promote(zhp);
 			zfs_close(zhp);
-			if (err)
+			if (!found_origin)
 				break;
+			if (err)
+				return (err);
 		}
 
-
 		if (err)
 			return (-1);
 	}
diff --git a/sbin/bectl/tests/bectl_test.sh b/sbin/bectl/tests/bectl_test.sh
index 7ca7af8a1abf..75884029d93e 100755
--- a/sbin/bectl/tests/bectl_test.sh
+++ b/sbin/bectl/tests/bectl_test.sh
@@ -528,7 +528,6 @@ bectl_jail_cleanup()
 atf_test_case bectl_promotion cleanup
 bectl_promotion_head()
 {
-
 	atf_set "descr" "Check bectl promotion upon activation"
 	atf_set "require.user" root
 }
@@ -550,7 +549,7 @@ bectl_promotion_body()
 	mount=${cwd}/mnt
 	root=${mount}/root
 
-	bectl_create_setup ${zpool} ${disk} ${mount}
+	bectl_create_deep_setup ${zpool} ${disk} ${mount}
 	atf_check mkdir -p ${root}
 
 	# Sleeps interspersed to workaround some naming quirks; notably,
@@ -560,23 +559,22 @@ bectl_promotion_body()
 	# with the same name, and the promotion will fail.
 	atf_check bectl -r ${zpool}/ROOT rename default A
 	sleep 1
-	atf_check bectl -r ${zpool}/ROOT create -e A B
+	atf_check bectl -r ${zpool}/ROOT create -r -e A B
 	sleep 1
-	atf_check bectl -r ${zpool}/ROOT create -e B C
+	atf_check bectl -r ${zpool}/ROOT create -r -e B C
 
 	# C should be a clone of B to start with
-	atf_check -o not-inline:"-" zfs list -H -o origin ${zpool}/ROOT/C
+	atf_check -o not-inline:"-" zfs list -Hr -o origin ${zpool}/ROOT/C
 
 	# Activating it should then promote it all the way out of clone-hood.
 	# This entails two promotes internally, as the first would promote it to
 	# a snapshot of A before finally promoting it the second time out of
 	# clone status.
 	atf_check -o not-empty bectl -r ${zpool}/ROOT activate C
-	atf_check -o inline:"-\n" zfs list -H -o origin ${zpool}/ROOT/C
+	atf_check -o inline:"-\n-\n" zfs list -Hr -o origin ${zpool}/ROOT/C
 }
 bectl_promotion_cleanup()
 {
-
 	bectl_cleanup $(get_zpool_name)
 }
 



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