summaryrefslogtreecommitdiff
path: root/usr/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib')
-rw-r--r--usr/src/lib/libbe/common/be_activate.c27
-rw-r--r--usr/src/lib/libbe/common/be_create.c157
-rw-r--r--usr/src/lib/libbe/common/be_list.c17
-rw-r--r--usr/src/lib/libbe/common/be_mount.c25
-rw-r--r--usr/src/lib/libbe/common/be_rename.c24
-rw-r--r--usr/src/lib/libbe/common/be_snapshot.c29
-rw-r--r--usr/src/lib/libbe/common/be_utils.c144
-rw-r--r--usr/src/lib/libbe/common/be_zones.c27
-rw-r--r--usr/src/lib/libbe/common/libbe_priv.h8
9 files changed, 318 insertions, 140 deletions
diff --git a/usr/src/lib/libbe/common/be_activate.c b/usr/src/lib/libbe/common/be_activate.c
index 4ec8f055e2..581ddc41c2 100644
--- a/usr/src/lib/libbe/common/be_activate.c
+++ b/usr/src/lib/libbe/common/be_activate.c
@@ -26,7 +26,7 @@
/*
* Copyright 2015 Nexenta Systems, Inc. All rights reserved.
* Copyright 2016 Toomas Soome <tsoome@me.com>
- * Copyright 2020 OmniOS Community Edition (OmniOSce) Association.
+ * Copyright 2022 OmniOS Community Edition (OmniOSce) Association.
*/
#include <assert.h>
@@ -266,7 +266,12 @@ _be_activate(char *be_name, be_nextboot_state_t nextboot)
return (ret);
}
- be_make_root_ds(cb.obe_zpool, cb.obe_name, root_ds, sizeof (root_ds));
+ if ((ret = be_make_root_ds(cb.obe_zpool, cb.obe_name, root_ds,
+ sizeof (root_ds))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container dataset "
+ "for %s/%s\n"), __func__, cb.obe_zpool, cb.obe_name);
+ return (ret);
+ }
cb.obe_root_ds = strdup(root_ds);
if (getzoneid() == GLOBAL_ZONEID) {
@@ -573,8 +578,13 @@ set_canmount(be_node_list_t *be_nodes, char *value)
while (list != NULL) {
be_dataset_list_t *datasets = list->be_node_datasets;
- be_make_root_ds(list->be_rpool, list->be_node_name, ds_path,
- sizeof (ds_path));
+ if ((err = be_make_root_ds(list->be_rpool, list->be_node_name,
+ ds_path, sizeof (ds_path))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container "
+ "dataset for %s/%s\n"), __func__,
+ list->be_rpool, list->be_node_name);
+ return (err);
+ }
if ((zhp = zfs_open(g_zfs, ds_path, ZFS_TYPE_DATASET)) ==
NULL) {
@@ -605,9 +615,14 @@ set_canmount(be_node_list_t *be_nodes, char *value)
ZFS_CLOSE(zhp);
while (datasets != NULL) {
- be_make_root_ds(list->be_rpool,
+ if ((err = be_make_root_ds(list->be_rpool,
datasets->be_dataset_name, ds_path,
- sizeof (ds_path));
+ sizeof (ds_path))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE "
+ "container dataset for %s/%s\n"), __func__,
+ list->be_rpool, datasets->be_dataset_name);
+ return (err);
+ }
if ((zhp = zfs_open(g_zfs, ds_path, ZFS_TYPE_DATASET))
== NULL) {
diff --git a/usr/src/lib/libbe/common/be_create.c b/usr/src/lib/libbe/common/be_create.c
index 4158ddb677..62f5bfe112 100644
--- a/usr/src/lib/libbe/common/be_create.c
+++ b/usr/src/lib/libbe/common/be_create.c
@@ -24,7 +24,7 @@
* Copyright 2013 Nexenta Systems, Inc. All rights reserved.
* Copyright (c) 2014, 2015 by Delphix. All rights reserved.
* Copyright (c) 2016 Martin Matuska. All rights reserved.
- * Copyright 2021 OmniOS Community Edition (OmniOSce) Association.
+ * Copyright 2022 OmniOS Community Edition (OmniOSce) Association.
*/
/*
@@ -206,8 +206,12 @@ be_init(nvlist_t *be_attrs)
}
/* Generate string for BE's root dataset */
- be_make_root_ds(bt.nbe_zpool, bt.nbe_name, nbe_root_ds,
- sizeof (nbe_root_ds));
+ if ((ret = be_make_root_ds(bt.nbe_zpool, bt.nbe_name, nbe_root_ds,
+ sizeof (nbe_root_ds))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container dataset "
+ "for %s/%s\n"), __func__, bt.nbe_zpool, bt.nbe_name);
+ return (ret);
+ }
/*
* Create property list for new BE root dataset. If some
@@ -446,8 +450,12 @@ be_destroy(nvlist_t *be_attrs)
}
/* Generate string for obe_name's root dataset */
- be_make_root_ds(bt.obe_zpool, bt.obe_name, obe_root_ds,
- sizeof (obe_root_ds));
+ if ((ret = be_make_root_ds(bt.obe_zpool, bt.obe_name, obe_root_ds,
+ sizeof (obe_root_ds))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container dataset "
+ "for %s/%s\n"), __func__, bt.obe_zpool, bt.obe_name);
+ return (ret);
+ }
bt.obe_root_ds = obe_root_ds;
if (getzoneid() != GLOBAL_ZONEID) {
@@ -780,10 +788,28 @@ be_copy(nvlist_t *be_attrs)
}
/*
+ * If an auto named BE is desired, it must be in the same
+ * pool as the original BE.
+ */
+ if (bt.nbe_name == NULL && bt.nbe_zpool != NULL) {
+ be_print_err(gettext("be_copy: cannot specify pool "
+ "name when creating an auto named BE\n"));
+ ret = BE_ERR_INVAL;
+ goto done;
+ }
+
+ /*
+ * If the zpool name to create new BE in is not provided,
+ * create the new BE in the original BE's pool.
+ */
+ if (bt.nbe_zpool == NULL)
+ bt.nbe_zpool = bt.obe_zpool;
+
+ /*
* If new BE name provided, validate the BE name and then verify
* that new BE name doesn't already exist in some pool.
*/
- if (bt.nbe_name) {
+ if (bt.nbe_name != NULL) {
/* Validate original BE name */
if (!be_valid_be_name(bt.nbe_name)) {
be_print_err(gettext("be_copy: "
@@ -808,8 +834,13 @@ be_copy(nvlist_t *be_attrs)
goto done;
}
} else {
- be_make_root_ds(bt.nbe_zpool, bt.nbe_name, nbe_root_ds,
- sizeof (nbe_root_ds));
+ if ((ret = be_make_root_ds(bt.nbe_zpool, bt.nbe_name,
+ nbe_root_ds, sizeof (nbe_root_ds))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE "
+ "container dataset for %s/%s\n"), __func__,
+ bt.nbe_zpool, bt.nbe_name);
+ goto done;
+ }
if (zfs_dataset_exists(g_zfs, nbe_root_ds,
ZFS_TYPE_FILESYSTEM)) {
be_print_err(gettext("be_copy: BE (%s) already "
@@ -820,17 +851,6 @@ be_copy(nvlist_t *be_attrs)
}
} else {
/*
- * If an auto named BE is desired, it must be in the same
- * pool is the original BE.
- */
- if (bt.nbe_zpool != NULL) {
- be_print_err(gettext("be_copy: cannot specify pool "
- "name when creating an auto named BE\n"));
- ret = BE_ERR_INVAL;
- goto done;
- }
-
- /*
* Generate auto named BE
*/
if ((bt.nbe_name = be_auto_be_name(bt.obe_name))
@@ -844,19 +864,19 @@ be_copy(nvlist_t *be_attrs)
autoname = B_TRUE;
}
- /*
- * If zpool name to create new BE in is not provided,
- * create new BE in original BE's pool.
- */
- if (bt.nbe_zpool == NULL) {
- bt.nbe_zpool = bt.obe_zpool;
- }
-
/* Get root dataset names for obe_name and nbe_name */
- be_make_root_ds(bt.obe_zpool, bt.obe_name, obe_root_ds,
- sizeof (obe_root_ds));
- be_make_root_ds(bt.nbe_zpool, bt.nbe_name, nbe_root_ds,
- sizeof (nbe_root_ds));
+ if ((ret = be_make_root_ds(bt.obe_zpool, bt.obe_name, obe_root_ds,
+ sizeof (obe_root_ds))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container dataset "
+ "for %s/%s\n"), __func__, bt.obe_zpool, bt.obe_name);
+ goto done;
+ }
+ if ((ret = be_make_root_ds(bt.nbe_zpool, bt.nbe_name, nbe_root_ds,
+ sizeof (nbe_root_ds))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container dataset "
+ "for %s/%s\n"), __func__, bt.nbe_zpool, bt.nbe_name);
+ goto done;
+ }
bt.obe_root_ds = obe_root_ds;
bt.nbe_root_ds = nbe_root_ds;
@@ -966,8 +986,15 @@ be_copy(nvlist_t *be_attrs)
* Regenerate string for new BE's
* root dataset name
*/
- be_make_root_ds(bt.nbe_zpool, bt.nbe_name,
- nbe_root_ds, sizeof (nbe_root_ds));
+ if ((ret = be_make_root_ds(bt.nbe_zpool,
+ bt.nbe_name, nbe_root_ds,
+ sizeof (nbe_root_ds))) != BE_SUCCESS) {
+ be_print_err(gettext(
+ "%s: failed to get BE container "
+ "dataset for %s/%s\n"), __func__,
+ bt.nbe_zpool, bt.nbe_name);
+ goto done;
+ }
bt.nbe_root_ds = nbe_root_ds;
/*
@@ -1122,10 +1149,18 @@ be_copy(nvlist_t *be_attrs)
* Update new BE's vfstab.
*/
- be_make_root_container_ds(bt.obe_zpool, obe_root_container,
- sizeof (obe_root_container));
- be_make_root_container_ds(bt.nbe_zpool, nbe_root_container,
- sizeof (nbe_root_container));
+ if ((ret = be_make_root_container_ds(bt.obe_zpool, obe_root_container,
+ sizeof (obe_root_container))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container dataset "
+ "for %s\n"), __func__, bt.obe_zpool);
+ goto done;
+ }
+ if ((ret = be_make_root_container_ds(bt.nbe_zpool, nbe_root_container,
+ sizeof (nbe_root_container))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container dataset "
+ "for %s\n"), __func__, bt.nbe_zpool);
+ goto done;
+ }
if ((ret = be_update_vfstab(bt.nbe_name, obe_root_container,
nbe_root_container, &fld, new_mp)) != BE_SUCCESS) {
@@ -1258,11 +1293,15 @@ be_find_zpool_callback(zpool_handle_t *zlp, void *data)
be_transaction_data_t *bt = data;
const char *zpool = zpool_get_name(zlp);
char be_root_ds[MAXPATHLEN];
+ int ret = 0;
/*
* Generate string for the BE's root dataset
*/
- be_make_root_ds(zpool, bt->obe_name, be_root_ds, sizeof (be_root_ds));
+ if (be_make_root_ds(zpool, bt->obe_name, be_root_ds,
+ sizeof (be_root_ds)) != BE_SUCCESS) {
+ goto out;
+ }
/*
* Check if dataset exists
@@ -1270,12 +1309,12 @@ be_find_zpool_callback(zpool_handle_t *zlp, void *data)
if (zfs_dataset_exists(g_zfs, be_root_ds, ZFS_TYPE_FILESYSTEM)) {
/* BE's root dataset exists in zpool */
bt->obe_zpool = strdup(zpool);
- zpool_close(zlp);
- return (1);
+ ret = 1;
}
+out:
zpool_close(zlp);
- return (0);
+ return (ret);
}
/*
@@ -1297,23 +1336,27 @@ be_exists_callback(zpool_handle_t *zlp, void *data)
const char *zpool = zpool_get_name(zlp);
char *be_name = data;
char be_root_ds[MAXPATHLEN];
+ int ret = 0;
/*
* Generate string for the BE's root dataset
*/
- be_make_root_ds(zpool, be_name, be_root_ds, sizeof (be_root_ds));
+ if (be_make_root_ds(zpool, be_name, be_root_ds,
+ sizeof (be_root_ds)) != BE_SUCCESS) {
+ goto out;
+ }
/*
* Check if dataset exists
*/
if (zfs_dataset_exists(g_zfs, be_root_ds, ZFS_TYPE_FILESYSTEM)) {
/* BE's root dataset exists in zpool */
- zpool_close(zlp);
- return (1);
+ ret = 1;
}
+out:
zpool_close(zlp);
- return (0);
+ return (ret);
}
/*
@@ -1779,8 +1822,12 @@ be_destroy_zone_roots(char *zonepath_ds, be_destroy_data_t *dd)
int ret = BE_SUCCESS;
/* Generate string for the root container dataset for this zone. */
- be_make_container_ds(zonepath_ds, zone_container_ds,
- sizeof (zone_container_ds));
+ if ((ret = be_make_container_ds(zonepath_ds, zone_container_ds,
+ sizeof (zone_container_ds))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container dataset "
+ "for %s\n"), __func__, zonepath_ds);
+ return (ret);
+ }
/* Get handle to this zone's root container dataset. */
if ((zhp = zfs_open(g_zfs, zone_container_ds, ZFS_TYPE_FILESYSTEM))
@@ -2049,8 +2096,12 @@ be_copy_zones(char *obe_name, char *obe_root_ds, char *nbe_root_ds)
goto done;
}
- be_make_container_ds(zonepath_ds, zone_container_ds,
- sizeof (zone_container_ds));
+ if ((ret = be_make_container_ds(zonepath_ds, zone_container_ds,
+ sizeof (zone_container_ds))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container "
+ "dataset for %s\n"), __func__, zonepath_ds);
+ goto done;
+ }
if ((z_zhp = zfs_open(g_zfs, zoneroot_ds,
ZFS_TYPE_FILESYSTEM)) == NULL) {
@@ -2901,8 +2952,12 @@ be_create_container_ds(char *zpool)
char be_container_ds[MAXPATHLEN];
/* Generate string for BE container dataset for this pool */
- be_make_container_ds(zpool, be_container_ds,
- sizeof (be_container_ds));
+ if (be_make_container_ds(zpool, be_container_ds,
+ sizeof (be_container_ds)) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container dataset "
+ "for %s\n"), __func__, zpool);
+ return (B_FALSE);
+ }
if (!zfs_dataset_exists(g_zfs, be_container_ds, ZFS_TYPE_FILESYSTEM)) {
diff --git a/usr/src/lib/libbe/common/be_list.c b/usr/src/lib/libbe/common/be_list.c
index 3e0833ea83..85b62eff38 100644
--- a/usr/src/lib/libbe/common/be_list.c
+++ b/usr/src/lib/libbe/common/be_list.c
@@ -29,7 +29,7 @@
* Copyright 2015 Toomas Soome <tsoome@me.com>
* Copyright 2015 Gary Mills
* Copyright (c) 2016 Martin Matuska. All rights reserved.
- * Copyright 2018 OmniOS Community Edition (OmniOSce) Association.
+ * Copyright 2022 OmniOS Community Edition (OmniOSce) Association.
*/
#include <assert.h>
@@ -445,8 +445,12 @@ be_get_list_callback(zpool_handle_t *zlp, void *data)
/*
* Generate string for the BE container dataset
*/
- be_make_container_ds(rpool, be_container_ds,
- sizeof (be_container_ds));
+ if (be_make_container_ds(rpool, be_container_ds,
+ sizeof (be_container_ds)) != BE_SUCCESS) {
+ /* Move on to the next pool */
+ zpool_close(zlp);
+ return (0);
+ }
/*
* If a BE name was specified we use it's root dataset in place of
@@ -454,12 +458,17 @@ be_get_list_callback(zpool_handle_t *zlp, void *data)
* the information for the specified BE.
*/
if (cb->be_name != NULL) {
+ int rv;
+
if (!be_valid_be_name(cb->be_name))
return (BE_ERR_INVAL);
/*
* Generate string for the BE root dataset
*/
- be_make_root_ds(rpool, cb->be_name, be_ds, sizeof (be_ds));
+ if ((rv = be_make_root_ds(rpool, cb->be_name, be_ds,
+ sizeof (be_ds))) != BE_SUCCESS) {
+ return (rv);
+ }
open_ds = be_ds;
} else {
open_ds = be_container_ds;
diff --git a/usr/src/lib/libbe/common/be_mount.c b/usr/src/lib/libbe/common/be_mount.c
index 98c861fca4..672424d1f2 100644
--- a/usr/src/lib/libbe/common/be_mount.c
+++ b/usr/src/lib/libbe/common/be_mount.c
@@ -24,6 +24,7 @@
* Copyright 2013 Nexenta Systems, Inc. All rights reserved.
* Copyright 2015 EveryCity Ltd.
* Copyright (c) 2015 by Delphix. All rights reserved.
+ * Copyright 2022 OmniOS Community Edition (OmniOSce) Association.
*/
/*
@@ -277,8 +278,12 @@ _be_mount(char *be_name, char **altroot, int flags)
}
/* Generate string for obe_name's root dataset */
- be_make_root_ds(bt.obe_zpool, bt.obe_name, obe_root_ds,
- sizeof (obe_root_ds));
+ if ((ret = be_make_root_ds(bt.obe_zpool, bt.obe_name, obe_root_ds,
+ sizeof (obe_root_ds))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container dataset "
+ "for %s/%s\n"), __func__, bt.obe_zpool, bt.obe_name);
+ return (ret);
+ }
bt.obe_root_ds = obe_root_ds;
/* Get handle to BE's root dataset */
@@ -448,8 +453,12 @@ _be_unmount(char *be_name, int flags)
}
/* Generate string for obe_name's root dataset */
- be_make_root_ds(bt.obe_zpool, bt.obe_name, obe_root_ds,
- sizeof (obe_root_ds));
+ if ((ret = be_make_root_ds(bt.obe_zpool, bt.obe_name, obe_root_ds,
+ sizeof (obe_root_ds))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container dataset "
+ "for %s/%s\n"), __func__, bt.obe_zpool, bt.obe_name);
+ return (ret);
+ }
bt.obe_root_ds = obe_root_ds;
/* Get handle to BE's root dataset */
@@ -1565,15 +1574,13 @@ iter_shared_fs_callback(zfs_handle_t *zhp, void *data)
pool = strtok(tmp_name, "/");
if (pool) {
- /* Get the name of this pool's container dataset */
- be_make_container_ds(pool, container_ds,
- sizeof (container_ds));
-
/*
* If what we're processing is this pool's BE container
* dataset, skip it.
*/
- if (strcmp(name, container_ds) == 0) {
+ if (be_make_container_ds(pool, container_ds,
+ sizeof (container_ds)) == BE_SUCCESS &&
+ strcmp(name, container_ds) == 0) {
ZFS_CLOSE(zhp);
return (0);
}
diff --git a/usr/src/lib/libbe/common/be_rename.c b/usr/src/lib/libbe/common/be_rename.c
index f0cd781b22..87dadefaff 100644
--- a/usr/src/lib/libbe/common/be_rename.c
+++ b/usr/src/lib/libbe/common/be_rename.c
@@ -22,7 +22,7 @@
/*
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012 by Delphix. All rights reserved.
- * Copyright 2021 OmniOS Community Edition (OmniOSce) Association.
+ * Copyright 2022 OmniOS Community Edition (OmniOSce) Association.
*/
#include <assert.h>
@@ -150,9 +150,19 @@ be_rename(nvlist_t *be_attrs)
/* New BE will reside in the same zpool as orig BE */
bt.nbe_zpool = bt.obe_zpool;
- be_make_root_ds(bt.obe_zpool, bt.obe_name, root_ds, sizeof (root_ds));
+ if ((ret = be_make_root_ds(bt.obe_zpool, bt.obe_name, root_ds,
+ sizeof (root_ds))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container dataset "
+ "for %s/%s\n"), __func__, bt.obe_zpool, bt.obe_name);
+ goto done;
+ };
bt.obe_root_ds = strdup(root_ds);
- be_make_root_ds(bt.nbe_zpool, bt.nbe_name, root_ds, sizeof (root_ds));
+ if ((ret = be_make_root_ds(bt.nbe_zpool, bt.nbe_name, root_ds,
+ sizeof (root_ds))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container dataset "
+ "for %s/%s\n"), __func__, bt.nbe_zpool, bt.nbe_name);
+ goto done;
+ }
bt.nbe_root_ds = strdup(root_ds);
/*
@@ -248,8 +258,12 @@ be_rename(nvlist_t *be_attrs)
* Since the new and old BEs reside in the same pool (see above),
* the same variable can be used for the container for both.
*/
- be_make_root_container_ds(bt.obe_zpool, be_root_container,
- sizeof (be_root_container));
+ if ((ret = be_make_root_container_ds(bt.obe_zpool, be_root_container,
+ sizeof (be_root_container))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container dataset "
+ "for %s\n"), __func__, bt.obe_zpool);
+ goto done;
+ }
if ((ret = be_update_vfstab(bt.nbe_name, be_root_container,
be_root_container, &fld, mp)) != BE_SUCCESS) {
diff --git a/usr/src/lib/libbe/common/be_snapshot.c b/usr/src/lib/libbe/common/be_snapshot.c
index a4e2c79e5a..92fd2ae96d 100644
--- a/usr/src/lib/libbe/common/be_snapshot.c
+++ b/usr/src/lib/libbe/common/be_snapshot.c
@@ -25,6 +25,7 @@
/*
* Copyright 2013 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2022 OmniOS Community Edition (OmniOSce) Association.
*/
/*
@@ -88,7 +89,7 @@ be_create_snapshot(nvlist_t *be_attrs)
char *snap_name = NULL;
char *policy = NULL;
boolean_t autoname = B_FALSE;
- int ret = BE_SUCCESS;
+ int ret = BE_SUCCESS;
/* Initialize libzfs handle */
if (!be_zfs_init())
@@ -184,7 +185,7 @@ be_destroy_snapshot(nvlist_t *be_attrs)
{
char *be_name = NULL;
char *snap_name = NULL;
- int ret = BE_SUCCESS;
+ int ret = BE_SUCCESS;
/* Initialize libzfs handle */
if (!be_zfs_init())
@@ -319,8 +320,12 @@ be_rollback(nvlist_t *be_attrs)
}
/* Generate string for BE's root dataset */
- be_make_root_ds(bt.obe_zpool, bt.obe_name, obe_root_ds,
- sizeof (obe_root_ds));
+ if ((ret = be_make_root_ds(bt.obe_zpool, bt.obe_name, obe_root_ds,
+ sizeof (obe_root_ds))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container dataset "
+ "for %s/%s\n"), __func__, bt.obe_zpool, bt.obe_name);
+ return (ret);
+ }
bt.obe_root_ds = obe_root_ds;
if (getzoneid() != GLOBAL_ZONEID) {
@@ -434,8 +439,12 @@ _be_create_snapshot(char *be_name, char **snap_name, char *policy)
return (zfs_err_to_be_err(g_zfs));
}
- be_make_root_ds(bt.obe_zpool, bt.obe_name, root_ds,
- sizeof (root_ds));
+ if ((ret = be_make_root_ds(bt.obe_zpool, bt.obe_name, root_ds,
+ sizeof (root_ds))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container dataset "
+ "for %s/%s\n"), __func__, bt.obe_zpool, bt.obe_name);
+ return (ret);
+ }
bt.obe_root_ds = root_ds;
if (getzoneid() != GLOBAL_ZONEID) {
@@ -662,8 +671,12 @@ _be_destroy_snapshot(char *be_name, char *snap_name)
return (zfs_err_to_be_err(g_zfs));
}
- be_make_root_ds(bt.obe_zpool, bt.obe_name, root_ds,
- sizeof (root_ds));
+ if ((ret = be_make_root_ds(bt.obe_zpool, bt.obe_name, root_ds,
+ sizeof (root_ds))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container dataset "
+ "for %s/%s\n"), __func__, bt.obe_zpool, bt.obe_name);
+ return (ret);
+ }
bt.obe_root_ds = root_ds;
zhp = zfs_open(g_zfs, bt.obe_root_ds, ZFS_TYPE_DATASET);
diff --git a/usr/src/lib/libbe/common/be_utils.c b/usr/src/lib/libbe/common/be_utils.c
index 17d43ee195..8b95f7bc91 100644
--- a/usr/src/lib/libbe/common/be_utils.c
+++ b/usr/src/lib/libbe/common/be_utils.c
@@ -24,7 +24,7 @@
* Copyright 2013 Nexenta Systems, Inc. All rights reserved.
* Copyright 2016 Toomas Soome <tsoome@me.com>
* Copyright (c) 2015 by Delphix. All rights reserved.
- * Copyright 2019 OmniOS Community Edition (OmniOSce) Association.
+ * Copyright 2022 OmniOS Community Edition (OmniOSce) Association.
* Copyright (c) 2018, Joyent, Inc.
*/
@@ -439,17 +439,19 @@ be_get_defaults(struct be_defaults *defaults)
* be_root_ds - pointer to buffer to return BE root dataset in.
* be_root_ds_size - size of be_root_ds
* Returns:
- * None
+ * BE_SUCCESS - Success
+ * be_errno_t - Failure
* Scope:
* Semi-private (library wide use only)
*/
-void
+int
be_make_root_ds(const char *zpool, const char *be_name, char *be_root_ds,
int be_root_ds_size)
{
struct be_defaults be_defaults;
be_get_defaults(&be_defaults);
- char *root_ds = NULL;
+
+ assert(zpool != NULL);
if (getzoneid() == GLOBAL_ZONEID) {
if (be_defaults.be_deflt_rpool_container) {
@@ -461,18 +463,30 @@ be_make_root_ds(const char *zpool, const char *be_name, char *be_root_ds,
}
} else {
/*
- * In non-global zone we can use path from mounted root dataset
- * to generate BE's root dataset string.
+ * In a non-global zone we can use the path from the mounted
+ * root dataset to generate the BE's root dataset string.
*/
- if ((root_ds = be_get_ds_from_dir("/")) != NULL) {
- (void) snprintf(be_root_ds, be_root_ds_size, "%s/%s",
- dirname(root_ds), be_name);
- } else {
+ char *root_ds = be_get_ds_from_dir("/");
+
+ if (root_ds == NULL) {
be_print_err(gettext("be_make_root_ds: zone root "
"dataset is not mounted\n"));
- return;
+ return (BE_ERR_NOTMOUNTED);
}
+ if (strncmp(root_ds, zpool, strlen(zpool)) != 0 ||
+ root_ds[strlen(zpool)] != '/') {
+ /*
+ * This pool is not the one that contains the zone
+ * root.
+ */
+ return (BE_ERR_ACCESS);
+ }
+
+ (void) snprintf(be_root_ds, be_root_ds_size, "%s/%s",
+ dirname(root_ds), be_name);
}
+
+ return (BE_SUCCESS);
}
/*
@@ -484,17 +498,17 @@ be_make_root_ds(const char *zpool, const char *be_name, char *be_root_ds,
* dataset in.
* container_ds_size - size of container_ds
* Returns:
- * None
+ * BE_SUCCESS - Success
+ * be_errno_t - Failure
* Scope:
* Semi-private (library wide use only)
*/
-void
-be_make_container_ds(const char *zpool, char *container_ds,
+int
+be_make_container_ds(const char *zpool, char *container_ds,
int container_ds_size)
{
struct be_defaults be_defaults;
be_get_defaults(&be_defaults);
- char *root_ds = NULL;
if (getzoneid() == GLOBAL_ZONEID) {
if (be_defaults.be_deflt_rpool_container) {
@@ -505,15 +519,26 @@ be_make_container_ds(const char *zpool, char *container_ds,
"%s/%s", zpool, BE_CONTAINER_DS_NAME);
}
} else {
- if ((root_ds = be_get_ds_from_dir("/")) != NULL) {
- (void) strlcpy(container_ds, dirname(root_ds),
- container_ds_size);
- } else {
+ char *root_ds = be_get_ds_from_dir("/");
+
+ if (root_ds == NULL) {
be_print_err(gettext("be_make_container_ds: zone root "
"dataset is not mounted\n"));
- return;
+ return (BE_ERR_NOTMOUNTED);
+ }
+ if (strncmp(root_ds, zpool, strlen(zpool)) != 0 ||
+ root_ds[strlen(zpool)] != '/') {
+ /*
+ * This pool is not the one that contains the zone
+ * root.
+ */
+ return (BE_ERR_ACCESS);
}
+ (void) strlcpy(container_ds, dirname(root_ds),
+ container_ds_size);
}
+
+ return (BE_SUCCESS);
}
/*
@@ -525,17 +550,22 @@ be_make_container_ds(const char *zpool, char *container_ds,
* container_ds - pointer to buffer in which to return result
* container_ds_size - size of container_ds
* Returns:
- * None
+ * BE_SUCCESS - Success
+ * be_errno_t - Failure
* Scope:
* Semi-private (library wide use only)
*/
-void
+int
be_make_root_container_ds(const char *zpool, char *container_ds,
int container_ds_size)
{
char *root;
+ int ret;
- be_make_container_ds(zpool, container_ds, container_ds_size);
+ if ((ret = be_make_container_ds(zpool, container_ds,
+ container_ds_size)) != BE_SUCCESS) {
+ return (ret);
+ }
/* If the container DS ends with /ROOT, remove it. */
@@ -543,6 +573,8 @@ be_make_root_container_ds(const char *zpool, char *container_ds,
strcmp(root + 1, BE_CONTAINER_DS_NAME) == 0) {
*root = '\0';
}
+
+ return (BE_SUCCESS);
}
/*
@@ -714,7 +746,12 @@ be_append_menu(char *be_name, char *be_root_pool, char *boot_pool,
"%s%s", pool_mntpnt, BE_SPARC_MENU);
}
- be_make_root_ds(be_root_pool, be_name, be_root_ds, sizeof (be_root_ds));
+ if ((ret = be_make_root_ds(be_root_pool, be_name, be_root_ds,
+ sizeof (be_root_ds))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container dataset "
+ "for %s/%s\n"), __func__, be_root_pool, be_name);
+ goto cleanup;
+ }
/*
* Iterate through menu first to make sure the BE doesn't already
@@ -969,7 +1006,12 @@ be_remove_menu(char *be_name, char *be_root_pool, char *boot_pool)
boot_pool = be_root_pool;
/* Get name of BE's root dataset */
- be_make_root_ds(be_root_pool, be_name, be_root_ds, sizeof (be_root_ds));
+ if ((ret = be_make_root_ds(be_root_pool, be_name, be_root_ds,
+ sizeof (be_root_ds))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container dataset "
+ "for %s/%s\n"), __func__, be_root_pool, be_name);
+ return (ret);
+ }
/* Get handle to pool dataset */
if ((zhp = zfs_open(g_zfs, be_root_pool, ZFS_TYPE_DATASET)) == NULL) {
@@ -1579,7 +1621,12 @@ be_change_grub_default(char *be_name, char *be_root_pool)
}
/* Generate string for BE's root dataset */
- be_make_root_ds(be_root_pool, be_name, be_root_ds, sizeof (be_root_ds));
+ if ((ret = be_make_root_ds(be_root_pool, be_name, be_root_ds,
+ sizeof (be_root_ds))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container dataset "
+ "for %s/%s\n"), __func__, be_root_pool, be_name);
+ return (ret);
+ }
/* Get handle to pool dataset */
if ((zhp = zfs_open(g_zfs, be_root_pool, ZFS_TYPE_DATASET)) == NULL) {
@@ -1848,10 +1895,18 @@ be_update_menu(char *be_orig_name, char *be_new_name, char *be_root_pool,
"%s%s", pool_mntpnt, BE_SPARC_MENU);
}
- be_make_root_ds(be_root_pool, be_orig_name, be_root_ds,
- sizeof (be_root_ds));
- be_make_root_ds(be_root_pool, be_new_name, be_new_root_ds,
- sizeof (be_new_root_ds));
+ if ((ret = be_make_root_ds(be_root_pool, be_orig_name, be_root_ds,
+ sizeof (be_root_ds))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container dataset "
+ "for %s/%s\n"), __func__, be_root_pool, be_orig_name);
+ goto cleanup;
+ }
+ if ((ret = be_make_root_ds(be_root_pool, be_new_name, be_new_root_ds,
+ sizeof (be_new_root_ds))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container dataset "
+ "for %s/%s\n"), __func__, be_root_pool, be_new_name);
+ goto cleanup;
+ }
if ((ret = be_open_menu(be_root_pool, menu_file,
&menu_fp, "r", B_TRUE)) != BE_SUCCESS) {
@@ -2714,24 +2769,14 @@ be_zpool_find_current_be_callback(zpool_handle_t *zlp, void *data)
zfs_handle_t *zhp = NULL;
const char *zpool = zpool_get_name(zlp);
char be_container_ds[MAXPATHLEN];
- char *zpath = NULL;
/*
* Generate string for BE container dataset
*/
- if (getzoneid() != GLOBAL_ZONEID) {
- if ((zpath = be_get_ds_from_dir("/")) != NULL) {
- (void) strlcpy(be_container_ds, dirname(zpath),
- sizeof (be_container_ds));
- } else {
- be_print_err(gettext(
- "be_zpool_find_current_be_callback: "
- "zone root dataset is not mounted\n"));
- return (0);
- }
- } else {
- be_make_container_ds(zpool, be_container_ds,
- sizeof (be_container_ds));
+ if (be_make_container_ds(zpool, be_container_ds,
+ sizeof (be_container_ds)) != BE_SUCCESS) {
+ zpool_close(zlp);
+ return (0);
}
/*
@@ -2865,7 +2910,10 @@ be_check_be_roots_callback(zpool_handle_t *zlp, void *data)
char be_container_ds[MAXPATHLEN];
/* Generate string for this pool's BE root container dataset */
- be_make_container_ds(zpool, be_container_ds, sizeof (be_container_ds));
+ if (be_make_container_ds(zpool, be_container_ds,
+ sizeof (be_container_ds)) != BE_SUCCESS) {
+ return (0);
+ }
/*
* If dataset lives under the BE root container dataset
@@ -3420,6 +3468,7 @@ update_dataset(char *dataset, int dataset_len, char *be_name,
{
char *ds = NULL;
char *sub_ds = NULL;
+ int ret;
/* Tear off the BE container dataset */
if ((ds = be_make_name_from_ds(dataset, old_rc_loc)) == NULL) {
@@ -3430,7 +3479,10 @@ update_dataset(char *dataset, int dataset_len, char *be_name,
sub_ds = strchr(ds, '/');
/* Generate the BE root dataset name */
- be_make_root_ds(new_rc_loc, be_name, dataset, dataset_len);
+ if ((ret = be_make_root_ds(new_rc_loc, be_name, dataset,
+ dataset_len)) != BE_SUCCESS) {
+ return (ret);
+ }
/* If a subordinate dataset name was found, append it */
if (sub_ds != NULL)
diff --git a/usr/src/lib/libbe/common/be_zones.c b/usr/src/lib/libbe/common/be_zones.c
index e257b62125..665db1b1d0 100644
--- a/usr/src/lib/libbe/common/be_zones.c
+++ b/usr/src/lib/libbe/common/be_zones.c
@@ -25,6 +25,7 @@
/*
* Copyright 2013 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2022 OmniOS Community Edition (OmniOSce) Association.
*/
/*
@@ -135,9 +136,13 @@ be_find_active_zone_root(zfs_handle_t *be_zhp, char *zonepath_ds,
}
}
- /* Generate string for the root container dataset for this zone. */
- be_make_container_ds(zonepath_ds, zone_container_ds,
- sizeof (zone_container_ds));
+ /* Generate string for the root container dataset for this zone. */
+ if ((ret = be_make_container_ds(zonepath_ds, zone_container_ds,
+ sizeof (zone_container_ds))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container dataset "
+ "for %s\n"), __func__, zonepath_ds);
+ return (ret);
+ }
/* Get handle to this zone's root container dataset */
if ((zhp = zfs_open(g_zfs, zone_container_ds, ZFS_TYPE_FILESYSTEM))
@@ -205,8 +210,12 @@ be_find_mounted_zone_root(char *zone_altroot, char *zonepath_ds,
int zret = 0;
/* Generate string for the root container dataset for this zone. */
- be_make_container_ds(zonepath_ds, zone_container_ds,
- sizeof (zone_container_ds));
+ if ((ret = be_make_container_ds(zonepath_ds, zone_container_ds,
+ sizeof (zone_container_ds))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container dataset "
+ "for %s\n"), __func__, zonepath_ds);
+ return (ret);
+ }
/* Get handle to this zone's root container dataset. */
if ((zhp = zfs_open(g_zfs, zone_container_ds, ZFS_TYPE_FILESYSTEM))
@@ -293,8 +302,12 @@ be_zone_supported(char *zonepath_ds)
* Make sure the zonepath has a zone root container dataset
* underneath it.
*/
- be_make_container_ds(zonepath_ds, zone_container_ds,
- sizeof (zone_container_ds));
+ if ((ret = be_make_container_ds(zonepath_ds, zone_container_ds,
+ sizeof (zone_container_ds))) != BE_SUCCESS) {
+ be_print_err(gettext("%s: failed to get BE container dataset "
+ "for %s\n"), __func__, zonepath_ds);
+ return (B_FALSE);
+ }
if (!zfs_dataset_exists(g_zfs, zone_container_ds,
ZFS_TYPE_FILESYSTEM)) {
diff --git a/usr/src/lib/libbe/common/libbe_priv.h b/usr/src/lib/libbe/common/libbe_priv.h
index ace201577f..dd73e33bb1 100644
--- a/usr/src/lib/libbe/common/libbe_priv.h
+++ b/usr/src/lib/libbe/common/libbe_priv.h
@@ -24,7 +24,7 @@
* Copyright 2013 Nexenta Systems, Inc. All rights reserved.
* Copyright 2016 Toomas Soome <tsoome@me.com>
* Copyright (c) 2015 by Delphix. All rights reserved.
- * Copyright 2019 OmniOS Community Edition (OmniOSce) Association.
+ * Copyright 2022 OmniOS Community Edition (OmniOSce) Association.
*/
#ifndef _LIBBE_PRIV_H
@@ -179,9 +179,9 @@ int _be_destroy_snapshot(char *, char *);
/* be_utils.c */
boolean_t be_zfs_init(void);
void be_zfs_fini(void);
-void be_make_root_ds(const char *, const char *, char *, int);
-void be_make_container_ds(const char *, char *, int);
-void be_make_root_container_ds(const char *, char *, int);
+int be_make_root_ds(const char *, const char *, char *, int);
+int be_make_container_ds(const char *, char *, int);
+int be_make_root_container_ds(const char *, char *, int);
char *be_make_name_from_ds(const char *, char *);
int be_append_menu(char *, char *, char *, char *, char *);
int be_remove_menu(char *, char *, char *);