aboutsummaryrefslogtreecommitdiff
path: root/lib/libbe
diff options
context:
space:
mode:
authorKyle Evans <kevans@FreeBSD.org>2018-11-10 20:42:29 +0000
committerKyle Evans <kevans@FreeBSD.org>2018-11-10 20:42:29 +0000
commit8d4ce3586f6aed9c492065424de322b35571594b (patch)
treecea45d033ffe4d540003e1d54efbb6738740b763 /lib/libbe
parent0e48e06807cfe7971a04a6013a7f260efd30cfc9 (diff)
downloadsrc-8d4ce3586f6aed9c492065424de322b35571594b.tar.gz
src-8d4ce3586f6aed9c492065424de322b35571594b.zip
Notes
Diffstat (limited to 'lib/libbe')
-rw-r--r--lib/libbe/be.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/lib/libbe/be.c b/lib/libbe/be.c
index 10977747a670..540fe44ea1e9 100644
--- a/lib/libbe/be.c
+++ b/lib/libbe/be.c
@@ -922,6 +922,21 @@ be_set_nextboot(libbe_handle_t *lbh, nvlist_t *config, uint64_t pool_guid,
return (0);
}
+/*
+ * Deactivate old BE dataset; currently just sets canmount=noauto
+ */
+static int
+be_deactivate(libbe_handle_t *lbh, const char *ds)
+{
+ zfs_handle_t *zfs;
+
+ if ((zfs = zfs_open(lbh->lzh, ds, ZFS_TYPE_DATASET)) == NULL)
+ return (1);
+ if (zfs_prop_set(zfs, "canmount", "noauto") != 0)
+ return (1);
+ zfs_close(zfs);
+ return (0);
+}
int
be_activate(libbe_handle_t *lbh, const char *bootenv, bool temporary)
@@ -961,6 +976,9 @@ be_activate(libbe_handle_t *lbh, const char *bootenv, bool temporary)
return (be_set_nextboot(lbh, vdevs, pool_guid, buf));
} else {
+ if (be_deactivate(lbh, lbh->bootfs) != 0)
+ return (-1);
+
/* Obtain bootenv zpool */
err = zpool_set_prop(lbh->active_phandle, "bootfs", be_path);
if (err)