zpool_main.c revision 8eed72d43abf6184b757f3eb9228c3c4979aca10
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER START
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The contents of this file are subject to the terms of the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Common Development and Distribution License (the "License").
fa9e4066f08beec538e775443c5be79dd423fcabahrens * You may not use this file except in compliance with the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fa9e4066f08beec538e775443c5be79dd423fcabahrens * See the License for the specific language governing permissions
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and limitations under the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * When distributing Covered Code, include this CDDL HEADER in each
fa9e4066f08beec538e775443c5be79dd423fcabahrens * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If applicable, add the following below this CDDL HEADER, with the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * fields enclosed by brackets "[]" replaced with your own identifying
fa9e4066f08beec538e775443c5be79dd423fcabahrens * information: Portions Copyright [yyyy] [name of copyright owner]
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER END
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Use is subject to license terms.
fa9e4066f08beec538e775443c5be79dd423fcabahrens#pragma ident "%Z%%M% %I% %E% SMI"
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_create(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_destroy(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_add(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_remove(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_list(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_iostat(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_status(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_online(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_offline(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_clear(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_attach(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_detach(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_replace(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_scrub(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_import(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_export(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_upgrade(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_history(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_get(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_set(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * These libumem hooks provide a reasonable set of defaults for the allocator's
fa9e4066f08beec538e775443c5be79dd423fcabahrens * debugging facilities.
fa9e4066f08beec538e775443c5be79dd423fcabahrensconst char *
fa9e4066f08beec538e775443c5be79dd423fcabahrens return ("default,verbose"); /* $UMEM_DEBUG setting */
fa9e4066f08beec538e775443c5be79dd423fcabahrensconst char *
fa9e4066f08beec538e775443c5be79dd423fcabahrens return ("fail,contents"); /* $UMEM_LOGGING setting */
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef enum {
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct zpool_command {
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *name;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int (*func)(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Master command table. Each ZFS command has a name, associated function, and
fa9e4066f08beec538e775443c5be79dd423fcabahrens * usage message. The usage messages need to be internationalized, so we have
fa9e4066f08beec538e775443c5be79dd423fcabahrens * to have a function to return the usage message based on a command index.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * These commands are organized according to how they are displayed in the usage
fa9e4066f08beec538e775443c5be79dd423fcabahrens * message. An empty command (one with a NULL name) indicates an empty line in
fa9e4066f08beec538e775443c5be79dd423fcabahrens * the generic usage message.
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define NCOMMAND (sizeof (command_table) / sizeof (command_table[0]))
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic const char *
fa9e4066f08beec538e775443c5be79dd423fcabahrens "<new-device>\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (gettext("\tcreate [-fn] [-o property=value] ... \n"
fa9e4066f08beec538e775443c5be79dd423fcabahrens "\t [-m mountpoint] [-R root] <pool> <vdev> ...\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens "\timport [-o mntopts] [-o property=value] ... \n"
fa9e4066f08beec538e775443c5be79dd423fcabahrens "\t [-d dir | -c cachefile] [-D] [-f] [-R root] -a\n"
fa9e4066f08beec538e775443c5be79dd423fcabahrens "\timport [-o mntopts] [-o property=value] ... \n"
fa9e4066f08beec538e775443c5be79dd423fcabahrens "\t [-d dir | -c cachefile] [-D] [-f] [-R root] "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "<pool | id> [newpool]\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (gettext("\tiostat [-v] [pool] ... [interval "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "[count]]\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens "[pool] ...\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (gettext("\toffline [-t] <pool> <device> ...\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens "[new-device]\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens "\tupgrade -v\n"
fa9e4066f08beec538e775443c5be79dd423fcabahrens "\tupgrade [-V version] <-a | pool ...>\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens "<pool> ...\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (gettext("\tset <property=value> <pool> \n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* NOTREACHED */
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Callback routine that will print out a pool property value.
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(fp, "\t%-13s ", zpool_prop_to_name(prop));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Display usage message. If we're inside a command, display only the usage for
fa9e4066f08beec538e775443c5be79dd423fcabahrens * that command. Otherwise, iterate over the entire command table and display
fa9e4066f08beec538e775443c5be79dd423fcabahrens * a complete usage message.
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(fp, gettext("usage: zpool command args ...\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens gettext("where 'command' is one of the following:\n\n"));
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock for (i = 0; i < NCOMMAND; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(fp, "%s", get_usage(current_command->usage));
fa9e4066f08beec538e775443c5be79dd423fcabahrens gettext("\nthe following properties are supported:\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Iterate over all properties */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) zprop_iter(print_prop_cb, fp, B_FALSE, B_TRUE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * See comments at end of main().
fa9e4066f08beec538e775443c5be79dd423fcabahrensprint_vdev_tree(zpool_handle_t *zhp, const char *name, nvlist_t *nv, int indent,
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (c = 0; c < children; c++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG,
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((is_log && !print_logs) || (!is_log && print_logs))
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Add a property pair (name, string-value) into a property nvlist.
fa9e4066f08beec538e775443c5be79dd423fcabahrensadd_prop_list(const char *propname, char *propval, nvlist_t **props)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((prop = zpool_name_to_prop(propname)) == ZPROP_INVAL) {
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock return (2);
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Use normalized property name for nvlist operations */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_string(proplist, zpool_prop_to_name(prop),
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (2);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_add_string(proplist, zpool_prop_to_name(prop),
fa9e4066f08beec538e775443c5be79dd423fcabahrens "error: out of memory\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool add [-fn] <pool> <vdev> ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Force addition of devices, even if they appear in use
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -n Do not add the devices, but display the resulting layout if
fa9e4066f08beec538e775443c5be79dd423fcabahrens * they were to be added.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Adds the given vdevs to 'pool'. As with create, the bulk of this work is
fa9e4066f08beec538e775443c5be79dd423fcabahrens * handled by get_vdev_spec(), which constructs the nvlist needed to pass to
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get pool name and check number of arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name argument\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing vdev specification\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((config = zpool_get_config(zhp, NULL)) == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("pool '%s' is unavailable\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* pass off to get_vdev_spec for processing */
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvroot = make_root_vdev(zhp, force, !force, B_FALSE, argc, argv);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("would update '%s' to the following "
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* print original main pool and new tree */
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_vdev_tree(zhp, poolname, poolnvroot, 0, B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Do the same for the logs */
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool remove <pool> <vdev>
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Removes the given vdev from the pool. Currently, this only supports removing
fa9e4066f08beec538e775443c5be79dd423fcabahrens * spares from the pool. Eventually, we'll want to support removing leaf vdevs
fa9e4066f08beec538e775443c5be79dd423fcabahrens * (as an alias for 'detach') as well as toplevel vdevs.
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get pool name and check number of arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name argument\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool create [-fn] [-o property=value] ... [-R root] [-m mountpoint]
fa9e4066f08beec538e775443c5be79dd423fcabahrens * <pool> <dev> ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Force creation, even if devices appear in use
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -n Do not create the pool, but display the resulting layout if it
fa9e4066f08beec538e775443c5be79dd423fcabahrens * were to be created.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -R Create a pool under an alternate root
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -m Set default mountpoint for the root dataset. By default it's
fa9e4066f08beec538e775443c5be79dd423fcabahrens * '/<pool>'
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -o Set property=value.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Creates the named pool according to the given vdev specification. The
fa9e4066f08beec538e775443c5be79dd423fcabahrens * bulk of the vdev processing is done in get_vdev_spec() in zpool_vdev.c. Once
fa9e4066f08beec538e775443c5be79dd423fcabahrens * we get the nvlist back from get_vdev_spec(), we either print out the contents
fa9e4066f08beec538e775443c5be79dd423fcabahrens * (if '-n' was specified), or pass it to libzfs to do the creation.
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((c = getopt(argc, argv, ":fnR:m:o:")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens "'=' for -o option\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing argument for "
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get pool name and check number of arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name argument\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing vdev specification\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * As a special case, check for use of '/' in the name, and direct the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * user to use 'zfs create' instead.
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("cannot create '%s': invalid "
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("use 'zfs create' to "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "create a dataset\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* pass off to get_vdev_spec for bulk processing */
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvroot = make_root_vdev(NULL, force, !force, B_FALSE, argc - 1,
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* make_root_vdev() allows 0 toplevel children if there are spares */
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_CHILDREN,
fa9e4066f08beec538e775443c5be79dd423fcabahrens "specification: at least one toplevel vdev must be "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "specified\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid alternate root '%s': "
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Check the validity of the mountpoint and direct the user to use the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * '-m' mountpoint option if it looks like its in use.
fa9e4066f08beec538e775443c5be79dd423fcabahrens "'%s': must be an absolute path, 'legacy', or "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "mountpoint '%s' exists and is not "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "option to provide a different default\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * For a dry run invocation, print out a basic message and run
fa9e4066f08beec538e775443c5be79dd423fcabahrens * through all the vdevs in the list and print out in an
fa9e4066f08beec538e775443c5be79dd423fcabahrens * appropriate hierarchy.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Hand off to libzfs.
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zpool_create(g_zfs, poolname, nvroot, props) == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else if (libzfs_errno(g_zfs) == EZFS_INVALIDNAME) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens "been omitted\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (2);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool destroy <pool>
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Forcefully unmount any datasets
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Destroy the given pool. Automatically unmounts any datasets in the pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool argument\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("too many arguments\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((zhp = zpool_open_canfail(g_zfs, pool)) == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens * As a special case, check for use of '/' in the name, and
fa9e4066f08beec538e775443c5be79dd423fcabahrens * direct the user to use 'zfs destroy' instead.
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("use 'zfs destroy' to "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "destroy a dataset\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("could not destroy '%s': "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "could not unmount datasets\n"), zpool_get_name(zhp));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool export [-f] <pool> ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Forcefully unmount datasets
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Export the given pools. By default, the command will attempt to cleanly
fa9e4066f08beec538e775443c5be79dd423fcabahrens * unmount any active datasets within the pool. If the '-f' flag is specified,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * then the datasets will be forcefully unmounted.
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool argument\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < argc; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((zhp = zpool_open_canfail(g_zfs, argv[i])) == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Given a vdev configuration, determine the maximum width needed for the device
fa9e4066f08beec538e775443c5be79dd423fcabahrens * name column.
fa9e4066f08beec538e775443c5be79dd423fcabahrensmax_width(zpool_handle_t *zhp, nvlist_t *nv, int depth, int max)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_SPARES,
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (c = 0; c < children; c++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (c = 0; c < children; c++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print the configuration of an exported pool. Iterate over all vdevs in the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * pool, printing out the name and status for each one.
fa9e4066f08beec538e775443c5be79dd423fcabahrensprint_import_config(const char *name, nvlist_t *nv, int namewidth, int depth,
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &type) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_STATS,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("\t%*s%-*s", depth, "", namewidth - depth, name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(" %s", zpool_state_to_name(vs->vs_state, vs->vs_aux));
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (c = 0; c < children; c++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG,
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((is_log && !print_logs) || (!is_log && print_logs))
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_SPARES,
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (c = 0; c < children; c++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Display the status for the given pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *health;
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME,
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID,
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_STATE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_STATS,
fa9e4066f08beec538e775443c5be79dd423fcabahrens health = zpool_state_to_name(vs->vs_state, vs->vs_aux);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext(" id: %llu\n"), (u_longlong_t)guid);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: One or more devices are missing "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "from the system.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: One or more devices contains "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "corrupted data.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: The pool data is corrupted.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens "are offlined.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: The pool metadata is "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "corrupted.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: The pool is formatted using an "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "older on-disk version.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: The pool is formatted using an "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "incompatible version.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: The pool was last accessed by "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "another system.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: One or more devices are "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "faulted.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * No other status can be seen when importing pools.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print out an action according to the overall state of the pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens "imported using its name or numeric identifier, "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "though\n\tsome features will not be available "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "without an explicit 'zpool upgrade'.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens "imported using its name or numeric "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "identifier and\n\tthe '-f' flag.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens "imported using its name or numeric "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "identifier.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: The pool can be imported "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "despite missing or damaged devices. The\n\tfault "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "tolerance of the pool may be compromised if imported.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens "imported. Access the pool on a system running "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "newer\n\tsoftware, or recreate the pool from "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "backup.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens "imported. Attach the missing\n\tdevices and try "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "again.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens "imported due to damaged devices or data.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If the state is "closed" or "can't open", and the aux state
fa9e4066f08beec538e775443c5be79dd423fcabahrens * is "corrupt data":
fa9e4066f08beec538e775443c5be79dd423fcabahrens "but can be imported using the '-Df' flags.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens "on another system, but can be imported using\n\t"
fa9e4066f08beec538e775443c5be79dd423fcabahrens "the '-f' flag.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext(" see: http://www.sun.com/msg/%s\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_import_config(name, nvroot, namewidth, 0, B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_import_config(name, nvroot, namewidth, 0, B_TRUE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("\n\tAdditional devices are known to "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "be part of this pool, though their\n\texact "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "configuration cannot be determined.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Perform the import for the given configuration. This passes the heavy
fa9e4066f08beec538e775443c5be79dd423fcabahrens * lifting off to zpool_import_props(), and then mounts the datasets contained
fa9e4066f08beec538e775443c5be79dd423fcabahrens * within the pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrensdo_import(nvlist_t *config, const char *newname, const char *mntopts,
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("cannot import '%s': pool "
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_HOSTID,
fa9e4066f08beec538e775443c5be79dd423fcabahrens "'%s': pool may be in use from other "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "system, it was last accessed by %s "
fa9e4066f08beec538e775443c5be79dd423fcabahrens (unsigned long)hostid,
fa9e4066f08beec538e775443c5be79dd423fcabahrens "import anyway\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("cannot import '%s': "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "anyway\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zpool_import_props(g_zfs, config, newname, props) != 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock * zpool import [-d dir] [-D]
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock * import [-o mntopts] [-o prop=value] ... [-R root] [-D]
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock * [-d dir | -c cachefile] [-f] -a
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock * import [-o mntopts] [-o prop=value] ... [-R root] [-D]
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock * [-d dir | -c cachefile] [-f] <pool | id> [newpool]
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -c Read pool information from a cachefile instead of searching
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * -d Scan in a specific directory, other than /dev/dsk. More than
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * one directory can be specified using multiple '-d' options.
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * -D Scan for previously destroyed pools or import all or only
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * specified destroyed pools.
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * -R Temporarily import the pool, with all mountpoints relative to
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * the given root. The pool will remain exported when the machine
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * is rebooted.
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * -f Force import, even if it appears that the pool is active.
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * -a Import all pools found.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -o Set property=value and/or temporary mount options (without '=').
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The import command scans for pools to import, and import pools based on pool
fa9e4066f08beec538e775443c5be79dd423fcabahrens * name and GUID. The pool can also be renamed as part of the import process.
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((c = getopt(argc, argv, ":afc:d:Do:p:R:")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (char *));
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (char *));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing argument for "
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("-c is incompatible with -d\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check argument count */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("too many arguments\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("too many arguments\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Check for the SYS_CONFIG privilege. We do this explicitly
fa9e4066f08beec538e775443c5be79dd423fcabahrens * here because otherwise any attempt to discover pools will
fa9e4066f08beec538e775443c5be79dd423fcabahrens * silently fail.
fa9e4066f08beec538e775443c5be79dd423fcabahrens "discover pools: permission denied\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens pools = zpool_find_import(g_zfs, nsearch, searchdirs);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * We now have a list of all available pools in the given directories.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Depending on the arguments given, we do one of the following:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * <none> Iterate through all pools and display information about
fa9e4066f08beec538e775443c5be79dd423fcabahrens * each one.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -a Iterate through all pools and try to import each one.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * <id> Find the pool that corresponds to the given GUID/pool
fa9e4066f08beec538e775443c5be79dd423fcabahrens * name and import that one.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -D Above options applies only to destroyed pools.
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((elem = nvlist_next_nvpair(pools, elem)) != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_STATE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!do_destroyed && pool_state == POOL_STATE_DESTROYED)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (do_destroyed && pool_state != POOL_STATE_DESTROYED)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens * We are searching for a pool based on name.
fa9e4066f08beec538e775443c5be79dd423fcabahrens "cannot import '%s': more than "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "import by numeric ID instead\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Search for a pool by guid.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If we were searching for a specific pool, verify that we found a
fa9e4066f08beec538e775443c5be79dd423fcabahrens * pool, and then do the import.
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("cannot import '%s': "
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If we were just looking for pools, report an error if none were
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct iostat_cbdata {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(" ----- ----- ----- ----- ----- -----\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("%-*s used avail read write read write\n",
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Display a single statistic.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print out all the statistics for the given vdev. This can either be the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * toplevel configuration, or called recursively. If 'name' is NULL, then this
fa9e4066f08beec538e775443c5be79dd423fcabahrens * is a verbose output, and we don't want to display the toplevel pool stats.
fa9e4066f08beec538e775443c5be79dd423fcabahrensprint_vdev_stats(zpool_handle_t *zhp, const char *name, nvlist_t *oldnv,
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64_array(oldnv, ZPOOL_CONFIG_STATS,
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64_array(newnv, ZPOOL_CONFIG_STATS,
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* only toplevel vdevs have capacity stats */
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_one_stat((uint64_t)(scale * (newvs->vs_ops[ZIO_TYPE_READ] -
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_one_stat((uint64_t)(scale * (newvs->vs_ops[ZIO_TYPE_WRITE] -
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_one_stat((uint64_t)(scale * (newvs->vs_bytes[ZIO_TYPE_READ] -
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_one_stat((uint64_t)(scale * (newvs->vs_bytes[ZIO_TYPE_WRITE] -
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(newnv, ZPOOL_CONFIG_CHILDREN,
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (oldnv && nvlist_lookup_nvlist_array(oldnv, ZPOOL_CONFIG_CHILDREN,
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (c = 0; c < children; c++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_vdev_stats(zhp, vname, oldnv ? oldchild[c] : NULL,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If the pool has disappeared, remove it from the list and continue.
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (-1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Callback to print out the iostats for the given pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist(newconfig, ZPOOL_CONFIG_VDEV_TREE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist(oldconfig, ZPOOL_CONFIG_VDEV_TREE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print out the statistics for the pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_vdev_stats(zhp, zpool_get_name(zhp), oldnvroot, newnvroot, cb, 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((config = zpool_get_config(zhp, NULL)) != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The width must fall into the range [10,38]. The upper limit is the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * maximum we can have and still fit in 80 columns.
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool iostat [-v] [pool] ... [interval [count]]
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -v Display statistics for individual vdevs
fa9e4066f08beec538e775443c5be79dd423fcabahrens * This command can be tricky because we want to be able to deal with pool
fa9e4066f08beec538e775443c5be79dd423fcabahrens * creation/destruction as well as vdev configuration changes. The bulk of this
fa9e4066f08beec538e775443c5be79dd423fcabahrens * processing is handled by the pool_list_* routines in zpool_iter.c. We rely
fa9e4066f08beec538e775443c5be79dd423fcabahrens * on pool_list_update() to detect the addition of new pools. Configuration
fa9e4066f08beec538e775443c5be79dd423fcabahrens * changes are all handled within libzfs.
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Determine if the last argument is an integer or a pool name
fa9e4066f08beec538e775443c5be79dd423fcabahrens "cannot be zero\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Ignore the last parameter
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If this is not a valid number, just plow on. The
fa9e4066f08beec538e775443c5be79dd423fcabahrens * user will get a more informative error message later
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If the last argument is also an integer, then we have both a count
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and an integer.
fa9e4066f08beec538e775443c5be79dd423fcabahrens "cannot be zero\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Ignore the last parameter
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Construct the list of all interesting pools.
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((list = pool_list_get(argc, argv, NULL, &ret)) == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("no pools available\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Enter the main iostat loop.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Refresh all statistics. This is done as an explicit step
fa9e4066f08beec538e775443c5be79dd423fcabahrens * before calculating the maximum name width, so that any
fa9e4066f08beec538e775443c5be79dd423fcabahrens * configuration changes are properly accounted for.
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) pool_list_iter(list, B_FALSE, refresh_iostat, &cb);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Iterate over all pools to determine the maximum width
fa9e4066f08beec538e775443c5be79dd423fcabahrens * for the pool / device name column across all pools.
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) pool_list_iter(list, B_FALSE, get_namewidth, &cb);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If it's the first time, or verbose mode, print the header.
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) pool_list_iter(list, B_FALSE, print_iostat, &cb);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If there's more than one pool, and we're not in verbose mode
fa9e4066f08beec538e775443c5be79dd423fcabahrens * (which prints a separator for us), then print a separator.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Flush the output so that redirection to a file isn't buffered
fa9e4066f08beec538e775443c5be79dd423fcabahrens * indefinitely.
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct list_cbdata {
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Given a list of columns to display, output appropriate headers for each one.
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *header;
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Given a pool and a list of properties, print out all the properties according
fa9e4066f08beec538e775443c5be79dd423fcabahrens * to the described layout.
fa9e4066f08beec538e775443c5be79dd423fcabahrensprint_pool(zpool_handle_t *zhp, zprop_list_t *pl, int scripted)
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If this is being called in scripted mode, or if this is the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * last column and it is left-justified, don't include a width
fa9e4066f08beec538e775443c5be79dd423fcabahrens * format specifier.
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (scripted || (pl->pl_next == NULL && !right_justify))
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Generic callback function to list a pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool list [-H] [-o prop[,prop]*] [pool] ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -H Scripted mode. Don't display headers, and separate properties
fa9e4066f08beec538e775443c5be79dd423fcabahrens * by a single tab.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -o List of properties to display. Defaults to
fa9e4066f08beec538e775443c5be79dd423fcabahrens * "name,size,used,available,capacity,health,altroot"
fa9e4066f08beec538e775443c5be79dd423fcabahrens * List all pools in the system, whether or not they're healthy. Output space
fa9e4066f08beec538e775443c5be79dd423fcabahrens * statistics for each one, as well as health status summary.
fa9e4066f08beec538e775443c5be79dd423fcabahrens static char default_props[] =
fa9e4066f08beec538e775443c5be79dd423fcabahrens "name,size,used,available,capacity,health,altroot";
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing argument for "
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zprop_get_list(g_zfs, props, &cb.cb_proplist, ZFS_TYPE_POOL) != 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = for_each_pool(argc, argv, B_TRUE, &cb.cb_proplist,
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (c = 0; c < children; c++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((match = zpool_get_vdev_by_name(child[c], name)) != NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_attach_or_replace(int argc, char **argv, int replacing)
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get pool name and check number of arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name argument\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("too many arguments\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("pool '%s' is unavailable\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvroot = make_root_vdev(zhp, force, B_FALSE, replacing, argc, argv);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = zpool_vdev_attach(zhp, old_disk, new_disk, nvroot, replacing);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool replace [-f] <pool> <device> <new_device>
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Force attach, even if <new_device> appears to be in use.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Replace <device> with <new_device>.
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock return (zpool_do_attach_or_replace(argc, argv, B_TRUE));
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock * zpool attach [-f] <pool> <device> <new_device>
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Force attach, even if <new_device> appears to be in use.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Attach <new_device> to the mirror containing <device>. If <device> is not
fa9e4066f08beec538e775443c5be79dd423fcabahrens * part of a mirror, then <device> will be transformed into a mirror of
fa9e4066f08beec538e775443c5be79dd423fcabahrens * <device> and <new_device>. In either case, <new_device> will begin life
fa9e4066f08beec538e775443c5be79dd423fcabahrens * with a DTL of [0, now], and will immediately begin to resilver itself.
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (zpool_do_attach_or_replace(argc, argv, B_FALSE));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool detach [-f] <pool> <device>
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Force detach of <device>, even if DTLs argue against it
fa9e4066f08beec538e775443c5be79dd423fcabahrens * (not supported yet)
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Detach a device from a mirror. The operation will be refused if <device>
fa9e4066f08beec538e775443c5be79dd423fcabahrens * is the last device in the mirror, or if the DTLs indicate that this device
fa9e4066f08beec538e775443c5be79dd423fcabahrens * has the only valid copy of some data.
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get pool name and check number of arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name argument\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool online <pool> <device> ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get pool name and check number of arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing device name\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zpool_vdev_online(zhp, argv[i], 0, &newstate) == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens "onlined, but remains in faulted state\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens "clear' to restore a faulted "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "device\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens "replace' to replace devices "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "that are no longer present\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool offline [-ft] <pool> <device> ...
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock * -f Force the device into the offline state, even if doing
fa9e4066f08beec538e775443c5be79dd423fcabahrens * so would appear to compromise pool availability.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * (not supported yet)
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -t Only take the device off-line temporarily. The offline
fa9e4066f08beec538e775443c5be79dd423fcabahrens * state will not be persistent across reboots.
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get pool name and check number of arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing device name\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool clear <pool> [device]
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Clear all errors associated with a pool or a particular device.
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("too many arguments\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct scrub_cbdata {
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Ignore faulted pools.
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("cannot scrub '%s': pool is "
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (err != 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool scrub [-s] <pool> ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -s Stop. Stops any in-progress scrub.
optopt);
typedef struct status_cbdata {
int cb_count;
double fraction_done;
char *scrub_type;
if (end != 0) {
if (examined == 0)
typedef struct spare_cbdata {
static boolean_t
return (B_TRUE);
for (c = 0; c < children; c++)
return (B_TRUE);
return (B_FALSE);
&nvroot) == 0);
char *vname;
char *state;
children = 0;
if (isspare) {
if (!isspare) {
¬present) == 0) {
char *path;
case VDEV_AUX_OPEN_FAILED:
case VDEV_AUX_BAD_GUID_SUM:
case VDEV_AUX_NO_REPLICAS:
case VDEV_AUX_VERSION_NEWER:
case VDEV_AUX_SPARED:
case VDEV_AUX_ERR_EXCEEDED:
* Report bytes resilvered/repaired on leaf devices.
for (c = 0; c < children; c++) {
&is_log);
char *pathname;
&dsobj) == 0);
&obj) == 0);
int namewidth)
uint_t i;
char *name;
if (nspares == 0)
for (i = 0; i < nspares; i++) {
char *msgid;
int reason;
const char *health;
uint_t c;
&nvroot) == 0);
switch (reason) {
case ZPOOL_STATUS_FAILING_DEV:
case ZPOOL_STATUS_OFFLINE_DEV:
case ZPOOL_STATUS_RESILVERING:
msgid);
int namewidth;
&nerr) == 0) {
nerr = 0;
nerr++;
if (nerr == 0)
int ret;
optopt);
if (argc == 0)
return (ret);
typedef struct upgrade_cbdata {
int cb_all;
int cb_first;
int cb_newer;
int cb_argc;
char **cb_argv;
int ret = 0;
&version) == 0);
if (!ret) {
return (ret);
int ret;
if (!ret) {
return (ret != 0);
int ret = 0;
char *end;
optopt);
if (showversions) {
if (argc != 0) {
if (showversions) {
} else if (argc == 0) {
int notfound;
if (ret == 0) {
if (notfound)
return (ret);
typedef struct hist_cbdata {
int longfmt;
int internal;
char *cmdstr;
char *pathstr;
struct tm t;
int ret, i;
char *hostname;
char *zonename;
return (ret);
for (i = 0; i < numrecords; i++) {
&dst_time) != 0)
&cmdstr) != 0) {
sizeof (internalstr),
pathstr);
if (pwd)
(int)who);
return (ret);
int ret;
optopt);
&cbdata);
return (ret);
int ret;
ZFS_TYPE_POOL) != 0)
return (ret);
typedef struct set_cbdata {
char *cb_propname;
char *cb_value;
} set_cbdata_t;
int error;
if (!error)
return (error);
int error;
return (error);
for (i = 0; i < NCOMMAND; i++) {
*idx = i;
int ret;
char *cmdname;
opterr = 0;
abort();
return (ret);