--- a/usr/src/lib/libbe/Makefile Thu May 29 15:37:15 2008 -0700
+++ b/usr/src/lib/libbe/Makefile Wed Jun 04 15:59:15 2008 -0600
@@ -5,13 +5,13 @@
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
-# You can obtain a copy of the license at src/OPENSOLARIS.LICENSE
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at src/OPENSOLARIS.LICENSE.
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
--- a/usr/src/lib/libbe/be_activate.c Thu May 29 15:37:15 2008 -0700
+++ b/usr/src/lib/libbe/be_activate.c Wed Jun 04 15:59:15 2008 -0600
@@ -25,7 +25,6 @@
*/
#include <assert.h>
-#include <errno.h>
#include <libintl.h>
#include <libnvpair.h>
#include <libzfs.h>
@@ -66,7 +65,7 @@
* BE_ATTR_ORIG_BE_NAME *required
* Return:
* 0 - Success
- * non-zero - Failure
+ * be_errno_t - Failure
* Scope:
* Public
*/
@@ -83,7 +82,7 @@
/* Initialize libzfs handle */
if (!be_zfs_init())
- return (1);
+ return (BE_ERR_INIT);
/* Get the BE name to activate */
if (nvlist_lookup_string(be_attrs, BE_ATTR_ORIG_BE_NAME, &cb.obe_name)
@@ -91,14 +90,14 @@
be_print_err(gettext("be_activate: failed to "
"lookup BE_ATTR_ORIG_BE_NAME attribute\n"));
be_zfs_fini();
- return (1);
+ return (BE_ERR_INVAL);
}
/* Validate BE name */
if (!be_valid_be_name(cb.obe_name)) {
be_print_err(gettext("be_activate: invalid BE name %s\n"),
cb.obe_name);
- return (1);
+ return (BE_ERR_INVAL);
}
/*
@@ -111,13 +110,14 @@
be_print_err(gettext("be_activate: failed to "
"find zpool for BE (%s)\n"), cb.obe_name);
be_zfs_fini();
- return (1);
+ return (BE_ERR_BE_NOENT);
} else if (ret < 0) {
be_print_err(gettext("be_activate: "
"zpool_iter failed: %s\n"),
libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
be_zfs_fini();
- return (1);
+ return (err);
}
be_make_root_ds(cb.obe_zpool, cb.obe_name, root_ds, sizeof (root_ds));
@@ -129,9 +129,11 @@
* The zfs_open failed return an error
*/
be_print_err(gettext("be_activate: failed "
- "to open BE root dataset (%s)\n"), cb.obe_root_ds);
+ "to open BE root dataset (%s): %s\n"), cb.obe_root_ds,
+ libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
be_zfs_fini();
- return (1);
+ return (err);
} else {
/*
* once the legacy mounts are no longer needed for booting
@@ -148,14 +150,10 @@
err = _be_list(cb.obe_name, &be_nodes);
if (err) {
- err = BE_ERR_NOENT;
be_zfs_fini();
return (err);
}
- /*
- * The value passed to set_canmount should be changed to 'noauto'
- */
err = set_canmount(be_nodes, "noauto");
if (err) {
be_print_err(gettext("be_activate: failed to set "
@@ -175,7 +173,7 @@
err = set_bootfs(be_nodes->be_rpool, root_ds);
if (err) {
be_print_err(gettext("be_activate: failed to set "
- "bootfs pool property\n"));
+ "bootfs pool property for %s\n"), root_ds);
goto done;
}
@@ -203,7 +201,7 @@
* be_root_ds - The main dataset for the BE.
* Return:
* 0 - Success
- * non-zero - Failure
+ * be_errno_t - Failure
* Scope:
* Private
*/
@@ -214,20 +212,24 @@
int err = 0;
if ((zhp = zpool_open(g_zfs, boot_rpool)) == NULL) {
- be_print_err(gettext("set_bootfs: failed to open pool"));
- return (1);
+ be_print_err(gettext("set_bootfs: failed to open pool "
+ "(%s): %s\n"), boot_rpool, libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
+ return (err);
}
err = zpool_set_prop(zhp, "bootfs", be_root_ds);
if (err) {
be_print_err(gettext("set_bootfs: failed to set "
- "bootfs property for pool %s\n"), boot_rpool);
+ "bootfs property for pool %s: %s\n"), boot_rpool,
+ libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
zpool_close(zhp);
- return (1);
+ return (err);
}
zpool_close(zhp);
- return (0);
+ return (BE_SUCCESS);
}
/*
@@ -239,7 +241,7 @@
* value - The value of canmount we setting, on|off|noauto.
* Return:
* 0 - Success
- * non-zero - Failure
+ * be_errno_t - Failure
* Scope:
* Private
*/
@@ -260,17 +262,21 @@
if ((zhp = zfs_open(g_zfs, ds_path, ZFS_TYPE_DATASET)) ==
NULL) {
- be_print_err(gettext("set_canmount: failed to "
- "open dataset\n"));
- return (1);
+ be_print_err(gettext("set_canmount: failed to open "
+ "dataset (%s): %s\n"), ds_path,
+ libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
+ return (err);
}
while (zfs_promote(zhp) == 0) {
ZFS_CLOSE(zhp);
if ((zhp = zfs_open(g_zfs, ds_path,
ZFS_TYPE_DATASET)) == NULL) {
be_print_err(gettext("set_canmount: failed to "
- "open dataset\n"));
- return (1);
+ "open dataset (%s): %s\n"), ds_path,
+ libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
+ return (err);
}
}
if (zfs_prop_get(zhp, ZFS_PROP_ORIGIN, prop_buf,
@@ -281,7 +287,7 @@
ZFS_CLOSE(zhp);
be_print_err(gettext("set_canmount: failed to "
"promote dataset (%s)\n"), ds_path);
- return (1);
+ return (BE_ERR_PROMOTE);
}
if (zfs_prop_get_int(zhp, ZFS_PROP_MOUNTED)) {
/*
@@ -295,8 +301,10 @@
if (err) {
ZFS_CLOSE(zhp);
be_print_err(gettext("set_canmount: failed to "
- "set canmount dataset property\n"));
- return (1);
+ "set dataset property (%s): %s\n"),
+ ds_path, libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
+ return (err);
}
}
ZFS_CLOSE(zhp);
@@ -309,16 +317,21 @@
if ((zhp = zfs_open(g_zfs, ds_path, ZFS_TYPE_DATASET))
== NULL) {
be_print_err(gettext("set_canmount: failed to "
- "open dataset %s\n"), ds_path);
- return (1);
+ "open dataset %s: %s\n"), ds_path,
+ libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
+ return (err);
}
while (zfs_promote(zhp) == 0) {
ZFS_CLOSE(zhp);
if ((zhp = zfs_open(g_zfs, ds_path,
ZFS_TYPE_DATASET)) == NULL) {
be_print_err(gettext("set_canmount: "
- "Failed to open dataset\n"));
- return (1);
+ "Failed to open dataset "
+ "(%s): %s\n"), ds_path,
+ libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
+ return (err);
}
}
if (zfs_prop_get(zhp, ZFS_PROP_ORIGIN, prop_buf,
@@ -328,8 +341,9 @@
if (strcmp(prop_buf, "-") != 0) {
ZFS_CLOSE(zhp);
be_print_err(gettext("set_canmount: "
- "Failed to promote the dataset\n"));
- return (1);
+ "Failed to promote the dataset (%s)\n"),
+ ds_path);
+ return (BE_ERR_PROMOTE);
}
if (zfs_prop_get_int(zhp, ZFS_PROP_MOUNTED)) {
/*
@@ -345,9 +359,11 @@
if (err) {
ZFS_CLOSE(zhp);
be_print_err(gettext("set_canmount: "
- "Failed to set canmount dataset "
- "property\n"));
- return (1);
+ "Failed to set property value %s "
+ "for dataset %s: %s\n"), value, ds_path,
+ libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
+ return (err);
}
ZFS_CLOSE(zhp);
datasets = datasets->be_next_dataset;
--- a/usr/src/lib/libbe/be_create.c Thu May 29 15:37:15 2008 -0700
+++ b/usr/src/lib/libbe/be_create.c Wed Jun 04 15:59:15 2008 -0600
@@ -86,7 +86,7 @@
* BE_ATTR_SHARED_FS_NUM *optional
* Return:
* 0 - Success
- * non-zero - Failure
+ * be_errno_t - Failure
* Scope:
* Public
*/
@@ -104,26 +104,25 @@
int shared_fs_num = 0;
int nelem;
int i;
- int zret;
- int ret = 0;
+ int zret = 0, ret = 0;
/* Initialize libzfs handle */
if (!be_zfs_init())
- return (1);
+ return (BE_ERR_INIT);
/* Get new BE name */
if (nvlist_lookup_string(be_attrs, BE_ATTR_NEW_BE_NAME, &bt.nbe_name)
!= 0) {
be_print_err(gettext("be_init: failed to lookup "
"BE_ATTR_NEW_BE_NAME attribute\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
/* Validate new BE name */
if (!be_valid_be_name(bt.nbe_name)) {
be_print_err(gettext("be_init: invalid BE name %s\n"),
bt.nbe_name);
- return (1);
+ return (BE_ERR_INVAL);
}
/* Get zpool name */
@@ -131,7 +130,7 @@
!= 0) {
be_print_err(gettext("be_init: failed to lookup "
"BE_ATTR_NEW_BE_POOL attribute\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
/* Get file system attributes */
@@ -142,12 +141,12 @@
NULL) != 0) {
be_print_err(gettext("be_init: failed to lookup fs "
"attributes\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
if (nelem != fs_num) {
- be_print_err(gettext("be_init: size of FS_NAMES array does not "
- "match FS_NUM\n"));
- return (1);
+ be_print_err(gettext("be_init: size of FS_NAMES array (%d) "
+ "does not match FS_NUM (%d)\n"), nelem, fs_num);
+ return (BE_ERR_INVAL);
}
/* Get shared file system attributes */
@@ -158,19 +157,20 @@
&nelem, NULL) != 0) {
be_print_err(gettext("be_init: failed to lookup "
"shared fs attributes\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
if (nelem != shared_fs_num) {
be_print_err(gettext("be_init: size of SHARED_FS_NAMES "
"array does not match SHARED_FS_NUM\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
/* Verify that nbe_zpool exists */
if ((zlp = zpool_open(g_zfs, bt.nbe_zpool)) == NULL) {
be_print_err(gettext("be_init: failed to "
- "find existing zpool (%s)\n"), bt.nbe_zpool);
- return (1);
+ "find existing zpool (%s): %s\n"), bt.nbe_zpool,
+ libzfs_error_description(g_zfs));
+ return (zfs_err_to_be_err(g_zfs));
}
zpool_close(zlp);
@@ -179,7 +179,7 @@
* If not, create it.
*/
if (!be_create_container_ds(bt.nbe_zpool))
- return (1);
+ return (BE_ERR_CREATDS);
/*
* Verify that nbe_name doesn't already exist in some pool.
@@ -187,11 +187,11 @@
if ((zret = zpool_iter(g_zfs, be_exists_callback, bt.nbe_name)) > 0) {
be_print_err(gettext("be_init: BE (%s) already exists\n"),
bt.nbe_name);
- return (1);
+ return (BE_ERR_EXISTS);
} else if (zret < 0) {
be_print_err(gettext("be_init: zpool_iter failed: %s\n"),
libzfs_error_description(g_zfs));
- return (1);
+ return (zfs_err_to_be_err(g_zfs));
}
/* Generate string for BE's root dataset */
@@ -208,7 +208,7 @@
!= 0) {
be_print_err(gettext("be_init: failed to lookup "
"BE_ATTR_ZFS_PROPERTIES attribute\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
if (zfs_props != NULL) {
/* Make sure its a unique nvlist */
@@ -216,21 +216,21 @@
!(zfs_props->nvl_nvflag & NV_UNIQUE_NAME_TYPE)) {
be_print_err(gettext("be_init: ZFS property list "
"not unique\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
/* Dup the list */
if (nvlist_dup(zfs_props, &bt.nbe_zfs_props, 0) != 0) {
be_print_err(gettext("be_init: failed to dup ZFS "
"property list\n"));
- return (1);
+ return (BE_ERR_NOMEM);
}
} else {
/* Initialize new nvlist */
if (nvlist_alloc(&bt.nbe_zfs_props, NV_UNIQUE_NAME, 0) != 0) {
be_print_err(gettext("be_init: internal "
"error: out of memory\n"));
- return (1);
+ return (BE_ERR_NOMEM);
}
}
@@ -242,7 +242,7 @@
!= 0) {
be_print_err(gettext("be_init: internal error "
"out of memory\n"));
- ret = 1;
+ ret = BE_ERR_NOMEM;
goto done;
}
@@ -251,7 +251,7 @@
zfs_prop_to_name(ZFS_PROP_CANMOUNT), "noauto") != 0) {
be_print_err(gettext("be_init: internal error "
"out of memory\n"));
- ret = 1;
+ ret = BE_ERR_NOMEM;
goto done;
}
@@ -261,7 +261,7 @@
be_print_err(gettext("be_init: failed to "
"create BE root dataset (%s): %s\n"), nbe_root_ds,
libzfs_error_description(g_zfs));
- ret = 1;
+ ret = zfs_err_to_be_err(g_zfs);
goto done;
}
@@ -282,7 +282,7 @@
zfs_prop_to_name(ZFS_PROP_MOUNTPOINT), fs_names[i]) != 0) {
be_print_err(gettext("be_init: "
"internal error: out of memory\n"));
- ret = 1;
+ ret = BE_ERR_NOMEM;
goto done;
}
@@ -296,7 +296,7 @@
be_print_err(gettext("be_init: failed to create "
"BE's child dataset (%s): %s\n"), child_fs,
libzfs_error_description(g_zfs));
- ret = 1;
+ ret = zfs_err_to_be_err(g_zfs);
goto done;
}
}
@@ -307,7 +307,7 @@
if (nvlist_alloc(&props, NV_UNIQUE_NAME, 0) != 0) {
be_print_err(gettext("be_init: nvlist_alloc failed\n"));
- ret = 1;
+ ret = BE_ERR_NOMEM;
goto done;
}
@@ -322,7 +322,7 @@
be_print_err(gettext("be_init: "
"internal error: out of memory\n"));
nvlist_free(props);
- ret = 1;
+ ret = BE_ERR_NOMEM;
goto done;
}
@@ -336,8 +336,8 @@
be_print_err(gettext("be_init: failed to "
"create BE's shared dataset (%s): %s\n"),
child_fs, libzfs_error_description(g_zfs));
+ ret = zfs_err_to_be_err(g_zfs);
nvlist_free(props);
- ret = 1;
goto done;
}
}
@@ -365,7 +365,7 @@
* BE_ATTR_DESTROY_FLAGS *optional
* Return:
* 0 - Success
- * non-zero - Failure
+ * be_errno_t - Failure
* Scope:
* Public
*
@@ -392,21 +392,21 @@
/* Initialize libzfs handle */
if (!be_zfs_init())
- return (1);
+ return (BE_ERR_INIT);
/* Get name of BE to delete */
if (nvlist_lookup_string(be_attrs, BE_ATTR_ORIG_BE_NAME, &bt.obe_name)
!= 0) {
be_print_err(gettext("be_destroy: failed to lookup "
"BE_ATTR_ORIG_BE_NAME attribute\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
/* Validate BE name */
if (!be_valid_be_name(bt.obe_name)) {
be_print_err(gettext("be_destroy: invalid BE name %s\n"),
bt.obe_name);
- return (1);
+ return (BE_ERR_INVAL);
}
/* Get destroy flags if provided */
@@ -415,7 +415,7 @@
!= 0) {
be_print_err(gettext("be_destroy: failed to lookup "
"BE_ATTR_DESTROY_FLAGS attribute\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
dd.destroy_snaps = flags & BE_DESTROY_FLAG_SNAPSHOTS;
dd.force_unmount = flags & BE_DESTROY_FLAG_FORCE_UNMOUNT;
@@ -424,11 +424,11 @@
if ((zret = zpool_iter(g_zfs, be_find_zpool_callback, &bt)) == 0) {
be_print_err(gettext("be_destroy: failed to find zpool "
"for BE (%s)\n"), bt.obe_name);
- return (1);
+ return (BE_ERR_BE_NOENT);
} else if (zret < 0) {
be_print_err(gettext("be_destroy: zpool_iter failed: %s\n"),
libzfs_error_description(g_zfs));
- return (1);
+ return (zfs_err_to_be_err(g_zfs));
}
/* Generate string for obe_name's root dataset */
@@ -440,8 +440,9 @@
if ((zhp = zfs_open(g_zfs, bt.obe_root_ds, ZFS_TYPE_FILESYSTEM)) ==
NULL) {
be_print_err(gettext("be_destroy: failed to "
- "open BE root dataset (%s)\n"), bt.obe_root_ds);
- return (1);
+ "open BE root dataset (%s): %s\n"), bt.obe_root_ds,
+ libzfs_error_description(g_zfs));
+ return (zfs_err_to_be_err(g_zfs));
}
/* Is BE mounted */
@@ -458,7 +459,7 @@
if (mp != NULL)
free(mp);
ZFS_CLOSE(zhp);
- return (1);
+ return (BE_ERR_MOUNTED);
}
if (mp != NULL)
free(mp);
@@ -466,11 +467,12 @@
/*
* Attempt to unmount the BE before destroying.
*/
- if (_be_unmount(bt.obe_name, BE_UNMOUNT_FLAG_FORCE) != 0) {
+ if ((ret = _be_unmount(bt.obe_name,
+ BE_UNMOUNT_FLAG_FORCE)) != 0) {
be_print_err(gettext("be_destroy: "
"failed to unmount %s\n"), bt.obe_name);
ZFS_CLOSE(zhp);
- return (1);
+ return (ret);
}
}
@@ -485,7 +487,7 @@
ZFS_CLOSE(zhp);
be_print_err(gettext("be_destroy: failed to "
"get snapshot name from origin\n"));
- return (1);
+ return (BE_ERR_ZFS);
}
has_origin = B_TRUE;
}
@@ -494,22 +496,23 @@
if (be_demote_callback(zhp, NULL) != 0) {
be_print_err(gettext("be_destroy: "
"failed to demote BE %s\n"), bt.obe_name);
- return (1);
+ return (BE_ERR_DEMOTE);
}
/* Get handle to BE's root dataset */
if ((zhp = zfs_open(g_zfs, bt.obe_root_ds, ZFS_TYPE_FILESYSTEM)) ==
NULL) {
be_print_err(gettext("be_destroy: failed to "
- "open BE root dataset (%s)\n"), bt.obe_root_ds);
- return (1);
+ "open BE root dataset (%s): %s\n"), bt.obe_root_ds,
+ libzfs_error_description(g_zfs));
+ return (zfs_err_to_be_err(g_zfs));
}
/* Destroy the BE's root and its hierarchical children */
if (be_destroy_callback(zhp, &dd) != 0) {
be_print_err(gettext("be_destroy: failed to "
"destroy BE %s\n"), bt.obe_name);
- return (1);
+ return (BE_ERR_DESTROY);
}
/* If BE has an origin */
@@ -526,8 +529,9 @@
if ((zhp = zfs_open(g_zfs, origin, ZFS_TYPE_SNAPSHOT)) ==
NULL) {
be_print_err(gettext("be_destroy: failed to "
- "open BE's origin (%s)\n"), origin);
- ret = 1;
+ "open BE's origin (%s): %s\n"), origin,
+ libzfs_error_description(g_zfs));
+ ret = zfs_err_to_be_err(g_zfs);
goto done;
}
@@ -535,8 +539,9 @@
if (zfs_prop_get(zhp, ZFS_PROP_NUMCLONES, numclonestr,
sizeof (numclonestr), NULL, NULL, 0, B_TRUE) != 0) {
be_print_err(gettext("be_destroy: failed to "
- "get number of clones for %s\n"), origin);
- ret = 1;
+ "get number of clones for %s: %s\n"), origin,
+ libzfs_error_description(g_zfs));
+ ret = zfs_err_to_be_err(g_zfs);
ZFS_CLOSE(zhp);
goto done;
}
@@ -546,7 +551,7 @@
if (sscanf(numclonestr, "%llu", &numclone) != 1) {
be_print_err(gettext("be_destroy: invalid numclone "
"format %s\n"), numclonestr);
- ret = 1;
+ ret = BE_ERR_INVAL;
goto done;
}
@@ -558,16 +563,18 @@
if ((zhp = zfs_open(g_zfs, parent, ZFS_TYPE_FILESYSTEM)) ==
NULL) {
be_print_err(gettext("be_destroy: failed to "
- "open BE's parent root dataset (%s)\n"), parent);
- ret = 1;
+ "open BE's parent root dataset (%s): %s\n"), parent,
+ libzfs_error_description(g_zfs));
+ ret = zfs_err_to_be_err(g_zfs);
goto done;
}
/* Destroy the snapshot origin used to create this BE. */
if (zfs_destroy_snaps(zhp, snap) != 0) {
be_print_err(gettext("be_destroy: failed to "
- "destroy original snapshots used to create BE\n"));
- ret = 1;
+ "destroy original snapshots used to create "
+ "BE: %s\n"), libzfs_error_description(g_zfs));
+ ret = zfs_err_to_be_err(g_zfs);
ZFS_CLOSE(zhp);
goto done;
}
@@ -577,10 +584,10 @@
done:
/* Remove BE's entry from the GRUB menu */
- if (be_remove_grub(bt.obe_name, bt.obe_zpool, NULL) != 0) {
+ if ((zret = be_remove_grub(bt.obe_name, bt.obe_zpool, NULL)) != 0) {
be_print_err(gettext("be_destroy: failed to "
"remove BE %s from the GRUB menu\n"), bt.obe_name);
- return (1);
+ ret = zret;
}
be_zfs_fini();
@@ -617,7 +624,7 @@
* BE_ATTR_NEW_BE_NAME
* Return:
* 0 - Success
- * non-zero - Failure
+ * be_errno_t - Failure
* Scope:
* Public
*/
@@ -638,14 +645,14 @@
/* Initialize libzfs handle */
if (!be_zfs_init())
- return (1);
+ return (BE_ERR_INIT);
/* Get original BE name */
if (nvlist_lookup_pairs(be_attrs, NV_FLAG_NOENTOK,
BE_ATTR_ORIG_BE_NAME, DATA_TYPE_STRING, &bt.obe_name, NULL) != 0) {
be_print_err(gettext("be_copy: failed to lookup "
"BE_ATTR_ORIG_BE_NAME attribute\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
/* If original BE name not provided, use current BE */
@@ -654,19 +661,19 @@
be_zpool_find_current_be_callback, &bt)) == 0) {
be_print_err(gettext("be_copy: failed to "
"find current BE name\n"));
- return (1);
+ return (BE_ERR_BE_NOENT);
} else if (zret < 0) {
be_print_err(gettext("be_copy: "
"zpool_iter failed: %s\n"),
libzfs_error_description(g_zfs));
- return (1);
+ return (zfs_err_to_be_err(g_zfs));
}
} else {
/* Validate original BE name */
if (!be_valid_be_name(bt.obe_name)) {
be_print_err(gettext("be_copy: "
"invalid BE name %s\n"), bt.obe_name);
- return (1);
+ return (BE_ERR_INVAL);
}
}
@@ -674,12 +681,12 @@
if ((zret = zpool_iter(g_zfs, be_find_zpool_callback, &bt)) == 0) {
be_print_err(gettext("be_copy: failed to "
"find zpool for BE (%s)\n"), bt.obe_name);
- return (1);
+ return (BE_ERR_BE_NOENT);
} else if (zret < 0) {
be_print_err(gettext("be_copy: "
"zpool_iter failed: %s\n"),
libzfs_error_description(g_zfs));
- return (1);
+ return (zfs_err_to_be_err(g_zfs));
}
/* Get snapshot name of original BE if one was provided */
@@ -688,7 +695,7 @@
!= 0) {
be_print_err(gettext("be_copy: failed to lookup "
"BE_ATTR_SNAP_NAME attribute\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
/* Get new BE name */
@@ -697,7 +704,7 @@
!= 0) {
be_print_err(gettext("be_copy: failed to lookup "
"BE_ATTR_NEW_BE_NAME attribute\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
/* Get zpool name to create new BE in */
@@ -705,7 +712,7 @@
BE_ATTR_NEW_BE_POOL, DATA_TYPE_STRING, &bt.nbe_zpool, NULL) != 0) {
be_print_err(gettext("be_copy: failed to lookup "
"BE_ATTR_NEW_BE_POOL attribute\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
/* Get new BE's description if one was provided */
@@ -713,7 +720,7 @@
BE_ATTR_NEW_BE_DESC, DATA_TYPE_STRING, &bt.nbe_desc, NULL) != 0) {
be_print_err(gettext("be_copy: failed to lookup "
"BE_ATTR_NEW_BE_DESC attribute\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
/* Get BE policy to create this snapshot under */
@@ -721,7 +728,7 @@
BE_ATTR_POLICY, DATA_TYPE_STRING, &bt.policy, NULL) != 0) {
be_print_err(gettext("be_copy: failed to lookup "
"BE_ATTR_POLICY attribute\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
if (bt.policy == NULL) {
/* If no policy type provided, use default type */
@@ -738,7 +745,7 @@
!= 0) {
be_print_err(gettext("be_copy: failed to lookup "
"BE_ATTR_ZFS_PROPERTIES attribute\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
if (zfs_props != NULL) {
/* Make sure its a unique nvlist */
@@ -746,21 +753,21 @@
!(zfs_props->nvl_nvflag & NV_UNIQUE_NAME_TYPE)) {
be_print_err(gettext("be_copy: ZFS property list "
"not unique\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
/* Dup the list */
if (nvlist_dup(zfs_props, &bt.nbe_zfs_props, 0) != 0) {
be_print_err(gettext("be_copy: "
"failed to dup ZFS property list\n"));
- return (1);
+ return (BE_ERR_NOMEM);
}
} else {
/* Initialize new nvlist */
if (nvlist_alloc(&bt.nbe_zfs_props, NV_UNIQUE_NAME, 0) != 0) {
be_print_err(gettext("be_copy: internal "
"error: out of memory\n"));
- return (1);
+ return (BE_ERR_NOMEM);
}
}
@@ -773,7 +780,7 @@
if (!be_valid_be_name(bt.nbe_name)) {
be_print_err(gettext("be_copy: "
"invalid BE name %s\n"), bt.nbe_name);
- ret = 1;
+ ret = BE_ERR_INVAL;
goto done;
}
@@ -782,12 +789,12 @@
> 0) {
be_print_err(gettext("be_copy: BE (%s) already "
"exists\n"), bt.nbe_name);
- ret = 1;
+ ret = BE_ERR_EXISTS;
goto done;
} else if (zret < 0) {
be_print_err(gettext("be_copy: zpool_iter failed: "
"%s\n"), libzfs_error_description(g_zfs));
- ret = 1;
+ ret = zfs_err_to_be_err(g_zfs);
goto done;
}
} else {
@@ -798,7 +805,7 @@
if (bt.nbe_zpool != NULL) {
be_print_err(gettext("be_copy: cannot specify pool "
"name when creating an auto named BE\n"));
- ret = 1;
+ ret = BE_ERR_INVAL;
goto done;
}
@@ -809,7 +816,7 @@
== NULL) {
be_print_err(gettext("be_copy: "
"failed to generate auto BE name\n"));
- ret = 1;
+ ret = BE_ERR_AUTONAME;
goto done;
}
@@ -848,7 +855,7 @@
be_print_err(gettext("be_copy: "
"snapshot does not exist (%s): %s\n"), ss,
libzfs_error_description(g_zfs));
- ret = 1;
+ ret = zfs_err_to_be_err(g_zfs);
goto done;
}
} else {
@@ -859,11 +866,10 @@
* as the snapshot name.
*/
if (autoname) {
- if (_be_create_snapshot(bt.obe_name, &bt.obe_snap_name,
- bt.policy) != 0) {
+ if ((ret = _be_create_snapshot(bt.obe_name,
+ &bt.obe_snap_name, bt.policy)) != BE_SUCCESS) {
be_print_err(gettext("be_copy: "
"failed to create auto named snapshot\n"));
- ret = 1;
goto done;
}
@@ -871,7 +877,7 @@
bt.obe_snap_name) != 0) {
be_print_err(gettext("be_copy: "
"failed to add snap name to be_attrs\n"));
- ret = 1;
+ ret = BE_ERR_NOMEM;
goto done;
}
} else {
@@ -890,7 +896,7 @@
be_print_err(gettext("be_copy: "
"failed to snapshot BE (%s): %s\n"),
ss, libzfs_error_description(g_zfs));
- ret = 1;
+ ret = zfs_err_to_be_err(g_zfs);
goto done;
}
}
@@ -902,7 +908,7 @@
be_print_err(gettext("be_copy: failed to "
"open BE root dataset (%s): %s\n"), bt.obe_root_ds,
libzfs_error_description(g_zfs));
- ret = 1;
+ ret = zfs_err_to_be_err(g_zfs);
goto done;
}
@@ -911,7 +917,7 @@
be_print_err(gettext("be_copy: failed to "
"get altroot of mounted BE %s: %s\n"),
bt.obe_name, libzfs_error_description(g_zfs));
- ret = 1;
+ ret = zfs_err_to_be_err(g_zfs);
goto done;
}
@@ -931,7 +937,7 @@
"failed to clone new BE (%s) from "
"orig BE (%s)\n"),
bt.nbe_name, bt.obe_name);
- ret = 1;
+ ret = BE_ERR_CLONE;
goto done;
} else {
for (i = 1; i < BE_AUTO_NAME_MAX_TRY; i++) {
@@ -947,7 +953,7 @@
be_print_err(gettext("be_copy: "
"failed to generate auto "
"BE name\n"));
- ret = 1;
+ ret = BE_ERR_AUTONAME;
goto done;
}
@@ -974,7 +980,8 @@
bt.obe_root_ds,
libzfs_error_description(
g_zfs));
- ret = 1;
+ ret =
+ zfs_err_to_be_err(g_zfs);
goto done;
}
@@ -988,7 +995,7 @@
"failed to clone new BE "
"(%s) from orig BE (%s)\n"),
bt.nbe_name, bt.obe_name);
- ret = 1;
+ ret = BE_ERR_CLONE;
goto done;
}
}
@@ -1003,7 +1010,7 @@
"to create unique auto BE name\n"));
free(bt.nbe_name);
bt.nbe_name = NULL;
- ret = 1;
+ ret = BE_ERR_AUTONAME;
goto done;
}
}
@@ -1025,7 +1032,7 @@
* If not, create it.
*/
if (!be_create_container_ds(bt.nbe_zpool)) {
- ret = 1;
+ ret = BE_ERR_CREATDS;
goto done;
}
@@ -1037,7 +1044,7 @@
be_print_err(gettext("be_copy: failed to "
"send BE (%s) to pool (%s)\n"), bt.obe_name,
bt.nbe_zpool);
- ret = 1;
+ ret = BE_ERR_COPY;
zhp = NULL;
goto done;
}
@@ -1054,31 +1061,31 @@
* legacy mounted. We use this list to determine which entries in
* vfstab we need to update for the new BE we've just created.
*/
- if (be_get_legacy_fs(bt.obe_name, bt.obe_zpool, &fld) != 0) {
+ if ((ret = be_get_legacy_fs(bt.obe_name, bt.obe_zpool, &fld)) !=
+ BE_SUCCESS) {
be_print_err(gettext("be_copy: failed to "
"get legacy mounted file system list for %s\n"),
bt.obe_name);
- ret = 1;
goto done;
}
/*
* Update new BE's vfstab.
*/
- if (be_update_vfstab(bt.nbe_name, bt.nbe_zpool, &fld, NULL) != 0) {
+ if ((ret = be_update_vfstab(bt.nbe_name, bt.nbe_zpool,
+ &fld, NULL)) != BE_SUCCESS) {
be_print_err(gettext("be_copy: failed to "
"update new BE's vfstab (%s)\n"), bt.nbe_name);
- ret = 1;
goto done;
}
/*
* Add GRUB entry for newly created clone
*/
- if (be_append_grub(bt.nbe_name, bt.nbe_zpool, NULL, bt.nbe_desc) != 0) {
+ if ((ret = be_append_grub(bt.nbe_name, bt.nbe_zpool,
+ NULL, bt.nbe_desc)) != BE_SUCCESS) {
be_print_err(gettext("be_copy: failed to "
"add BE (%s) to GRUB menu\n"), bt.nbe_name);
- ret = 1;
goto done;
}
@@ -1092,8 +1099,9 @@
if ((zhp = zfs_open(g_zfs, bt.nbe_root_ds,
ZFS_TYPE_FILESYSTEM)) == NULL) {
be_print_err(gettext("be_copy: failed to "
- "open BE root dataset (%s)\n"), bt.nbe_root_ds);
- ret = 1;
+ "open BE root dataset (%s): %s\n"), bt.nbe_root_ds,
+ libzfs_error_description(g_zfs));
+ ret = zfs_err_to_be_err(g_zfs);
goto done;
}
@@ -1102,8 +1110,9 @@
*/
if (zfs_prop_set(zhp, BE_POLICY_PROPERTY, bt.policy) != 0) {
be_print_err(gettext("be_copy: failed to "
- "set BE policy for %s\n"), bt.nbe_name);
- ret = 1;
+ "set BE policy for %s: %s\n"), bt.nbe_name,
+ libzfs_error_description(g_zfs));
+ ret = zfs_err_to_be_err(g_zfs);
goto done;
}
@@ -1265,8 +1274,8 @@
if ((zhp = zfs_open(g_zfs, be_container_ds, ZFS_TYPE_FILESYSTEM)) ==
NULL) {
be_print_err(gettext("be_zpool_find_current_be_callback: "
- "failed to open BE container dataset (%s)\n"),
- be_container_ds);
+ "failed to open BE container dataset (%s): %s\n"),
+ be_container_ds, libzfs_error_description(g_zfs));
zpool_close(zlp);
return (0);
}
@@ -1353,7 +1362,7 @@
* about original BE and new BE.
* Return:
* 0 - Success
- * non-zero - Failure
+ * be_errno_t - Failure
* Scope:
* Private
*/
@@ -1365,6 +1374,7 @@
char zhp_name[ZFS_MAXNAMELEN];
char clone_ds[MAXPATHLEN];
char ss[MAXPATHLEN];
+ int err = 0;
/*
* Get a copy of the dataset name zfs_name from zhp
@@ -1374,9 +1384,10 @@
/*
* Get the clone dataset name and prepare the zfs properties for it.
*/
- if (be_prep_clone_send_fs(zhp, bt, clone_ds, sizeof (clone_ds)) != 0) {
+ if ((err = be_prep_clone_send_fs(zhp, bt, clone_ds,
+ sizeof (clone_ds))) != 0) {
ZFS_CLOSE(zhp);
- return (1);
+ return (err);
}
/*
@@ -1392,8 +1403,9 @@
be_print_err(gettext("be_clone_fs_callback: "
"failed to get handle to snapshot (%s): %s\n"), ss,
libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
ZFS_CLOSE(zhp);
- return (1);
+ return (err);
}
/*
@@ -1407,14 +1419,7 @@
ZFS_CLOSE(zhp_ss);
ZFS_CLOSE(zhp);
- /*
- * If failed because clone dataset already exists,
- * return special err code so caller can retry.
- */
- if (libzfs_errno(g_zfs) == EZFS_EXISTS)
- return (BE_ERR_EXISTS);
-
- return (1);
+ return (zfs_err_to_be_err(g_zfs));
}
ZFS_CLOSE(zhp_ss);
@@ -1426,7 +1431,7 @@
zfs_iter_filesystems(zhp, be_clone_fs_callback, bt);
ZFS_CLOSE(zhp);
- return (0);
+ return (BE_SUCCESS);
}
/*
@@ -1439,7 +1444,7 @@
* about original BE and new BE.
* Return:
* 0 - Success
- * non-zero - Failure
+ * be_errnot_t - Failure
* Scope:
* Private
*/
@@ -1452,6 +1457,7 @@
char clone_ds[MAXPATHLEN];
int pid, status, retval;
int srpipe[2];
+ int err = 0;
/*
* Get a copy of the dataset name zfs_name from zhp
@@ -1461,9 +1467,10 @@
/*
* Get the clone dataset name and prepare the zfs properties for it.
*/
- if (be_prep_clone_send_fs(zhp, bt, clone_ds, sizeof (clone_ds)) != 0) {
+ if ((err = be_prep_clone_send_fs(zhp, bt, clone_ds,
+ sizeof (clone_ds))) != 0) {
ZFS_CLOSE(zhp);
- return (1);
+ return (err);
}
/*
@@ -1474,9 +1481,9 @@
be_print_err(gettext("be_send_fs_callback: "
"failed to create new dataset '%s': %s\n"),
clone_ds, libzfs_error_description(g_zfs));
-
+ err = zfs_err_to_be_err(g_zfs);
ZFS_CLOSE(zhp);
- return (1);
+ return (err);
}
/*
@@ -1489,21 +1496,23 @@
* Initiate the pipe to be used for the send and recv
*/
if (pipe(srpipe) != 0) {
+ int err = errno;
be_print_err(gettext("be_send_fs_callback: failed to "
"open pipe\n"));
ZFS_CLOSE(zhp);
- return (1);
+ return (errno_to_be_err(err));
}
/*
* Fork off a child to send the dataset
*/
if ((pid = fork()) == -1) {
+ int err = errno;
be_print_err(gettext("be_send_fs_callback: failed to fork\n"));
(void) close(srpipe[0]);
(void) close(srpipe[1]);
ZFS_CLOSE(zhp);
- return (1);
+ return (errno_to_be_err(err));
} else if (pid == 0) { /* child process */
(void) close(srpipe[0]);
@@ -1538,7 +1547,7 @@
be_print_err(gettext("be_send_fs_callback: failed to "
"send dataset (%s)\n"), zhp_name);
ZFS_CLOSE(zhp);
- return (1);
+ return (BE_ERR_ZFS);
}
@@ -1546,13 +1555,13 @@
* iterate through zhp's children datasets (if any)
* and send them accordingly.
*/
- if (zfs_iter_filesystems(zhp, be_send_fs_callback, bt) != 0) {
+ if ((err = zfs_iter_filesystems(zhp, be_send_fs_callback, bt)) != 0) {
ZFS_CLOSE(zhp);
- return (1);
+ return (err);
}
ZFS_CLOSE(zhp);
- return (0);
+ return (BE_SUCCESS);
}
/*
@@ -1564,7 +1573,7 @@
* data - Not used.
* Returns:
* 0 - Success
- * 1 - Failure
+ * be_errno_t - Failure
* Scope:
* Private
*/
@@ -1572,14 +1581,15 @@
be_destroy_callback(zfs_handle_t *zhp, void *data)
{
be_destroy_data_t *dd = data;
+ int err = 0;
/*
* Iterate down this file system's hierarchical children
* and destroy them first.
*/
- if (zfs_iter_filesystems(zhp, be_destroy_callback, dd) != 0) {
+ if ((err = zfs_iter_filesystems(zhp, be_destroy_callback, dd)) != 0) {
ZFS_CLOSE(zhp);
- return (1);
+ return (err);
}
if (dd->destroy_snaps) {
@@ -1587,33 +1597,35 @@
* Iterate through this file system's snapshots and
* destroy them before destroying the file system itself.
*/
- if (zfs_iter_snapshots(zhp, be_destroy_callback, dd)
+ if ((err = zfs_iter_snapshots(zhp, be_destroy_callback, dd))
!= 0) {
ZFS_CLOSE(zhp);
- return (1);
+ return (err);
}
}
/* Attempt to unmount the dataset before destroying it */
if (dd->force_unmount) {
- if (zfs_unmount(zhp, NULL, MS_FORCE) != 0) {
+ if ((err = zfs_unmount(zhp, NULL, MS_FORCE)) != 0) {
be_print_err(gettext("be_destroy_callback: "
"failed to unmount %s: %s\n"), zfs_get_name(zhp),
libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
ZFS_CLOSE(zhp);
- return (1);
+ return (err);
}
}
if (zfs_destroy(zhp) != 0) {
be_print_err(gettext("be_destroy_callback: "
"failed to destroy %s: %s\n"), zfs_get_name(zhp),
libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
ZFS_CLOSE(zhp);
- return (1);
+ return (err);
}
ZFS_CLOSE(zhp);
- return (0);
+ return (BE_SUCCESS);
}
/*
@@ -1640,7 +1652,7 @@
* data - not used.
* Return:
* 0 - Success
- * >0 - Failure
+ * be_errno_t - Failure
* Scope:
* Private
*/
@@ -1648,7 +1660,7 @@
be_demote_callback(zfs_handle_t *zhp, void *data)
{
be_demote_data_t dd = { 0 };
- int i;
+ int i, err = 0;
/*
* Initialize be_demote_data for the first pass - this will find a
@@ -1663,8 +1675,9 @@
be_print_err(gettext("be_demote_callback: "
"failed to iterate snapshots for %s: %s\n"),
zfs_get_name(zhp), libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
ZFS_CLOSE(zhp);
- return (1);
+ return (err);
}
if (dd.clone_zhp != NULL) {
/* Found the clone to promote. Promote it. */
@@ -1673,9 +1686,10 @@
"failed to promote %s: %s\n"),
zfs_get_name(dd.clone_zhp),
libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
ZFS_CLOSE(dd.clone_zhp);
ZFS_CLOSE(zhp);
- return (1);
+ return (err);
}
ZFS_CLOSE(dd.clone_zhp);
@@ -1693,13 +1707,13 @@
}
/* Iterate down this file system's children and demote them */
- if (zfs_iter_filesystems(zhp, be_demote_callback, NULL) != 0) {
+ if ((err = zfs_iter_filesystems(zhp, be_demote_callback, NULL)) != 0) {
ZFS_CLOSE(zhp);
- return (1);
+ return (err);
}
ZFS_CLOSE(zhp);
- return (0);
+ return (BE_SUCCESS);
}
/*
@@ -1955,7 +1969,7 @@
* clone_ds_len - length of clone_ds buffer
* Return:
* 0 - Success
- * 1 - Failure
+ * be_errno_t - Failure
* Scope:
* Private
*/
@@ -1969,7 +1983,7 @@
char mountpoint[MAXPATHLEN];
char *child_fs = NULL;
char *zhp_mountpoint = NULL;
- int ret;
+ int ret = 0;
/*
* Get a copy of the dataset name zfs_name from zhp
@@ -1990,7 +2004,7 @@
if (child_fs == NULL)
child_fs = "";
} else {
- return (1);
+ return (BE_ERR_INVAL);
}
/*
@@ -2012,15 +2026,17 @@
zfs_prop_to_name(ZFS_PROP_MOUNTPOINT), mountpoint) != 0) {
be_print_err(gettext("be_prep_clone_send_fs: "
"internal error: out of memory\n"));
- return (1);
+ return (BE_ERR_NOMEM);
}
} else {
if (zfs_prop_get(zhp, ZFS_PROP_MOUNTPOINT, mountpoint,
sizeof (mountpoint), &sourcetype, source, sizeof (source),
B_FALSE) != 0) {
be_print_err(gettext("be_prep_clone_send_fs: "
- "failed to get mountpoint for (%s)\n"), zhp_name);
- return (1);
+ "failed to get mountpoint for (%s): %s\n"),
+ zhp_name, libzfs_error_description(g_zfs));
+ ret = zfs_err_to_be_err(g_zfs);
+ return (ret);
}
/*
@@ -2052,7 +2068,7 @@
zhp_mountpoint) != 0) {
be_print_err(gettext("be_prep_clone_send_fs: "
"internal error: out of memory\n"));
- return (1);
+ return (BE_ERR_NOMEM);
}
} else {
ret = nvlist_remove_all(bt->nbe_zfs_props,
@@ -2061,7 +2077,7 @@
be_print_err(gettext("be_prep_clone_send_fs: "
"failed to remove mountpoint from "
"nvlist\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
}
}
@@ -2073,7 +2089,7 @@
zfs_prop_to_name(ZFS_PROP_CANMOUNT), "noauto") != 0) {
be_print_err(gettext("be_prep_clone_send_fs: "
"internal error: out of memory\n"));
- return (1);
+ return (BE_ERR_NOMEM);
}
return (0);
--- a/usr/src/lib/libbe/be_list.c Thu May 29 15:37:15 2008 -0700
+++ b/usr/src/lib/libbe/be_list.c Wed Jun 04 15:59:15 2008 -0600
@@ -25,7 +25,6 @@
*/
#include <assert.h>
-#include <errno.h>
#include <libintl.h>
#include <libnvpair.h>
#include <libzfs.h>
@@ -87,7 +86,7 @@
* set to NULL.
* Return:
* 0 - Success
- * non-zero - Failure
+ * be_errno_t - Failure
* Scope:
* Public
*/
@@ -98,14 +97,14 @@
/* Initialize libzfs handle */
if (!be_zfs_init())
- return (1);
+ return (BE_ERR_INIT);
/* Validate be_name if its not NULL */
if (be_name != NULL) {
if (!be_valid_be_name(be_name)) {
be_print_err(gettext("be_list: "
"invalid BE name %s\n"), be_name);
- return (1);
+ return (BE_ERR_INVAL);
}
}
@@ -133,7 +132,7 @@
* set to NULL.
* Return:
* 0 - Success
- * non-zero - Failure
+ * be_errno_t - Failure
* Scope:
* Semi-private (library wide use only)
*/
@@ -171,11 +170,11 @@
cb.be_nodes_head = NULL;
cb.be_nodes = NULL;
}
- err = BE_ERR_NOENT;
+ err = BE_ERR_BE_NOENT;
} else if (cb.be_nodes_head == NULL) {
be_print_err(gettext("be_list: "
"No BE's found\n"));
- err = BE_ERR_NOENT;
+ err = BE_ERR_BE_NOENT;
}
} else {
cb.be_name = be_name;
@@ -186,12 +185,12 @@
cb.be_nodes_head = NULL;
cb.be_nodes = NULL;
}
- err = BE_ERR_NOENT;
+ err = BE_ERR_BE_NOENT;
} else if (cb.be_nodes_head == NULL) {
be_print_err(gettext("be_list: "
"BE (%s) does not exist\n"),
be_name);
- err = BE_ERR_NOENT;
+ err = BE_ERR_BE_NOENT;
}
}
@@ -217,7 +216,7 @@
* the list of BE back.
* Returns:
* 0 - Success
- * non-zero - Failure
+ * be_errno_t - Failure
* Scope:
* Private
*/
@@ -254,8 +253,9 @@
be_print_err(gettext("be_get_list_all_callback: failed to "
"open BE container dataset %s: %s\n"),
be_container_ds, libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
zpool_close(zlp);
- return (1);
+ return (err);
}
if (cb->be_nodes_head == NULL) {
@@ -293,7 +293,7 @@
* the BE information back.
* Returns:
* 0 - Success
- * non-zero - Failure
+ * be_errno_t - Failure
* Scope:
* Private
*/
@@ -331,15 +331,16 @@
* next zpool.
*/
zpool_close(zlp);
- return (0);
+ return (BE_SUCCESS);
}
if ((zhp = zfs_open(g_zfs, be_ds, ZFS_TYPE_FILESYSTEM)) == NULL) {
be_print_err(gettext("be_get_list_callback: failed to open "
"BE root dataset %s: %s\n"), be_ds,
libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
zpool_close(zlp);
- return (1);
+ return (err);
}
cb->be_nodes_head = cb->be_nodes = calloc(1, sizeof (be_node_list_t));
@@ -445,7 +446,7 @@
* the BE information back.
* Returns:
* 0 - Success
- * non-zero - Failure
+ * be_errno_t - Failure
* Scope:
* Private
*/
@@ -469,7 +470,7 @@
* This is a snapshot created by the installer and not a BE.
*/
ZFS_CLOSE(zhp);
- return (0);
+ return (BE_SUCCESS);
}
/*
* get past the end of the container dataset plus the trailing "/"
@@ -917,6 +918,12 @@
}
}
err = zfs_iter_children(zhp, be_add_children_callback, cb);
+ if (err != 0) {
+ be_print_err(gettext("be_add_children_callback: "
+ "encountered error: %s\n"),
+ libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
+ }
ZFS_CLOSE(zhp);
return (err);
}
@@ -945,7 +952,8 @@
while (datasets != NULL) {
be_dataset_list_t *temp_ds = datasets;
datasets = datasets->be_next_dataset;
- free(temp_ds->be_dataset_name);
+ if (temp_ds->be_dataset_name != NULL)
+ free(temp_ds->be_dataset_name);
if (temp_ds->be_ds_mntpt != NULL)
free(temp_ds->be_ds_mntpt);
if (temp_ds->be_ds_plcy_type)
@@ -956,7 +964,8 @@
while (snapshots != NULL) {
be_snapshot_list_t *temp_ss = snapshots;
snapshots = snapshots->be_next_snapshot;
- free(temp_ss->be_snapshot_name);
+ if (temp_ss->be_snapshot_name != NULL)
+ free(temp_ss->be_snapshot_name);
if (temp_ss->be_snapshot_type)
free(temp_ss->be_snapshot_type);
free(temp_ss);
--- a/usr/src/lib/libbe/be_mount.c Thu May 29 15:37:15 2008 -0700
+++ b/usr/src/lib/libbe/be_mount.c Wed Jun 04 15:59:15 2008 -0600
@@ -78,7 +78,7 @@
* BE_ATTR_MOUNT_FLAGS *optional
* Return:
* 0 - Success
- * non-zero - Failure
+ * be_errno_t - Failure
* Scope:
* Public
*/
@@ -92,21 +92,21 @@
/* Initialize libzfs handle */
if (!be_zfs_init())
- return (1);
+ return (BE_ERR_INIT);
/* Get original BE name */
if (nvlist_lookup_string(be_attrs, BE_ATTR_ORIG_BE_NAME, &be_name)
!= 0) {
be_print_err(gettext("be_mount: failed to lookup "
"BE_ATTR_ORIG_BE_NAME attribute\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
/* Validate original BE name */
if (!be_valid_be_name(be_name)) {
be_print_err(gettext("be_mount: invalid BE name %s\n"),
be_name);
- return (1);
+ return (BE_ERR_INVAL);
}
/* Get mountpoint */
@@ -114,15 +114,15 @@
!= 0) {
be_print_err(gettext("be_mount: failed to lookup "
"BE_ATTR_MOUNTPOINT attribute\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
/* Get flags */
if (nvlist_lookup_pairs(be_attrs, NV_FLAG_NOENTOK,
BE_ATTR_MOUNT_FLAGS, DATA_TYPE_UINT16, &flags, NULL) != 0) {
be_print_err(gettext("be_mount: failed to lookup "
- "lookup BE_ATTR_MOUNT_FLAGS attribute\n"));
- return (1);
+ "BE_ATTR_MOUNT_FLAGS attribute\n"));
+ return (BE_ERR_INVAL);
}
ret = _be_mount(be_name, &mountpoint, flags);
@@ -143,7 +143,7 @@
* BE_ATTR_UNMOUNT_FLAGS *optional
* Return:
* 0 - Success
- * non-zero - Failure
+ * be_errno_t - Failure
* Scope:
* Public
*/
@@ -156,21 +156,21 @@
/* Initialize libzfs handle */
if (!be_zfs_init())
- return (1);
+ return (BE_ERR_INIT);
/* Get original BE name */
if (nvlist_lookup_string(be_attrs, BE_ATTR_ORIG_BE_NAME, &be_name)
!= 0) {
be_print_err(gettext("be_unmount: failed to lookup "
"BE_ATTR_ORIG_BE_NAME attribute\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
/* Validate original BE name */
if (!be_valid_be_name(be_name)) {
be_print_err(gettext("be_unmount: invalid BE name %s\n"),
be_name);
- return (1);
+ return (BE_ERR_INVAL);
}
/* Get unmount flags */
@@ -178,7 +178,7 @@
BE_ATTR_UNMOUNT_FLAGS, DATA_TYPE_UINT16, &flags, NULL) != 0) {
be_print_err(gettext("be_unmount: failed to loookup "
"BE_ATTR_UNMOUNT_FLAGS attribute\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
ret = _be_unmount(be_name, flags);
@@ -206,7 +206,7 @@
* flags - flag indicating special handling for mounting the BE
* Return:
* 0 - Success
- * non-zero - Failure
+ * be_errno_t - Failure
* Scope:
* Semi-private (library wide use only)
*/
@@ -220,10 +220,10 @@
char mountpoint[MAXPATHLEN];
char *mp = NULL;
char *tmp_altroot = NULL;
- int ret;
+ int ret, err = 0;
if (be_name == NULL || altroot == NULL)
- return (1);
+ return (BE_ERR_INVAL);
/* Set be_name as obe_name in bt structure */
bt.obe_name = be_name;
@@ -232,11 +232,11 @@
if ((ret = zpool_iter(g_zfs, be_find_zpool_callback, &bt)) == 0) {
be_print_err(gettext("be_mount: failed to "
"find zpool for BE (%s)\n"), bt.obe_name);
- return (1);
+ return (BE_ERR_BE_NOENT);
} else if (ret < 0) {
be_print_err(gettext("be_mount: zpool_iter failed: %s\n"),
libzfs_error_description(g_zfs));
- return (1);
+ return (zfs_err_to_be_err(g_zfs));
}
/* Generate string for obe_name's root dataset */
@@ -248,8 +248,9 @@
if ((zhp = zfs_open(g_zfs, bt.obe_root_ds, ZFS_TYPE_FILESYSTEM)) ==
NULL) {
be_print_err(gettext("be_mount: failed to "
- "open BE root dataset (%s)\n"), bt.obe_root_ds);
- return (1);
+ "open BE root dataset (%s): %s\n"), bt.obe_root_ds,
+ libzfs_error_description(g_zfs));
+ return (zfs_err_to_be_err(g_zfs));
}
/* Make sure BE's root dataset isn't already mounted somewhere */
@@ -259,7 +260,7 @@
"at %s\n"), bt.obe_name, mp != NULL ? mp : "");
if (mp != NULL)
free(mp);
- return (1);
+ return (BE_ERR_MOUNTED);
}
/*
@@ -271,7 +272,7 @@
ZFS_CLOSE(zhp);
be_print_err(gettext("be_mount: failed to get mountpoint "
"of %s\n"), bt.obe_name);
- return (1);
+ return (BE_ERR_ZFS);
}
/*
@@ -283,7 +284,7 @@
ZFS_CLOSE(zhp);
be_print_err(gettext("be_mount: failed to "
"set canmount to 'noauto' (%s)\n"), bt.obe_root_ds);
- return (1);
+ return (BE_ERR_ZFS);
}
/*
@@ -299,10 +300,10 @@
* Iterate through this BE's children datasets and fix them
* if they need fixing.
*/
- if (zfs_iter_filesystems(zhp, fix_mountpoint_callback,
- mountpoint) != 0) {
+ if ((err = zfs_iter_filesystems(zhp, fix_mountpoint_callback,
+ mountpoint)) != BE_SUCCESS) {
ZFS_CLOSE(zhp);
- return (1);
+ return (err);
}
/* Set the BE's root dataset back to 'legacy' */
@@ -312,7 +313,7 @@
be_print_err(gettext("be_mount: failed to "
"set mountpoint for BE's root dataset "
"to 'legacy' (%s)\n"), bt.obe_root_ds);
- return (1);
+ return (BE_ERR_ZFS);
}
}
@@ -323,15 +324,17 @@
ZFS_CLOSE(zhp);
be_print_err(gettext("be_mount: "
"malloc failed\n"));
- return (1);
+ return (BE_ERR_NOMEM);
}
(void) strcpy(tmp_altroot, BE_TMP_MNTPNT);
if (mkdtemp(tmp_altroot) == NULL) {
+ ret = errno;
be_print_err(gettext("be_mount: "
- "mkdtemp() failed for %s\n"), tmp_altroot);
+ "mkdtemp() failed for %s: %s\n"),
+ tmp_altroot, strerror(ret));
free(tmp_altroot);
ZFS_CLOSE(zhp);
- return (1);
+ return (errno_to_be_err(ret));
}
} else {
tmp_altroot = *altroot;
@@ -343,10 +346,11 @@
be_print_err(gettext("be_mount: failed to "
"set mountpoint of %s to %s: %s\n"), bt.obe_root_ds,
tmp_altroot, libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
if (*altroot == NULL)
free(tmp_altroot);
ZFS_CLOSE(zhp);
- return (1);
+ return (err);
}
/* Mount the BE's root filesystem */
@@ -363,17 +367,18 @@
if (*altroot == NULL)
free(tmp_altroot);
ZFS_CLOSE(zhp);
- return (1);
+ return (BE_ERR_MOUNT);
}
/* Iterate through BE's children filesystems */
- if (zfs_iter_filesystems(zhp, be_mount_callback, tmp_altroot) != 0) {
+ if ((err = zfs_iter_filesystems(zhp, be_mount_callback,
+ tmp_altroot)) != BE_SUCCESS) {
be_print_err(gettext("be_mount: failed to "
"mount BE (%s) on %s\n"), bt.obe_name, tmp_altroot);
if (*altroot == NULL)
free(tmp_altroot);
ZFS_CLOSE(zhp);
- return (1);
+ return (err);
}
md.altroot = tmp_altroot;
@@ -401,7 +406,7 @@
if (*altroot == NULL)
*altroot = tmp_altroot;
- return (0);
+ return (BE_SUCCESS);
}
/*
@@ -412,7 +417,7 @@
* flags - flags for unmounting the BE.
* Returns:
* 0 - Success
- * non-zero - Failure
+ * be_errno_t - Failure
* Scope:
* Semi-private (library wide use only)
*/
@@ -425,10 +430,10 @@
char obe_root_ds[MAXPATHLEN];
char mountpoint[MAXPATHLEN];
char *mp = NULL;
- int ret;
+ int ret, err = 0;
if (be_name == NULL)
- return (1);
+ return (BE_ERR_INVAL);
/* Set be_name as obe_name in bt structure */
bt.obe_name = be_name;
@@ -437,12 +442,13 @@
if ((ret = zpool_iter(g_zfs, be_find_zpool_callback, &bt)) == 0) {
be_print_err(gettext("be_unmount: failed to "
"find zpool for BE (%s)\n"), bt.obe_name);
- return (1);
+ return (BE_ERR_BE_NOENT);
} else if (ret < 0) {
be_print_err(gettext("be_unmount: "
"zpool_iter failed: %s\n"),
libzfs_error_description(g_zfs));
- return (1);
+ err = zfs_err_to_be_err(g_zfs);
+ return (err);
}
/* Generate string for obe_name's root dataset */
@@ -454,8 +460,10 @@
if ((zhp = zfs_open(g_zfs, bt.obe_root_ds, ZFS_TYPE_FILESYSTEM)) ==
NULL) {
be_print_err(gettext("be_unmount: failed to "
- "open BE root dataset (%s)\n"), bt.obe_root_ds);
- return (1);
+ "open BE root dataset (%s): %s\n"), bt.obe_root_ds,
+ libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
+ return (err);
}
/* Make sure BE's root dataset is mounted somewhere */
@@ -480,7 +488,7 @@
be_print_err(gettext("be_unmount: failed to get "
"mountpoint of (%s)\n"), bt.obe_name);
ZFS_CLOSE(zhp);
- return (1);
+ return (BE_ERR_ZFS);
}
if (strcmp(mountpoint, ZFS_MOUNTPOINT_LEGACY) != 0) {
@@ -491,7 +499,7 @@
if (zfs_iter_filesystems(zhp, fix_mountpoint_callback,
mountpoint) != 0) {
ZFS_CLOSE(zhp);
- return (1);
+ return (BE_ERR_ZFS);
}
/* Set the BE's root dataset back to 'legacy' */
@@ -503,7 +511,7 @@
"dataset to 'legacy' (%s)\n"),
bt.obe_root_ds);
ZFS_CLOSE(zhp);
- return (1);
+ return (BE_ERR_ZFS);
}
}
ZFS_CLOSE(zhp);
@@ -520,7 +528,7 @@
be_print_err(gettext("be_unmount: failed to "
"get mountpoint of (%s)\n"), bt.obe_name);
ZFS_CLOSE(zhp);
- return (1);
+ return (BE_ERR_ZFS);
}
} else {
(void) strlcpy(mountpoint, mp, sizeof (mountpoint));
@@ -532,7 +540,7 @@
be_print_err(gettext("be_unmount: "
"cannot unmount currently running BE\n"));
ZFS_CLOSE(zhp);
- return (1);
+ return (BE_ERR_INVAL);
}
ud.altroot = mountpoint;
@@ -547,15 +555,16 @@
be_print_err(gettext("be_unmount: failed to "
"unmount shared file systems\n"));
ZFS_CLOSE(zhp);
- return (1);
+ return (BE_ERR_UMOUNT);
}
/* Unmount all children datasets under the BE's root dataset */
- if (zfs_iter_filesystems(zhp, be_unmount_callback, &ud) != 0) {
+ if ((err = zfs_iter_filesystems(zhp, be_unmount_callback,
+ &ud)) != BE_SUCCESS) {
be_print_err(gettext("be_unmount: failed to "
"unmount BE (%s)\n"), bt.obe_name);
ZFS_CLOSE(zhp);
- return (1);
+ return (err);
}
/* Unmount this BE's root filesystem */
@@ -564,7 +573,8 @@
be_print_err(gettext("be_unmount: failed to "
"unmount %s: %s\n"), bt.obe_root_ds,
libzfs_error_description(g_zfs));
- return (1);
+ err = zfs_err_to_be_err(g_zfs);
+ return (err);
}
/* Set canmount property for this BE's root filesystem to noauto */
@@ -573,7 +583,7 @@
"set canmount to 'noauto' (%s)\n"),
bt.obe_root_ds);
ZFS_CLOSE(zhp);
- return (1);
+ return (BE_ERR_ZFS);
}
/* Set mountpoint for BE's root dataset back to legacy */
@@ -582,12 +592,12 @@
be_print_err(gettext("be_unmount: failed to "
"set mountpoint of %s to 'legacy'\n"), bt.obe_root_ds);
ZFS_CLOSE(zhp);
- return (1);
+ return (BE_ERR_ZFS);
}
ZFS_CLOSE(zhp);
- return (0);
+ return (BE_SUCCESS);
}
/*
@@ -604,7 +614,7 @@
* fld - be_fs_list_data_t pointer
* Returns:
* 0 - Success
- * 1 - Failure
+ * be_errno_t - Failure
* Scope:
* Semi-private (library wide use only)
*/
@@ -615,10 +625,10 @@
char be_root_ds[MAXPATHLEN];
char altroot[MAXPATHLEN];
boolean_t mounted_here = B_FALSE;
- int ret = 0;
+ int ret = 0, err = 0;
if (be_name == NULL || be_zpool == NULL || fld == NULL)
- return (1);
+ return (BE_ERR_INVAL);
be_make_root_ds(be_zpool, be_name, be_root_ds, sizeof (be_root_ds));
@@ -626,8 +636,10 @@
if ((zhp = zfs_open(g_zfs, be_root_ds, ZFS_TYPE_FILESYSTEM))
== NULL) {
be_print_err(gettext("get_legacy_fs: failed to "
- "open BE root dataset (%s)\n"), be_root_ds);
- return (1);
+ "open BE root dataset (%s): %s\n"), be_root_ds,
+ libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
+ return (err);
}
/*
@@ -637,16 +649,15 @@
if (add_to_fs_list(fld, (char *)zfs_get_name(zhp)) != 0) {
be_print_err(gettext("get_legacy_fs: "
"failed to add %s to fs list\n"), zfs_get_name(zhp));
- ret = 1;
+ ret = BE_ERR_INVAL;
goto cleanup;
}
/* If BE is not already mounted, mount it. */
if (!zfs_is_mounted(zhp, &fld->altroot)) {
- if (_be_mount(be_name, &fld->altroot, 0) != 0) {
+ if ((ret = _be_mount(be_name, &fld->altroot, 0)) != 0) {
be_print_err(gettext("get_legacy_fs: "
"failed to mount BE %s\n"), be_name);
- ret = 1;
goto cleanup;
}
@@ -657,8 +668,9 @@
if (zfs_prop_get(zhp, ZFS_PROP_MOUNTPOINT, altroot,
sizeof (altroot), NULL, NULL, 0, B_FALSE) != 0) {
be_print_err(gettext("get_legacy_fs: failed to "
- "get mountpoint of (%s)\n"), zfs_get_name(zhp));
- ret = 1;
+ "get mountpoint of (%s): %s\n"), zfs_get_name(zhp),
+ libzfs_error_description(g_zfs));
+ ret = zfs_err_to_be_err(g_zfs);
goto cleanup;
}
@@ -666,11 +678,11 @@
}
/* Iterate subordinate file systems looking for legacy mounts */
- if (zfs_iter_filesystems(zhp, be_get_legacy_fs_callback, fld) != 0) {
+ if ((ret = zfs_iter_filesystems(zhp, be_get_legacy_fs_callback,
+ fld)) != 0) {
be_print_err(gettext("get_legacy_fs: "
"failed to iterate %s to get legacy mounts\n"),
zfs_get_name(zhp));
- ret = 1;
}
cleanup:
@@ -678,10 +690,11 @@
/* If we mounted this BE, unmount it */
if (mounted_here) {
- if (_be_unmount(be_name, 0) != 0) {
+ if ((err = _be_unmount(be_name, 0)) != 0) {
be_print_err(gettext("get_legacy_fs: "
"failed to unmount %s\n"), be_name);
- ret = 1;
+ if (ret == 0)
+ ret = err;
}
}
@@ -733,7 +746,7 @@
* data - pointer to the altroot of where to mount BE.
* Returns:
* 0 - Success
- * non-zero - Failure
+ * be_errno_t - Failure
* Scope:
* Private
*/
@@ -746,6 +759,7 @@
char *altroot = data;
char zhp_mountpoint[MAXPATHLEN];
char mountpoint[MAXPATHLEN];
+ int err = 0;
/* Get dataset's mountpoint and source values */
if (zfs_prop_get(zhp, ZFS_PROP_MOUNTPOINT, zhp_mountpoint,
@@ -755,7 +769,7 @@
"get mountpoint and sourcetype for %s\n"),
fs_name);
ZFS_CLOSE(zhp);
- return (1);
+ return (BE_ERR_ZFS);
}
/*
@@ -767,7 +781,7 @@
be_print_err(gettext("be_mount_callback: failed to "
"set canmount to 'noauto' (%s)\n"), fs_name);
ZFS_CLOSE(zhp);
- return (1);
+ return (BE_ERR_ZFS);
}
/*
@@ -825,7 +839,7 @@
"failed to set mountpoint for %s to "
"%s\n"), fs_name, mountpoint);
ZFS_CLOSE(zhp);
- return (1);
+ return (BE_ERR_ZFS);
}
}
} else {
@@ -853,18 +867,20 @@
}
ZFS_CLOSE(zhp);
- return (1);
+ return (BE_ERR_MOUNT);
}
next:
/* Iterate through this dataset's children and mount them */
- if (zfs_iter_filesystems(zhp, be_mount_callback, altroot)) {
+ if ((err = zfs_iter_filesystems(zhp, be_mount_callback,
+ altroot)) != BE_SUCCESS) {
ZFS_CLOSE(zhp);
- return (1);
+ return (err);
}
+
ZFS_CLOSE(zhp);
- return (0);
+ return (BE_SUCCESS);
}
/*
@@ -877,7 +893,7 @@
* data - pointer to the mountpoint of where BE is mounted.
* Returns:
* 0 - Success
- * non-zero - Failure
+ * be_errno_t - Failure
* Scope:
* Private
*/
@@ -894,7 +910,7 @@
/* Iterate down this dataset's children first */
if (zfs_iter_filesystems(zhp, be_unmount_callback, ud->altroot)) {
- ret = 1;
+ ret = BE_ERR_UMOUNT;
goto done;
}
@@ -907,7 +923,7 @@
be_print_err(gettext("be_unmount_callback: "
"failed to unmount %s: %s\n"), fs_name,
libzfs_error_description(g_zfs));
- ret = 1;
+ ret = zfs_err_to_be_err(g_zfs);
goto done;
}
@@ -916,9 +932,9 @@
sizeof (mountpoint), &sourcetype, source, sizeof (source),
B_FALSE) != 0) {
be_print_err(gettext("be_unmount_callback: "
- "failed to get mountpoint and sourcetype for %s\n"),
- fs_name);
- ret = 1;
+ "failed to get mountpoint and sourcetype for %s: %s\n"),
+ fs_name, libzfs_error_description(g_zfs));
+ ret = zfs_err_to_be_err(g_zfs);
goto done;
}
@@ -962,23 +978,28 @@
be_print_err(
gettext("be_unmount_callback: "
"failed to set mountpoint for "
- "%s to %s\n"), fs_name,
- zhp_mountpoint);
- ret = 1;
+ "%s to %s: %s\n"), fs_name,
+ zhp_mountpoint,
+ libzfs_error_description(g_zfs));
+ ret = zfs_err_to_be_err(g_zfs);
}
} else {
be_print_err(
gettext("be_unmount_callback: "
"%s not mounted under BE's altroot %s, "
"skipping ...\n"), fs_name, ud->altroot);
- ret = 1;
+ /*
+ * fs_name is mounted but not under the
+ * root for this BE.
+ */
+ ret = BE_ERR_INVALMOUNTPOINT;
}
}
} else {
be_print_err(gettext("be_unmount_callback: "
"mountpoint sourcetype of %s is %d, skipping ...\n"),
fs_name, sourcetype);
- ret = 1;
+ ret = BE_ERR_ZFS;
}
done:
@@ -986,7 +1007,8 @@
if (zfs_prop_set(zhp, zfs_prop_to_name(ZFS_PROP_CANMOUNT), "noauto")) {
be_print_err(gettext("be_unmount_callback: "
"failed to set canmount to 'noauto' (%s)\n"), fs_name);
- ret = 1;
+ if (ret == 0)
+ ret = BE_ERR_ZFS;
}
ZFS_CLOSE(zhp);
@@ -1005,7 +1027,7 @@
* data - be_fs_list_data_t pointer
* Returns:
* 0 - Success
- * >1 - Failure
+ * be_errno_t - Failure
* Scope:
* Private
*/
@@ -1016,14 +1038,17 @@
char *fs_name = (char *)zfs_get_name(zhp);
char zhp_mountpoint[MAXPATHLEN];
char mountpoint[MAXPATHLEN];
+ int ret = 0;
/* Get this dataset's mountpoint property */
if (zfs_prop_get(zhp, ZFS_PROP_MOUNTPOINT, zhp_mountpoint,
sizeof (zhp_mountpoint), NULL, NULL, 0, B_FALSE) != 0) {
be_print_err(gettext("be_get_legacy_fs_callback: "
- "failed to get mountpoint for %s\n"), fs_name);
+ "failed to get mountpoint for %s: %s\n"),
+ fs_name, libzfs_error_description(g_zfs));
+ ret = zfs_err_to_be_err(g_zfs);
ZFS_CLOSE(zhp);
- return (1);
+ return (ret);
}
/*
@@ -1046,18 +1071,19 @@
be_print_err(gettext("be_get_legacy_fs_callback: "
"failed to add %s to fs list\n"), mountpoint);
ZFS_CLOSE(zhp);
- return (1);
+ return (BE_ERR_NOMEM);
}
}
next:
/* Iterate through this dataset's children file systems */
- if (zfs_iter_filesystems(zhp, be_get_legacy_fs_callback, fld) != 0) {
+ if ((ret = zfs_iter_filesystems(zhp, be_get_legacy_fs_callback,
+ fld)) != 0) {
ZFS_CLOSE(zhp);
- return (1);
+ return (ret);
}
ZFS_CLOSE(zhp);
- return (0);
+ return (BE_SUCCESS);
}
/*
@@ -1104,7 +1130,7 @@
* data - be_mount_data_t pointer
* Returns:
* 0 - Success
- * 1 - Failure
+ * be_errno_t - Failure
* Scope:
* Private
*/
@@ -1114,6 +1140,7 @@
be_mount_data_t *md = data;
zfs_handle_t *zhp = NULL;
const char *zpool = zpool_get_name(zlp);
+ int err = 0;
/*
* Get handle to pool's "pool data" dataset
@@ -1122,8 +1149,9 @@
be_print_err(gettext("zpool_shared_fs: "
"failed to open pool dataset %s: %s\n"), zpool,
libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
zpool_close(zlp);
- return (1);
+ return (err);
}
/* Process this pool's "pool data" dataset */
@@ -1135,7 +1163,7 @@
ZFS_CLOSE(zhp);
zpool_close(zlp);
- return (0);
+ return (BE_SUCCESS);
}
/*
@@ -1157,7 +1185,7 @@
* data - be_mount_data_t pointer
* Returns:
* 0 - Success
- * 1 - Failure
+ * be_errno_t - Failure
* Scope:
* Private
*/
@@ -1185,14 +1213,14 @@
*/
if (strcmp(name, container_ds) == 0) {
ZFS_CLOSE(zhp);
- return (0);
+ return (BE_SUCCESS);
}
} else {
/* Getting the pool name failed, return error */
be_print_err(gettext("iter_shared_fs_callback: "
"failed to get pool name from %s\n"), name);
ZFS_CLOSE(zhp);
- return (1);
+ return (BE_ERR_POOL_NOENT);
}
/* Mount this shared filesystem */
@@ -1202,7 +1230,7 @@
(void) zfs_iter_filesystems(zhp, iter_shared_fs_callback, md);
ZFS_CLOSE(zhp);
- return (0);
+ return (BE_SUCCESS);
}
/*
@@ -1219,7 +1247,7 @@
* md - be_mount_data_t pointer
* Returns:
* 0 - Success
- * 1 - Failure
+ * be_errno_t - Failure
* Scope:
* Private
*/
@@ -1230,7 +1258,7 @@
char mountpoint[MAXPATHLEN];
char *mp = NULL;
int mflag = 0;
- int errno;
+ int err;
/* Check if file system is currently mounted. */
if (zfs_is_mounted(zhp, &mp)) {
@@ -1245,7 +1273,7 @@
be_print_err(
gettext("loopback_mount_shared_fs: "
"failed to get mountpoint property\n"));
- return (1);
+ return (BE_ERR_ZFS);
}
} else {
(void) strlcpy(zhp_mountpoint, mp,
@@ -1268,14 +1296,15 @@
if (mount(zhp_mountpoint, mountpoint, mflag, MNTTYPE_LOFS,
NULL, 0, NULL, 0) != 0) {
+ err = errno;
be_print_err(gettext("loopback_mount_shared_fs: "
"failed to loopback mount %s at %s: %s\n"),
- zhp_mountpoint, mountpoint, strerror(errno));
- return (1);
+ zhp_mountpoint, mountpoint, strerror(err));
+ return (BE_ERR_MOUNT);
}
}
- return (0);
+ return (BE_SUCCESS);
}
/*
@@ -1287,7 +1316,7 @@
* ud - be_unmount_data_t pointer
* Returns:
* 0 - Success
- * 1 - Failure
+ * be_errno_t - Failure
* Scope:
* Private
*/
@@ -1303,13 +1332,14 @@
int i;
int altroot_len;
int ret = 0;
- int errno;
+ int err = 0;
/* Read in the mnttab into a table */
if ((fp = fopen(MNTTAB, "r")) == NULL) {
+ err = errno;
be_print_err(gettext("unmount_shared_fs: "
"failed to open mnttab\n"));
- return (1);
+ return (errno_to_be_err(err));
}
while (getmntent(fp, &ent) == 0) {
@@ -1345,10 +1375,11 @@
if (strncmp(entp->mnt_mountp, ud->altroot, altroot_len) == 0 &&
entp->mnt_mountp[altroot_len] == '/') {
if (umount(entp->mnt_mountp) != 0) {
+ err = errno;
be_print_err(gettext("unmount_shared_fs: "
"failed to unmount shared file system %s: "
- "%s\n"), entp->mnt_mountp, strerror(errno));
- ret = 1;
+ "%s\n"), entp->mnt_mountp, strerror(err));
+ ret = BE_ERR_UMOUNT;
}
}
}
@@ -1438,7 +1469,7 @@
* data - altroot of where BE is to be mounted.
* Returns:
* 0 - Success
- * 1 - Failure
+ * be_errno_t - Failure
* Scope:
* Private
*/
@@ -1450,6 +1481,7 @@
char mountpoint[MAXPATHLEN];
char *zhp_mountpoint = NULL;
char *altroot = data;
+ int err = 0;
/* Get dataset's mountpoint and source values */
if (zfs_prop_get(zhp, ZFS_PROP_MOUNTPOINT, mountpoint,
@@ -1459,7 +1491,7 @@
"failed to get mountpoint and sourcetype for %s\n"),
zfs_get_name(zhp));
ZFS_CLOSE(zhp);
- return (1);
+ return (BE_ERR_ZFS);
}
/*
@@ -1488,21 +1520,25 @@
zfs_prop_to_name(ZFS_PROP_MOUNTPOINT),
zhp_mountpoint)) {
be_print_err(gettext("fix_mountpoint_callback: "
- "failed to set mountpoint for %s to %s\n"),
- zfs_get_name(zhp), zhp_mountpoint);
-
+ "failed to set mountpoint for %s to "
+ "%s: %s\n"), zfs_get_name(zhp),
+ zhp_mountpoint,
+ libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
ZFS_CLOSE(zhp);
- return (1);
+ return (err);
}
}
}
/* Iterate through this dataset's children and fix them */
- if (zfs_iter_filesystems(zhp, fix_mountpoint_callback, altroot)) {
+ if ((err = zfs_iter_filesystems(zhp, fix_mountpoint_callback,
+ altroot)) != 0) {
ZFS_CLOSE(zhp);
- return (1);
+ return (err);
}
+
ZFS_CLOSE(zhp);
- return (0);
+ return (BE_SUCCESS);
}
--- a/usr/src/lib/libbe/be_rename.c Thu May 29 15:37:15 2008 -0700
+++ b/usr/src/lib/libbe/be_rename.c Wed Jun 04 15:59:15 2008 -0600
@@ -25,7 +25,6 @@
*/
#include <assert.h>
-#include <errno.h>
#include <libintl.h>
#include <libnvpair.h>
#include <libzfs.h>
@@ -57,7 +56,7 @@
* BE_ATTR_NEW_BE_NAME *required
* Return:
* 0 - Success
- * non-zero - Failure
+ * be_errno_t - Failure
* Scope:
* Public
*/
@@ -70,12 +69,11 @@
zfs_handle_t *zhp = NULL;
char root_ds[MAXPATHLEN];
char *mp = NULL;
- int err = 0;
- int ret;
+ int err = 0, ret = 0;
/* Initialize libzfs handle */
if (!be_zfs_init())
- return (1);
+ return (BE_ERR_INIT);
/* Get original BE name to rename from */
if (nvlist_lookup_string(be_attrs, BE_ATTR_ORIG_BE_NAME, &bt.obe_name)
@@ -83,7 +81,7 @@
be_print_err(gettext("be_rename: failed to "
"lookup BE_ATTR_ORIG_BE_NAME attribute\n"));
be_zfs_fini();
- return (1);
+ return (BE_ERR_INVAL);
}
/* Get new BE name to rename to */
@@ -92,7 +90,7 @@
be_print_err(gettext("be_rename: failed to "
"lookup BE_ATTR_NEW_BE_NAME attribute\n"));
be_zfs_fini();
- return (1);
+ return (BE_ERR_INVAL);
}
/* Validate original BE name */
@@ -100,7 +98,7 @@
be_print_err(gettext("be_rename: "
"invalid BE name %s\n"), bt.obe_name);
be_zfs_fini();
- return (1);
+ return (BE_ERR_INVAL);
}
/* Validate new BE name */
@@ -108,20 +106,21 @@
be_print_err(gettext("be_rename: invalid BE name %s\n"),
bt.nbe_name);
be_zfs_fini();
- return (1);
+ return (BE_ERR_INVAL);
}
/* Find which zpool the BE is in */
- if ((ret = zpool_iter(g_zfs, be_find_zpool_callback, &bt)) == 0) {
+ if (zpool_iter(g_zfs, be_find_zpool_callback, &bt) == 0) {
be_print_err(gettext("be_rename: failed to "
"find zpool for BE (%s)\n"), bt.obe_name);
be_zfs_fini();
- return (1);
+ return (BE_ERR_BE_NOENT);
} else if (ret < 0) {
be_print_err(gettext("be_rename: zpool_iter failed: %s\n"),
libzfs_error_description(g_zfs));
+ ret = zfs_err_to_be_err(g_zfs);
be_zfs_fini();
- return (1);
+ return (ret);
}
/* New BE will reside in the same zpool as orig BE */
@@ -137,11 +136,10 @@
* mounted before renaming. We use this list to determine which
* entries in the vfstab we need to update after we've renamed the BE.
*/
- if (be_get_legacy_fs(bt.obe_name, bt.obe_zpool, &fld) != 0) {
+ if ((err = be_get_legacy_fs(bt.obe_name, bt.obe_zpool, &fld)) != 0) {
be_print_err(gettext("be_rename: failed to "
"get legacy mounted file system list for %s\n"),
bt.obe_name);
- err = 1;
goto done;
}
@@ -149,17 +147,18 @@
if ((zhp = zfs_open(g_zfs, bt.obe_root_ds, ZFS_TYPE_FILESYSTEM))
== NULL) {
be_print_err(gettext("be_rename: failed to "
- "open BE root dataset (%s)\n"),
- bt.obe_root_ds);
- err = 1;
+ "open BE root dataset (%s): %s\n"),
+ bt.obe_root_ds, libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
goto done;
}
/* Rename of BE's root dataset. */
- if ((err = zfs_rename(zhp, bt.nbe_root_ds, B_FALSE)) != 0) {
+ if (zfs_rename(zhp, bt.nbe_root_ds, B_FALSE) != 0) {
be_print_err(gettext("be_rename: failed to "
"rename dataset (%s): %s\n"), bt.obe_root_ds,
libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
goto done;
}
@@ -168,9 +167,9 @@
if ((zhp = zfs_open(g_zfs, bt.nbe_root_ds, ZFS_TYPE_FILESYSTEM))
== NULL) {
be_print_err(gettext("be_rename: failed to "
- "open BE root dataset (%s)\n"),
- bt.obe_root_ds);
- err = 1;
+ "open BE root dataset (%s): %s\n"),
+ bt.obe_root_ds, libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
goto done;
}
@@ -179,7 +178,7 @@
be_print_err(gettext("be_rename: failed to "
"get altroot of mounted BE %s: %s\n"),
bt.nbe_name, libzfs_error_description(g_zfs));
- err = 1;
+ err = zfs_err_to_be_err(g_zfs);
goto done;
}
--- a/usr/src/lib/libbe/be_snapshot.c Thu May 29 15:37:15 2008 -0700
+++ b/usr/src/lib/libbe/be_snapshot.c Wed Jun 04 15:59:15 2008 -0600
@@ -28,7 +28,6 @@
* System includes
*/
#include <assert.h>
-#include <errno.h>
#include <libintl.h>
#include <libnvpair.h>
#include <libzfs.h>
@@ -75,7 +74,7 @@
*
* Return:
* 0 - Success
- * non-zero - Failure
+ * be_errno_t - Failure
* Scope:
* Public
*/
@@ -90,7 +89,7 @@
/* Initialize libzfs handle */
if (!be_zfs_init())
- return (1);
+ return (BE_ERR_INIT);
/* Get original BE name if one was provided */
if (nvlist_lookup_pairs(be_attrs, NV_FLAG_NOENTOK,
@@ -98,7 +97,7 @@
be_print_err(gettext("be_create_snapshot: failed to "
"lookup BE_ATTR_ORIG_BE_NAME attribute\n"));
be_zfs_fini();
- return (1);
+ return (BE_ERR_INVAL);
}
/* Validate original BE name if one was provided */
@@ -106,7 +105,7 @@
be_print_err(gettext("be_create_snapshot: "
"invalid BE name %s\n"), be_name);
be_zfs_fini();
- return (1);
+ return (BE_ERR_INVAL);
}
/* Get snapshot name to create if one was provided */
@@ -115,7 +114,7 @@
be_print_err(gettext("be_create_snapshot: "
"failed to lookup BE_ATTR_SNAP_NAME attribute\n"));
be_zfs_fini();
- return (1);
+ return (BE_ERR_INVAL);
}
/* Get BE policy to create this snapshot under */
@@ -124,7 +123,7 @@
be_print_err(gettext("be_create_snapshot: "
"failed to lookup BE_ATTR_POLICY attribute\n"));
be_zfs_fini();
- return (1);
+ return (BE_ERR_INVAL);
}
/*
@@ -144,9 +143,9 @@
if (nvlist_add_string(be_attrs, BE_ATTR_SNAP_NAME,
snap_name) != 0) {
be_print_err(gettext("be_create_snapshot: "
- "failed to add auto snap name to "
- "be_attrs\n"));
- ret = 1;
+ "failed to add auto snap name (%s) to "
+ "be_attrs\n"), snap_name);
+ ret = BE_ERR_NOMEM;
}
}
}
@@ -172,7 +171,7 @@
* BE_ATTR_SNAP_NAME *required
* Return:
* 0 - Success
- * non-zero - Failure
+ * be_errno_t - Failure
* Scope:
* Public
*/
@@ -185,21 +184,21 @@
/* Initialize libzfs handle */
if (!be_zfs_init())
- return (1);
+ return (BE_ERR_INIT);
/* Get original BE name if one was provided */
if (nvlist_lookup_pairs(be_attrs, NV_FLAG_NOENTOK,
BE_ATTR_ORIG_BE_NAME, DATA_TYPE_STRING, &be_name, NULL) != 0) {
be_print_err(gettext("be_destroy_snapshot: "
"failed to lookup BE_ATTR_ORIG_BE_NAME attribute\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
/* Validate original BE name if one was provided */
if (be_name != NULL && !be_valid_be_name(be_name)) {
be_print_err(gettext("be_destroy_snapshot: "
"invalid BE name %s\n"), be_name);
- return (1);
+ return (BE_ERR_INVAL);
}
/* Get snapshot name to destroy */
@@ -207,7 +206,7 @@
!= 0) {
be_print_err(gettext("be_destroy_snapshot: "
"failed to lookup BE_ATTR_SNAP_NAME attribute.\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
ret = _be_destroy_snapshot(be_name, snap_name);
@@ -240,7 +239,7 @@
*
* Returns:
* 0 - Success
- * 1 - Failure
+ * be_errno_t - Failure
* Scope:
* Public
*/
@@ -250,18 +249,18 @@
be_transaction_data_t bt = { 0 };
zfs_handle_t *zhp = NULL;
char obe_root_ds[MAXPATHLEN];
- int zret;
+ int zret = 0, err = 0;
/* Initialize libzfs handle */
if (!be_zfs_init())
- return (1);
+ return (BE_ERR_INIT);
/* Get original BE name if one was provided */
if (nvlist_lookup_pairs(be_attrs, NV_FLAG_NOENTOK,
BE_ATTR_ORIG_BE_NAME, DATA_TYPE_STRING, &bt.obe_name, NULL) != 0) {
be_print_err(gettext("be_rollback: "
"failed to lookup BE_ATTR_ORIG_BE_NAME attribute\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
/* If original BE name not provided, use current BE */
@@ -270,19 +269,19 @@
be_zpool_find_current_be_callback, &bt)) == 0) {
be_print_err(gettext("be_rollback: "
"failed to find current BE name\n"));
- return (1);
+ return (BE_ERR_BE_NOENT);
} else if (zret < 0) {
be_print_err(gettext("be_rollback: "
"zpool_iter failed: %s\n"),
libzfs_error_description(g_zfs));
- return (1);
+ return (zfs_err_to_be_err(g_zfs));
}
} else {
/* Validate original BE name */
if (!be_valid_be_name(bt.obe_name)) {
be_print_err(gettext("be_rollback: "
"invalid BE name %s\n"), bt.obe_name);
- return (1);
+ return (BE_ERR_INVAL);
}
}
@@ -291,19 +290,19 @@
!= 0) {
be_print_err(gettext("be_rollback: "
"failed to lookup BE_ATTR_SNAP_NAME attribute.\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
/* Find which zpool obe_name lives in */
if ((zret = zpool_iter(g_zfs, be_find_zpool_callback, &bt)) == 0) {
be_print_err(gettext("be_rollback: "
"failed to find zpool for BE (%s)\n"), bt.obe_name);
- return (1);
+ return (BE_ERR_BE_NOENT);
} else if (zret < 0) {
be_print_err(gettext("be_rollback: "
"zpool_iter failed: %s\n"),
libzfs_error_description(g_zfs));
- return (1);
+ return (zfs_err_to_be_err(g_zfs));
}
/* Generate string for BE's root dataset */
@@ -316,16 +315,16 @@
be_print_err(gettext("be_rollback: "
"failed to open BE root dataset (%s): %s\n"),
bt.obe_root_ds, libzfs_error_description(g_zfs));
- return (1);
+ return (zfs_err_to_be_err(g_zfs));
}
/*
* Check that snapshot name exists for this BE and all of its
* children file systems.
*/
- if (be_rollback_check_callback(zhp, bt.obe_snap_name) != 0) {
+ if ((err = be_rollback_check_callback(zhp, bt.obe_snap_name)) != 0) {
zhp = NULL;
- return (1);
+ return (err);
}
/* Get handle to BE's root dataset */
@@ -333,23 +332,23 @@
be_print_err(gettext("be_rollback: "
"failed to open BE root dataset (%s): %s\n"),
bt.obe_root_ds, libzfs_error_description(g_zfs));
- return (1);
+ return (zfs_err_to_be_err(g_zfs));
}
/*
* Iterate through a BE's datasets and roll them all back to
* the specified snapshot.
*/
- if (be_rollback_callback(zhp, bt.obe_snap_name) != 0) {
+ if ((err = be_rollback_callback(zhp, bt.obe_snap_name)) != 0) {
zhp = NULL;
be_print_err(gettext("be_rollback: "
"failed to rollback BE %s to %s\n"), bt.obe_name,
bt.obe_snap_name);
- return (1);
+ return (err);
}
zhp = NULL;
be_zfs_fini();
- return (0);
+ return (BE_SUCCESS);
}
@@ -370,7 +369,7 @@
* policy - The clean-up policy type. (library wide use only)
* Return:
* 0 - Success
- * non-zero - Failure
+ * be_erno_t - Failure
* Scope:
* Semi-private (library wide use only)
*/
@@ -382,7 +381,7 @@
char ss[MAXPATHLEN];
char root_ds[MAXPATHLEN];
int err = 0;
- int i, ret;
+ int i, ret = 0;
boolean_t autoname = B_FALSE;
/* Set parameters in bt structure */
@@ -396,12 +395,12 @@
&bt)) == 0) {
be_print_err(gettext("be_create_snapshot: "
"failed to find current BE name\n"));
- return (1);
+ return (BE_ERR_INVAL);
} else if (ret < 0) {
be_print_err(gettext("be_create_snapshot: "
"zpool_iter failed: %s\n"),
libzfs_error_description(g_zfs));
- return (1);
+ return (zfs_err_to_be_err(g_zfs));
}
}
@@ -409,12 +408,12 @@
if ((ret = zpool_iter(g_zfs, be_find_zpool_callback, &bt)) == 0) {
be_print_err(gettext("be_create_snapshot: failed to "
"find zpool for BE (%s)\n"), bt.obe_name);
- return (1);
+ return (BE_ERR_BE_NOENT);
} else if (ret < 0) {
be_print_err(gettext("be_create_snapshot: "
"zpool_iter failed: %s\n"),
libzfs_error_description(g_zfs));
- return (1);
+ return (zfs_err_to_be_err(g_zfs));
}
be_make_root_ds(bt.obe_zpool, bt.obe_name, root_ds,
@@ -429,7 +428,7 @@
if (!valid_be_policy(bt.policy)) {
be_print_err(gettext("be_create_snapshot: "
"invalid BE policy type (%s)\n"), bt.policy);
- return (1);
+ return (BE_ERR_INVAL);
}
}
@@ -443,7 +442,7 @@
== NULL) {
be_print_err(gettext("be_create_snapshot: "
"failed to create auto snapshot name\n"));
- err = 1;
+ err = BE_ERR_AUTONAME;
goto done;
}
}
@@ -456,9 +455,9 @@
if ((zhp = zfs_open(g_zfs, bt.obe_root_ds, ZFS_TYPE_DATASET))
== NULL) {
be_print_err(gettext("be_create_snapshot: "
- "failed to open BE root dataset (%s)\n"),
- bt.obe_root_ds);
- err = 1;
+ "failed to open BE root dataset (%s): %s\n"),
+ bt.obe_root_ds, libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
goto done;
}
@@ -468,7 +467,7 @@
be_print_err(gettext("be_create_snapshot: "
"recursive snapshot of %s failed: %s\n"),
ss, libzfs_error_description(g_zfs));
- err = 1;
+ err = zfs_err_to_be_err(g_zfs);
goto done;
} else {
for (i = 1; i < BE_AUTO_NAME_MAX_TRY; i++) {
@@ -483,7 +482,7 @@
be_print_err(gettext(
"be_create_snapshot: failed to "
"create auto snapshot name\n"));
- err = 1;
+ err = BE_ERR_AUTONAME;
goto done;
}
@@ -501,7 +500,7 @@
"failed: %s\n"), ss,
libzfs_error_description(
g_zfs));
- err = 1;
+ err = zfs_err_to_be_err(g_zfs);
goto done;
}
} else {
@@ -519,7 +518,7 @@
"name\n"));
free(bt.obe_snap_name);
bt.obe_snap_name = NULL;
- err = 1;
+ err = BE_ERR_AUTONAME;
}
}
}
@@ -545,7 +544,7 @@
* snap_name - The name of the snapshot we're destroying.
* Return:
* 0 - Success
- * non-zero - Failure
+ * be_errno_t - Failure
* Scope:
* Semi-private (library wide use only)
*/
@@ -556,14 +555,13 @@
zfs_handle_t *zhp;
char ss[MAXPATHLEN];
char root_ds[MAXPATHLEN];
- int err = 0;
- int ret;
+ int err = 0, ret = 0;
/* Make sure we actaully have a snapshot name */
if (snap_name == NULL) {
be_print_err(gettext("be_destroy_snapshot: "
"invalid snapshot name\n"));
- return (1);
+ return (BE_ERR_INVAL);
}
/* Set parameters in bt structure */
@@ -576,12 +574,12 @@
&bt)) == 0) {
be_print_err(gettext("be_destroy_snapshot: "
"failed to find current BE name\n"));
- return (1);
+ return (BE_ERR_BE_NOENT);
} else if (ret < 0) {
be_print_err(gettext("be_destroy_snapshot: "
"zpool_iter failed: %s\n"),
libzfs_error_description(g_zfs));
- return (1);
+ return (zfs_err_to_be_err(g_zfs));
}
}
@@ -589,12 +587,12 @@
if ((ret = zpool_iter(g_zfs, be_find_zpool_callback, &bt)) == 0) {
be_print_err(gettext("be_destroy_snapshot: "
"failed to find zpool for BE (%s)\n"), bt.obe_name);
- return (1);
+ return (BE_ERR_BE_NOENT);
} else if (ret < 0) {
be_print_err(gettext("be_destroy_snapshot: "
"zpool_iter failed: %s\n"),
libzfs_error_description(g_zfs));
- return (1);
+ return (zfs_err_to_be_err(g_zfs));
}
be_make_root_ds(bt.obe_zpool, bt.obe_name, root_ds,
@@ -607,9 +605,9 @@
* The zfs_open failed, return an error.
*/
be_print_err(gettext("be_destroy_snapshot: "
- "failed to open BE root dataset (%s)\n"),
- bt.obe_root_ds);
- err = 1;
+ "failed to open BE root dataset (%s): %s\n"),
+ bt.obe_root_ds, libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
} else {
/*
* Generate the name of the snapshot to take.
@@ -621,7 +619,7 @@
* destroy the snapshot.
*/
if (zfs_destroy_snaps(zhp, bt.obe_snap_name) != 0) {
- err = libzfs_errno(g_zfs);
+ err = zfs_err_to_be_err(g_zfs);
be_print_err(gettext("be_destroy_snapshot: "
"failed to destroy snapshot %s: %s\n"), ss,
libzfs_error_description(g_zfs));
@@ -646,7 +644,8 @@
* data - name of the snapshot to check for.
* Returns:
* 0 - Success, snapshot name exists for all filesystems.
- * 1 - Failure, snapshot name does not exist for all filesystems.
+ * be_errno_t - Failure, snapshot name does not exist for all
+ * filesystems.
* Scope:
* Private
*/
@@ -655,6 +654,7 @@
{
char *snap_name = data;
char ss[MAXPATHLEN];
+ int err = 0;
/* Generate string for this filesystem's snapshot name */
(void) snprintf(ss, sizeof (ss), "%s@%s", zfs_get_name(zhp), snap_name);
@@ -664,14 +664,14 @@
be_print_err(gettext("be_rollback_check_callback: "
"snapshot does not exist %s\n"), ss);
ZFS_CLOSE(zhp);
- return (1);
+ return (BE_ERR_SS_NOENT);
}
/* Iterate this dataset's children and check them */
- if (zfs_iter_filesystems(zhp, be_rollback_check_callback, snap_name)
- != 0) {
+ if ((err = zfs_iter_filesystems(zhp, be_rollback_check_callback,
+ snap_name)) != 0) {
ZFS_CLOSE(zhp);
- return (1);
+ return (err);
}
ZFS_CLOSE(zhp);
@@ -687,7 +687,7 @@
* data - name of snapshot to rollback to.
* Returns:
* 0 - Success
- * 1 - Failure
+ * be_errno_t - Failure
* Scope:
* Private
*/
@@ -697,6 +697,7 @@
zfs_handle_t *zhp_snap = NULL;
char *snap_name = data;
char ss[MAXPATHLEN];
+ int err = 0;
/* Generate string for this filesystem's snapshot name */
(void) snprintf(ss, sizeof (ss), "%s@%s", zfs_get_name(zhp), snap_name);
@@ -706,8 +707,9 @@
be_print_err(gettext("be_rollback_callback: "
"failed to open snapshot %s: %s\n"), zfs_get_name(zhp),
libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
ZFS_CLOSE(zhp);
- return (1);
+ return (err);
}
/* Rollback dataset */
@@ -715,16 +717,18 @@
be_print_err(gettext("be_rollback_callback: "
"failed to rollback BE dataset %s to snapshot %s: %s\n"),
zfs_get_name(zhp), ss, libzfs_error_description(g_zfs));
+ err = zfs_err_to_be_err(g_zfs);
ZFS_CLOSE(zhp_snap);
ZFS_CLOSE(zhp);
- return (1);
+ return (err);
}
ZFS_CLOSE(zhp_snap);
/* Iterate this dataset's children and roll them back */
- if (zfs_iter_filesystems(zhp, be_rollback_callback, snap_name) != 0) {
+ if ((err = zfs_iter_filesystems(zhp, be_rollback_callback,
+ snap_name)) != 0) {
ZFS_CLOSE(zhp);
- return (1);
+ return (err);
}
ZFS_CLOSE(zhp);
--- a/usr/src/lib/libbe/be_utils.c Thu May 29 15:37:15 2008 -0700
+++ b/usr/src/lib/libbe/be_utils.c Wed Jun 04 15:59:15 2008 -0600
@@ -76,14 +76,14 @@
/* Initialize libzfs handle */
if (!be_zfs_init())
- return (1);
+ return (BE_ERR_INIT);
zhp = zfs_open(g_zfs, dataset, ZFS_TYPE_DATASET);
if (zhp == NULL) {
/*
* The zfs_open failed return an error
*/
- err = ENOENT;
+ err = zfs_err_to_be_err(g_zfs);
} else {
err = be_maxsize_avail(zhp, ret);
}
@@ -269,7 +269,7 @@
* the title line for this BEs entry.
* Returns:
* 0 - Success
- * 1 - Failure
+ * be_errno_t - Failure
* Scope:
* Semi-private (library wide use only)
*/
@@ -285,17 +285,19 @@
char title[MAXPATHLEN];
boolean_t found_be = B_FALSE;
FILE *grub_fp = NULL;
+ int err = 0;
if (be_name == NULL || be_root_pool == NULL)
- return (1);
+ return (BE_ERR_INVAL);
if (boot_pool == NULL)
boot_pool = be_root_pool;
if ((zhp = zfs_open(g_zfs, be_root_pool, ZFS_TYPE_DATASET)) == NULL) {
be_print_err(gettext("be_append_grub: failed to open "
- "pool dataset for %s\n"), be_root_pool);
- return (1);
+ "pool dataset for %s: %s\n"), be_root_pool,
+ libzfs_error_description(g_zfs));
+ return (zfs_err_to_be_err(g_zfs));
}
(void) zfs_prop_get(zhp, ZFS_PROP_MOUNTPOINT, pool_mntpnt,
@@ -314,10 +316,11 @@
* have an entry in the menu.
*/
grub_fp = fopen(grub_file, "r");
+ err = errno;
if (grub_fp == NULL) {
be_print_err(gettext("be_append_grub: failed "
"to open menu.lst file %s\n"), grub_file);
- return (1);
+ return (errno_to_be_err(err));
}
while (fgets(line, BUFSIZ, grub_fp)) {
char *tok = strtok(line, " \t\r\n");
@@ -350,21 +353,22 @@
*/
char *new_title = description ? description : be_name;
if (strcmp(title, new_title) == 0) {
- return (0);
+ return (BE_SUCCESS);
} else {
be_print_err(gettext("be_append_grub: "
"BE entry already exists in grub menu: %s\n"),
be_name);
- return (1);
+ return (BE_ERR_EXISTS);
}
}
/* Append BE entry to the end of the file */
grub_fp = fopen(grub_file, "a+");
+ err = errno;
if (grub_fp == NULL) {
be_print_err(gettext("be_append_grub: failed "
"to open menu.lst file %s\n"), grub_file);
- return (1);
+ return (errno_to_be_err(err));
}
(void) fprintf(grub_fp, "title %s\n",
@@ -377,7 +381,7 @@
(void) fprintf(grub_fp, "%s\n", BE_GRUB_COMMENT);
(void) fclose(grub_fp);
- return (0);
+ return (BE_SUCCESS);
}
/*
@@ -390,7 +394,7 @@
* boot_pool -
* Returns:
* 0 - Success
- * 1 - Failure
+ * be_errno_t - Failure
* Scope:
* Semi-private (library wide use only)
*/
@@ -408,6 +412,7 @@
FILE *tmp_menu_fp = NULL;
int i;
int fd;
+ int err = 0;
int nlines = 0;
int default_entry = 0;
int entry_cnt = 0;
@@ -427,7 +432,7 @@
be_print_err(gettext("be_remove_grub: "
"failed to open pool dataset for %s: %s"),
be_root_pool, libzfs_error_description(g_zfs));
- return (1);
+ return (zfs_err_to_be_err(g_zfs));
}
/* Get location of where pool dataset is mounted */
@@ -437,7 +442,7 @@
"failed to get mountpoint for pool dataset %s: %s\n"),
zfs_get_name(zhp), libzfs_error_description(g_zfs));
ZFS_CLOSE(zhp);
- return (1);
+ return (zfs_err_to_be_err(g_zfs));
}
ZFS_CLOSE(zhp);
@@ -447,31 +452,34 @@
/* Get handle to GRUB menu file */
if ((menu_fp = fopen(menu, "r")) == NULL) {
+ err = errno;
be_print_err(gettext("be_remove_grub: "
"failed to open menu.lst (%s)\n"), menu);
- return (1);
+ return (errno_to_be_err(err));
}
/* Create a tmp file for the modified menu.lst */
if ((tmp_menu = (char *)malloc(strlen(menu) + 7)) == NULL) {
be_print_err(gettext("be_remove_grub: malloc failed\n"));
- return (1);
+ return (BE_ERR_NOMEM);
}
(void) memset(tmp_menu, 0, strlen(menu) + 7);
(void) strcpy(tmp_menu, menu);
(void) strcat(tmp_menu, "XXXXXX");
if ((fd = mkstemp(tmp_menu)) == -1) {
+ err = errno;
be_print_err(gettext("be_remove_grub: mkstemp failed\n"));
free(tmp_menu);
fclose(menu_fp);
- return (1);
+ return (errno_to_be_err(err));
}
if ((tmp_menu_fp = fdopen(fd, "w")) == NULL) {
+ err = errno;
be_print_err(gettext("be_remove_grub: "
- "could not open tmp file for write\n"));
+ "could not open tmp file for write: %s\n"), strerror(err));
free(tmp_menu);
fclose(menu_fp);
- return (1);
+ return (errno_to_be_err(err));
}
while (fgets(menu_buf, BUFSIZ, menu_fp)) {
@@ -489,7 +497,7 @@
/* Buffer this line */
if ((buffer = (char **)realloc(buffer,
sizeof (char *)*(nlines + 1))) == NULL)
- return (1);
+ return (BE_ERR_NOMEM);
buffer[nlines++] = strdup(menu_buf);
} else if (write || strncmp(menu_buf, BE_GRUB_COMMENT,
@@ -537,7 +545,7 @@
/* Buffer this 'title' line */
if ((buffer = (char **)realloc(buffer,
sizeof (char *)*(nlines + 1))) == NULL)
- return (1);
+ return (BE_ERR_NOMEM);
buffer[nlines++] = strdup(menu_buf);
} else if (strcmp(tok, "bootfs") == 0) {
@@ -599,7 +607,7 @@
/* Buffer this line */
if ((buffer = (char **)realloc(buffer,
sizeof (char *)*(nlines + 1))) == NULL)
- return (1);
+ return (BE_ERR_NOMEM);
buffer[nlines++] = strdup(menu_buf);
} else if (write) {
/* Write this line out */
@@ -616,11 +624,12 @@
/* Copy the modified menu.lst into place */
if (rename(tmp_menu, menu) != 0) {
+ err = errno;
be_print_err(gettext("be_remove_grub: "
- "failed to rename file %s to %s\n"),
- tmp_menu, menu);
+ "failed to rename file %s to %s: %s\n"),
+ tmp_menu, menu, strerror(err));
free(tmp_menu);
- return (1);
+ return (errno_to_be_err(err));
}
free(tmp_menu);
@@ -646,9 +655,11 @@
/* Get handle to GRUB menu file */
if ((menu_fp = fopen(menu, "r")) == NULL) {
+ err = errno;
be_print_err(gettext("be_remove_grub: "
- "failed to open menu.lst (%s)\n"), menu);
- return (1);
+ "failed to open menu.lst (%s)\n"), menu,
+ strerror(err));
+ return (errno_to_be_err(err));
}
/* Create a tmp file for the modified menu.lst */
@@ -657,24 +668,27 @@
be_print_err(gettext("be_remove_grub: "
"malloc failed\n"));
fclose(menu_fp);
- return (1);
+ return (BE_ERR_NOMEM);
}
(void) memset(tmp_menu, 0, strlen(menu) + 7);
(void) strcpy(tmp_menu, menu);
(void) strcat(tmp_menu, "XXXXXX");
if ((fd = mkstemp(tmp_menu)) == -1) {
+ err = errno;
be_print_err(gettext("be_remove_grub: "
- "mkstemp failed\n"));
+ "mkstemp failed: %s\n"), strerror(err));
fclose(menu_fp);
free(tmp_menu);
- return (1);
+ return (errno_to_be_err(err));
}
if ((tmp_menu_fp = fdopen(fd, "w")) == NULL) {
+ err = errno;
be_print_err(gettext("be_remove_grub: "
- "could not open tmp file for write\n"));
+ "could not open tmp file for write: %s\n"),
+ strerror(err));
fclose(menu_fp);
free(tmp_menu);
- return (1);
+ return (errno_to_be_err(err));
}
while (fgets(menu_buf, BUFSIZ, menu_fp)) {
@@ -706,18 +720,19 @@
/* Copy the modified menu.lst into place */
if (rename(tmp_menu, menu) != 0) {
+ err = errno;
be_print_err(gettext("be_remove_grub: "
- "failed to rename file %s to %s\n"),
- tmp_menu, menu);
+ "failed to rename file %s to %s: %s\n"),
+ tmp_menu, menu, strerror(err));
free(tmp_menu);
- return (1);
+ return (errno_to_be_err(err));
}
free(tmp_menu);
}
}
- return (0);
+ return (BE_SUCCESS);
}
/*
@@ -748,8 +763,8 @@
if ((menu_fp = fopen(grub_file, "r")) == NULL) {
err = errno;
be_print_err(gettext("be_default_grub_bootfs: "
- "failed to open %s file err is %d\n"),
- grub_file, err);
+ "failed to open %s: %s\n"),
+ grub_file, strerror(err));
return (NULL);
}
while (fgets(line, BUFSIZ, menu_fp)) {
@@ -801,7 +816,7 @@
* grub menu can be found.
* Returns:
* 0 - Success
- * 1 - Failure
+ * be_errno_t - Failure
* Scope:
* Semi-private (library wide use only)
*/
@@ -829,34 +844,35 @@
be_print_err(gettext("be_change_grub_default: "
"failed to open %s file err is %d\n"),
grub_file, err);
- return (1);
+ return (errno_to_be_err(err));
}
/* Create a tmp file for the modified menu.lst */
if ((temp_grub = (char *)malloc(strlen(grub_file) + 7)) == NULL) {
be_print_err(gettext("be_change_grub_default: "
"malloc failed\n"));
fclose(grub_fp);
- return (1);
+ return (BE_ERR_NOMEM);
}
(void) memset(temp_grub, 0, strlen(grub_file) + 7);
(void) strcpy(temp_grub, grub_file);
(void) strcat(temp_grub, "XXXXXX");
if ((fd = mkstemp(temp_grub)) == -1) {
+ err = errno;
be_print_err(gettext("be_change_grub_default: "
- "mkstemp failed\n"));
+ "mkstemp failed: %s\n"), strerror(err));
fclose(grub_fp);
free(temp_grub);
- return (1);
+ return (errno_to_be_err(err));
}
if ((temp_fp = fdopen(fd, "w")) == NULL) {
err = errno;
be_print_err(gettext("be_change_grub_default: "
- "failed to open %s file, err is %d\n"),
- temp_grub, err);
+ "failed to open %s file: %s\n"),
+ temp_grub, strerror(err));
close(fd);
fclose(grub_fp);
free(temp_grub);
- return (1);
+ return (errno_to_be_err(err));
}
while (fgets(line, BUFSIZ, grub_fp)) {
@@ -885,7 +901,7 @@
be_print_err(gettext("be_change_grub_default: failed "
"to find entry for %s in the grub menu\n"),
be_name);
- return (1);
+ return (BE_ERR_BE_NOENT);
}
rewind(grub_fp);
@@ -905,10 +921,11 @@
(void) fclose(temp_fp);
if (rename(temp_grub, grub_file) != 0) {
+ err = errno;
be_print_err(gettext("be_change_grub_default: "
- "failed to rename file %s to %s\n"),
- temp_grub, grub_file);
- err = 1;
+ "failed to rename file %s to %s: %s\n"),
+ temp_grub, grub_file, strerror(err));
+ err = errno_to_be_err(err);
}
free(temp_grub);
return (err);
@@ -927,7 +944,7 @@
* it will be set to be_root_pool.
* Returns:
* 0 - Success
- * > 0 - Failure
+ * be_errno_t - Failure
* Scope:
* Semi-private (library wide use only)
*/
@@ -952,8 +969,9 @@
if ((zhp = zfs_open(g_zfs, be_root_pool, ZFS_TYPE_DATASET)) == NULL) {
be_print_err(gettext("be_update_grub: failed to open "
- "pool dataset for %s\n"), be_root_pool);
- return (1);
+ "pool dataset for %s: %s\n"), be_root_pool,
+ libzfs_error_description(g_zfs));
+ return (zfs_err_to_be_err(g_zfs));
}
(void) zfs_prop_get(zhp, ZFS_PROP_MOUNTPOINT, pool_mntpnt,
@@ -969,11 +987,12 @@
be_make_root_ds(be_root_pool, be_new_name, be_new_root_ds,
sizeof (be_new_root_ds));
- menu_fp = fopen(grub_file, "r");
- if (menu_fp == NULL) {
+ if ((menu_fp = fopen(grub_file, "r")) == NULL) {
+ err = errno;
be_print_err(gettext("be_update_grub: failed "
- "to open menu.lst file %s\n"), grub_file);
- return (1);
+ "to open menu.lst file %s: %s\n"), grub_file,
+ strerror(err));
+ return (errno_to_be_err(err));
}
/* Create tmp file for modified menu.lst */
@@ -982,25 +1001,27 @@
be_print_err(gettext("be_update_grub: "
"malloc failed\n"));
fclose(menu_fp);
- return (1);
+ return (BE_ERR_NOMEM);
}
(void) memset(temp_grub, 0, strlen(grub_file) + 7);
(void) strcpy(temp_grub, grub_file);
(void) strcat(temp_grub, "XXXXXX");
if ((tmp_fd = mkstemp(temp_grub)) == -1) {
+ err = errno;
be_print_err(gettext("be_update_grub: "
- "mkstemp failed\n"));
+ "mkstemp failed: %s\n"), strerror(err));
fclose(menu_fp);
free(temp_grub);
- return (1);
+ return (errno_to_be_err(err));
}
if ((new_fp = fdopen(tmp_fd, "w")) == NULL) {
+ err = errno;
be_print_err(gettext("be_update_grub: "
- "fdopen failed\n"));
+ "fdopen failed: %s\n"), strerror(err));
close(tmp_fd);
fclose(menu_fp);
free(temp_grub);
- return (1);
+ return (errno_to_be_err(err));
}
while (fgets(line, BUFSIZ, menu_fp)) {
@@ -1108,10 +1129,11 @@
close(tmp_fd);
if (rename(temp_grub, grub_file) != 0) {
+ err = errno;
be_print_err(gettext("be_update_grub: "
- "failed to rename file %s to %s\n"),
- temp_grub, grub_file);
- err = 1;
+ "failed to rename file %s to %s: %s\n"),
+ temp_grub, grub_file, strerror(err));
+ err = errno_to_be_err(err);
}
free(temp_grub);
@@ -1127,8 +1149,8 @@
* be_root_pool - The pool which contains the grub menu
* entry - A pointer the the entry number of the BE if found.
* Returns:
- * 0 - Success
- * > 0 - Failure
+ * B_TRUE - Success
+ * B_FALSE - Failure
* Scope:
* Semi-private (library wide use only)
*/
@@ -1194,7 +1216,7 @@
* If NULL, then BE is not currently mounted.
* Returns:
* 0 - Success
- * 1 - Failure
+ * be_errno_t - Failure
* Scope:
* Semi-private (library wide use only)
*/
@@ -1215,19 +1237,19 @@
char dev[MAXPATHLEN];
char *c;
int fd;
- int ret = 0;
+ int ret = 0, err = 0;
int i;
boolean_t found_root = B_FALSE;
if (fld == NULL || fld->fs_list == NULL || fld->fs_num == 0)
- return (0);
+ return (BE_SUCCESS);
/* If BE not already mounted, mount the BE */
if (mountpoint == NULL) {
if (_be_mount(be_name, &tmp_mountpoint, 0) != 0) {
be_print_err(gettext("be_update_vfstab: "
"failed to mount BE (%s)\n"), be_name);
- return (1);
+ return (BE_ERR_MOUNT);
}
} else {
tmp_mountpoint = mountpoint;
@@ -1243,17 +1265,21 @@
*/
if ((comments = fopen(alt_vfstab, "r")) == NULL ||
(vfs_ents = fopen(alt_vfstab, "r")) == NULL) {
+ err = errno;
be_print_err(gettext("be_update_vfstab: "
- "failed to open vfstab (%s)\n"), alt_vfstab);
- ret = 1;
+ "failed to open vfstab (%s): %s\n"), alt_vfstab,
+ strerror(err));
+ ret = errno_to_be_err(err);
goto cleanup;
}
/* Grab the stats of the original vfstab file */
if (stat(alt_vfstab, &sb) != 0) {
+ err = errno;
be_print_err(gettext("be_update_vfstab: "
- "failed to stat file %s\n"), alt_vfstab);
- ret = 1;
+ "failed to stat file %s: %s\n"), alt_vfstab,
+ strerror(err));
+ ret = errno_to_be_err(err);
goto cleanup;
}
@@ -1262,23 +1288,25 @@
== NULL) {
be_print_err(gettext("be_update_vfstab: "
"malloc failed\n"));
- ret = 1;
+ ret = BE_ERR_NOMEM;
goto cleanup;
}
(void) memset(tmp_vfstab, 0, strlen(alt_vfstab) + 7);
(void) strcpy(tmp_vfstab, alt_vfstab);
(void) strcat(tmp_vfstab, "XXXXXX");
if ((fd = mkstemp(tmp_vfstab)) == -1) {
+ err = errno;
be_print_err(gettext("be_update_vfstab: "
- "mkstemp failed\n"));
- ret = 1;
+ "mkstemp failed: %s\n"), strerror(err));
+ ret = errno_to_be_err(err);
goto cleanup;
}
if ((tfile = fdopen(fd, "w")) == NULL) {
+ err = errno;
be_print_err(gettext("be_update_vfstab: "
"could not open file for write\n"));
(void) close(fd);
- ret = 1;
+ ret = errno_to_be_err(err);
goto cleanup;
}
@@ -1299,9 +1327,10 @@
* into a vfstab struct.
*/
if (getvfsent(vfs_ents, &vp) != 0) {
+ err = errno;
be_print_err(gettext("be_update_vfstab: "
- "getvfsent failed\n"));
- ret = 1;
+ "getvfsent failed: %s\n"), strerror(err));
+ ret = errno_to_be_err(err);
goto cleanup;
}
@@ -1334,14 +1363,14 @@
(void) strlcpy(dev, vp.vfs_special,
sizeof (dev));
- if (update_dataset(dev, sizeof (dev),
- be_name, zpool) != 0) {
+ if ((ret = update_dataset(dev,
+ sizeof (dev), be_name,
+ zpool)) != 0) {
be_print_err(
gettext("be_update_vfstab: "
"Failed to update device "
"field for vfstab entry "
"%s\n"), fld->fs_list[i]);
- ret = 1;
goto cleanup;
}
@@ -1364,24 +1393,27 @@
/* Copy tmp vfstab into place */
if (rename(tmp_vfstab, alt_vfstab) != 0) {
+ err = errno;
be_print_err(gettext("be_update_vfstab: "
- "failed to rename file %s to %s\n"), tmp_vfstab,
- alt_vfstab);
- ret = 1;
+ "failed to rename file %s to %s: %s\n"), tmp_vfstab,
+ alt_vfstab, strerror(err));
+ ret = errno_to_be_err(err);
goto cleanup;
}
/* Set the perms and ownership of the updated file */
if (chmod(alt_vfstab, sb.st_mode) != 0) {
+ err = errno;
be_print_err(gettext("be_update_vfstab: "
- "failed to chmod %s\n"), alt_vfstab);
- ret = 1;
+ "failed to chmod %s: %s\n"), alt_vfstab, strerror(err));
+ ret = errno_to_be_err(err);
goto cleanup;
}
if (chown(alt_vfstab, sb.st_uid, sb.st_gid) != 0) {
+ err = errno;
be_print_err(gettext("be_update_vfstab: "
- "failed to chown %s\n"), alt_vfstab);
- ret = 1;
+ "failed to chown %s: %s\n"), alt_vfstab, strerror(err));
+ ret = errno_to_be_err(err);
goto cleanup;
}
@@ -1393,9 +1425,10 @@
if (!found_root) {
/* No root entry in vfstab, add it */
if ((fp = fopen(alt_vfstab, "a+")) == NULL) {
+ err = errno;
be_print_err(gettext("be_update_vfstab: "
"failed to open vfstab (%s)\n"), alt_vfstab);
- ret = 1;
+ ret = errno_to_be_err(err);
goto cleanup;
}
@@ -1426,14 +1459,15 @@
/* Unmount BE if we mounted it */
if (mountpoint == NULL) {
- if (_be_unmount(be_name, 0) == 0) {
+ if ((err = _be_unmount(be_name, 0)) == 0) {
/* Remove temporary mountpoint */
rmdir(tmp_mountpoint);
} else {
be_print_err(gettext("be_update_vfstab: "
"failed to unmount BE %s mounted at %s\n"),
be_name, tmp_mountpoint);
- ret = 1;
+ if (ret == 0)
+ ret = err;
}
free(tmp_mountpoint);
@@ -1826,7 +1860,8 @@
/*
* Function: be_print_err
* Description: This function prints out error messages if do_print is
- * set to B_TRUE.
+ * set to B_TRUE or if the BE_PRINT_ERR environment variable
+ * is set to true.
* Paramters:
* prnt_str - the string we wish to print and any arguments
* for the format of that string.
@@ -1840,10 +1875,129 @@
{
va_list ap;
char buf[BUFSIZ];
- va_start(ap, prnt_str);
+ char *env_buf;
+ static boolean_t env_checked = B_FALSE;
+
+ if (!env_checked) {
+ if ((env_buf = getenv("BE_PRINT_ERR")) != NULL) {
+ if (strcasecmp(env_buf, "true") == 0) {
+ do_print = B_TRUE;
+ }
+ }
+ env_checked = B_TRUE;
+ }
+
if (do_print) {
+ va_start(ap, prnt_str);
(void) vsprintf(buf, prnt_str, ap);
(void) fprintf(stderr, buf);
+ va_end(ap);
+ }
+}
+
+
+/*
+ * Function: zfs_err_to_be_err
+ * Description: This function takes the error stored in the libzfs handle
+ * and maps it to an be_errno_t. If there are no matching
+ * be_errno_t's then BE_ERR_ZFS is returned.
+ * Paramters:
+ * zfsh - The libzfs handle containing the error we're looking up.
+ * Returns:
+ * be_errno_t
+ * Scope:
+ * Semi-private (library wide use only)
+ */
+int
+zfs_err_to_be_err(libzfs_handle_t *zfsh)
+{
+ int err = libzfs_errno(zfsh);
+ switch (err) {
+ case EZFS_PERM:
+ return (BE_ERR_PERM);
+ case EZFS_INTR:
+ return (BE_ERR_INTR);
+ case EZFS_NOENT:
+ return (BE_ERR_NOENT);
+ case EZFS_NOSPC:
+ return (BE_ERR_NOSPC);
+ case EZFS_MOUNTFAILED:
+ return (BE_ERR_MOUNT);
+ case EZFS_UMOUNTFAILED:
+ return (BE_ERR_UMOUNT);
+ case EZFS_EXISTS:
+ return (BE_ERR_EXISTS);
+ case EZFS_BUSY:
+ return (BE_ERR_BUSY);
+ case EZFS_PERMRDONLY:
+ return (BE_ERR_ROFS);
+ case EZFS_NAMETOOLONG:
+ return (BE_ERR_NAMETOOLONG);
+ case EZFS_NODEVICE:
+ return (BE_ERR_NODEV);
+ case EZFS_POOL_INVALARG:
+ return (BE_ERR_INVAL);
+ case EZFS_PROPTYPE:
+ return (BE_ERR_INVALPROP);
+ case EZFS_BADTYPE:
+ return (BE_ERR_DSTYPE);
+ case EZFS_PROPNONINHERIT:
+ return (BE_ERR_NONINHERIT);
+ case EZFS_PROPREADONLY:
+ return (BE_ERR_READONLYPROP);
+ case EZFS_RESILVERING:
+ case EZFS_POOLUNAVAIL:
+ return (BE_ERR_UNAVAIL);
+ case EZFS_DSREADONLY:
+ return (BE_ERR_READONLYDS);
+ default:
+ return (BE_ERR_ZFS);
+ }
+}
+
+/*
+ * Function: errno_to_be_err
+ * Description: This function takes an errno and maps it to an be_errno_t.
+ * If there are no matching be_errno_t's then BE_ERR_UNKNOWN is
+ * returned.
+ * Paramters:
+ * err - The errno we're compairing against.
+ * Returns:
+ * be_errno_t
+ * Scope:
+ * Semi-private (library wide use only)
+ */
+int
+errno_to_be_err(int err)
+{
+ switch (err) {
+ case EPERM:
+ return (BE_ERR_PERM);
+ case EACCES:
+ return (BE_ERR_ACCESS);
+ case ECANCELED:
+ return (BE_ERR_CANCELED);
+ case EINTR:
+ return (BE_ERR_INTR);
+ case ENOENT:
+ return (BE_ERR_NOENT);
+ case ENOSPC:
+ case EDQUOT:
+ return (BE_ERR_NOSPC);
+ case EEXIST:
+ return (BE_ERR_EXISTS);
+ case EBUSY:
+ return (BE_ERR_BUSY);
+ case EROFS:
+ return (BE_ERR_ROFS);
+ case ENAMETOOLONG:
+ return (BE_ERR_NAMETOOLONG);
+ case ENXIO:
+ return (BE_ERR_NXIO);
+ case EINVAL:
+ return (BE_ERR_INVAL);
+ default:
+ return (BE_ERR_UNKNOWN);
}
}
@@ -1863,7 +2017,7 @@
* zpool - name of new zpool to update to.
* Returns:
* 0 - Success
- * 1 - Failure
+ * be_errno_t - Failure
* Scope:
* Private
*/
@@ -1875,7 +2029,7 @@
/* Tear off the BE container dataset */
if ((ds = be_make_name_from_ds(dataset)) == NULL) {
- return (1);
+ return (BE_ERR_INVAL);
}
/* Get dataset name relative to BE root, if there is one */
@@ -1889,5 +2043,5 @@
(void) strlcat(dataset, sub_ds, dataset_len);
free(ds);
- return (0);
+ return (BE_SUCCESS);
}
--- a/usr/src/lib/libbe/libbe.h Thu May 29 15:37:15 2008 -0700
+++ b/usr/src/lib/libbe/libbe.h Wed Jun 04 15:59:15 2008 -0600
@@ -56,13 +56,45 @@
enum {
BE_SUCCESS = 0,
BE_ERR_ACCESS = 4000, /* permission denied */
+ BE_ERR_AUTONAME, /* auto naming failed */
BE_ERR_BUSY, /* mount busy */
+ BE_ERR_CANCELED, /* operation canceled */
+ BE_ERR_CLONE, /* BE clone failed */
+ BE_ERR_COPY, /* BE copy failed */
+ BE_ERR_CREATDS, /* dataset creation failed */
+ BE_ERR_DESTROY, /* failed to destroy BE or snapshot */
+ BE_ERR_DEMOTE, /* BE demotion failed */
+ BE_ERR_DSTYPE, /* invalid dataset type */
BE_ERR_EXISTS, /* BE exists */
+ BE_ERR_INIT, /* be_zfs_init failed */
+ BE_ERR_INTR, /* interupted system call */
BE_ERR_INVAL, /* invalid argument */
+ BE_ERR_INVALPROP, /* invalid property for dataset */
+ BE_ERR_INVALMOUNTPOINT, /* Unexspected mountpoint */
+ BE_ERR_MOUNT, /* mount failed */
+ BE_ERR_MOUNTED, /* already mounted */
BE_ERR_NAMETOOLONG, /* name > BUFSIZ */
- BE_ERR_NOENT, /* No such BE */
+ BE_ERR_NOENT, /* Doesn't exist */
+ BE_ERR_POOL_NOENT, /* No such pool */
+ BE_ERR_BE_NOENT, /* No such BE */
+ BE_ERR_SS_NOENT, /* No such snapshot */
+ BE_ERR_NODEV, /* No such device */
+ BE_ERR_NOTMOUNTED, /* File system not mounted */
BE_ERR_NOMEM, /* not enough memory */
+ BE_ERR_NONINHERIT, /* property is not inheritable for BE dataset */
+ BE_ERR_NXIO, /* No such device or address */
+ BE_ERR_NOSPC, /* No space on device */
+ BE_ERR_NOTSUP, /* Operation not supported */
+ BE_ERR_OPEN, /* open failed */
BE_ERR_PERM, /* Not owner */
+ BE_ERR_UNAVAIL, /* The BE is currently unavailable */
+ BE_ERR_PROMOTE, /* BE promotion failed */
+ BE_ERR_ROFS, /* read only file system */
+ BE_ERR_READONLYDS, /* read only dataset */
+ BE_ERR_READONLYPROP, /* read only property */
+ BE_ERR_UMOUNT, /* unmount failed */
+ BE_ERR_UNKNOWN, /* Unknown external error */
+ BE_ERR_ZFS, /* ZFS returned an error */
} be_errno_t;
/*
--- a/usr/src/lib/libbe/libbe_priv.h Thu May 29 15:37:15 2008 -0700
+++ b/usr/src/lib/libbe/libbe_priv.h Wed Jun 04 15:59:15 2008 -0600
@@ -135,6 +135,8 @@
boolean_t be_valid_auto_snap_name(char *);
boolean_t be_valid_be_name(char *);
void be_print_err(char *, ...);
+int zfs_err_to_be_err(libzfs_handle_t *);
+int errno_to_be_err(int);
/* callback functions */
int be_exists_callback(zpool_handle_t *, void *);