diff options
Diffstat (limited to 'usr/src/lib')
-rw-r--r-- | usr/src/lib/libbe/common/be_activate.c | 153 | ||||
-rw-r--r-- | usr/src/lib/libbe/common/libbe.h | 13 | ||||
-rw-r--r-- | usr/src/lib/libbe/common/mapfile-vers | 1 | ||||
-rw-r--r-- | usr/src/lib/libmd/Makefile | 3 | ||||
-rw-r--r-- | usr/src/lib/libmd/Makefile.com | 9 | ||||
-rw-r--r-- | usr/src/lib/libmd/Makefile.targ | 9 | ||||
-rw-r--r-- | usr/src/lib/libmd/amd64/Makefile | 4 | ||||
-rw-r--r-- | usr/src/lib/libmd/common/mapfile-vers | 26 | ||||
-rw-r--r-- | usr/src/lib/libmd/common/skein.h | 31 | ||||
-rw-r--r-- | usr/src/lib/libmd/i386/Makefile | 4 | ||||
-rw-r--r-- | usr/src/lib/libmd/inc.flg | 4 | ||||
-rw-r--r-- | usr/src/lib/libmd/sparc/Makefile | 4 | ||||
-rw-r--r-- | usr/src/lib/libmd/sparcv9/Makefile | 4 | ||||
-rw-r--r-- | usr/src/lib/libzfs/common/libzfs_dataset.c | 6 |
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); } |