summaryrefslogtreecommitdiff
path: root/usr/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib')
-rw-r--r--usr/src/lib/libbe/common/be_activate.c153
-rw-r--r--usr/src/lib/libbe/common/libbe.h13
-rw-r--r--usr/src/lib/libbe/common/mapfile-vers1
-rw-r--r--usr/src/lib/libmd/Makefile3
-rw-r--r--usr/src/lib/libmd/Makefile.com9
-rw-r--r--usr/src/lib/libmd/Makefile.targ9
-rw-r--r--usr/src/lib/libmd/amd64/Makefile4
-rw-r--r--usr/src/lib/libmd/common/mapfile-vers26
-rw-r--r--usr/src/lib/libmd/common/skein.h31
-rw-r--r--usr/src/lib/libmd/i386/Makefile4
-rw-r--r--usr/src/lib/libmd/inc.flg4
-rw-r--r--usr/src/lib/libmd/sparc/Makefile4
-rw-r--r--usr/src/lib/libmd/sparcv9/Makefile4
-rw-r--r--usr/src/lib/libzfs/common/libzfs_dataset.c6
14 files changed, 242 insertions, 29 deletions
diff --git a/usr/src/lib/libbe/common/be_activate.c b/usr/src/lib/libbe/common/be_activate.c
index 985a585094..6eda8eebba 100644
--- a/usr/src/lib/libbe/common/be_activate.c
+++ b/usr/src/lib/libbe/common/be_activate.c
@@ -55,8 +55,8 @@ static int set_bootfs(char *boot_rpool, char *be_root_ds);
static int set_canmount(be_node_list_t *, char *);
static boolean_t be_do_install_mbr(char *, nvlist_t *);
static int be_do_installboot_helper(zpool_handle_t *, nvlist_t *, char *,
- char *);
-static int be_do_installboot(be_transaction_data_t *);
+ char *, uint16_t);
+static int be_do_installboot(be_transaction_data_t *, uint16_t);
static int be_get_grub_vers(be_transaction_data_t *, char **, char **);
static int get_ver_from_capfile(char *, char **);
static int be_promote_zone_ds(char *, char *);
@@ -119,6 +119,82 @@ be_activate(nvlist_t *be_attrs)
return (ret);
}
+/*
+ * Function: be_installboot
+ * Description: Calls be_do_installboot to install/update bootloader on
+ * pool passed in through be_attrs. The primary consumer is
+ * bootadm command to avoid duplication of the code.
+ * Parameters:
+ * be_attrs - pointer to nvlist_t of attributes being passed in.
+ * The following attribute values are used:
+ *
+ * BE_ATTR_ORIG_BE_NAME *required
+ * BE_ATTR_ORIG_BE_POOL *required
+ * BE_ATTR_ORIG_BE_ROOT *required
+ * BE_ATTR_INSTALL_FLAGS optional
+ *
+ * Return:
+ * BE_SUCCESS - Success
+ * be_errno_t - Failure
+ * Scope:
+ * Public
+ */
+int
+be_installboot(nvlist_t *be_attrs)
+{
+ int ret = BE_SUCCESS;
+ uint16_t flags = 0;
+ uint16_t verbose;
+ be_transaction_data_t bt = { 0 };
+
+ /* Get flags */
+ if (nvlist_lookup_pairs(be_attrs, NV_FLAG_NOENTOK,
+ BE_ATTR_INSTALL_FLAGS, DATA_TYPE_UINT16, &flags, NULL) != 0) {
+ be_print_err(gettext("be_installboot: failed to lookup "
+ "BE_ATTR_INSTALL_FLAGS attribute\n"));
+ return (BE_ERR_INVAL);
+ }
+
+ /* Set verbose early, so we get all messages */
+ verbose = flags & BE_INSTALLBOOT_FLAG_VERBOSE;
+ if (verbose == BE_INSTALLBOOT_FLAG_VERBOSE)
+ libbe_print_errors(B_TRUE);
+
+ ret = nvlist_lookup_string(be_attrs, BE_ATTR_ORIG_BE_NAME,
+ &bt.obe_name);
+ if (ret != 0) {
+ be_print_err(gettext("be_installboot: failed to "
+ "lookup BE_ATTR_ORIG_BE_NAME attribute\n"));
+ return (BE_ERR_INVAL);
+ }
+
+ ret = nvlist_lookup_string(be_attrs, BE_ATTR_ORIG_BE_POOL,
+ &bt.obe_zpool);
+ if (ret != 0) {
+ be_print_err(gettext("be_installboot: failed to "
+ "lookup BE_ATTR_ORIG_BE_POOL attribute\n"));
+ return (BE_ERR_INVAL);
+ }
+
+ ret = nvlist_lookup_string(be_attrs, BE_ATTR_ORIG_BE_ROOT,
+ &bt.obe_root_ds);
+ if (ret != 0) {
+ be_print_err(gettext("be_installboot: failed to "
+ "lookup BE_ATTR_ORIG_BE_ROOT attribute\n"));
+ return (BE_ERR_INVAL);
+ }
+
+ /* Initialize libzfs handle */
+ if (!be_zfs_init())
+ return (BE_ERR_INIT);
+
+ ret = be_do_installboot(&bt, flags);
+
+ be_zfs_fini();
+
+ return (ret);
+}
+
/* ******************************************************************** */
/* Semi Private Functions */
/* ******************************************************************** */
@@ -175,7 +251,8 @@ _be_activate(char *be_name)
cb.obe_root_ds = strdup(root_ds);
if (getzoneid() == GLOBAL_ZONEID) {
- if ((ret = be_do_installboot(&cb)) != BE_SUCCESS)
+ ret = be_do_installboot(&cb, BE_INSTALLBOOT_FLAG_NULL);
+ if (ret != BE_SUCCESS)
return (ret);
if (!be_has_menu_entry(root_ds, cb.obe_zpool, &entry)) {
@@ -794,14 +871,16 @@ be_do_install_mbr(char *diskname, nvlist_t *child)
static int
be_do_installboot_helper(zpool_handle_t *zphp, nvlist_t *child, char *stage1,
- char *stage2)
+ char *stage2, uint16_t flags)
{
char install_cmd[MAXPATHLEN];
char be_run_cmd_errbuf[BUFSIZ];
+ char be_run_cmd_outbuf[BUFSIZ];
char diskname[MAXPATHLEN];
char *vname;
char *path, *dsk_ptr;
char *flag = "";
+ int ret;
if (nvlist_lookup_string(child, ZPOOL_CONFIG_PATH, &path) != 0) {
be_print_err(gettext("be_do_installboot: "
@@ -836,31 +915,60 @@ be_do_installboot_helper(zpool_handle_t *zphp, nvlist_t *child, char *stage1,
}
if (be_is_isa("i386")) {
- if (be_do_install_mbr(diskname, child))
- flag = "-m -f";
+ uint16_t force = flags & BE_INSTALLBOOT_FLAG_FORCE;
+ uint16_t mbr = flags & BE_INSTALLBOOT_FLAG_MBR;
+
+ if (force == BE_INSTALLBOOT_FLAG_FORCE) {
+ if (mbr == BE_INSTALLBOOT_FLAG_MBR ||
+ be_do_install_mbr(diskname, child))
+ flag = "-F -m -f";
+ else
+ flag = "-F";
+ } else {
+ if (mbr == BE_INSTALLBOOT_FLAG_MBR ||
+ be_do_install_mbr(diskname, child))
+ flag = "-m -f";
+ }
+
(void) snprintf(install_cmd, sizeof (install_cmd),
"%s %s %s %s %s", BE_INSTALL_GRUB, flag,
stage1, stage2, diskname);
} else {
- flag = "-F zfs";
+ if ((flags & BE_INSTALLBOOT_FLAG_FORCE) ==
+ BE_INSTALLBOOT_FLAG_FORCE)
+ flag = "-f -F zfs";
+ else
+ flag = "-F zfs";
+
(void) snprintf(install_cmd, sizeof (install_cmd),
"%s %s %s %s", BE_INSTALL_BOOT, flag, stage2, diskname);
}
- if (be_run_cmd(install_cmd, be_run_cmd_errbuf, BUFSIZ, NULL, 0)
- != BE_SUCCESS) {
+ *be_run_cmd_outbuf = '\0';
+ *be_run_cmd_errbuf = '\0';
+
+ ret = be_run_cmd(install_cmd, be_run_cmd_errbuf, BUFSIZ,
+ be_run_cmd_outbuf, BUFSIZ);
+
+ if (ret != BE_SUCCESS) {
be_print_err(gettext("be_do_installboot: install "
"failed for device %s.\n"), vname);
- /* Assume localized cmd err output. */
- be_print_err(gettext(" Command: \"%s\"\n"),
- install_cmd);
+ ret = BE_ERR_BOOTFILE_INST;
+ }
+
+ be_print_err(gettext(" Command: \"%s\"\n"), install_cmd);
+ if (be_run_cmd_outbuf[0] != 0) {
+ be_print_err(gettext(" Output:\n"));
+ be_print_err("%s", be_run_cmd_outbuf);
+ }
+
+ if (be_run_cmd_errbuf[0] != 0) {
+ be_print_err(gettext(" Errors:\n"));
be_print_err("%s", be_run_cmd_errbuf);
- free(vname);
- return (BE_ERR_BOOTFILE_INST);
}
free(vname);
- return (BE_SUCCESS);
+ return (ret);
}
/*
@@ -1069,6 +1177,7 @@ be_is_install_needed(be_transaction_data_t *bt, boolean_t *update)
*
* Parameters:
* bt - The transaction data for the BE we're activating.
+ * flags - flags for bootloader install
* Return:
* BE_SUCCESS - Success
* be_errno_t - Failure
@@ -1077,7 +1186,7 @@ be_is_install_needed(be_transaction_data_t *bt, boolean_t *update)
* Private
*/
static int
-be_do_installboot(be_transaction_data_t *bt)
+be_do_installboot(be_transaction_data_t *bt, uint16_t flags)
{
zpool_handle_t *zphp = NULL;
zfs_handle_t *zhp = NULL;
@@ -1096,9 +1205,11 @@ be_do_installboot(be_transaction_data_t *bt)
* version implementation like grub. Embedded versioning is
* checked by actual installer.
*/
- ret = be_is_install_needed(bt, &update);
- if (ret != BE_SUCCESS || update == B_FALSE)
- return (ret);
+ if ((flags & BE_INSTALLBOOT_FLAG_FORCE) != BE_INSTALLBOOT_FLAG_FORCE) {
+ ret = be_is_install_needed(bt, &update);
+ if (ret != BE_SUCCESS || update == B_FALSE)
+ return (ret);
+ }
if ((zhp = zfs_open(g_zfs, bt->obe_root_ds, ZFS_TYPE_FILESYSTEM)) ==
NULL) {
@@ -1205,7 +1316,7 @@ be_do_installboot(be_transaction_data_t *bt)
for (i = 0; i < nchildren; i++) {
ret = be_do_installboot_helper(zphp, nvchild[i],
- stage1, stage2);
+ stage1, stage2, flags);
if (ret != BE_SUCCESS)
goto done;
}
@@ -1213,7 +1324,7 @@ be_do_installboot(be_transaction_data_t *bt)
free(vname);
ret = be_do_installboot_helper(zphp, child[c], stage1,
- stage2);
+ stage2, flags);
if (ret != BE_SUCCESS)
goto done;
}
diff --git a/usr/src/lib/libbe/common/libbe.h b/usr/src/lib/libbe/common/libbe.h
index c5662893a2..994bc881ac 100644
--- a/usr/src/lib/libbe/common/libbe.h
+++ b/usr/src/lib/libbe/common/libbe.h
@@ -42,6 +42,7 @@ extern "C" {
#define BE_ATTR_ORIG_BE_NAME "orig_be_name"
#define BE_ATTR_ORIG_BE_POOL "orig_be_pool"
+#define BE_ATTR_ORIG_BE_ROOT "orig_be_root"
#define BE_ATTR_SNAP_NAME "snap_name"
#define BE_ATTR_NEW_BE_NAME "new_be_name"
@@ -59,6 +60,7 @@ extern "C" {
#define BE_ATTR_MOUNT_FLAGS "mount_flags"
#define BE_ATTR_UNMOUNT_FLAGS "unmount_flags"
#define BE_ATTR_DESTROY_FLAGS "destroy_flags"
+#define BE_ATTR_INSTALL_FLAGS "install_flags"
#define BE_ATTR_ROOT_DS "root_ds"
#define BE_ATTR_UUID_STR "uuid_str"
@@ -205,6 +207,12 @@ typedef struct be_node_list {
#define BE_DESTROY_FLAG_SNAPSHOTS 0x00000001
#define BE_DESTROY_FLAG_FORCE_UNMOUNT 0x00000002
+/* Flags for installboot */
+#define BE_INSTALLBOOT_FLAG_NULL 0x00000000
+#define BE_INSTALLBOOT_FLAG_MBR 0x00000001
+#define BE_INSTALLBOOT_FLAG_FORCE 0x00000002
+#define BE_INSTALLBOOT_FLAG_VERBOSE 0x00000004
+
/* sort rules for be_sort() */
typedef enum {
BE_SORT_UNSPECIFIED = -1,
@@ -244,6 +252,11 @@ char *be_err_to_str(int);
int be_sort(be_node_list_t **, int);
/*
+ * Installboot support
+ */
+int be_installboot(nvlist_t *);
+
+/*
* Library functions
*/
void libbe_print_errors(boolean_t);
diff --git a/usr/src/lib/libbe/common/mapfile-vers b/usr/src/lib/libbe/common/mapfile-vers
index 0e57583dab..0602bd7de3 100644
--- a/usr/src/lib/libbe/common/mapfile-vers
+++ b/usr/src/lib/libbe/common/mapfile-vers
@@ -49,6 +49,7 @@ SYMBOL_VERSION SUNWprivate_1.1 {
be_err_to_str;
be_free_list;
be_init;
+ be_installboot;
be_list;
be_mount;
be_rename;
diff --git a/usr/src/lib/libmd/Makefile b/usr/src/lib/libmd/Makefile
index ddd89d7382..137586aef6 100644
--- a/usr/src/lib/libmd/Makefile
+++ b/usr/src/lib/libmd/Makefile
@@ -21,6 +21,7 @@
#
# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright 2013 Saso Kiselkov. All rights reserved.
#
include $(SRC)/lib/Makefile.lib
@@ -29,7 +30,7 @@ $(SPARC_BLD)CAPDIR = capabilities
SUBDIRS= $(MACH) $(BUILD64) $(MACH64)
-HDRS = md4.h md5.h sha1.h sha2.h
+HDRS = md4.h md5.h sha1.h sha2.h skein.h
HDRDIR = common
all := TARGET= all
diff --git a/usr/src/lib/libmd/Makefile.com b/usr/src/lib/libmd/Makefile.com
index af8cac390b..9d2458f918 100644
--- a/usr/src/lib/libmd/Makefile.com
+++ b/usr/src/lib/libmd/Makefile.com
@@ -21,13 +21,18 @@
#
# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright 2013 Saso Kiselkov. All rights reserved.
#
LIBS = $(DYNLIB) $(LINTLIB)
-SRCS = $(COMDIR)/md4/md4.c \
+SRCS = $(COMDIR)/edonr/edonr.c \
+ $(COMDIR)/md4/md4.c \
$(COMDIR)/md5/md5.c \
$(COMDIR)/sha1/sha1.c \
- $(COMDIR)/sha2/sha2.c
+ $(COMDIR)/sha2/sha2.c \
+ $(COMDIR)/skein/skein.c \
+ $(COMDIR)/skein/skein_block.c \
+ $(COMDIR)/skein/skein_iv.c
COMDIR = $(SRC)/common/crypto
SRCDIR = ../common
diff --git a/usr/src/lib/libmd/Makefile.targ b/usr/src/lib/libmd/Makefile.targ
index 58ec7b30e5..fadc3d71ad 100644
--- a/usr/src/lib/libmd/Makefile.targ
+++ b/usr/src/lib/libmd/Makefile.targ
@@ -21,10 +21,15 @@
#
# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright 2013 Saso Kiselkov. All rights reserved.
#
COMDIR = $(SRC)/common/crypto
+pics/%.o: $(COMDIR)/edonr/%.c
+ $(COMPILE.c) -I$(COMDIR)/edonr -o $@ $<
+ $(POST_PROCESS_O)
+
pics/%.o: $(COMDIR)/md4/%.c
$(COMPILE.c) -I$(COMDIR)/md4 -o $@ $<
$(POST_PROCESS_O)
@@ -46,4 +51,8 @@ pics/%.o: $(COMDIR)/sha2/%.c
$(COMPILE.c) -I$(COMDIR)/sha2 -o $@ $<
$(POST_PROCESS_O)
+pics/%.o: $(COMDIR)/skein/%.c
+ $(COMPILE.c) -I$(COMDIR)/skein -o $@ $<
+ $(POST_PROCESS_O)
+
include $(SRC)/lib/Makefile.targ
diff --git a/usr/src/lib/libmd/amd64/Makefile b/usr/src/lib/libmd/amd64/Makefile
index 3872749fbb..8ac0b15a30 100644
--- a/usr/src/lib/libmd/amd64/Makefile
+++ b/usr/src/lib/libmd/amd64/Makefile
@@ -20,12 +20,14 @@
#
#
# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright 2013 Saso Kiselkov. All rights reserved.
#
LIBRARY = libmd.a
VERS = .1
-OBJECTS = md4.o md5.o sha1.o sha2.o
+OBJECTS = edonr.o md4.o md5.o sha1.o sha2.o \
+ skein.o skein_block.o skein_iv.o
include $(SRC)/lib/Makefile.lib
include $(SRC)/lib/Makefile.rootfs
diff --git a/usr/src/lib/libmd/common/mapfile-vers b/usr/src/lib/libmd/common/mapfile-vers
index a70144e833..f0b225235b 100644
--- a/usr/src/lib/libmd/common/mapfile-vers
+++ b/usr/src/lib/libmd/common/mapfile-vers
@@ -20,6 +20,7 @@
#
#
# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright 2013 Saso Kiselkov. All rights reserved.
#
#
@@ -50,6 +51,31 @@ $mapfile_version 2
# ELF section. As a result, ld will put the two main symbols in.
#
+SYMBOL_VERSION ILLUMOS_0.1 {
+ global:
+ Skein1024_Final;
+ Skein1024_Final_Pad;
+ Skein1024_Init;
+ Skein1024_InitExt;
+ Skein1024_Output;
+ Skein1024_Update;
+ Skein_256_Final;
+ Skein_256_Final_Pad;
+ Skein_256_Init;
+ Skein_256_InitExt;
+ Skein_256_Output;
+ Skein_256_Update;
+ Skein_512_Final;
+ Skein_512_Final_Pad;
+ Skein_512_Init;
+ Skein_512_InitExt;
+ Skein_512_Output;
+ Skein_512_Update;
+ EdonRFinal;
+ EdonRHash;
+ EdonRInit;
+ EdonRUpdate;
+} SUNW_1.1;
SYMBOL_VERSION SUNW_1.1 {
global:
diff --git a/usr/src/lib/libmd/common/skein.h b/usr/src/lib/libmd/common/skein.h
new file mode 100644
index 0000000000..f341b96776
--- /dev/null
+++ b/usr/src/lib/libmd/common/skein.h
@@ -0,0 +1,31 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * 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 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 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]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2013 Saso Kiselkov. All rights reserved.
+ */
+
+#ifndef _SKEIN_H
+#define _SKEIN_H
+
+#include <sys/skein.h>
+
+#endif /* _SKEIN_H */
diff --git a/usr/src/lib/libmd/i386/Makefile b/usr/src/lib/libmd/i386/Makefile
index 3e6fe00e17..d7827814d6 100644
--- a/usr/src/lib/libmd/i386/Makefile
+++ b/usr/src/lib/libmd/i386/Makefile
@@ -21,12 +21,14 @@
#
# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright 2013 Saso Kiselkov. All rights reserved.
#
LIBRARY = libmd.a
VERS = .1
-OBJECTS = md4.o md5.o sha1.o sha2.o
+OBJECTS = edonr.o md4.o md5.o sha1.o sha2.o \
+ skein.o skein_block.o skein_iv.o
include $(SRC)/lib/Makefile.lib
include $(SRC)/lib/Makefile.rootfs
diff --git a/usr/src/lib/libmd/inc.flg b/usr/src/lib/libmd/inc.flg
index 2652430b84..05c340cfd3 100644
--- a/usr/src/lib/libmd/inc.flg
+++ b/usr/src/lib/libmd/inc.flg
@@ -23,9 +23,11 @@
# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#ident "%Z%%M% %I% %E% SMI"
+# Copyright 2013 Saso Kiselkov. All rights reserved.
+find_files "s.*" usr/src/common/crypto/edonr
find_files "s.*" usr/src/common/crypto/md4
find_files "s.*" usr/src/common/crypto/md5
find_files "s.*" usr/src/common/crypto/sha1
find_files "s.*" usr/src/common/crypto/sha2
+find_files "s.*" usr/src/common/crypto/skein
diff --git a/usr/src/lib/libmd/sparc/Makefile b/usr/src/lib/libmd/sparc/Makefile
index 5f491cc9af..8260480325 100644
--- a/usr/src/lib/libmd/sparc/Makefile
+++ b/usr/src/lib/libmd/sparc/Makefile
@@ -20,12 +20,14 @@
#
#
# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright 2013 Saso Kiselkov. All rights reserved.
#
LIBRARY = libmd.a
VERS = .1
-OBJECTS = md4.o md5.o sha1.o sha2.o
+OBJECTS = edonr.o md4.o md5.o sha1.o sha2.o \
+ skein.o skein_block.o skein_iv.o
include $(SRC)/lib/Makefile.lib
include $(SRC)/lib/Makefile.rootfs
diff --git a/usr/src/lib/libmd/sparcv9/Makefile b/usr/src/lib/libmd/sparcv9/Makefile
index 5dd3f2eac3..a57dcf95f8 100644
--- a/usr/src/lib/libmd/sparcv9/Makefile
+++ b/usr/src/lib/libmd/sparcv9/Makefile
@@ -20,12 +20,14 @@
#
#
# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright 2013 Saso Kiselkov. All rights reserved.
#
LIBRARY = libmd.a
VERS = .1
-OBJECTS = md4.o md5.o sha1.o sha2.o
+OBJECTS = edonr.o md4.o md5.o sha1.o sha2.o \
+ skein.o skein_block.o skein_iv.o
include $(SRC)/lib/Makefile.lib
include $(SRC)/lib/Makefile.rootfs
diff --git a/usr/src/lib/libzfs/common/libzfs_dataset.c b/usr/src/lib/libzfs/common/libzfs_dataset.c
index f240b6494f..633850d316 100644
--- a/usr/src/lib/libzfs/common/libzfs_dataset.c
+++ b/usr/src/lib/libzfs/common/libzfs_dataset.c
@@ -1468,6 +1468,12 @@ zfs_setprop_error(libzfs_handle_t *hdl, zfs_prop_t prop, int err,
"property setting is not allowed on "
"bootable datasets"));
(void) zfs_error(hdl, EZFS_NOTSUP, errbuf);
+ } else if (prop == ZFS_PROP_CHECKSUM ||
+ prop == ZFS_PROP_DEDUP) {
+ (void) zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
+ "property setting is not allowed on "
+ "root pools"));
+ (void) zfs_error(hdl, EZFS_NOTSUP, errbuf);
} else {
(void) zfs_standard_error(hdl, err, errbuf);
}