beadm.c revision 7e0e2549bfaa531aff576083ab0c07f84fa8fb27
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * CDDL HEADER START
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * The contents of this file are subject to the terms of the
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * Common Development and Distribution License (the "License").
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * You may not use this file except in compliance with the License.
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * or http://www.opensolaris.org/os/licensing.
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * See the License for the specific language governing permissions
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * and limitations under the License.
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * When distributing Covered Code, include this CDDL HEADER in each
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * If applicable, add the following below this CDDL HEADER, with the
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * fields enclosed by brackets "[]" replaced with your own identifying
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * information: Portions Copyright [yyyy] [name of copyright owner]
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * CDDL HEADER END
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * System includes
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko#define _(x) (x)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int be_do_activate(int argc, char **argv);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int be_do_create(int argc, char **argv);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int be_do_destroy(int argc, char **argv);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int be_do_list(int argc, char **argv);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int be_do_mount(int argc, char **argv);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int be_do_unmount(int argc, char **argv);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int be_do_rename(int argc, char **argv);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int be_do_rollback(int argc, char **argv);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic void usage(void);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * single column name/width output format description
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * all columns output format
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * type of possible output formats
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * command handler description
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * sorted list of be commands
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenkostatic const be_command_t be_command_tbl[] = {
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko { "umount", be_do_unmount }, /* unmount alias */
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "\tbeadm subcommand cmd_options\n"
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "\tsubcommands:\n"
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin "\tbeadm activate [-v] beName\n"
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin "\tbeadm create [-a] [-d BE_desc]\n"
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "\t\t[-o property=value] ... [-p zpool] \n"
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin "\t\t[-e nonActiveBe | beName@snapshot] [-v] beName\n"
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "\tbeadm create [-d BE_desc]\n"
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin "\t\t[-o property=value] ... [-p zpool] [-v] beName@snapshot\n"
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin "\tbeadm destroy [-Ffsv] beName \n"
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin "\tbeadm destroy [-Fv] beName@snapshot \n"
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin "\tbeadm list [[-a] | [-d] [-s]] [-H] [-v] [beName]\n"
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin "\tbeadm mount [-s ro|rw] [-v] beName [mountpoint]\n"
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin "\tbeadm unmount [-fv] beName | mountpoint\n"
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin "\tbeadm umount [-fv] beName | mountpoint\n"
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin "\tbeadm rename [-v] origBeName newBeName\n"
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin "\tbeadm rollback [-v] beName snapshot\n"
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin "\tbeadm rollback [-v] beName@snapshot\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkorun_be_cmd(const char *cmdname, int argc, char **argv)
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko for (command = &be_command_tbl[0]; command->name != NULL; command++)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (strcmp(command->name, cmdname) == 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Invalid command: %s\n"), cmdname);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko /* Turn error printing off */
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (run_be_cmd(cmdname, --argc, ++argv));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko for (i = 0; i < NUM_COLS; i++) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko struct col_info *col_info = &hdr_info->cols[i];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkoinit_hdr_cols(enum be_fmt be_fmt, struct hdr_info *hdr)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko col[0].col_name = _("BE/Dataset/Snapshot");
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko for (i = 0; i < NUM_COLS; i++) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko size_t sz = mbstowcs(wname, name, sizeof (wname) /
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkonicenum(uint64_t num, char *buf, size_t buflen)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko while (n >= 1024) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) snprintf(buf, buflen, "%llu", n);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko for (i = 2; i >= 0; i--) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (double)num / (1ULL << 10 * index), u) <= 5)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkocount_widths(enum be_fmt be_fmt, struct hdr_info *hdr, be_node_list_t *be_nodes)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko for (i = 0; i < NUM_COLS; i++)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko for (cur_be = be_nodes; cur_be != NULL; cur_be = cur_be->be_next_node) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *be_name = cur_be->be_node_name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *root_ds = cur_be->be_root_ds;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko size_t node_name_len = strlen(cur_be->be_node_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko size_t root_ds_len = strlen(cur_be->be_root_ds);
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko policy_len = strlen(cur_be->be_policy_type);
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko (void) strlcpy(name, root_ds, sizeof (name));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko for (snap = cur_be->be_node_snapshots; snap != NULL;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko uint64_t snap_used = snap->be_snapshot_space_used;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *snap_name = snap->be_snapshot_name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko for (i = 0; i < NUM_COLS; i++)
9b7d742f0ee8ff89c05a8b5275d11359920ec60fAlexander Ereminprint_be_nodes(const char *be_name, boolean_t parsable, struct hdr_info *hdr,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko for (cur_be = nodes; cur_be != NULL; cur_be = cur_be->be_next_node) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *name = cur_be->be_node_name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko time_t creation = cur_be->be_node_creation;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_name != NULL && strcmp(be_name, name) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) strftime(datetime, DT_BUF_LEN, datetime_fmt, tm);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko for (snap = cur_be->be_node_snapshots; snap != NULL;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf("%s;%s;%s;%s;%llu;%s;%ld\n",
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf("%-*s %-*s %-*s %-*s %-*s %-*s\n",
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[2].width, (cur_be->be_mounted ? mntpt:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[4].width, cur_be->be_policy_type,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkoprint_be_snapshots(be_node_list_t *be, struct hdr_info *hdr, boolean_t parsable)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko for (snap = be->be_node_snapshots; snap != NULL;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *snap_name = snap->be_snapshot_name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko uint64_t used = snap->be_snapshot_space_used;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko time_t creation = snap->be_snapshot_creation;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) strncpy(name, root_ds, sizeof (name));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) strftime(datetime, DT_BUF_LEN, datetime_fmt, tm);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf("%s;%s;%s;%s;%llu;%s;%ld\n",
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(" %-*s %-*s %-*s %-*s %-*s "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkoprint_fmt_nodes(const char *be_name, enum be_fmt be_fmt, boolean_t parsable,
9b7d742f0ee8ff89c05a8b5275d11359920ec60fAlexander Eremin struct hdr_info *hdr, be_node_list_t *nodes)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko for (cur_be = nodes; cur_be != NULL; cur_be = cur_be->be_next_node) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *name = cur_be->be_node_name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko time_t creation = cur_be->be_node_creation;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_name != NULL && strcmp(be_name, name) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) strftime(datetime, DT_BUF_LEN, datetime_fmt, tm);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf("%s;%s;%s;%s;%llu;%s;%ld\n",
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(" %-*s %-*s %-*s %-*s %-*s "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[0].width-3, cur_be->be_root_ds,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[2].width, (cur_be->be_mounted ?
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[4].width, cur_be->be_policy_type,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko print_be_snapshots(cur_be, hdr, parsable);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkoprint_nodes(const char *be_name, boolean_t dsets, boolean_t snaps,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko boolean_t parsable, be_node_list_t *be_nodes)
9b7d742f0ee8ff89c05a8b5275d11359920ec60fAlexander Eremin print_be_nodes(be_name, parsable, &hdr, be_nodes);
9b7d742f0ee8ff89c05a8b5275d11359920ec60fAlexander Eremin print_fmt_nodes(be_name, be_fmt, parsable, &hdr, be_nodes);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *yesre = nl_langinfo(YESEXPR);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (regcomp(&yes_re, yesre, cflags) != 0) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko /* should not happen */
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Failed to compile 'yes' regexp\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (regcomp(&no_re, nore, cflags) != 0) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko /* should not happen */
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Failed to compile 'no' regexp\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(_("Are you sure you want to destroy %s?\n"
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "This action cannot be undone (y/[n]): "), name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko answer = fgets(buf, sizeof (buf), stdin);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (answer == NULL || *answer == '\0' || *answer == 10)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (regexec(&yes_re, answer, 0, NULL, 0) == 0) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko } else if (regexec(&no_re, answer, 0, NULL, 0) != 0) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Invalid response. "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "Please enter 'y' or 'n'.\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (nvlist_alloc(nvlp, NV_UNIQUE_NAME, 0) != 0) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) perror(_("nvlist_alloc failed.\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkobe_nvl_add_string(nvlist_t *nvl, const char *name, const char *val)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (nvlist_add_string(nvl, name, val) != 0) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("nvlist_add_string failed for "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkobe_nvl_add_nvlist(nvlist_t *nvl, const char *name, nvlist_t *val)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (nvlist_add_nvlist(nvl, name, val) != 0) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("nvlist_add_nvlist failed for %s.\n"),
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkobe_nvl_add_uint16(nvlist_t *nvl, const char *name, uint16_t val)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (nvlist_add_uint16(nvl, name, val) != 0) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("nvlist_add_uint16 failed for "
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin while ((c = getopt(argc, argv, "v")) != -1) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_string(be_attrs, BE_ATTR_ORIG_BE_NAME, obe_name) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(_("Activated successfully\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("%s does not exist or appear "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "to be a valid BE.\nPlease check that the name of "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "the BE provided is correct.\n"), obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to activate %s.\n"), obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("You have insufficient privileges to "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "execute this command.\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to activate %s.\n"), obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, "%s\n", be_err_to_str(err));
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin while ((c = getopt(argc, argv, "ad:e:io:p:v")) != -1) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (zfs_props == NULL && be_nvl_alloc(&zfs_props) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if ((propval = strchr(propname, '=')) == NULL) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "'=' for -o option\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (nvlist_lookup_string(zfs_props, propname,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("property '%s' "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "specified multiple times\n"), propname);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_string(zfs_props, propname, propval)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if ((snap_name = strrchr(nbe_name, '@')) != NULL) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * Check if obe_name is really a snapshot name.
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * If so, split it out.
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if ((snap_name = strrchr(obe_name, '@')) != NULL) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (zfs_props != NULL && be_nvl_add_nvlist(be_attrs,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (obe_name != NULL && be_nvl_add_string(be_attrs,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (snap_name != NULL && be_nvl_add_string(be_attrs,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (nbe_zpool != NULL && be_nvl_add_string(be_attrs,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (nbe_name != NULL && be_nvl_add_string(be_attrs,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (nbe_desc != NULL && be_nvl_add_string(be_attrs,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * We requested an auto named BE; find out the
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * name of the BE that was created for us and
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * the auto snapshot created from the original BE.
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (nvlist_lookup_string(be_attrs, BE_ATTR_NEW_BE_NAME,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("failed to get %s "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (nvlist_lookup_string(be_attrs, BE_ATTR_SNAP_NAME,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("failed to get %s "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(_("Auto named snapshot: %s\n"),
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char *args[] = { "activate", "", NULL };
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(_("Created successfully\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("BE %s already exists\n."
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "Please choose a different BE name.\n"), nbe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("BE %s snapshot %s already exists.\n"
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "Please choose a different snapshot name.\n"), obe_name,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to create snapshot "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to create %s.\n"),
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("You have insufficient privileges to "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "execute this command.\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to create snapshot "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to create %s.\n"),
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, "%s\n", be_err_to_str(err));
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin while ((c = getopt(argc, argv, "fFsv")) != -1) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko destroy_flags |= BE_DESTROY_FLAG_FORCE_UNMOUNT;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko destroy_flags |= BE_DESTROY_FLAG_SNAPSHOTS;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (!suppress_prompt && !confirm_destroy(be_name)) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(_("%s has not been destroyed.\n"), be_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if ((snap_name = strrchr(be_name, '@')) != NULL) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_string(be_attrs, BE_ATTR_ORIG_BE_NAME, be_name) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_string(be_attrs, BE_ATTR_SNAP_NAME,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_uint16(be_attrs, BE_ATTR_DESTROY_FLAGS,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(_("Destroyed successfully\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to destroy %s.\n"), be_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("It is currently mounted and must be "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "unmounted before it can be destroyed.\n" "Use 'beadm "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "unmount %s' to unmount the BE before destroying\nit or "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "'beadm destroy -f %s'.\n"), be_name, be_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("%s is the currently active BE and "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "cannot be destroyed.\nYou must boot from another BE in "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "order to destroy %s.\n"), be_name, be_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to destroy one of " "%s's "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "zone BE's.\nUse 'beadm destroy -f %s' or "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "'zfs -f destroy <dataset>'.\n"), be_name, be_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("%s does not exist or appear "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "to be a valid snapshot.\nPlease check that the name of "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "the snapshot provided is correct.\n"), snap_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to destroy %s.\n"), be_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("You have insufficient privileges to "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "execute this command.\n"));
5ee7c79303f6cc727e2df5f1c7332c0f4c9832a3Alexander Eremin (void) fprintf(stderr, _("Unable to destroy %s: "
5ee7c79303f6cc727e2df5f1c7332c0f4c9832a3Alexander Eremin "BE has snapshots.\nUse 'beadm destroy -s %s' or "
5ee7c79303f6cc727e2df5f1c7332c0f4c9832a3Alexander Eremin "'zfs -r destroy <dataset>'.\n"), be_name, be_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to destroy %s.\n"), be_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, "%s\n", be_err_to_str(err));
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin while ((c = getopt(argc, argv, "adsvH")) != -1) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Invalid options: -a and %s "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Invalid options: -a and %s "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko print_nodes(be_name, dsets, snaps, parsable, be_nodes);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("No boot environments found "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "on this system.\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("%s does not exist or appear "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "to be a valid BE.\nPlease check that the name of "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "the BE provided is correct.\n"), be_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to display Boot "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "Environment\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, "%s\n", be_err_to_str(err));
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin while ((c = getopt(argc, argv, "s:v")) != -1) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "requires an argument [ rw | ro ]\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Invalid mount point %s. "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "Mount point must start with a /.\n"), mountpoint);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko sz = asprintf(&tmp_mp, "%s/%s", tmpdir, tmpname);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("internal error: "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "out of memory\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_string(be_attrs, BE_ATTR_ORIG_BE_NAME, obe_name) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_string(be_attrs, BE_ATTR_MOUNTPOINT, mountpoint) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (shared_fs && be_nvl_add_uint16(be_attrs, BE_ATTR_MOUNT_FLAGS,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(_("Mounted successfully on: '%s'\n"), mountpoint);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("%s does not exist or appear "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "to be a valid BE.\nPlease check that the name of "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "the BE provided is correct.\n"), obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("%s is already mounted.\n"
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "Please unmount the BE before mounting it again.\n"),
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to mount %s.\n"), obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("You have insufficient privileges to "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "execute this command.\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to mount %s.\n"), obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, "%s\n", be_err_to_str(err));
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin while ((c = getopt(argc, argv, "fv")) != -1) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_string(be_attrs, BE_ATTR_ORIG_BE_NAME, obe_name) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_uint16(be_attrs, BE_ATTR_UNMOUNT_FLAGS,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(_("Unmounted successfully\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("%s does not exist or appear "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "to be a valid BE.\nPlease check that the name of "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "the BE provided is correct.\n"), obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("%s is the currently active BE.\n"
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "It cannot be unmounted unless another BE is the "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("%s is a shared file system and it "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to unmount %s.\n"), obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("You have insufficient privileges to "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "execute this command.\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to unmount %s.\n"), obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, "%s\n", be_err_to_str(err));
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin while ((c = getopt(argc, argv, "v")) != -1) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_string(be_attrs, BE_ATTR_ORIG_BE_NAME, obe_name) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_string(be_attrs, BE_ATTR_NEW_BE_NAME, nbe_name) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(_("Renamed successfully\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("%s does not exist or appear "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "to be a valid BE.\nPlease check that the name of "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "the BE provided is correct.\n"), obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Rename of BE %s failed.\n"),
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("You have insufficient privileges to "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "execute this command.\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Rename of BE %s failed.\n"),
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, "%s\n", be_err_to_str(err));
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin while ((c = getopt(argc, argv, "v")) != -1) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko else { /* argc == 1 */
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if ((snap_name = strrchr(obe_name, '@')) != NULL) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_string(be_attrs, BE_ATTR_ORIG_BE_NAME, obe_name) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_string(be_attrs, BE_ATTR_SNAP_NAME, snap_name) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(_("Rolled back successfully\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("%s does not exist or appear "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "to be a valid BE.\nPlease check that the name of "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "the BE provided is correct.\n"), obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("%s does not exist or appear "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "to be a valid snapshot.\nPlease check that the name of "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "the snapshot provided is correct.\n"), snap_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Rollback of BE %s snapshot %s "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("You have insufficient privileges to "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "execute this command.\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Rollback of BE %s snapshot %s "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, "%s\n", be_err_to_str(err));