1817 libbe should return error codes defined in libbe.h
authorevanl
Wed, 04 Jun 2008 15:59:15 -0600
changeset 159 33a6226817d5
parent 158 ad7c6c297ed2
child 160 fa00ad757703
1817 libbe should return error codes defined in libbe.h
usr/src/lib/libbe/Makefile
usr/src/lib/libbe/be_activate.c
usr/src/lib/libbe/be_create.c
usr/src/lib/libbe/be_list.c
usr/src/lib/libbe/be_mount.c
usr/src/lib/libbe/be_rename.c
usr/src/lib/libbe/be_snapshot.c
usr/src/lib/libbe/be_utils.c
usr/src/lib/libbe/libbe.h
usr/src/lib/libbe/libbe_priv.h
--- 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 *);