beadm.c revision 5ee7c79303f6cc727e2df5f1c7332c0f4c9832a3
55553f719b521a0bb4deab6efc944cd30c1a56aada * CDDL HEADER START
55553f719b521a0bb4deab6efc944cd30c1a56aada * The contents of this file are subject to the terms of the
55553f719b521a0bb4deab6efc944cd30c1a56aada * Common Development and Distribution License (the "License").
55553f719b521a0bb4deab6efc944cd30c1a56aada * You may not use this file except in compliance with the License.
55553f719b521a0bb4deab6efc944cd30c1a56aada * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
55553f719b521a0bb4deab6efc944cd30c1a56aada * See the License for the specific language governing permissions
55553f719b521a0bb4deab6efc944cd30c1a56aada * and limitations under the License.
55553f719b521a0bb4deab6efc944cd30c1a56aada * When distributing Covered Code, include this CDDL HEADER in each
55553f719b521a0bb4deab6efc944cd30c1a56aada * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
55553f719b521a0bb4deab6efc944cd30c1a56aada * If applicable, add the following below this CDDL HEADER, with the
55553f719b521a0bb4deab6efc944cd30c1a56aada * fields enclosed by brackets "[]" replaced with your own identifying
55553f719b521a0bb4deab6efc944cd30c1a56aada * information: Portions Copyright [yyyy] [name of copyright owner]
55553f719b521a0bb4deab6efc944cd30c1a56aada * CDDL HEADER END
55553f719b521a0bb4deab6efc944cd30c1a56aada * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
55553f719b521a0bb4deab6efc944cd30c1a56aada * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
55553f719b521a0bb4deab6efc944cd30c1a56aada * System includes
55553f719b521a0bb4deab6efc944cd30c1a56aada#define _(x) gettext(x)
55553f719b521a0bb4deab6efc944cd30c1a56aada#define _(x) (x)
55553f719b521a0bb4deab6efc944cd30c1a56aadastatic void usage(void);
55553f719b521a0bb4deab6efc944cd30c1a56aada * single column name/width output format description
55553f719b521a0bb4deab6efc944cd30c1a56aada const char *col_name;
55553f719b521a0bb4deab6efc944cd30c1a56aada * all columns output format
55553f719b521a0bb4deab6efc944cd30c1a56aada * type of possible output formats
55553f719b521a0bb4deab6efc944cd30c1a56aada * command handler description
55553f719b521a0bb4deab6efc944cd30c1a56aadatypedef struct be_command {
55553f719b521a0bb4deab6efc944cd30c1a56aada const char *name;
55553f719b521a0bb4deab6efc944cd30c1a56aada * sorted list of be commands
55553f719b521a0bb4deab6efc944cd30c1a56aadastatic void
55553f719b521a0bb4deab6efc944cd30c1a56aada "\tbeadm subcommand cmd_options\n"
55553f719b521a0bb4deab6efc944cd30c1a56aada "\tsubcommands:\n"
55553f719b521a0bb4deab6efc944cd30c1a56aada "\tbeadm activate beName\n"
55553f719b521a0bb4deab6efc944cd30c1a56aada "\tbeadm create [-d BE_desc]\n"
55553f719b521a0bb4deab6efc944cd30c1a56aada "\t\t[-o property=value] ... [-p zpool] \n"
55553f719b521a0bb4deab6efc944cd30c1a56aada "\t\t[-e nonActiveBe | beName@snapshot] beName\n"
55553f719b521a0bb4deab6efc944cd30c1a56aada "\tbeadm create [-d BE_desc]\n"
55553f719b521a0bb4deab6efc944cd30c1a56aada "\t\t[-o property=value] ... [-p zpool] beName@snapshot\n"
55553f719b521a0bb4deab6efc944cd30c1a56aada "\tbeadm destroy [-Ffs] beName \n"
55553f719b521a0bb4deab6efc944cd30c1a56aada "\tbeadm destroy [-F] beName@snapshot \n"
55553f719b521a0bb4deab6efc944cd30c1a56aada "\tbeadm list [[-a] | [-d] [-s]] [-H] [beName]\n"
55553f719b521a0bb4deab6efc944cd30c1a56aada "\tbeadm mount [-s ro|rw] beName [mountpoint]\n"
55553f719b521a0bb4deab6efc944cd30c1a56aada "\tbeadm unmount [-f] beName\n"
55553f719b521a0bb4deab6efc944cd30c1a56aada "\tbeadm umount [-f] beName\n"
55553f719b521a0bb4deab6efc944cd30c1a56aada "\tbeadm rename origBeName newBeName\n"
55553f719b521a0bb4deab6efc944cd30c1a56aada "\tbeadm rollback beName snapshot\n"
55553f719b521a0bb4deab6efc944cd30c1a56aada "\tbeadm rollback beName@snapshot\n"));
55553f719b521a0bb4deab6efc944cd30c1a56aada for (command = &be_command_tbl[0]; command->name != NULL; command++)
55553f719b521a0bb4deab6efc944cd30c1a56aada (void) fprintf(stderr, _("Invalid command: %s\n"), cmdname);
55553f719b521a0bb4deab6efc944cd30c1a56aada return (1);
55553f719b521a0bb4deab6efc944cd30c1a56aada const char *cmdname;
55553f719b521a0bb4deab6efc944cd30c1a56aada return (1);
55553f719b521a0bb4deab6efc944cd30c1a56aada /* Turn error printing off */
55553f719b521a0bb4deab6efc944cd30c1a56aadastatic void
55553f719b521a0bb4deab6efc944cd30c1a56aada for (i = 0; i < NUM_COLS; i++) {
55553f719b521a0bb4deab6efc944cd30c1a56aadastatic void
8de5c4f463386063e184a851437d58080c6c626cDan OpenSolaris Anderson col[0].col_name = _("BE/Dataset/Snapshot");
8de5c4f463386063e184a851437d58080c6c626cDan OpenSolaris Anderson col[0].col_name = _("BE/Snapshot");
55553f719b521a0bb4deab6efc944cd30c1a56aada for (i = 0; i < NUM_COLS; i++) {
55553f719b521a0bb4deab6efc944cd30c1a56aada if (sz > 0) {
55553f719b521a0bb4deab6efc944cd30c1a56aadastatic void
55553f719b521a0bb4deab6efc944cd30c1a56aada while (n >= 1024) {
55553f719b521a0bb4deab6efc944cd30c1a56aada n /= 1024;
55553f719b521a0bb4deab6efc944cd30c1a56aada if (index == 0) {
55553f719b521a0bb4deab6efc944cd30c1a56aada for (i = 2; i >= 0; i--) {
55553f719b521a0bb4deab6efc944cd30c1a56aadastatic void
55553f719b521a0bb4deab6efc944cd30c1a56aadacount_widths(enum be_fmt be_fmt, struct hdr_info *hdr, be_node_list_t *be_nodes)
55553f719b521a0bb4deab6efc944cd30c1a56aada for (i = 0; i < NUM_COLS; i++)
55553f719b521a0bb4deab6efc944cd30c1a56aada for (cur_be = be_nodes; cur_be != NULL; cur_be = cur_be->be_next_node) {
55553f719b521a0bb4deab6efc944cd30c1a56aada for (i = 0; i < NUM_COLS; i++)
55553f719b521a0bb4deab6efc944cd30c1a56aadastatic void
55553f719b521a0bb4deab6efc944cd30c1a56aadaprint_be_nodes(const char *be_name, boolean_t parsable, be_node_list_t *nodes)
55553f719b521a0bb4deab6efc944cd30c1a56aada for (cur_be = nodes; cur_be != NULL; cur_be = cur_be->be_next_node) {
if (parsable)
name,
used,
creation);
char *pos;
if (parsable)
used,
creation);
used,
creation);
if (!parsable)
int ai = 0;
if (!parsable)
if (parsable)
used,
creation);
if (dsets)
if (snaps)
static boolean_t
char *answer;
return (res);
return (res);
goto out;
out:
return (res);
name);
char *obe_name;
usage();
goto out;
switch (err) {
case BE_SUCCESS:
case BE_ERR_BE_NOENT:
case BE_ERR_PERM:
case BE_ERR_ACCESS:
case BE_ERR_ACTIVATE_CURR:
out:
return (err);
goto out2;
propval++;
&strval) == 0) {
goto out2;
goto out2;
usage();
goto out2;
usage();
goto out2;
usage();
goto out2;
snap_name++;
if (obe_name) {
if (is_snap) {
usage();
goto out2;
usage();
goto out2;
snap_name++;
} else if (is_snap) {
goto out2;
goto out;
goto out;
goto out;
goto out;
goto out;
goto out;
if (is_snap)
switch (err) {
case BE_SUCCESS:
&nbe_name) != 0) {
nbe_name);
&snap_name) != 0) {
goto out;
case BE_ERR_BE_EXISTS:
case BE_ERR_SS_EXISTS:
case BE_ERR_PERM:
case BE_ERR_ACCESS:
if (is_snap)
nbe_name);
if (is_snap)
nbe_name);
out:
out2:
return (err);
int destroy_flags = 0;
char *snap_name;
char *be_name;
usage();
usage();
usage();
snap_name++;
goto out;
if (is_snap) {
snap_name) != 0)
goto out;
destroy_flags) != 0)
goto out;
switch (err) {
case BE_SUCCESS:
case BE_ERR_MOUNTED:
case BE_ERR_DESTROY_CURR_BE:
case BE_ERR_ZONES_UNMOUNT:
case BE_ERR_SS_NOENT:
case BE_ERR_PERM:
case BE_ERR_ACCESS:
case BE_ERR_SS_EXISTS:
out:
return (err);
usage();
if (all) {
if (dsets) {
usage();
if (snaps) {
usage();
switch (err) {
case BE_SUCCESS:
case BE_ERR_BE_NOENT:
return (err);
int mount_flags = 0;
char *obe_name;
char *mountpoint;
usage();
usage();
usage();
int sz;
if (sz < 0) {
goto out;
goto out;
mount_flags) != 0)
goto out;
switch (err) {
case BE_SUCCESS:
case BE_ERR_BE_NOENT:
case BE_ERR_MOUNTED:
obe_name);
case BE_ERR_PERM:
case BE_ERR_ACCESS:
out:
return (err);
char *obe_name;
int unmount_flags = 0;
usage();
usage();
goto out;
unmount_flags) != 0)
goto out;
switch (err) {
case BE_SUCCESS:
case BE_ERR_BE_NOENT:
case BE_ERR_UMOUNT_CURR_BE:
case BE_ERR_UMOUNT_SHARED:
case BE_ERR_PERM:
case BE_ERR_ACCESS:
out:
return (err);
char *obe_name;
char *nbe_name;
usage();
goto out;
goto out;
switch (err) {
case BE_SUCCESS:
case BE_ERR_BE_NOENT:
case BE_ERR_PERM:
case BE_ERR_ACCESS:
obe_name);
obe_name);
out:
return (err);
char *obe_name;
char *snap_name;
usage();
usage();
snap_name++;
usage();
goto out;
goto out;
switch (err) {
case BE_SUCCESS:
case BE_ERR_BE_NOENT:
case BE_ERR_SS_NOENT:
case BE_ERR_PERM:
case BE_ERR_ACCESS:
out:
return (err);