9889 libbe reads defaults too often
Reviewed by: Dominik Hassler <hadfl@omniosce.org>
Reviewed by: Igor Kozhukhov <igor@dilos.org>
Reviewed by: Jim Klimov <jim@cos.ru>
Reviewed by: Andy Stormont <astormont@racktopsystems.com>
Reviewed by: Garrett D'Amore <garrett@damore.org>
Reviewed by: Joshua M. Clulow <josh@sysmgr.org>
Reviewed by: Dan McDonald <danmcd@joyent.com>
Approved by: Gordon Ross <gordon.w.ross@gmail.com>
diff --git a/usr/src/lib/libbe/common/be_list.c b/usr/src/lib/libbe/common/be_list.c
index 373b8ef..c8e052a 100644
--- a/usr/src/lib/libbe/common/be_list.c
+++ b/usr/src/lib/libbe/common/be_list.c
@@ -28,6 +28,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.
*/
#include <assert.h>
@@ -55,6 +56,7 @@
be_node_list_t *be_nodes_head;
be_node_list_t *be_nodes;
char current_be[MAXPATHLEN];
+ struct be_defaults be_defaults;
} list_callback_data_t;
/*
@@ -220,12 +222,11 @@
int sret;
zpool_handle_t *zphp;
char *rpool = NULL;
- struct be_defaults be_defaults;
if (be_nodes == NULL)
return (BE_ERR_INVAL);
- be_get_defaults(&be_defaults);
+ be_get_defaults(&cb.be_defaults);
if (be_find_current_be(&bt) != BE_SUCCESS) {
/*
@@ -247,7 +248,7 @@
if (be_name != NULL)
cb.be_name = strdup(be_name);
- if (be_defaults.be_deflt_rpool_container && rpool != NULL) {
+ if (cb.be_defaults.be_deflt_rpool_container && rpool != NULL) {
if ((zphp = zpool_open(g_zfs, rpool)) == NULL) {
be_print_err(gettext("be_list: failed to "
"open rpool (%s): %s\n"), rpool,
@@ -391,8 +392,10 @@
}
cb.be_nodes = cb.be_nodes_head;
}
- if (ret == 0)
+ if (ret == 0) {
+ be_get_defaults(&cb.be_defaults);
ret = zfs_iter_filesystems(zhp, be_add_children_callback, &cb);
+ }
ZFS_CLOSE(zhp);
*zbe_nodes = cb.be_nodes_head;
@@ -538,9 +541,6 @@
list_callback_data_t *cb = (list_callback_data_t *)data;
char *str = NULL, *ds_path = NULL;
int ret = 0;
- struct be_defaults be_defaults;
-
- be_get_defaults(&be_defaults);
ds_path = str = strdup(zfs_get_name(zhp));
@@ -548,7 +548,7 @@
* get past the end of the container dataset plus the trailing "/"
*/
str = str + (strlen(be_container_ds) + 1);
- if (be_defaults.be_deflt_rpool_container) {
+ if (cb->be_defaults.be_deflt_rpool_container) {
/* just skip if invalid */
if (!be_valid_be_name(str))
return (BE_SUCCESS);
@@ -1335,7 +1335,7 @@
* size - The size of memory to allocate.
* Returns:
* Success - A pointer to the allocated memory
- * Failure - NULL
+ * Failure - NULL
* Scope:
* Private
*/