zpool_main.c revision 46657f8d750bdb71753495ce2919170f126b8e34
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER START
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The contents of this file are subject to the terms of the
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling * Common Development and Distribution License (the "License").
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling * You may not use this file except in compliance with the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fa9e4066f08beec538e775443c5be79dd423fcabahrens * or http://www.opensolaris.org/os/licensing.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * See the License for the specific language governing permissions
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and limitations under the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
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 *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER END
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Use is subject to license terms.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#pragma ident "%Z%%M% %I% %E% SMI"
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <assert.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <ctype.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <dirent.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <errno.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <fcntl.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <libgen.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <libintl.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <libuutil.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <locale.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <stdio.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <stdlib.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <string.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <strings.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <unistd.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <priv.h>
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks#include <sys/stat.h>
b1b8ab34de515a5e83206da22c3d7e563241b021lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <libzfs.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "zpool_util.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_create(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_destroy(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_add(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_remove(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_list(int, char **);
99653d4ee642c6528e88224f12409a5f23060994eschrockstatic int zpool_do_iostat(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_status(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_online(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_offline(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_clear(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_attach(int, char **);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockstatic int zpool_do_detach(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_replace(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_scrub(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_import(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_export(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_upgrade(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_history(int, char **);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock/*
06eeb2ad640ce72d394ac521094bed7681044408ek * These libumem hooks provide a reasonable set of defaults for the allocator's
06eeb2ad640ce72d394ac521094bed7681044408ek * debugging facilities.
b1b8ab34de515a5e83206da22c3d7e563241b021lling */
b1b8ab34de515a5e83206da22c3d7e563241b021llingconst char *
b1b8ab34de515a5e83206da22c3d7e563241b021lling_umem_debug_init(void)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens return ("default,verbose"); /* $UMEM_DEBUG setting */
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensconst char *
99653d4ee642c6528e88224f12409a5f23060994eschrock_umem_logging_init(void)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens return ("fail,contents"); /* $UMEM_LOGGING setting */
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef enum {
fa9e4066f08beec538e775443c5be79dd423fcabahrens HELP_ADD,
fa9e4066f08beec538e775443c5be79dd423fcabahrens HELP_ATTACH,
fa9e4066f08beec538e775443c5be79dd423fcabahrens HELP_CLEAR,
fa9e4066f08beec538e775443c5be79dd423fcabahrens HELP_CREATE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens HELP_DESTROY,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_DETACH,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_EXPORT,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_HISTORY,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock HELP_IMPORT,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_IOSTAT,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_LIST,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_OFFLINE,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_ONLINE,
06eeb2ad640ce72d394ac521094bed7681044408ek HELP_REPLACE,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_REMOVE,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_SCRUB,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_STATUS,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_UPGRADE
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock} zpool_help_t;
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock
65cd9f2809a015b46790a9c5c2ef992d56177624eschrocktypedef struct zpool_command {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock const char *name;
b1b8ab34de515a5e83206da22c3d7e563241b021lling int (*func)(int, char **);
b1b8ab34de515a5e83206da22c3d7e563241b021lling zpool_help_t usage;
b1b8ab34de515a5e83206da22c3d7e563241b021lling} zpool_command_t;
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock/*
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * 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 *
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * 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 */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic zpool_command_t command_table[] = {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock { "create", zpool_do_create, HELP_CREATE },
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock { "destroy", zpool_do_destroy, HELP_DESTROY },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { NULL },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "add", zpool_do_add, HELP_ADD },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "remove", zpool_do_remove, HELP_REMOVE },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { NULL },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "list", zpool_do_list, HELP_LIST },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "iostat", zpool_do_iostat, HELP_IOSTAT },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "status", zpool_do_status, HELP_STATUS },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { NULL },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "online", zpool_do_online, HELP_ONLINE },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "offline", zpool_do_offline, HELP_OFFLINE },
99653d4ee642c6528e88224f12409a5f23060994eschrock { "clear", zpool_do_clear, HELP_CLEAR },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { NULL },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "attach", zpool_do_attach, HELP_ATTACH },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "detach", zpool_do_detach, HELP_DETACH },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "replace", zpool_do_replace, HELP_REPLACE },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { NULL },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "scrub", zpool_do_scrub, HELP_SCRUB },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { NULL },
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock { "import", zpool_do_import, HELP_IMPORT },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "export", zpool_do_export, HELP_EXPORT },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "upgrade", zpool_do_upgrade, HELP_UPGRADE },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { NULL },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "history", zpool_do_history, HELP_HISTORY }
fa9e4066f08beec538e775443c5be79dd423fcabahrens};
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define NCOMMAND (sizeof (command_table) / sizeof (command_table[0]))
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
65cd9f2809a015b46790a9c5c2ef992d56177624eschrockzpool_command_t *current_command;
06eeb2ad640ce72d394ac521094bed7681044408ek
06eeb2ad640ce72d394ac521094bed7681044408ekstatic const char *
b1b8ab34de515a5e83206da22c3d7e563241b021llingget_usage(zpool_help_t idx) {
b1b8ab34de515a5e83206da22c3d7e563241b021lling switch (idx) {
b1b8ab34de515a5e83206da22c3d7e563241b021lling case HELP_ADD:
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (gettext("\tadd [-fn] <pool> <vdev> ...\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens case HELP_ATTACH:
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (gettext("\tattach [-f] <pool> <device> "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "<new_device>\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens case HELP_CLEAR:
2a6b87f07ac0c0b819179c84afe5a60afa04cfa5ek return (gettext("\tclear <pool> [device]\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens case HELP_CREATE:
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock return (gettext("\tcreate [-fn] [-R root] [-m mountpoint] "
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock "<pool> <vdev> ...\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_DESTROY:
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock return (gettext("\tdestroy [-f] <pool>\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_DETACH:
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock return (gettext("\tdetach <pool> <device>\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_EXPORT:
e45ce728996d8e573eecb27f555fb86aaff0cafdahrens return (gettext("\texport [-f] <pool> ...\n"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock case HELP_HISTORY:
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock return (gettext("\thistory [<pool>]\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_IMPORT:
990b4856d0eaada6f8140335733a1b1771ed2746lling return (gettext("\timport [-d dir] [-D]\n"
990b4856d0eaada6f8140335733a1b1771ed2746lling "\timport [-d dir] [-D] [-f] [-o opts] [-R root] -a\n"
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock "\timport [-d dir] [-D] [-f] [-o opts] [-R root ]"
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock " <pool | id> [newpool]\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_IOSTAT:
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock return (gettext("\tiostat [-v] [pool] ... [interval "
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock "[count]]\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_LIST:
06eeb2ad640ce72d394ac521094bed7681044408ek return (gettext("\tlist [-H] [-o field[,field]*] "
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "[pool] ...\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_OFFLINE:
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm return (gettext("\toffline [-t] <pool> <device> ...\n"));
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock case HELP_ONLINE:
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock return (gettext("\tonline <pool> <device> ...\n"));
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock case HELP_REPLACE:
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock return (gettext("\treplace [-f] <pool> <device> "
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock "[new_device]\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_REMOVE:
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock return (gettext("\tremove <pool> <device>\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_SCRUB:
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock return (gettext("\tscrub [-s] <pool> ...\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling case HELP_STATUS:
990b4856d0eaada6f8140335733a1b1771ed2746lling return (gettext("\tstatus [-vx] [pool] ...\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_UPGRADE:
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling return (gettext("\tupgrade\n"
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock "\tupgrade -v\n"
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling "\tupgrade <-a | pool>\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock }
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
e45ce728996d8e573eecb27f555fb86aaff0cafdahrens abort();
99653d4ee642c6528e88224f12409a5f23060994eschrock /* NOTREACHED */
99653d4ee642c6528e88224f12409a5f23060994eschrock}
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock/*
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * Fields available for 'zpool list'.
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock */
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrocktypedef enum {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock ZPOOL_FIELD_NAME,
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock ZPOOL_FIELD_SIZE,
990b4856d0eaada6f8140335733a1b1771ed2746lling ZPOOL_FIELD_USED,
b1b8ab34de515a5e83206da22c3d7e563241b021lling ZPOOL_FIELD_AVAILABLE,
e45ce728996d8e573eecb27f555fb86aaff0cafdahrens ZPOOL_FIELD_CAPACITY,
b1b8ab34de515a5e83206da22c3d7e563241b021lling ZPOOL_FIELD_HEALTH,
b1b8ab34de515a5e83206da22c3d7e563241b021lling ZPOOL_FIELD_ROOT
b1b8ab34de515a5e83206da22c3d7e563241b021lling} zpool_field_t;
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock#define MAX_FIELDS 10
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
65cd9f2809a015b46790a9c5c2ef992d56177624eschrocktypedef struct column_def {
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock const char *cd_title;
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock size_t cd_width;
fa9e4066f08beec538e775443c5be79dd423fcabahrens enum {
b1b8ab34de515a5e83206da22c3d7e563241b021lling left_justify,
b1b8ab34de515a5e83206da22c3d7e563241b021lling right_justify
b1b8ab34de515a5e83206da22c3d7e563241b021lling } cd_justify;
990b4856d0eaada6f8140335733a1b1771ed2746lling} column_def_t;
990b4856d0eaada6f8140335733a1b1771ed2746lling
b1b8ab34de515a5e83206da22c3d7e563241b021llingstatic column_def_t column_table[] = {
b1b8ab34de515a5e83206da22c3d7e563241b021lling { "NAME", 20, left_justify },
b1b8ab34de515a5e83206da22c3d7e563241b021lling { "SIZE", 6, right_justify },
b1b8ab34de515a5e83206da22c3d7e563241b021lling { "USED", 6, right_justify },
b1b8ab34de515a5e83206da22c3d7e563241b021lling { "AVAIL", 6, right_justify },
990b4856d0eaada6f8140335733a1b1771ed2746lling { "CAP", 5, right_justify },
990b4856d0eaada6f8140335733a1b1771ed2746lling { "HEALTH", 9, left_justify },
990b4856d0eaada6f8140335733a1b1771ed2746lling { "ALTROOT", 15, left_justify }
990b4856d0eaada6f8140335733a1b1771ed2746lling};
990b4856d0eaada6f8140335733a1b1771ed2746lling
b1b8ab34de515a5e83206da22c3d7e563241b021llingstatic char *column_subopts[] = {
b1b8ab34de515a5e83206da22c3d7e563241b021lling "name",
b1b8ab34de515a5e83206da22c3d7e563241b021lling "size",
b1b8ab34de515a5e83206da22c3d7e563241b021lling "used",
b1b8ab34de515a5e83206da22c3d7e563241b021lling "available",
990b4856d0eaada6f8140335733a1b1771ed2746lling "capacity",
b1b8ab34de515a5e83206da22c3d7e563241b021lling "health",
b1b8ab34de515a5e83206da22c3d7e563241b021lling "root",
fa9e4066f08beec538e775443c5be79dd423fcabahrens NULL
fa9e4066f08beec538e775443c5be79dd423fcabahrens};
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
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
99653d4ee642c6528e88224f12409a5f23060994eschrock * a complete usage message.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrensusage(boolean_t requested)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens FILE *fp = requested ? stdout : stderr;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (current_command == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(fp, gettext("usage: zpool command args ...\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(fp,
fa9e4066f08beec538e775443c5be79dd423fcabahrens gettext("where 'command' is one of the following:\n\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < NCOMMAND; i++) {
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock if (command_table[i].name == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(fp, "\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(fp, "%s",
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock get_usage(command_table[i].usage));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) fprintf(fp, gettext("usage:\n"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) fprintf(fp, "%s", get_usage(current_command->usage));
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling if (strcmp(current_command->name, "list") == 0) {
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) fprintf(fp, gettext("\nwhere 'field' is one "
b1b8ab34de515a5e83206da22c3d7e563241b021lling "of the following:\n\n"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling for (i = 0; column_subopts[i] != NULL; i++)
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) fprintf(fp, "\t%s\n", column_subopts[i]);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
b1b8ab34de515a5e83206da22c3d7e563241b021lling }
b1b8ab34de515a5e83206da22c3d7e563241b021lling
990b4856d0eaada6f8140335733a1b1771ed2746lling /*
990b4856d0eaada6f8140335733a1b1771ed2746lling * See comments at end of main().
b1b8ab34de515a5e83206da22c3d7e563241b021lling */
b1b8ab34de515a5e83206da22c3d7e563241b021lling if (getenv("ZFS_ABORT") != NULL) {
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock (void) printf("dumping core by request\n");
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock abort();
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock }
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock exit(requested ? 0 : 2);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock}
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrockconst char *
fa9e4066f08beec538e775443c5be79dd423fcabahrensstate_to_health(int vs_state)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (vs_state) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case VDEV_STATE_CLOSED:
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin case VDEV_STATE_CANT_OPEN:
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin case VDEV_STATE_OFFLINE:
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (dgettext(TEXT_DOMAIN, "FAULTED"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens case VDEV_STATE_DEGRADED:
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (dgettext(TEXT_DOMAIN, "DEGRADED"));
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock case VDEV_STATE_HEALTHY:
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (dgettext(TEXT_DOMAIN, "ONLINE"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (dgettext(TEXT_DOMAIN, "UNKNOWN"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensconst char *
fa9e4066f08beec538e775443c5be79dd423fcabahrensstate_to_name(vdev_stat_t *vs)
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock{
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin switch (vs->vs_state) {
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin case VDEV_STATE_CLOSED:
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin case VDEV_STATE_CANT_OPEN:
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin if (vs->vs_aux == VDEV_AUX_CORRUPT_DATA)
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin return (gettext("FAULTED"));
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin else
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin return (gettext("UNAVAIL"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case VDEV_STATE_OFFLINE:
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin return (gettext("OFFLINE"));
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin case VDEV_STATE_DEGRADED:
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock return (gettext("DEGRADED"));
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock case VDEV_STATE_HEALTHY:
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (gettext("ONLINE"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling return (gettext("UNKNOWN"));
990b4856d0eaada6f8140335733a1b1771ed2746lling}
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746llingvoid
990b4856d0eaada6f8140335733a1b1771ed2746llingprint_vdev_tree(zpool_handle_t *zhp, const char *name, nvlist_t *nv, int indent)
990b4856d0eaada6f8140335733a1b1771ed2746lling{
990b4856d0eaada6f8140335733a1b1771ed2746lling nvlist_t **child;
990b4856d0eaada6f8140335733a1b1771ed2746lling uint_t c, children;
990b4856d0eaada6f8140335733a1b1771ed2746lling char *vname;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling if (name != NULL)
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf("\t%*s%s\n", indent, "", name);
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
990b4856d0eaada6f8140335733a1b1771ed2746lling &child, &children) != 0)
990b4856d0eaada6f8140335733a1b1771ed2746lling return;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling for (c = 0; c < children; c++) {
990b4856d0eaada6f8140335733a1b1771ed2746lling vname = zpool_vdev_name(g_zfs, zhp, child[c]);
990b4856d0eaada6f8140335733a1b1771ed2746lling print_vdev_tree(zhp, vname, child[c], indent + 2);
990b4856d0eaada6f8140335733a1b1771ed2746lling free(vname);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling}
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling/*
990b4856d0eaada6f8140335733a1b1771ed2746lling * zpool add [-fn] <pool> <vdev> ...
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock *
990b4856d0eaada6f8140335733a1b1771ed2746lling * -f Force addition of devices, even if they appear in use
990b4856d0eaada6f8140335733a1b1771ed2746lling * -n Do not add the devices, but display the resulting layout if
990b4856d0eaada6f8140335733a1b1771ed2746lling * they were to be added.
990b4856d0eaada6f8140335733a1b1771ed2746lling *
990b4856d0eaada6f8140335733a1b1771ed2746lling * Adds the given vdevs to 'pool'. As with create, the bulk of this work is
990b4856d0eaada6f8140335733a1b1771ed2746lling * handled by get_vdev_spec(), which constructs the nvlist needed to pass to
990b4856d0eaada6f8140335733a1b1771ed2746lling * libzfs.
990b4856d0eaada6f8140335733a1b1771ed2746lling */
990b4856d0eaada6f8140335733a1b1771ed2746llingint
990b4856d0eaada6f8140335733a1b1771ed2746llingzpool_do_add(int argc, char **argv)
990b4856d0eaada6f8140335733a1b1771ed2746lling{
990b4856d0eaada6f8140335733a1b1771ed2746lling boolean_t force = B_FALSE;
990b4856d0eaada6f8140335733a1b1771ed2746lling boolean_t dryrun = B_FALSE;
990b4856d0eaada6f8140335733a1b1771ed2746lling int c;
990b4856d0eaada6f8140335733a1b1771ed2746lling nvlist_t *nvroot;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *poolname;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ret;
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_handle_t *zhp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *config;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((c = getopt(argc, argv, "fn")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'f':
fa9e4066f08beec538e775443c5be79dd423fcabahrens force = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'n':
fa9e4066f08beec538e775443c5be79dd423fcabahrens dryrun = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
99653d4ee642c6528e88224f12409a5f23060994eschrock case '?':
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens optopt);
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc -= optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv += optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get pool name and check number of arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name argument\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 2) {
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, gettext("missing vdev specification\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens poolname = argv[0];
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc--;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv++;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((config = zpool_get_config(zhp, NULL)) == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("pool '%s' is unavailable\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens poolname);
99653d4ee642c6528e88224f12409a5f23060994eschrock zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock /* pass off to get_vdev_spec for processing */
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvroot = make_root_vdev(config, force, !force, B_FALSE, argc, argv);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvroot == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (dryrun) {
99653d4ee642c6528e88224f12409a5f23060994eschrock nvlist_t *poolnvroot;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock &poolnvroot) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("would update '%s' to the following "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "configuration:\n"), zpool_get_name(zhp));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_vdev_tree(zhp, poolname, poolnvroot, 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_vdev_tree(zhp, NULL, nvroot, 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor ret = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = (zpool_add(zhp, nvroot) != 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!ret) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_log_history(g_zfs, argc + 1 + optind,
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv - 1 - optind, poolname, B_TRUE, B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_free(nvroot);
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin/*
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * zpool remove <pool> <vdev>
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin *
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * Removes the given vdev from the pool. Currently, this only supports removing
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * spares from the pool. Eventually, we'll want to support removing leaf vdevs
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * (as an alias for 'detach') as well as toplevel vdevs.
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin */
8654d0253136055bd4cc2423d87378e8a37f2eb5perrinint
8654d0253136055bd4cc2423d87378e8a37f2eb5perrinzpool_do_remove(int argc, char **argv)
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin{
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin char *poolname;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ret;
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_handle_t *zhp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc--;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv++;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock /* get pool name and check number of arguments */
99653d4ee642c6528e88224f12409a5f23060994eschrock if (argc < 1) {
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, gettext("missing pool name argument\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock if (argc < 2) {
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, gettext("missing device\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock poolname = argv[0];
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
99653d4ee642c6528e88224f12409a5f23060994eschrock return (1);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock ret = (zpool_vdev_remove(zhp, argv[1]) != 0);
99653d4ee642c6528e88224f12409a5f23060994eschrock if (!ret) {
99653d4ee642c6528e88224f12409a5f23060994eschrock zpool_log_history(g_zfs, ++argc, --argv, poolname, B_TRUE,
99653d4ee642c6528e88224f12409a5f23060994eschrock B_FALSE);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock return (ret);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock/*
99653d4ee642c6528e88224f12409a5f23060994eschrock * zpool create [-fn] [-R root] [-m mountpoint] <pool> <dev> ...
99653d4ee642c6528e88224f12409a5f23060994eschrock *
99653d4ee642c6528e88224f12409a5f23060994eschrock * -f Force creation, even if devices appear in use
99653d4ee642c6528e88224f12409a5f23060994eschrock * -n Do not create the pool, but display the resulting layout if it
99653d4ee642c6528e88224f12409a5f23060994eschrock * were to be created.
99653d4ee642c6528e88224f12409a5f23060994eschrock * -R Create a pool under an alternate root
99653d4ee642c6528e88224f12409a5f23060994eschrock * -m Set default mountpoint for the root dataset. By default it's
99653d4ee642c6528e88224f12409a5f23060994eschrock * '/<pool>'
99653d4ee642c6528e88224f12409a5f23060994eschrock *
99653d4ee642c6528e88224f12409a5f23060994eschrock * Creates the the named pool according to the given vdev specification. The
99653d4ee642c6528e88224f12409a5f23060994eschrock * bulk of the vdev processing is done in get_vdev_spec() in zpool_vdev.c. Once
99653d4ee642c6528e88224f12409a5f23060994eschrock * we get the nvlist back from get_vdev_spec(), we either print out the contents
99653d4ee642c6528e88224f12409a5f23060994eschrock * (if '-n' was specified), or pass it to libzfs to do the creation.
99653d4ee642c6528e88224f12409a5f23060994eschrock */
99653d4ee642c6528e88224f12409a5f23060994eschrockint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_create(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t force = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t dryrun = B_FALSE;
990b4856d0eaada6f8140335733a1b1771ed2746lling int c;
990b4856d0eaada6f8140335733a1b1771ed2746lling nvlist_t *nvroot;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *poolname;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ret;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *altroot = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *mountpoint = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t **child;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint_t children;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((c = getopt(argc, argv, ":fnR:m:")) != -1) {
b1b8ab34de515a5e83206da22c3d7e563241b021lling switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'f':
fa9e4066f08beec538e775443c5be79dd423fcabahrens force = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'n':
fa9e4066f08beec538e775443c5be79dd423fcabahrens dryrun = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'R':
99653d4ee642c6528e88224f12409a5f23060994eschrock altroot = optarg;
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'm':
990b4856d0eaada6f8140335733a1b1771ed2746lling mountpoint = optarg;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
990b4856d0eaada6f8140335733a1b1771ed2746lling case ':':
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing argument for "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "'%c' option\n"), optopt);
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
990b4856d0eaada6f8140335733a1b1771ed2746lling case '?':
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens optopt);
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock argc -= optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv += optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock /* get pool name and check number of arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name argument\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling if (argc < 2) {
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) fprintf(stderr, gettext("missing vdev specification\n"));
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock usage(B_FALSE);
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock }
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock poolname = argv[0];
990b4856d0eaada6f8140335733a1b1771ed2746lling
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock /*
990b4856d0eaada6f8140335733a1b1771ed2746lling * As a special case, check for use of '/' in the name, and direct the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * user to use 'zfs create' instead.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strchr(poolname, '/') != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("cannot create '%s': invalid "
990b4856d0eaada6f8140335733a1b1771ed2746lling "character '/' in pool name\n"), poolname);
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) fprintf(stderr, gettext("use 'zfs create' to "
990b4856d0eaada6f8140335733a1b1771ed2746lling "create a dataset\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling return (1);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling /* pass off to get_vdev_spec for bulk processing */
990b4856d0eaada6f8140335733a1b1771ed2746lling nvroot = make_root_vdev(NULL, force, !force, B_FALSE, argc - 1,
990b4856d0eaada6f8140335733a1b1771ed2746lling argv + 1);
990b4856d0eaada6f8140335733a1b1771ed2746lling if (nvroot == NULL)
990b4856d0eaada6f8140335733a1b1771ed2746lling return (1);
990b4856d0eaada6f8140335733a1b1771ed2746lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* make_root_vdev() allows 0 toplevel children if there are spares */
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_CHILDREN,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &child, &children) == 0);
990b4856d0eaada6f8140335733a1b1771ed2746lling if (children == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid vdev "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "specification: at least one toplevel vdev must be "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "specified\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (altroot != NULL && altroot[0] != '/') {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid alternate root '%s': "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "must be an absolute path\n"), altroot);
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_free(nvroot);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
990b4856d0eaada6f8140335733a1b1771ed2746lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
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.
990b4856d0eaada6f8140335733a1b1771ed2746lling */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mountpoint == NULL ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens (strcmp(mountpoint, ZFS_MOUNTPOINT_LEGACY) != 0 &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens strcmp(mountpoint, ZFS_MOUNTPOINT_NONE) != 0)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens char buf[MAXPATHLEN];
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct stat64 statbuf;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mountpoint && mountpoint[0] != '/') {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid mountpoint "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "'%s': must be an absolute path, 'legacy', or "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "'none'\n"), mountpoint);
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_free(nvroot);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
990b4856d0eaada6f8140335733a1b1771ed2746lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mountpoint == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (altroot != NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) snprintf(buf, sizeof (buf), "%s/%s",
99653d4ee642c6528e88224f12409a5f23060994eschrock altroot, poolname);
99653d4ee642c6528e88224f12409a5f23060994eschrock else
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) snprintf(buf, sizeof (buf), "/%s",
fa9e4066f08beec538e775443c5be79dd423fcabahrens poolname);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
99653d4ee642c6528e88224f12409a5f23060994eschrock if (altroot != NULL)
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) snprintf(buf, sizeof (buf), "%s%s",
99653d4ee642c6528e88224f12409a5f23060994eschrock altroot, mountpoint);
99653d4ee642c6528e88224f12409a5f23060994eschrock else
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) snprintf(buf, sizeof (buf), "%s",
99653d4ee642c6528e88224f12409a5f23060994eschrock mountpoint);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
990b4856d0eaada6f8140335733a1b1771ed2746lling
99653d4ee642c6528e88224f12409a5f23060994eschrock if (stat64(buf, &statbuf) == 0 &&
99653d4ee642c6528e88224f12409a5f23060994eschrock statbuf.st_nlink != 2) {
99653d4ee642c6528e88224f12409a5f23060994eschrock if (mountpoint == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("default "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "mountpoint '%s' exists and is not "
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock "empty\n"), buf);
990b4856d0eaada6f8140335733a1b1771ed2746lling else
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("mountpoint "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "'%s' exists and is not empty\n"), buf);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("use '-m' "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "option to provide a different default\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_free(nvroot);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (dryrun) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
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 */
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf(gettext("would create '%s' with the "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "following layout:\n\n"), poolname);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_vdev_tree(NULL, poolname, nvroot, 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Hand off to libzfs.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zpool_create(g_zfs, poolname, nvroot, altroot) == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens zfs_handle_t *pool = zfs_open(g_zfs, poolname,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZFS_TYPE_FILESYSTEM);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (pool != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mountpoint != NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(zfs_prop_set(pool,
fa9e4066f08beec538e775443c5be79dd423fcabahrens zfs_prop_to_name(
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZFS_PROP_MOUNTPOINT),
fa9e4066f08beec538e775443c5be79dd423fcabahrens mountpoint) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zfs_mount(pool, NULL, 0) == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = zfs_share_nfs(pool);
fa9e4066f08beec538e775443c5be79dd423fcabahrens zfs_close(pool);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_log_history(g_zfs, argc + optind, argv - optind,
fa9e4066f08beec538e775443c5be79dd423fcabahrens poolname, B_TRUE, B_TRUE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else if (libzfs_errno(g_zfs) == EZFS_INVALIDNAME) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("pool name may have "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "been omitted\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
990b4856d0eaada6f8140335733a1b1771ed2746lling }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_free(nvroot);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool destroy <pool>
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Forcefully unmount any datasets
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Destroy the given pool. Automatically unmounts any datasets in the pool.
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin */
8654d0253136055bd4cc2423d87378e8a37f2eb5perrinint
8654d0253136055bd4cc2423d87378e8a37f2eb5perrinzpool_do_destroy(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t force = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *pool;
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_handle_t *zhp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ret;
990b4856d0eaada6f8140335733a1b1771ed2746lling
99653d4ee642c6528e88224f12409a5f23060994eschrock /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((c = getopt(argc, argv, "f")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'f':
fa9e4066f08beec538e775443c5be79dd423fcabahrens force = B_TRUE;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock break;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock case '?':
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens optopt);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock argc -= optind;
99653d4ee642c6528e88224f12409a5f23060994eschrock argv += optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 1) {
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) fprintf(stderr, gettext("missing pool argument\n"));
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock usage(B_FALSE);
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc > 1) {
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) fprintf(stderr, gettext("too many arguments\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling usage(B_FALSE);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens pool = argv[0];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((zhp = zpool_open_canfail(g_zfs, pool)) == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * As a special case, check for use of '/' in the name, and
fa9e4066f08beec538e775443c5be79dd423fcabahrens * direct the user to use 'zfs destroy' instead.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strchr(pool, '/') != NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("use 'zfs destroy' to "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "destroy a dataset\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zpool_disable_datasets(zhp, force) != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("could not destroy '%s': "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "could not unmount datasets\n"), zpool_get_name(zhp));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_log_history(g_zfs, argc + optind, argv - optind, pool, B_TRUE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock ret = (zpool_destroy(zhp) != 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool export [-f] <pool> ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Forcefully unmount datasets
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Export the 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.
99653d4ee642c6528e88224f12409a5f23060994eschrock */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_export(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
99653d4ee642c6528e88224f12409a5f23060994eschrock boolean_t force = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c;
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_handle_t *zhp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ret;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i;
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((c = getopt(argc, argv, "f")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'f':
fa9e4066f08beec538e775443c5be79dd423fcabahrens force = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case '?':
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens optopt);
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
f3861e1a2ceec23a5b699c24d814b7775a9e0b52ahl }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc -= optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv += optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool argument\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < argc; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((zhp = zpool_open_canfail(g_zfs, argv[i])) == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens continue;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
b1b8ab34de515a5e83206da22c3d7e563241b021lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zpool_disable_datasets(zhp, force) != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens continue;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock zpool_log_history(g_zfs, argc + optind, argv - optind, argv[i],
fa9e4066f08beec538e775443c5be79dd423fcabahrens B_TRUE, B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zpool_export(zhp) != 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Given a vdev configuration, determine the maximum width needed for the device
fa9e4066f08beec538e775443c5be79dd423fcabahrens * name column.
99653d4ee642c6528e88224f12409a5f23060994eschrock */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensmax_width(zpool_handle_t *zhp, nvlist_t *nv, int depth, int max)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *name = zpool_vdev_name(g_zfs, zhp, nv);
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t **child;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint_t c, children;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ret;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strlen(name) + depth > max)
99653d4ee642c6528e88224f12409a5f23060994eschrock max = strlen(name) + depth;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_SPARES,
99653d4ee642c6528e88224f12409a5f23060994eschrock &child, &children) == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (c = 0; c < children; c++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((ret = max_width(zhp, child[c], depth + 2,
fa9e4066f08beec538e775443c5be79dd423fcabahrens max)) > max)
fa9e4066f08beec538e775443c5be79dd423fcabahrens max = ret;
f3861e1a2ceec23a5b699c24d814b7775a9e0b52ahl }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &child, &children) == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (c = 0; c < children; c++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((ret = max_width(zhp, child[c], depth + 2,
fa9e4066f08beec538e775443c5be79dd423fcabahrens max)) > max)
fa9e4066f08beec538e775443c5be79dd423fcabahrens max = ret;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (max);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
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.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrockprint_import_config(const char *name, nvlist_t *nv, int namewidth, int depth)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
99653d4ee642c6528e88224f12409a5f23060994eschrock nvlist_t **child;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint_t c, children;
fa9e4066f08beec538e775443c5be79dd423fcabahrens vdev_stat_t *vs;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *type, *vname;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &type) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strcmp(type, VDEV_TYPE_MISSING) == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock verify(nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_STATS,
99653d4ee642c6528e88224f12409a5f23060994eschrock (uint64_t **)&vs, &c) == 0);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf("\t%*s%-*s", depth, "", namewidth - depth, name);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if (vs->vs_aux != 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(" %-8s ", state_to_name(vs));
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock switch (vs->vs_aux) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case VDEV_AUX_OPEN_FAILED:
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext("cannot open"));
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock case VDEV_AUX_BAD_GUID_SUM:
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext("missing device"));
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case VDEV_AUX_NO_REPLICAS:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("insufficient replicas"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case VDEV_AUX_VERSION_NEWER:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("newer version"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens default:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("corrupted data"));
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin break;
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(" %s", state_to_name(vs));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("\n");
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &child, &children) != 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (c = 0; c < children; c++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens vname = zpool_vdev_name(g_zfs, NULL, child[c]);
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_import_config(vname, child[c],
fa9e4066f08beec538e775443c5be79dd423fcabahrens namewidth, depth + 2);
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(vname);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_SPARES,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock &child, &children) != 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("\tspares\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (c = 0; c < children; c++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens vname = zpool_vdev_name(g_zfs, NULL, child[c]);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("\t %s\n", vname);
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(vname);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Display the status for the given pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockshow_import(nvlist_t *config)
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock{
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock uint64_t pool_state;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock vdev_stat_t *vs;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock char *name;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock uint64_t guid;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock char *msgid;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock nvlist_t *nvroot;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int reason;
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *health;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint_t vsc;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int namewidth;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &name) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &guid) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_STATE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &pool_state) == 0);
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin &nvroot) == 0);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_STATS,
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin (uint64_t **)&vs, &vsc) == 0);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin health = state_to_health(vs->vs_state);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin reason = zpool_import_status(config, &msgid);
99653d4ee642c6528e88224f12409a5f23060994eschrock
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock (void) printf(gettext(" pool: %s\n"), name);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin (void) printf(gettext(" id: %llu\n"), (u_longlong_t)guid);
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock (void) printf(gettext(" state: %s"), health);
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock if (pool_state == POOL_STATE_DESTROYED)
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext(" (DESTROYED)"));
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf("\n");
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock switch (reason) {
99653d4ee642c6528e88224f12409a5f23060994eschrock case ZPOOL_STATUS_MISSING_DEV_R:
99653d4ee642c6528e88224f12409a5f23060994eschrock case ZPOOL_STATUS_MISSING_DEV_NR:
99653d4ee642c6528e88224f12409a5f23060994eschrock case ZPOOL_STATUS_BAD_GUID_SUM:
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext("status: One or more devices are missing "
99653d4ee642c6528e88224f12409a5f23060994eschrock "from the system.\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_CORRUPT_LABEL_R:
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_CORRUPT_LABEL_NR:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: One or more devices contains "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "corrupted data.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_CORRUPT_DATA:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: The pool data is corrupted.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_OFFLINE_DEV:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: One or more devices "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "are offlined.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
46657f8d750bdb71753495ce2919170f126b8e34mmusante case ZPOOL_STATUS_CORRUPT_POOL:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: The pool metadata is "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "corrupted.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_VERSION_OLDER:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: The pool is formatted using an "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "older on-disk version.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_VERSION_NEWER:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: The pool is formatted using an "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "incompatible version.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling default:
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * No other status can be seen when importing pools.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
46657f8d750bdb71753495ce2919170f126b8e34mmusante assert(reason == ZPOOL_STATUS_OK);
46657f8d750bdb71753495ce2919170f126b8e34mmusante }
46657f8d750bdb71753495ce2919170f126b8e34mmusante
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm /*
b1b8ab34de515a5e83206da22c3d7e563241b021lling * Print out an action according to the overall state of the pool.
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (vs->vs_state == VDEV_STATE_HEALTHY) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (reason == ZPOOL_STATUS_VERSION_OLDER)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: The pool can be "
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 else
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: The pool can be "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "imported using its name or numeric "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "identifier.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else if (vs->vs_state == VDEV_STATE_DEGRADED) {
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 } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (reason) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_VERSION_NEWER:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: The pool cannot be "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "imported. Access the pool on a system running "
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling "newer\n\tsoftware, or recreate the pool from "
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling "backup.\n"));
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling break;
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling case ZPOOL_STATUS_MISSING_DEV_R:
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling case ZPOOL_STATUS_MISSING_DEV_NR:
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock case ZPOOL_STATUS_BAD_GUID_SUM:
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) printf(gettext("action: The pool cannot be "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "imported. Attach the missing\n\tdevices and try "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "again.\n"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock break;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock default:
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("action: The pool cannot be "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "imported due to damaged devices or data.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock /*
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * If the state is "closed" or "can't open", and the aux state
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * is "corrupt data":
95173954d2b811ceb583a9012c3b16e1d0dd6438ek */
95173954d2b811ceb583a9012c3b16e1d0dd6438ek if (((vs->vs_state == VDEV_STATE_CLOSED) ||
95173954d2b811ceb583a9012c3b16e1d0dd6438ek (vs->vs_state == VDEV_STATE_CANT_OPEN)) &&
95173954d2b811ceb583a9012c3b16e1d0dd6438ek (vs->vs_aux == VDEV_AUX_CORRUPT_DATA)) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (pool_state == POOL_STATE_DESTROYED)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) printf(gettext("\tThe pool was destroyed, "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "but can be imported using the '-Df' flags.\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock else if (pool_state != POOL_STATE_EXPORTED)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) printf(gettext("\tThe pool may be active on "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "on another system, but can be imported using\n\t"
fa9e4066f08beec538e775443c5be79dd423fcabahrens "the '-f' flag.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (msgid != NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext(" see: http://www.sun.com/msg/%s\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens msgid);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("config:\n\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens namewidth = max_width(NULL, nvroot, 0, 0);
46657f8d750bdb71753495ce2919170f126b8e34mmusante if (namewidth < 10)
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock namewidth = 10;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock print_import_config(name, nvroot, namewidth, 0);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (reason == ZPOOL_STATUS_BAD_GUID_SUM) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("\n\tAdditional devices are known to "
95173954d2b811ceb583a9012c3b16e1d0dd6438ek "be part of this pool, though their\n\texact "
95173954d2b811ceb583a9012c3b16e1d0dd6438ek "configuration cannot be determined.\n"));
95173954d2b811ceb583a9012c3b16e1d0dd6438ek }
95173954d2b811ceb583a9012c3b16e1d0dd6438ek}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock/*
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * Perform the import for the given configuration. This passes the heavy
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * lifting off to zpool_import(), and then mounts the datasets contained within
46657f8d750bdb71753495ce2919170f126b8e34mmusante * the pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockdo_import(nvlist_t *config, const char *newname, const char *mntopts,
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *altroot, int force, int argc, char **argv)
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock{
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock zpool_handle_t *zhp;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock char *name;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock uint64_t state;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock uint64_t version;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME,
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock &name) == 0);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock verify(nvlist_lookup_uint64(config,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZPOOL_CONFIG_POOL_STATE, &state) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64(config,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZPOOL_CONFIG_VERSION, &version) == 0);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (version > ZFS_VERSION) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) fprintf(stderr, gettext("cannot import '%s': pool "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "is formatted using a newer ZFS version\n"), name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock } else if (state != POOL_STATE_EXPORTED && !force) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) fprintf(stderr, gettext("cannot import '%s': pool "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "may be in use from other system\n"), name);
46657f8d750bdb71753495ce2919170f126b8e34mmusante (void) fprintf(stderr, gettext("use '-f' to import anyway\n"));
46657f8d750bdb71753495ce2919170f126b8e34mmusante return (1);
46657f8d750bdb71753495ce2919170f126b8e34mmusante }
46657f8d750bdb71753495ce2919170f126b8e34mmusante
46657f8d750bdb71753495ce2919170f126b8e34mmusante if (zpool_import(g_zfs, config, newname, altroot) != 0)
46657f8d750bdb71753495ce2919170f126b8e34mmusante return (1);
46657f8d750bdb71753495ce2919170f126b8e34mmusante
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (newname != NULL)
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock name = (char *)newname;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock zpool_log_history(g_zfs, argc, argv, name, B_TRUE, B_FALSE);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock verify((zhp = zpool_open(g_zfs, name)) != NULL);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zpool_enable_datasets(zhp, mntopts, 0) != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool import [-d dir] [-D]
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * import [-R root] [-D] [-d dir] [-f] -a
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * import [-R root] [-D] [-d dir] [-f] <pool | id> [newpool]
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin *
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * -d Scan in a specific directory, other than /dev/dsk. More than
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * one directory can be specified using multiple '-d' options.
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -D Scan for previously destroyed pools or import all or only
fa9e4066f08beec538e775443c5be79dd423fcabahrens * specified destroyed pools.
46657f8d750bdb71753495ce2919170f126b8e34mmusante *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -R Temporarily import the pool, with all mountpoints relative to
46657f8d750bdb71753495ce2919170f126b8e34mmusante * the given root. The pool will remain exported when the machine
fa9e4066f08beec538e775443c5be79dd423fcabahrens * is rebooted.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Force import, even if it appears that the pool is active.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -a Import all pools found.
990b4856d0eaada6f8140335733a1b1771ed2746lling *
990b4856d0eaada6f8140335733a1b1771ed2746lling * 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 */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
990b4856d0eaada6f8140335733a1b1771ed2746llingzpool_do_import(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens char **searchdirs = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int nsearch = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock int err;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks nvlist_t *pools;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t do_all = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t do_destroyed = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *altroot = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *mntopts = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t do_force = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvpair_t *elem;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock nvlist_t *config;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock uint64_t searchguid;
e7437265dc2a4920c197ed4337665539d358b22cahrens char *searchname;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock nvlist_t *found_config;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock boolean_t first;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock uint64_t pool_state;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
95173954d2b811ceb583a9012c3b16e1d0dd6438ek /* check options */
95173954d2b811ceb583a9012c3b16e1d0dd6438ek while ((c = getopt(argc, argv, ":Dfd:R:ao:")) != -1) {
95173954d2b811ceb583a9012c3b16e1d0dd6438ek switch (c) {
95173954d2b811ceb583a9012c3b16e1d0dd6438ek case 'a':
95173954d2b811ceb583a9012c3b16e1d0dd6438ek do_all = B_TRUE;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek break;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek case 'd':
95173954d2b811ceb583a9012c3b16e1d0dd6438ek if (searchdirs == NULL) {
95173954d2b811ceb583a9012c3b16e1d0dd6438ek searchdirs = safe_malloc(sizeof (char *));
95173954d2b811ceb583a9012c3b16e1d0dd6438ek } else {
95173954d2b811ceb583a9012c3b16e1d0dd6438ek char **tmp = safe_malloc((nsearch + 1) *
95173954d2b811ceb583a9012c3b16e1d0dd6438ek sizeof (char *));
95173954d2b811ceb583a9012c3b16e1d0dd6438ek bcopy(searchdirs, tmp, nsearch *
95173954d2b811ceb583a9012c3b16e1d0dd6438ek sizeof (char *));
95173954d2b811ceb583a9012c3b16e1d0dd6438ek free(searchdirs);
95173954d2b811ceb583a9012c3b16e1d0dd6438ek searchdirs = tmp;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek }
95173954d2b811ceb583a9012c3b16e1d0dd6438ek searchdirs[nsearch++] = optarg;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek break;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek case 'D':
95173954d2b811ceb583a9012c3b16e1d0dd6438ek do_destroyed = B_TRUE;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek break;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek case 'f':
95173954d2b811ceb583a9012c3b16e1d0dd6438ek do_force = B_TRUE;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek break;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek case 'o':
95173954d2b811ceb583a9012c3b16e1d0dd6438ek mntopts = optarg;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek break;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek case 'R':
95173954d2b811ceb583a9012c3b16e1d0dd6438ek altroot = optarg;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ':':
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing argument for "
990b4856d0eaada6f8140335733a1b1771ed2746lling "'%c' option\n"), optopt);
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case '?':
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens optopt);
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
f3861e1a2ceec23a5b699c24d814b7775a9e0b52ahl }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc -= optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv += optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (searchdirs == NULL) {
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks searchdirs = safe_malloc(sizeof (char *));
fa9e4066f08beec538e775443c5be79dd423fcabahrens searchdirs[0] = "/dev/dsk";
fa9e4066f08beec538e775443c5be79dd423fcabahrens nsearch = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock /* check argument count */
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock if (do_all) {
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock if (argc != 0) {
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock (void) fprintf(stderr, gettext("too many arguments\n"));
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock usage(B_FALSE);
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock }
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc > 2) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("too many arguments\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm /*
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm * Check for the SYS_CONFIG privilege. We do this explicitly
fa9e4066f08beec538e775443c5be79dd423fcabahrens * here because otherwise any attempt to discover pools will
fa9e4066f08beec538e775443c5be79dd423fcabahrens * silently fail.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc == 0 && !priv_ineffect(PRIV_SYS_CONFIG)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("cannot "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "discover pools: permission denied\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(searchdirs);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((pools = zpool_find_import(g_zfs, nsearch, searchdirs)) == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(searchdirs);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
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 *
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock * <none> Iterate through all pools and display information about
99653d4ee642c6528e88224f12409a5f23060994eschrock * each one.
99653d4ee642c6528e88224f12409a5f23060994eschrock *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -a Iterate through all pools and try to import each one.
99653d4ee642c6528e88224f12409a5f23060994eschrock *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * <id> Find the pool that corresponds to the given GUID/pool
fa9e4066f08beec538e775443c5be79dd423fcabahrens * name and import that one.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -D Above options applies only to destroyed pools.
990b4856d0eaada6f8140335733a1b1771ed2746lling */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc != 0) {
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks char *endptr;
99653d4ee642c6528e88224f12409a5f23060994eschrock
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm errno = 0;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock searchguid = strtoull(argv[0], &endptr, 10);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (errno != 0 || *endptr != '\0')
fa9e4066f08beec538e775443c5be79dd423fcabahrens searchname = argv[0];
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock else
fa9e4066f08beec538e775443c5be79dd423fcabahrens searchname = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens found_config = NULL;
99653d4ee642c6528e88224f12409a5f23060994eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock err = 0;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock elem = NULL;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock first = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((elem = nvlist_next_nvpair(pools, elem)) != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvpair_value_nvlist(elem, &config) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_STATE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &pool_state) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!do_destroyed && pool_state == POOL_STATE_DESTROYED)
fa9e4066f08beec538e775443c5be79dd423fcabahrens continue;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (do_destroyed && pool_state != POOL_STATE_DESTROYED)
fa9e4066f08beec538e775443c5be79dd423fcabahrens continue;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (first)
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm first = B_FALSE;
99653d4ee642c6528e88224f12409a5f23060994eschrock else if (!do_all)
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm (void) printf("\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock if (do_all)
fa9e4066f08beec538e775443c5be79dd423fcabahrens err |= do_import(config, NULL, mntopts,
fa9e4066f08beec538e775443c5be79dd423fcabahrens altroot, do_force, argc + optind,
990b4856d0eaada6f8140335733a1b1771ed2746lling argv - optind);
990b4856d0eaada6f8140335733a1b1771ed2746lling else
990b4856d0eaada6f8140335733a1b1771ed2746lling show_import(config);
990b4856d0eaada6f8140335733a1b1771ed2746lling } else if (searchname != NULL) {
990b4856d0eaada6f8140335733a1b1771ed2746lling char *name;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling /*
990b4856d0eaada6f8140335733a1b1771ed2746lling * We are searching for a pool based on name.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_string(config,
990b4856d0eaada6f8140335733a1b1771ed2746lling ZPOOL_CONFIG_POOL_NAME, &name) == 0);
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling if (strcmp(name, searchname) == 0) {
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock if (found_config != NULL) {
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock (void) fprintf(stderr, gettext(
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock "cannot import '%s': more than "
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock "one matching pool\n"), searchname);
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) fprintf(stderr, gettext(
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock "import by numeric ID instead\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling err = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens found_config = config;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
99653d4ee642c6528e88224f12409a5f23060994eschrock uint64_t guid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Search for a pool by guid.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
99653d4ee642c6528e88224f12409a5f23060994eschrock verify(nvlist_lookup_uint64(config,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZPOOL_CONFIG_POOL_GUID, &guid) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (guid == searchguid)
fa9e4066f08beec538e775443c5be79dd423fcabahrens found_config = config;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock /*
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock * If we were searching for a specific pool, verify that we found a
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock * pool, and then do the import.
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc != 0 && err == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (found_config == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("cannot import '%s': "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "no such pool available\n"), argv[0]);
fa9e4066f08beec538e775443c5be79dd423fcabahrens err = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens err |= do_import(found_config, argc == 1 ? NULL :
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv[1], mntopts, altroot, do_force, argc + optind,
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv - optind);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
99653d4ee642c6528e88224f12409a5f23060994eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If we were just looking for pools, report an error if none were
fa9e4066f08beec538e775443c5be79dd423fcabahrens * found.
99653d4ee642c6528e88224f12409a5f23060994eschrock */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc == 0 && first)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens gettext("no pools available to import\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_free(pools);
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(searchdirs);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (err ? 1 : 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrocktypedef struct iostat_cbdata {
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_list_t *cb_list;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int cb_verbose;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int cb_iteration;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int cb_namewidth;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock} iostat_cbdata_t;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrockstatic void
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrockprint_iostat_separator(iostat_cbdata_t *cb)
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock{
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock int i = 0;
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < cb->cb_namewidth; i++)
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf("-");
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(" ----- ----- ----- ----- ----- -----\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void
fa9e4066f08beec538e775443c5be79dd423fcabahrensprint_iostat_header(iostat_cbdata_t *cb)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("%*s capacity operations bandwidth\n",
fa9e4066f08beec538e775443c5be79dd423fcabahrens cb->cb_namewidth, "");
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("%-*s used avail read write read write\n",
fa9e4066f08beec538e775443c5be79dd423fcabahrens cb->cb_namewidth, "pool");
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_iostat_separator(cb);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Display a single statistic.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrensprint_one_stat(uint64_t value)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens char buf[64];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens zfs_nicenum(value, buf, sizeof (buf));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(" %5s", buf);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
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.
99653d4ee642c6528e88224f12409a5f23060994eschrock */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrensprint_vdev_stats(zpool_handle_t *zhp, const char *name, nvlist_t *oldnv,
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *newnv, iostat_cbdata_t *cb, int depth)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm nvlist_t **oldchild, **newchild;
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm uint_t c, children;
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm vdev_stat_t *oldvs, *newvs;
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm vdev_stat_t zerovs = { 0 };
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm uint64_t tdelta;
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm double scale;
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm char *vname;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (oldnv != NULL) {
99653d4ee642c6528e88224f12409a5f23060994eschrock verify(nvlist_lookup_uint64_array(oldnv, ZPOOL_CONFIG_STATS,
3bb79bece53191f2cf27aa61a72ea1784a7ce700eschrock (uint64_t **)&oldvs, &c) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens oldvs = &zerovs;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling verify(nvlist_lookup_uint64_array(newnv, ZPOOL_CONFIG_STATS,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (uint64_t **)&newvs, &c) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strlen(name) + depth > cb->cb_namewidth)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("%*s%s", depth, "", name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("%*s%s%*s", depth, "", name,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (int)(cb->cb_namewidth - strlen(name) - depth), "");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens tdelta = newvs->vs_timestamp - oldvs->vs_timestamp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (tdelta == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens scale = 1.0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens scale = (double)NANOSEC / tdelta;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* only toplevel vdevs have capacity stats */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (newvs->vs_space == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(" - -");
99653d4ee642c6528e88224f12409a5f23060994eschrock } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_one_stat(newvs->vs_alloc);
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_one_stat(newvs->vs_space - newvs->vs_alloc);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_one_stat((uint64_t)(scale * (newvs->vs_ops[ZIO_TYPE_READ] -
fa9e4066f08beec538e775443c5be79dd423fcabahrens oldvs->vs_ops[ZIO_TYPE_READ])));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_one_stat((uint64_t)(scale * (newvs->vs_ops[ZIO_TYPE_WRITE] -
fa9e4066f08beec538e775443c5be79dd423fcabahrens oldvs->vs_ops[ZIO_TYPE_WRITE])));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_one_stat((uint64_t)(scale * (newvs->vs_bytes[ZIO_TYPE_READ] -
fa9e4066f08beec538e775443c5be79dd423fcabahrens oldvs->vs_bytes[ZIO_TYPE_READ])));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_one_stat((uint64_t)(scale * (newvs->vs_bytes[ZIO_TYPE_WRITE] -
fa9e4066f08beec538e775443c5be79dd423fcabahrens oldvs->vs_bytes[ZIO_TYPE_WRITE])));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!cb->cb_verbose)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(newnv, ZPOOL_CONFIG_CHILDREN,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &newchild, &children) != 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock if (oldnv && nvlist_lookup_nvlist_array(oldnv, ZPOOL_CONFIG_CHILDREN,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &oldchild, &c) != 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
990b4856d0eaada6f8140335733a1b1771ed2746lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (c = 0; c < children; c++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens vname = zpool_vdev_name(g_zfs, zhp, newchild[c]);
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_vdev_stats(zhp, vname, oldnv ? oldchild[c] : NULL,
fa9e4066f08beec538e775443c5be79dd423fcabahrens newchild[c], cb, depth + 2);
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(vname);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensrefresh_iostat(zpool_handle_t *zhp, void *data)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks iostat_cbdata_t *cb = data;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock boolean_t missing;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If the pool has disappeared, remove it from the list and continue.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zpool_refresh_stats(zhp, &missing) != 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (-1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (missing)
fa9e4066f08beec538e775443c5be79dd423fcabahrens pool_list_remove(cb->cb_list, zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Callback to print out the iostats for the given pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrensprint_iostat(zpool_handle_t *zhp, void *data)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens iostat_cbdata_t *cb = data;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *oldconfig, *newconfig;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *oldnvroot, *newnvroot;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens newconfig = zpool_get_config(zhp, &oldconfig);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (cb->cb_iteration == 1)
fa9e4066f08beec538e775443c5be79dd423fcabahrens oldconfig = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist(newconfig, ZPOOL_CONFIG_VDEV_TREE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &newnvroot) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (oldconfig == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens oldnvroot = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist(oldconfig, ZPOOL_CONFIG_VDEV_TREE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &oldnvroot) == 0);
990b4856d0eaada6f8140335733a1b1771ed2746lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print out the statistics for the pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_vdev_stats(zhp, zpool_get_name(zhp), oldnvroot, newnvroot, cb, 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (cb->cb_verbose)
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_iostat_separator(cb);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrensget_namewidth(zpool_handle_t *zhp, void *data)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock iostat_cbdata_t *cb = data;
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock nvlist_t *config, *nvroot;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((config = zpool_get_config(zhp, NULL)) != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &nvroot) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!cb->cb_verbose)
fa9e4066f08beec538e775443c5be79dd423fcabahrens cb->cb_namewidth = strlen(zpool_get_name(zhp));
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock cb->cb_namewidth = max_width(zhp, nvroot, 0, 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
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 */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (cb->cb_namewidth < 10)
fa9e4066f08beec538e775443c5be79dd423fcabahrens cb->cb_namewidth = 10;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (cb->cb_namewidth > 38)
fa9e4066f08beec538e775443c5be79dd423fcabahrens cb->cb_namewidth = 38;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool iostat [-v] [pool] ... [interval [count]]
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -v Display statistics for individual vdevs
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
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 */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_iostat(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ret;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int npools;
fa9e4066f08beec538e775443c5be79dd423fcabahrens unsigned long interval = 0, count = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_list_t *list;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t verbose = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens iostat_cbdata_t cb;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((c = getopt(argc, argv, "v")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'v':
fa9e4066f08beec538e775443c5be79dd423fcabahrens verbose = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case '?':
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens optopt);
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc -= optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv += optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Determine if the last argument is an integer or a pool name
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc > 0 && isdigit(argv[argc - 1][0])) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *end;
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock errno = 0;
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock interval = strtoul(argv[argc - 1], &end, 10);
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock if (*end == '\0' && errno == 0) {
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock if (interval == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("interval "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "cannot be zero\n"));
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock usage(B_FALSE);
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock }
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock /*
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock * Ignore the last parameter
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock */
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock argc--;
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock } else {
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock /*
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock * If this is not a valid number, just plow on. The
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock * user will get a more informative error message later
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock * on.
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock */
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock interval = 0;
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock }
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock }
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If the last argument is also an integer, then we have both a count
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and an integer.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc > 0 && isdigit(argv[argc - 1][0])) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *end;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens errno = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens count = interval;
fa9e4066f08beec538e775443c5be79dd423fcabahrens interval = strtoul(argv[argc - 1], &end, 10);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock if (*end == '\0' && errno == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (interval == 0) {
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock (void) fprintf(stderr, gettext("interval "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "cannot be zero\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * Ignore the last parameter
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock argc--;
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock } else {
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock interval = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock * Construct the list of all interesting pools.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((list = pool_list_get(argc, argv, &ret)) == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (pool_list_count(list) == 0 && argc != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens pool_list_free(list);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (pool_list_count(list) == 0 && interval == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens pool_list_free(list);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("no pools available\n"));
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Enter the main iostat loop.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock cb.cb_list = list;
fa9e4066f08beec538e775443c5be79dd423fcabahrens cb.cb_verbose = verbose;
fa9e4066f08beec538e775443c5be79dd423fcabahrens cb.cb_iteration = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens cb.cb_namewidth = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (;;) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens pool_list_update(list);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((npools = pool_list_count(list)) == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
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 */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) pool_list_iter(list, B_FALSE, refresh_iostat, &cb);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Iterate over all pools to determine the maximum width
fa9e4066f08beec538e775443c5be79dd423fcabahrens * for the pool / device name column across all pools.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens cb.cb_namewidth = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) pool_list_iter(list, B_FALSE, get_namewidth, &cb);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If it's the first time, or verbose mode, print the header.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (++cb.cb_iteration == 1 || verbose)
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_iostat_header(&cb);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) pool_list_iter(list, B_FALSE, print_iostat, &cb);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
99653d4ee642c6528e88224f12409a5f23060994eschrock * 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 */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (npools > 1 && !verbose)
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_iostat_separator(&cb);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (verbose)
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf("\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Flush the output so that redirection to a file isn't buffered
fa9e4066f08beec538e775443c5be79dd423fcabahrens * indefinitely.
99653d4ee642c6528e88224f12409a5f23060994eschrock */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fflush(stdout);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (interval == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (count != 0 && --count == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) sleep(interval);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pool_list_free(list);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct list_cbdata {
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t cb_scripted;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t cb_first;
99653d4ee642c6528e88224f12409a5f23060994eschrock int cb_fields[MAX_FIELDS];
fa9e4066f08beec538e775443c5be79dd423fcabahrens int cb_fieldcount;
fa9e4066f08beec538e775443c5be79dd423fcabahrens} list_cbdata_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Given a list of columns to display, output appropriate headers for each one.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrensprint_header(int *fields, size_t count)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens column_def_t *col;
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *fmt;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < count; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens col = &column_table[fields[i]];
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (i != 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(" ");
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (col->cd_justify == left_justify)
fa9e4066f08beec538e775443c5be79dd423fcabahrens fmt = "%-*s";
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens fmt = "%*s";
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(fmt, i == count - 1 ? strlen(col->cd_title) :
fa9e4066f08beec538e775443c5be79dd423fcabahrens col->cd_width, col->cd_title);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenslist_callback(zpool_handle_t *zhp, void *data)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
fa9e4066f08beec538e775443c5be79dd423fcabahrens list_cbdata_t *cbp = data;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *config;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char buf[ZPOOL_MAXNAMELEN];
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t total;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t used;
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *fmt;
fa9e4066f08beec538e775443c5be79dd423fcabahrens column_def_t *col;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (cbp->cb_first) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!cbp->cb_scripted)
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_header(cbp->cb_fields, cbp->cb_fieldcount);
fa9e4066f08beec538e775443c5be79dd423fcabahrens cbp->cb_first = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
b1b8ab34de515a5e83206da22c3d7e563241b021lling if (zpool_get_state(zhp) == POOL_STATE_UNAVAIL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens config = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
99653d4ee642c6528e88224f12409a5f23060994eschrock config = zpool_get_config(zhp, NULL);
99653d4ee642c6528e88224f12409a5f23060994eschrock total = zpool_get_space_total(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens used = zpool_get_space_used(zhp);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < cbp->cb_fieldcount; i++) {
99653d4ee642c6528e88224f12409a5f23060994eschrock if (i != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (cbp->cb_scripted)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("\t");
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(" ");
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens col = &column_table[cbp->cb_fields[i]];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (cbp->cb_fields[i]) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_FIELD_NAME:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strlcpy(buf, zpool_get_name(zhp), sizeof (buf));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_FIELD_SIZE:
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (config == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strlcpy(buf, "-", sizeof (buf));
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens zfs_nicenum(total, buf, sizeof (buf));
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock break;
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock case ZPOOL_FIELD_USED:
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock if (config == NULL)
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock (void) strlcpy(buf, "-", sizeof (buf));
99653d4ee642c6528e88224f12409a5f23060994eschrock else
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock zfs_nicenum(used, buf, sizeof (buf));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_FIELD_AVAILABLE:
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (config == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strlcpy(buf, "-", sizeof (buf));
99653d4ee642c6528e88224f12409a5f23060994eschrock else
fa9e4066f08beec538e775443c5be79dd423fcabahrens zfs_nicenum(total - used, buf, sizeof (buf));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_FIELD_CAPACITY:
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (config == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strlcpy(buf, "-", sizeof (buf));
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
99653d4ee642c6528e88224f12409a5f23060994eschrock uint64_t capacity = (total == 0 ? 0 :
fa9e4066f08beec538e775443c5be79dd423fcabahrens (used * 100 / total));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) snprintf(buf, sizeof (buf), "%llu%%",
fa9e4066f08beec538e775443c5be79dd423fcabahrens (u_longlong_t)capacity);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_FIELD_HEALTH:
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (config == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strlcpy(buf, "FAULTED", sizeof (buf));
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *nvroot;
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock vdev_stat_t *vs;
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock uint_t vsc;
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock verify(nvlist_lookup_nvlist(config,
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock ZPOOL_CONFIG_VDEV_TREE, &nvroot) == 0);
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock verify(nvlist_lookup_uint64_array(nvroot,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZPOOL_CONFIG_STATS, (uint64_t **)&vs,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &vsc) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strlcpy(buf, state_to_name(vs),
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (buf));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_FIELD_ROOT:
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (config == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strlcpy(buf, "-", sizeof (buf));
fa9e4066f08beec538e775443c5be79dd423fcabahrens else if (zpool_get_root(zhp, buf, sizeof (buf)) != 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strlcpy(buf, "-", sizeof (buf));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock if (cbp->cb_scripted)
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf("%s", buf);
990b4856d0eaada6f8140335733a1b1771ed2746lling else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (col->cd_justify == left_justify)
fa9e4066f08beec538e775443c5be79dd423fcabahrens fmt = "%-*s";
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens fmt = "%*s";
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf(fmt, i == cbp->cb_fieldcount - 1 ?
990b4856d0eaada6f8140335733a1b1771ed2746lling strlen(buf) : col->cd_width, buf);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf("\n");
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling return (0);
990b4856d0eaada6f8140335733a1b1771ed2746lling}
990b4856d0eaada6f8140335733a1b1771ed2746lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
990b4856d0eaada6f8140335733a1b1771ed2746lling * zpool list [-H] [-o field[,field]*] [pool] ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -H Scripted mode. Don't display headers, and separate fields by
990b4856d0eaada6f8140335733a1b1771ed2746lling * a single tab.
990b4856d0eaada6f8140335733a1b1771ed2746lling * -o List of fields to display. Defaults to all fields, or
990b4856d0eaada6f8140335733a1b1771ed2746lling * "name,size,used,available,capacity,health,root"
990b4856d0eaada6f8140335733a1b1771ed2746lling *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * List all pools in the system, whether or not they're healthy. Output space
990b4856d0eaada6f8140335733a1b1771ed2746lling * statistics for each one, as well as health status summary.
990b4856d0eaada6f8140335733a1b1771ed2746lling */
990b4856d0eaada6f8140335733a1b1771ed2746llingint
990b4856d0eaada6f8140335733a1b1771ed2746llingzpool_do_list(int argc, char **argv)
990b4856d0eaada6f8140335733a1b1771ed2746lling{
990b4856d0eaada6f8140335733a1b1771ed2746lling int c;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ret;
fa9e4066f08beec538e775443c5be79dd423fcabahrens list_cbdata_t cb = { 0 };
fa9e4066f08beec538e775443c5be79dd423fcabahrens static char default_fields[] =
fa9e4066f08beec538e775443c5be79dd423fcabahrens "name,size,used,available,capacity,health,root";
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *fields = default_fields;
990b4856d0eaada6f8140335733a1b1771ed2746lling char *value;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling /* check options */
990b4856d0eaada6f8140335733a1b1771ed2746lling while ((c = getopt(argc, argv, ":Ho:")) != -1) {
990b4856d0eaada6f8140335733a1b1771ed2746lling switch (c) {
990b4856d0eaada6f8140335733a1b1771ed2746lling case 'H':
fa9e4066f08beec538e775443c5be79dd423fcabahrens cb.cb_scripted = B_TRUE;
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
990b4856d0eaada6f8140335733a1b1771ed2746lling case 'o':
990b4856d0eaada6f8140335733a1b1771ed2746lling fields = optarg;
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
990b4856d0eaada6f8140335733a1b1771ed2746lling case ':':
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) fprintf(stderr, gettext("missing argument for "
990b4856d0eaada6f8140335733a1b1771ed2746lling "'%c' option\n"), optopt);
990b4856d0eaada6f8140335733a1b1771ed2746lling usage(B_FALSE);
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case '?':
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens optopt);
990b4856d0eaada6f8140335733a1b1771ed2746lling usage(B_FALSE);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling argc -= optind;
990b4856d0eaada6f8140335733a1b1771ed2746lling argv += optind;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling while (*fields != '\0') {
990b4856d0eaada6f8140335733a1b1771ed2746lling if (cb.cb_fieldcount == MAX_FIELDS) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("too many "
990b4856d0eaada6f8140335733a1b1771ed2746lling "properties given to -o option\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling if ((cb.cb_fields[cb.cb_fieldcount] = getsubopt(&fields,
990b4856d0eaada6f8140335733a1b1771ed2746lling column_subopts, &value)) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid property "
990b4856d0eaada6f8140335733a1b1771ed2746lling "'%s'\n"), value);
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling cb.cb_fieldcount++;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling cb.cb_first = B_TRUE;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling ret = for_each_pool(argc, argv, B_TRUE, list_callback, &cb);
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling if (argc == 0 && cb.cb_first) {
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf(gettext("no pools available\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
990b4856d0eaada6f8140335733a1b1771ed2746lling}
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746llingstatic nvlist_t *
990b4856d0eaada6f8140335733a1b1771ed2746llingzpool_get_vdev_by_name(nvlist_t *nv, char *name)
990b4856d0eaada6f8140335733a1b1771ed2746lling{
990b4856d0eaada6f8140335733a1b1771ed2746lling nvlist_t **child;
990b4856d0eaada6f8140335733a1b1771ed2746lling uint_t c, children;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *match;
990b4856d0eaada6f8140335733a1b1771ed2746lling char *path;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
990b4856d0eaada6f8140335733a1b1771ed2746lling &child, &children) != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strncmp(name, "/dev/dsk/", 9) == 0)
990b4856d0eaada6f8140335733a1b1771ed2746lling name += 9;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strncmp(path, "/dev/dsk/", 9) == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens path += 9;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strcmp(name, path) == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (nv);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (NULL);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling for (c = 0; c < children; c++)
990b4856d0eaada6f8140335733a1b1771ed2746lling if ((match = zpool_get_vdev_by_name(child[c], name)) != NULL)
990b4856d0eaada6f8140335733a1b1771ed2746lling return (match);
990b4856d0eaada6f8140335733a1b1771ed2746lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_attach_or_replace(int argc, char **argv, int replacing)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t force = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *nvroot;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *poolname, *old_disk, *new_disk;
990b4856d0eaada6f8140335733a1b1771ed2746lling zpool_handle_t *zhp;
990b4856d0eaada6f8140335733a1b1771ed2746lling nvlist_t *config;
990b4856d0eaada6f8140335733a1b1771ed2746lling int ret;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int log_argc;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char **log_argv;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((c = getopt(argc, argv, "f")) != -1) {
99653d4ee642c6528e88224f12409a5f23060994eschrock switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'f':
fa9e4066f08beec538e775443c5be79dd423fcabahrens force = B_TRUE;
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case '?':
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens optopt);
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens log_argc = argc;
fa9e4066f08beec538e775443c5be79dd423fcabahrens log_argv = argv;
99653d4ee642c6528e88224f12409a5f23060994eschrock argc -= optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv += optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get pool name and check number of arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name argument\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens poolname = argv[0];
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 2) {
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) fprintf(stderr,
990b4856d0eaada6f8140335733a1b1771ed2746lling gettext("missing <device> specification\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling usage(B_FALSE);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fce7d82b2f44c64aedba1312d169198f858de333mmusante old_disk = argv[1];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 3) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!replacing) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens gettext("missing <new_device> specification\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens new_disk = old_disk;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc -= 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv += 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens new_disk = argv[2];
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc -= 2;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv += 2;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc > 1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("too many arguments\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((config = zpool_get_config(zhp, NULL)) == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("pool '%s' is unavailable\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens poolname);
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvroot = make_root_vdev(config, force, B_FALSE, replacing, argc, argv);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvroot == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock ret = zpool_vdev_attach(zhp, old_disk, new_disk, nvroot, replacing);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!ret) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_log_history(g_zfs, log_argc, log_argv, poolname, B_TRUE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens B_FALSE);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_free(nvroot);
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool replace [-f] <pool> <device> <new_device>
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
99653d4ee642c6528e88224f12409a5f23060994eschrock * -f Force attach, even if <new_device> appears to be in use.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Replace <device> with <new_device>.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_replace(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (zpool_do_attach_or_replace(argc, argv, B_TRUE));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool attach [-f] <pool> <device> <new_device>
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Force attach, even if <new_device> appears to be in use.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
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
99653d4ee642c6528e88224f12409a5f23060994eschrock * <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 */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_attach(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (zpool_do_attach_or_replace(argc, argv, B_FALSE));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool detach [-f] <pool> <device>
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Force detach of <device>, even if DTLs argue against it
fa9e4066f08beec538e775443c5be79dd423fcabahrens * (not supported yet)
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
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 */
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_detach(int argc, char **argv)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *poolname, *path;
99653d4ee642c6528e88224f12409a5f23060994eschrock zpool_handle_t *zhp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ret;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((c = getopt(argc, argv, "f")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'f':
fa9e4066f08beec538e775443c5be79dd423fcabahrens case '?':
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens optopt);
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc -= optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv += optind;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock /* get pool name and check number of arguments */
99653d4ee642c6528e88224f12409a5f23060994eschrock if (argc < 1) {
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, gettext("missing pool name argument\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 2) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens gettext("missing <device> specification\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens poolname = argv[0];
fa9e4066f08beec538e775443c5be79dd423fcabahrens path = argv[1];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = zpool_vdev_detach(zhp, path);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!ret) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_log_history(g_zfs, argc + optind, argv - optind, poolname,
fa9e4066f08beec538e775443c5be79dd423fcabahrens B_TRUE, B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool online <pool> <device> ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_online(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c, i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *poolname;
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_handle_t *zhp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ret = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((c = getopt(argc, argv, "t")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 't':
fa9e4066f08beec538e775443c5be79dd423fcabahrens case '?':
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens optopt);
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc -= optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv += optind;
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get pool name and check number of arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 2) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing device name\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens poolname = argv[0];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 1; i < argc; i++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zpool_vdev_online(zhp, argv[i]) == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("Bringing device %s online\n"),
99653d4ee642c6528e88224f12409a5f23060994eschrock argv[i]);
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!ret) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_log_history(g_zfs, argc + optind, argv - optind, poolname,
99653d4ee642c6528e88224f12409a5f23060994eschrock B_TRUE, B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool offline [-ft] <pool> <device> ...
99653d4ee642c6528e88224f12409a5f23060994eschrock *
99653d4ee642c6528e88224f12409a5f23060994eschrock * -f Force the device into the offline state, even if doing
99653d4ee642c6528e88224f12409a5f23060994eschrock * so would appear to compromise pool availability.
99653d4ee642c6528e88224f12409a5f23060994eschrock * (not supported yet)
99653d4ee642c6528e88224f12409a5f23060994eschrock *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -t Only take the device off-line temporarily. The offline
fa9e4066f08beec538e775443c5be79dd423fcabahrens * state will not be persistent across reboots.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_offline(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c, i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *poolname;
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_handle_t *zhp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ret = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t istmp = B_FALSE;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((c = getopt(argc, argv, "ft")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 't':
fa9e4066f08beec538e775443c5be79dd423fcabahrens istmp = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'f':
fa9e4066f08beec538e775443c5be79dd423fcabahrens case '?':
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens optopt);
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc -= optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv += optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get pool name and check number of arguments */
99653d4ee642c6528e88224f12409a5f23060994eschrock if (argc < 1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
99653d4ee642c6528e88224f12409a5f23060994eschrock if (argc < 2) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing device name\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock poolname = argv[0];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (1);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock for (i = 1; i < argc; i++)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (zpool_vdev_offline(zhp, argv[i], istmp) == 0)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) printf(gettext("Bringing device %s offline\n"),
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock argv[i]);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock else
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ret = 1;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (!ret) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock zpool_log_history(g_zfs, argc + optind, argv - optind, poolname,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock B_TRUE, B_FALSE);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock zpool_close(zhp);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (ret);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool clear <pool> [device]
99653d4ee642c6528e88224f12409a5f23060994eschrock *
99653d4ee642c6528e88224f12409a5f23060994eschrock * Clear all errors associated with a pool or a particular device.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_clear(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling int ret = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_handle_t *zhp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *pool, *device;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 2) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc > 3) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("too many arguments\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pool = argv[1];
fa9e4066f08beec538e775443c5be79dd423fcabahrens device = argc == 3 ? argv[2] : NULL;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if ((zhp = zpool_open(g_zfs, pool)) == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zpool_clear(zhp, device) != 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock if (!ret)
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling zpool_log_history(g_zfs, argc, argv, pool, B_TRUE, B_FALSE);
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct scrub_cbdata {
fa9e4066f08beec538e775443c5be79dd423fcabahrens int cb_type;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int cb_argc;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char **cb_argv;
fa9e4066f08beec538e775443c5be79dd423fcabahrens} scrub_cbdata_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrensscrub_callback(zpool_handle_t *zhp, void *data)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
99653d4ee642c6528e88224f12409a5f23060994eschrock scrub_cbdata_t *cb = data;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int err;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
99653d4ee642c6528e88224f12409a5f23060994eschrock * Ignore faulted pools.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zpool_get_state(zhp) == POOL_STATE_UNAVAIL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("cannot scrub '%s': pool is "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "currently unavailable\n"), zpool_get_name(zhp));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock err = zpool_scrub(zhp, cb->cb_type);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!err) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock zpool_log_history(g_zfs, cb->cb_argc, cb->cb_argv,
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_get_name(zhp), B_TRUE, B_FALSE);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (err != 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock/*
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * zpool scrub [-s] <pool> ...
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock *
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * -s Stop. Stops any in-progress scrub.
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockint
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockzpool_do_scrub(int argc, char **argv)
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock{
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock int c;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock scrub_cbdata_t cb;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock cb.cb_type = POOL_SCRUB_EVERYTHING;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock /* check options */
99653d4ee642c6528e88224f12409a5f23060994eschrock while ((c = getopt(argc, argv, "s")) != -1) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock switch (c) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock case 's':
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock cb.cb_type = POOL_SCRUB_NONE;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock case '?':
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) fprintf(stderr, gettext("invalid option '%c'\n"),
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock optopt);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock usage(B_FALSE);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock cb.cb_argc = argc;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock cb.cb_argv = argv;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock argc -= optind;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock argv += optind;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (argc < 1) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) fprintf(stderr, gettext("missing pool name argument\n"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock usage(B_FALSE);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (for_each_pool(argc, argv, B_TRUE, scrub_callback, &cb));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
06eeb2ad640ce72d394ac521094bed7681044408ek
06eeb2ad640ce72d394ac521094bed7681044408ektypedef struct status_cbdata {
fa9e4066f08beec538e775443c5be79dd423fcabahrens int cb_count;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t cb_allpools;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t cb_verbose;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t cb_explain;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t cb_first;
fa9e4066f08beec538e775443c5be79dd423fcabahrens} status_cbdata_t;
06eeb2ad640ce72d394ac521094bed7681044408ek
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * Print out detailed scrub status.
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockvoid
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockprint_scrub_status(nvlist_t *nvroot)
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock{
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock vdev_stat_t *vs;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock uint_t vsc;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock time_t start, end, now;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock double fraction_done;
06eeb2ad640ce72d394ac521094bed7681044408ek uint64_t examined, total, minutes_left;
06eeb2ad640ce72d394ac521094bed7681044408ek char *scrub_type;
06eeb2ad640ce72d394ac521094bed7681044408ek
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_STATS,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (uint64_t **)&vs, &vsc) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If there's never been a scrub, there's not much to say.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (vs->vs_scrub_end == 0 && vs->vs_scrub_type == POOL_SCRUB_NONE) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("none requested\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens scrub_type = (vs->vs_scrub_type == POOL_SCRUB_RESILVER) ?
fa9e4066f08beec538e775443c5be79dd423fcabahrens "resilver" : "scrub";
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens start = vs->vs_scrub_start;
fa9e4066f08beec538e775443c5be79dd423fcabahrens end = vs->vs_scrub_end;
fa9e4066f08beec538e775443c5be79dd423fcabahrens now = time(NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens examined = vs->vs_scrub_examined;
fa9e4066f08beec538e775443c5be79dd423fcabahrens total = vs->vs_alloc;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (end != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("%s %s with %llu errors on %s"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens scrub_type, vs->vs_scrub_complete ? "completed" : "stopped",
fa9e4066f08beec538e775443c5be79dd423fcabahrens (u_longlong_t)vs->vs_scrub_errors, ctime(&end));
99653d4ee642c6528e88224f12409a5f23060994eschrock return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (examined == 0)
06eeb2ad640ce72d394ac521094bed7681044408ek examined = 1;
06eeb2ad640ce72d394ac521094bed7681044408ek if (examined > total)
fa9e4066f08beec538e775443c5be79dd423fcabahrens total = examined;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens fraction_done = (double)examined / total;
fa9e4066f08beec538e775443c5be79dd423fcabahrens minutes_left = (uint64_t)((now - start) *
fa9e4066f08beec538e775443c5be79dd423fcabahrens (1 - fraction_done) / fraction_done / 60);
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("%s in progress, %.2f%% done, %lluh%um to go\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens scrub_type, 100 * fraction_done,
b1b8ab34de515a5e83206da22c3d7e563241b021lling (u_longlong_t)(minutes_left / 60), (uint_t)(minutes_left % 60));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct spare_cbdata {
99653d4ee642c6528e88224f12409a5f23060994eschrock uint64_t cb_guid;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock zpool_handle_t *cb_zhp;
99653d4ee642c6528e88224f12409a5f23060994eschrock} spare_cbdata_t;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrockstatic boolean_t
fa9e4066f08beec538e775443c5be79dd423fcabahrensfind_vdev(nvlist_t *nv, uint64_t search)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t guid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t **child;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint_t c, children;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &guid) == 0 &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens search == guid)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (B_TRUE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &child, &children) == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (c = 0; c < children; c++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (find_vdev(child[c], search))
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (B_TRUE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensfind_spare(zpool_handle_t *zhp, void *data)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens spare_cbdata_t *cbp = data;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *config, *nvroot;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens config = zpool_get_config(zhp, NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &nvroot) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (find_vdev(nvroot, cbp->cb_guid)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens cbp->cb_zhp = zhp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print out configuration state as requested by status_callback.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrensprint_status_config(zpool_handle_t *zhp, const char *name, nvlist_t *nv,
fa9e4066f08beec538e775443c5be79dd423fcabahrens int namewidth, int depth, boolean_t isspare)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t **child;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint_t c, children;
fa9e4066f08beec538e775443c5be79dd423fcabahrens vdev_stat_t *vs;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char rbuf[6], wbuf[6], cbuf[6], repaired[7];
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *vname;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t notpresent;
fa9e4066f08beec538e775443c5be79dd423fcabahrens spare_cbdata_t cb;
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *state;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_STATS,
99653d4ee642c6528e88224f12409a5f23060994eschrock (uint64_t **)&vs, &c) == 0);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
99653d4ee642c6528e88224f12409a5f23060994eschrock &child, &children) != 0)
99653d4ee642c6528e88224f12409a5f23060994eschrock children = 0;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock state = state_to_name(vs);
99653d4ee642c6528e88224f12409a5f23060994eschrock if (isspare) {
99653d4ee642c6528e88224f12409a5f23060994eschrock /*
99653d4ee642c6528e88224f12409a5f23060994eschrock * For hot spares, we use the terms 'INUSE' and 'AVAILABLE' for
99653d4ee642c6528e88224f12409a5f23060994eschrock * online drives.
99653d4ee642c6528e88224f12409a5f23060994eschrock */
99653d4ee642c6528e88224f12409a5f23060994eschrock if (vs->vs_aux == VDEV_AUX_SPARED)
99653d4ee642c6528e88224f12409a5f23060994eschrock state = "INUSE";
99653d4ee642c6528e88224f12409a5f23060994eschrock else if (vs->vs_state == VDEV_STATE_HEALTHY)
99653d4ee642c6528e88224f12409a5f23060994eschrock state = "AVAIL";
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf("\t%*s%-*s %-8s", depth, "", namewidth - depth,
99653d4ee642c6528e88224f12409a5f23060994eschrock name, state);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if (!isspare) {
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_nicenum(vs->vs_read_errors, rbuf, sizeof (rbuf));
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_nicenum(vs->vs_write_errors, wbuf, sizeof (wbuf));
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_nicenum(vs->vs_checksum_errors, cbuf, sizeof (cbuf));
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(" %5s %5s %5s", rbuf, wbuf, cbuf);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT,
99653d4ee642c6528e88224f12409a5f23060994eschrock &notpresent) == 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock char *path;
99653d4ee642c6528e88224f12409a5f23060994eschrock verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0);
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(" was %s", path);
99653d4ee642c6528e88224f12409a5f23060994eschrock } else if (vs->vs_aux != 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(" ");
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock switch (vs->vs_aux) {
99653d4ee642c6528e88224f12409a5f23060994eschrock case VDEV_AUX_OPEN_FAILED:
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext("cannot open"));
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock case VDEV_AUX_BAD_GUID_SUM:
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext("missing device"));
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens case VDEV_AUX_NO_REPLICAS:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("insufficient replicas"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock case VDEV_AUX_VERSION_NEWER:
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin (void) printf(gettext("newer version"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case VDEV_AUX_SPARED:
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock &cb.cb_guid) == 0);
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock if (zpool_iter(g_zfs, find_spare, &cb) == 1) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (strcmp(zpool_get_name(cb.cb_zhp),
99653d4ee642c6528e88224f12409a5f23060994eschrock zpool_get_name(zhp)) == 0)
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf(gettext("currently in "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "use"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("in use by "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "pool '%s'"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_get_name(cb.cb_zhp));
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(cb.cb_zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("currently in use"));
990b4856d0eaada6f8140335733a1b1771ed2746lling }
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock default:
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext("corrupted data"));
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock } else if (vs->vs_scrub_repaired != 0 && children == 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock /*
99653d4ee642c6528e88224f12409a5f23060994eschrock * Report bytes resilvered/repaired on leaf devices.
99653d4ee642c6528e88224f12409a5f23060994eschrock */
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_nicenum(vs->vs_scrub_repaired, repaired, sizeof (repaired));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext(" %s %s"), repaired,
99653d4ee642c6528e88224f12409a5f23060994eschrock (vs->vs_scrub_type == POOL_SCRUB_RESILVER) ?
fa9e4066f08beec538e775443c5be79dd423fcabahrens "resilvered" : "repaired");
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf("\n");
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock for (c = 0; c < children; c++) {
99653d4ee642c6528e88224f12409a5f23060994eschrock vname = zpool_vdev_name(g_zfs, zhp, child[c]);
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_status_config(zhp, vname, child[c],
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock namewidth, depth + 2, isspare);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock free(vname);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock}
0917b783fd655a0c943e0b8fb848db2301774947eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockstatic void
fa9e4066f08beec538e775443c5be79dd423fcabahrensprint_error_log(zpool_handle_t *zhp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *nverrlist;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvpair_t *elem;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *pathname;
fa9e4066f08beec538e775443c5be79dd423fcabahrens size_t len = MAXPATHLEN * 2;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zpool_get_errlog(zhp, &nverrlist) != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("errors: List of errors unavailable "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "(insufficient privileges)\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("errors: Permanent errors have been "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "detected in the following files:\n\n");
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock pathname = safe_malloc(len);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock elem = NULL;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock while ((elem = nvlist_next_nvpair(nverrlist, elem)) != NULL) {
99653d4ee642c6528e88224f12409a5f23060994eschrock nvlist_t *nv;
99653d4ee642c6528e88224f12409a5f23060994eschrock uint64_t dsobj, obj;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock verify(nvpair_value_nvlist(elem, &nv) == 0);
99653d4ee642c6528e88224f12409a5f23060994eschrock verify(nvlist_lookup_uint64(nv, ZPOOL_ERR_DATASET,
99653d4ee642c6528e88224f12409a5f23060994eschrock &dsobj) == 0);
99653d4ee642c6528e88224f12409a5f23060994eschrock verify(nvlist_lookup_uint64(nv, ZPOOL_ERR_OBJECT,
99653d4ee642c6528e88224f12409a5f23060994eschrock &obj) == 0);
99653d4ee642c6528e88224f12409a5f23060994eschrock zpool_obj_to_path(zhp, dsobj, obj, pathname, len);
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf("%7s %s\n", "", pathname);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock free(pathname);
99653d4ee642c6528e88224f12409a5f23060994eschrock nvlist_free(nverrlist);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrockstatic void
99653d4ee642c6528e88224f12409a5f23060994eschrockprint_spares(zpool_handle_t *zhp, nvlist_t **spares, uint_t nspares,
99653d4ee642c6528e88224f12409a5f23060994eschrock int namewidth)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock{
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock uint_t i;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock char *name;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nspares == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("\tspares\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < nspares; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens name = zpool_vdev_name(g_zfs, zhp, spares[i]);
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_status_config(zhp, name, spares[i],
fa9e4066f08beec538e775443c5be79dd423fcabahrens namewidth, 2, B_TRUE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Display a summary of pool status. Displays a summary such as:
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock * pool: tank
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * status: DEGRADED
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * reason: One or more devices ...
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * see: http://www.sun.com/msg/ZFS-xxxx-01
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * config:
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * mirror DEGRADED
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * c1t0d0 OK
99653d4ee642c6528e88224f12409a5f23060994eschrock * c2t0d0 UNAVAIL
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock *
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin * When given the '-v' option, we print out the complete config. If the '-e'
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock * option is specified, then we print out error rate information as well.
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatus_callback(zpool_handle_t *zhp, void *data)
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock{
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock status_cbdata_t *cbp = data;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock nvlist_t *config, *nvroot;
75519f380eac71fe6d10b26e736f01567d6c13c9ek char *msgid;
55434c770c89aa1b84474f2559a106803511aba0ek int reason;
55434c770c89aa1b84474f2559a106803511aba0ek const char *health;
55434c770c89aa1b84474f2559a106803511aba0ek uint_t c;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock vdev_stat_t *vs;
55434c770c89aa1b84474f2559a106803511aba0ek
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock config = zpool_get_config(zhp, NULL);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock reason = zpool_get_status(zhp, &msgid);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock cbp->cb_count++;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
55434c770c89aa1b84474f2559a106803511aba0ek /*
55434c770c89aa1b84474f2559a106803511aba0ek * If we were given 'zpool status -x', only report those pools with
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * problems.
55434c770c89aa1b84474f2559a106803511aba0ek */
55434c770c89aa1b84474f2559a106803511aba0ek if (reason == ZPOOL_STATUS_OK && cbp->cb_explain) {
55434c770c89aa1b84474f2559a106803511aba0ek if (!cbp->cb_allpools) {
55434c770c89aa1b84474f2559a106803511aba0ek (void) printf(gettext("pool '%s' is healthy\n"),
55434c770c89aa1b84474f2559a106803511aba0ek zpool_get_name(zhp));
55434c770c89aa1b84474f2559a106803511aba0ek if (cbp->cb_first)
55434c770c89aa1b84474f2559a106803511aba0ek cbp->cb_first = B_FALSE;
55434c770c89aa1b84474f2559a106803511aba0ek }
55434c770c89aa1b84474f2559a106803511aba0ek return (0);
55434c770c89aa1b84474f2559a106803511aba0ek }
55434c770c89aa1b84474f2559a106803511aba0ek
55434c770c89aa1b84474f2559a106803511aba0ek if (cbp->cb_first)
55434c770c89aa1b84474f2559a106803511aba0ek cbp->cb_first = B_FALSE;
55434c770c89aa1b84474f2559a106803511aba0ek else
55434c770c89aa1b84474f2559a106803511aba0ek (void) printf("\n");
55434c770c89aa1b84474f2559a106803511aba0ek
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock &nvroot) == 0);
99653d4ee642c6528e88224f12409a5f23060994eschrock verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_STATS,
99653d4ee642c6528e88224f12409a5f23060994eschrock (uint64_t **)&vs, &c) == 0);
99653d4ee642c6528e88224f12409a5f23060994eschrock health = state_to_name(vs);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext(" pool: %s\n"), zpool_get_name(zhp));
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext(" state: %s\n"), health);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock switch (reason) {
99653d4ee642c6528e88224f12409a5f23060994eschrock case ZPOOL_STATUS_MISSING_DEV_R:
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext("status: One or more devices could not "
99653d4ee642c6528e88224f12409a5f23060994eschrock "be opened. Sufficient replicas exist for\n\tthe pool to "
99653d4ee642c6528e88224f12409a5f23060994eschrock "continue functioning in a degraded state.\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext("action: Attach the missing device and "
99653d4ee642c6528e88224f12409a5f23060994eschrock "online it using 'zpool online'.\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
99653d4ee642c6528e88224f12409a5f23060994eschrock case ZPOOL_STATUS_MISSING_DEV_NR:
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext("status: One or more devices could not "
99653d4ee642c6528e88224f12409a5f23060994eschrock "be opened. There are insufficient\n\treplicas for the "
99653d4ee642c6528e88224f12409a5f23060994eschrock "pool to continue functioning.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: Attach the missing device and "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "online it using 'zpool online'.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_CORRUPT_LABEL_R:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: One or more devices could not "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "be used because the label is missing or\n\tinvalid. "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "Sufficient replicas exist for the pool to continue\n\t"
fa9e4066f08beec538e775443c5be79dd423fcabahrens "functioning in a degraded state.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: Replace the device using "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "'zpool replace'.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_CORRUPT_LABEL_NR:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: One or more devices could not "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "be used because the the label is missing \n\tor invalid. "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "There are insufficient replicas for the pool to "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "continue\n\tfunctioning.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: Destroy and re-create the pool "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "from a backup source.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
46657f8d750bdb71753495ce2919170f126b8e34mmusante case ZPOOL_STATUS_FAILING_DEV:
46657f8d750bdb71753495ce2919170f126b8e34mmusante (void) printf(gettext("status: One or more devices has "
46657f8d750bdb71753495ce2919170f126b8e34mmusante "experienced an unrecoverable error. An\n\tattempt was "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "made to correct the error. Applications are "
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock "unaffected.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: Determine if the device needs "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "to be replaced, and clear the errors\n\tusing "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "'zpool clear' or replace the device with 'zpool "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "replace'.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_OFFLINE_DEV:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: One or more devices has "
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock "been taken offline by the administrator.\n\tSufficient "
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock "replicas exist for the pool to continue functioning in "
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock "a\n\tdegraded state.\n"));
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock (void) printf(gettext("action: Online the device using "
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock "'zpool online' or replace the device with\n\t'zpool "
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock "replace'.\n"));
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock case ZPOOL_STATUS_RESILVERING:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: One or more devices is "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "currently being resilvered. The pool will\n\tcontinue "
99653d4ee642c6528e88224f12409a5f23060994eschrock "to function, possibly in a degraded state.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: Wait for the resilver to "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "complete.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
46657f8d750bdb71753495ce2919170f126b8e34mmusante
46657f8d750bdb71753495ce2919170f126b8e34mmusante case ZPOOL_STATUS_CORRUPT_DATA:
46657f8d750bdb71753495ce2919170f126b8e34mmusante (void) printf(gettext("status: One or more devices has "
46657f8d750bdb71753495ce2919170f126b8e34mmusante "experienced an error resulting in data\n\tcorruption. "
990b4856d0eaada6f8140335733a1b1771ed2746lling "Applications may be affected.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: Restore the file in question "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "if possible. Otherwise restore the\n\tentire pool from "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "backup.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_CORRUPT_POOL:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: The pool metadata is corrupted "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "and the pool cannot be opened.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: Destroy and re-create the pool "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "from a backup source.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_VERSION_OLDER:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: The pool is formatted using an "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "older on-disk format. The pool can\n\tstill be used, but "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "some features are unavailable.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: Upgrade the pool using 'zpool "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "upgrade'. Once this is done, the\n\tpool will no longer "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "be accessible on older software versions.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_VERSION_NEWER:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: The pool has been upgraded to a "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "newer, incompatible on-disk version.\n\tThe pool cannot "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "be accessed on this system.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: Access the pool from a system "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "running more recent software, or\n\trestore the pool from "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "backup.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens default:
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
b1b8ab34de515a5e83206da22c3d7e563241b021lling * The remaining errors can't actually be generated, yet.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens assert(reason == ZPOOL_STATUS_OK);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (msgid != NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext(" see: http://www.sun.com/msg/%s\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens msgid);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (config != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens int namewidth;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t nerr;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t **spares;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint_t nspares;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext(" scrub: "));
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_scrub_status(nvroot);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens namewidth = max_width(zhp, nvroot, 0, 0);
d7d4af51b4d115490d97f0b89993fdbaaf441c94mmusante if (namewidth < 10)
fa9e4066f08beec538e775443c5be79dd423fcabahrens namewidth = 10;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("config:\n\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("\t%-*s %-8s %5s %5s %5s\n"), namewidth,
fa9e4066f08beec538e775443c5be79dd423fcabahrens "NAME", "STATE", "READ", "WRITE", "CKSUM");
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_status_config(zhp, zpool_get_name(zhp), nvroot,
fa9e4066f08beec538e775443c5be79dd423fcabahrens namewidth, 0, B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &spares, &nspares) == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_spares(zhp, spares, nspares, namewidth);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_ERRCOUNT,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &nerr) == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *nverrlist = NULL;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock /*
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * If the approximate error count is small, get a
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * precise count by fetching the entire log and
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * uniquifying the results.
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (nerr < 100 && !cbp->cb_verbose &&
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock zpool_get_errlog(zhp, &nverrlist) == 0) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock nvpair_t *elem;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock elem = NULL;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock nerr = 0;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock while ((elem = nvlist_next_nvpair(nverrlist,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock elem)) != NULL) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock nerr++;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock nvlist_free(nverrlist);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf("\n");
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (nerr == 0)
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("errors: No known data "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "errors\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock else if (!cbp->cb_verbose)
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("errors: %llu data "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "errors, use '-v' for a list\n"),
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (u_longlong_t)nerr);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock else
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock print_error_log(zhp);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock } else {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("config: The configuration cannot be "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "determined.\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (0);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock}
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock/*
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * zpool status [-vx] [pool] ...
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock *
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * -v Display complete error logs
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * -x Display only pools with potential problems
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock *
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * Describes the health status of all pools or some subset.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockint
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockzpool_do_status(int argc, char **argv)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock{
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock int c;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock int ret;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock status_cbdata_t cb = { 0 };
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((c = getopt(argc, argv, "vx")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'v':
fa9e4066f08beec538e775443c5be79dd423fcabahrens cb.cb_verbose = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'x':
fa9e4066f08beec538e775443c5be79dd423fcabahrens cb.cb_explain = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case '?':
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens optopt);
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc -= optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv += optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens cb.cb_first = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock if (argc == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens cb.cb_allpools = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = for_each_pool(argc, argv, B_TRUE, status_callback, &cb);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc == 0 && cb.cb_count == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("no pools available\n"));
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock else if (cb.cb_explain && cb.cb_first && cb.cb_allpools)
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin (void) printf(gettext("all pools are healthy\n"));
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin return (ret);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin}
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrocktypedef struct upgrade_cbdata {
99653d4ee642c6528e88224f12409a5f23060994eschrock int cb_all;
99653d4ee642c6528e88224f12409a5f23060994eschrock int cb_first;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock int cb_newer;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock int cb_argc;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock char **cb_argv;
55434c770c89aa1b84474f2559a106803511aba0ek} upgrade_cbdata_t;
55434c770c89aa1b84474f2559a106803511aba0ek
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockstatic int
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockupgrade_cb(zpool_handle_t *zhp, void *arg)
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock{
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock upgrade_cbdata_t *cbp = arg;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock nvlist_t *config;
75519f380eac71fe6d10b26e736f01567d6c13c9ek uint64_t version;
55434c770c89aa1b84474f2559a106803511aba0ek int ret = 0;
55434c770c89aa1b84474f2559a106803511aba0ek
55434c770c89aa1b84474f2559a106803511aba0ek config = zpool_get_config(zhp, NULL);
55434c770c89aa1b84474f2559a106803511aba0ek verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION,
55434c770c89aa1b84474f2559a106803511aba0ek &version) == 0);
55434c770c89aa1b84474f2559a106803511aba0ek
55434c770c89aa1b84474f2559a106803511aba0ek if (!cbp->cb_newer && version < ZFS_VERSION) {
55434c770c89aa1b84474f2559a106803511aba0ek if (!cbp->cb_all) {
55434c770c89aa1b84474f2559a106803511aba0ek if (cbp->cb_first) {
55434c770c89aa1b84474f2559a106803511aba0ek (void) printf(gettext("The following pools are "
55434c770c89aa1b84474f2559a106803511aba0ek "out of date, and can be upgraded. After "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "being\nupgraded, these pools will no "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "longer be accessible by older software "
99653d4ee642c6528e88224f12409a5f23060994eschrock "versions.\n\n"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) printf(gettext("VER POOL\n"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) printf(gettext("--- ------------\n"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock cbp->cb_first = B_FALSE;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
5ad820458efd0fdb914baff9c1447c22b819fa23nd (void) printf("%2llu %s\n", (u_longlong_t)version,
5ad820458efd0fdb914baff9c1447c22b819fa23nd zpool_get_name(zhp));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock } else {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock cbp->cb_first = B_FALSE;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock ret = zpool_upgrade(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!ret) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_log_history(g_zfs, cbp->cb_argc,
fa9e4066f08beec538e775443c5be79dd423fcabahrens cbp->cb_argv, zpool_get_name(zhp), B_TRUE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("Successfully upgraded "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "'%s'\n"), zpool_get_name(zhp));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else if (cbp->cb_newer && version > ZFS_VERSION) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens assert(!cbp->cb_all);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (cbp->cb_first) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("The following pools are "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "formatted using a newer software version and\n"
fa9e4066f08beec538e775443c5be79dd423fcabahrens "cannot be accessed on the current system.\n\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("VER POOL\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("--- ------------\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens cbp->cb_first = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("%2llu %s\n", (u_longlong_t)version,
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_get_name(zhp));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
99653d4ee642c6528e88224f12409a5f23060994eschrockupgrade_one(zpool_handle_t *zhp, void *data)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *config;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t version;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ret;
99653d4ee642c6528e88224f12409a5f23060994eschrock upgrade_cbdata_t *cbp = data;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens config = zpool_get_config(zhp, NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &version) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (version == ZFS_VERSION) {
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext("Pool '%s' is already formatted "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "using the current version.\n"), zpool_get_name(zhp));
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock return (0);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock }
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
b1b8ab34de515a5e83206da22c3d7e563241b021lling ret = zpool_upgrade(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!ret) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_log_history(g_zfs, cbp->cb_argc, cbp->cb_argv,
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock zpool_get_name(zhp), B_TRUE, B_FALSE);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock (void) printf(gettext("Successfully upgraded '%s' "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "from version %llu to version %llu\n"), zpool_get_name(zhp),
fa9e4066f08beec538e775443c5be79dd423fcabahrens (u_longlong_t)version, (u_longlong_t)ZFS_VERSION);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock return (ret != 0);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock}
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock/*
06eeb2ad640ce72d394ac521094bed7681044408ek * zpool upgrade
990b4856d0eaada6f8140335733a1b1771ed2746lling * zpool upgrade -v
06eeb2ad640ce72d394ac521094bed7681044408ek * zpool upgrade <-a | pool>
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock *
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * With no arguments, display downrev'd ZFS pool available for upgrade.
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * Individual pools can be upgraded by specifying the pool, and '-a' will
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * upgrade all pools.
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock */
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockint
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockzpool_do_upgrade(int argc, char **argv)
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock{
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock int c;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock upgrade_cbdata_t cb = { 0 };
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock int ret = 0;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock boolean_t showversions = B_FALSE;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock /* check options */
e7437265dc2a4920c197ed4337665539d358b22cahrens while ((c = getopt(argc, argv, "av")) != -1) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock switch (c) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case 'a':
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock cb.cb_all = B_TRUE;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock break;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case 'v':
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock showversions = B_TRUE;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock break;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case '?':
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) fprintf(stderr, gettext("invalid option '%c'\n"),
99653d4ee642c6528e88224f12409a5f23060994eschrock optopt);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock usage(B_FALSE);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
5ad820458efd0fdb914baff9c1447c22b819fa23nd }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock cb.cb_argc = argc;
99653d4ee642c6528e88224f12409a5f23060994eschrock cb.cb_argv = argv;
990b4856d0eaada6f8140335733a1b1771ed2746lling argc -= optind;
06eeb2ad640ce72d394ac521094bed7681044408ek argv += optind;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
990b4856d0eaada6f8140335733a1b1771ed2746lling if (showversions) {
06eeb2ad640ce72d394ac521094bed7681044408ek if (cb.cb_all || argc != 0) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) fprintf(stderr, gettext("-v option is "
e7437265dc2a4920c197ed4337665539d358b22cahrens "incompatible with other arguments\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock usage(B_FALSE);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock } else if (cb.cb_all) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (argc != 0) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) fprintf(stderr, gettext("-a option is "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "incompatible with other arguments\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock usage(B_FALSE);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("This system is currently running ZFS version "
5ad820458efd0fdb914baff9c1447c22b819fa23nd "%llu.\n\n"), ZFS_VERSION);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock cb.cb_first = B_TRUE;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (showversions) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("The following versions are "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "supported:\n\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("VER DESCRIPTION\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf("--- -----------------------------------------"
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "---------------\n");
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext(" 1 Initial ZFS version\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext(" 2 Ditto blocks "
06eeb2ad640ce72d394ac521094bed7681044408ek "(replicated metadata)\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext(" 3 Hot spares and double parity "
990b4856d0eaada6f8140335733a1b1771ed2746lling "RAID-Z\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf(gettext("\nFor more information on a particular "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "version, including supported releases, see:\n\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf("http://www.opensolaris.org/os/community/zfs/"
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin "version/N\n\n");
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin (void) printf(gettext("Where 'N' is the version number.\n"));
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin } else if (argc == 0) {
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin int notfound;
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin ret = zpool_iter(g_zfs, upgrade_cb, &cb);
990b4856d0eaada6f8140335733a1b1771ed2746lling notfound = cb.cb_first;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling if (!cb.cb_all && ret == 0) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (!cb.cb_first)
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf("\n");
990b4856d0eaada6f8140335733a1b1771ed2746lling cb.cb_first = B_TRUE;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock cb.cb_newer = B_TRUE;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock ret = zpool_iter(g_zfs, upgrade_cb, &cb);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (!cb.cb_first) {
990b4856d0eaada6f8140335733a1b1771ed2746lling notfound = B_FALSE;
06eeb2ad640ce72d394ac521094bed7681044408ek (void) printf("\n");
06eeb2ad640ce72d394ac521094bed7681044408ek }
44cd46cadd9aab751dae6a4023c1cb5bf316d274billm }
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling if (ret == 0) {
990b4856d0eaada6f8140335733a1b1771ed2746lling if (notfound)
06eeb2ad640ce72d394ac521094bed7681044408ek (void) printf(gettext("All pools are formatted "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "using this version.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock else if (!cb.cb_all)
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("Use 'zpool upgrade -v' "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "for a list of available versions and "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "their associated\nfeatures.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock } else {
990b4856d0eaada6f8140335733a1b1771ed2746lling ret = for_each_pool(argc, argv, B_FALSE, upgrade_one, &cb);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock return (ret);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock}
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock/*
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * Print out the command history for a specific pool.
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock */
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockstatic int
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockget_history_one(zpool_handle_t *zhp, void *data)
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock{
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock nvlist_t *nvhis;
990b4856d0eaada6f8140335733a1b1771ed2746lling nvlist_t **records;
990b4856d0eaada6f8140335733a1b1771ed2746lling uint_t numrecords;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock char *cmdstr;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock uint64_t dst_time;
990b4856d0eaada6f8140335733a1b1771ed2746lling time_t tsec;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock struct tm t;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock char tbuf[30];
99653d4ee642c6528e88224f12409a5f23060994eschrock int ret, i;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock *(boolean_t *)data = B_FALSE;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("History for '%s':\n"), zpool_get_name(zhp));
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling if ((ret = zpool_get_history(zhp, &nvhis)) != 0)
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling return (ret);
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling
990b4856d0eaada6f8140335733a1b1771ed2746lling verify(nvlist_lookup_nvlist_array(nvhis, ZPOOL_HIST_RECORD,
990b4856d0eaada6f8140335733a1b1771ed2746lling &records, &numrecords) == 0);
990b4856d0eaada6f8140335733a1b1771ed2746lling for (i = 0; i < numrecords; i++) {
990b4856d0eaada6f8140335733a1b1771ed2746lling if (nvlist_lookup_uint64(records[i], ZPOOL_HIST_TIME,
990b4856d0eaada6f8140335733a1b1771ed2746lling &dst_time) == 0) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock verify(nvlist_lookup_string(records[i], ZPOOL_HIST_CMD,
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock &cmdstr) == 0);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock tsec = dst_time;
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) localtime_r(&tsec, &t);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) strftime(tbuf, sizeof (tbuf), "%F.%T", &t);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf("%s %s\n", tbuf, cmdstr);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
06eeb2ad640ce72d394ac521094bed7681044408ek }
06eeb2ad640ce72d394ac521094bed7681044408ek (void) printf("\n");
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock nvlist_free(nvhis);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock return (ret);
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling}
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling/*
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling * zpool history <pool>
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling *
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling * Displays the history of commands that modified pools.
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling */
351420b34707afeafa8d5c3e0c77b7bcffb1edc0llingint
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockzpool_do_history(int argc, char **argv)
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock{
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock boolean_t first = B_TRUE;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock int ret;
99653d4ee642c6528e88224f12409a5f23060994eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock argc -= optind;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock argv += optind;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling ret = for_each_pool(argc, argv, B_FALSE, get_history_one, &first);
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling
99653d4ee642c6528e88224f12409a5f23060994eschrock if (argc == 0 && first == B_TRUE) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("no pools available\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock return (0);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
e7437265dc2a4920c197ed4337665539d358b22cahrens
e7437265dc2a4920c197ed4337665539d358b22cahrens return (ret);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockint
d7d4af51b4d115490d97f0b89993fdbaaf441c94mmusantemain(int argc, char **argv)
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock{
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock int ret;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock int i;
99653d4ee642c6528e88224f12409a5f23060994eschrock char *cmdname;
44cd46cadd9aab751dae6a4023c1cb5bf316d274billm
44cd46cadd9aab751dae6a4023c1cb5bf316d274billm (void) setlocale(LC_ALL, "");
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) textdomain(TEXT_DOMAIN);
99653d4ee642c6528e88224f12409a5f23060994eschrock
d7306b64c847d897abb9ece8624fca9cf28d358fek if ((g_zfs = libzfs_init()) == NULL) {
c9431fa1e59a88c2f0abf611f25b97af964449e5ahl (void) fprintf(stderr, gettext("internal error: failed to "
c9431fa1e59a88c2f0abf611f25b97af964449e5ahl "initialize ZFS library\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling return (1);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin }
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
8eed72d43abf6184b757f3eb9228c3c4979aca10ck libzfs_print_on_error(g_zfs, B_TRUE);
a9799022bd90b13722204e80112efaa5bf573099ck
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin opterr = 0;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock /*
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * Make sure the user has specified some command.
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock */
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (argc < 2) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) fprintf(stderr, gettext("missing command\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock usage(B_FALSE);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock cmdname = argv[1];
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock /*
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * Special case '-?'
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock */
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (strcmp(cmdname, "-?") == 0)
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_TRUE);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock /*
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * Run the appropriate command.
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock */
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock for (i = 0; i < NCOMMAND; i++) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (command_table[i].name == NULL)
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock continue;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (strcmp(cmdname, command_table[i].name) == 0) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock current_command = &command_table[i];
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock ret = command_table[i].func(argc - 1, argv + 1);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock break;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock /*
b1b8ab34de515a5e83206da22c3d7e563241b021lling * 'freeze' is a vile debugging abomination, so we treat it as such.
b1b8ab34de515a5e83206da22c3d7e563241b021lling */
06eeb2ad640ce72d394ac521094bed7681044408ek if (strcmp(cmdname, "freeze") == 0 && argc == 3) {
06eeb2ad640ce72d394ac521094bed7681044408ek char buf[16384];
06eeb2ad640ce72d394ac521094bed7681044408ek int fd = open(ZFS_DEV, O_RDWR);
06eeb2ad640ce72d394ac521094bed7681044408ek (void) strcpy((void *)buf, argv[2]);
06eeb2ad640ce72d394ac521094bed7681044408ek return (!!ioctl(fd, ZFS_IOC_POOL_FREEZE, buf));
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks }
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks if (i == NCOMMAND) {
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (void) fprintf(stderr, gettext("unrecognized "
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "command '%s'\n"), cmdname);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks usage(B_FALSE);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks }
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks libzfs_fini(g_zfs);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks /*
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks * The 'ZFS_ABORT' environment variable causes us to dump core on exit
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks * for the purposes of running ::findleaks.
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks */
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks if (getenv("ZFS_ABORT") != NULL) {
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (void) printf("dumping core by request\n");
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks abort();
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks }
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks return (ret);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks}
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks