zpool_main.c revision 379c004d1f26b343f034bba8a350290691d00d38
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/*
18ce54df8809e9f672d0ed1a53e99669df0a6df0ek * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Use is subject to license terms.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
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>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <pwd.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <zone.h>
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks#include <sys/fs/zfs.h>
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
b1b8ab34de515a5e83206da22c3d7e563241b021lling#include <sys/stat.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <libzfs.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "zpool_util.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "zfs_comutil.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens
b7b97454b9b1f6625e7e655e9651e744a8dee09dperrinstatic 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
99653d4ee642c6528e88224f12409a5f23060994eschrockstatic int zpool_do_list(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic 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
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockstatic int zpool_do_attach(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic 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
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockstatic int zpool_do_history(int, char **);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
06eeb2ad640ce72d394ac521094bed7681044408ekstatic int zpool_do_get(int, char **);
06eeb2ad640ce72d394ac521094bed7681044408ekstatic int zpool_do_set(int, char **);
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling/*
b1b8ab34de515a5e83206da22c3d7e563241b021lling * These libumem hooks provide a reasonable set of defaults for the allocator's
fa9e4066f08beec538e775443c5be79dd423fcabahrens * debugging facilities.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef DEBUG
29ab75c9a733dad2978c4860efd954b5625e3467rmconst char *
29ab75c9a733dad2978c4860efd954b5625e3467rm_umem_debug_init(void)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
99653d4ee642c6528e88224f12409a5f23060994eschrock return ("default,verbose"); /* $UMEM_DEBUG setting */
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensconst char *
fa9e4066f08beec538e775443c5be79dd423fcabahrens_umem_logging_init(void)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens return ("fail,contents"); /* $UMEM_LOGGING setting */
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens
29ab75c9a733dad2978c4860efd954b5625e3467rmtypedef enum {
fa9e4066f08beec538e775443c5be79dd423fcabahrens HELP_ADD,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_ATTACH,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_CLEAR,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_CREATE,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock HELP_DESTROY,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_DETACH,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_EXPORT,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_HISTORY,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_IMPORT,
06eeb2ad640ce72d394ac521094bed7681044408ek HELP_IOSTAT,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_LIST,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_OFFLINE,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_ONLINE,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_REPLACE,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_REMOVE,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_SCRUB,
99653d4ee642c6528e88224f12409a5f23060994eschrock HELP_STATUS,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_UPGRADE,
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock HELP_GET,
b1b8ab34de515a5e83206da22c3d7e563241b021lling HELP_SET
b1b8ab34de515a5e83206da22c3d7e563241b021lling} zpool_help_t;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
65cd9f2809a015b46790a9c5c2ef992d56177624eschrocktypedef struct zpool_command {
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock const char *name;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int (*func)(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_help_t usage;
fa9e4066f08beec538e775443c5be79dd423fcabahrens} zpool_command_t;
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Master command table. Each ZFS command has a name, associated function, and
fa9e4066f08beec538e775443c5be79dd423fcabahrens * usage message. The usage messages need to be internationalized, so we have
fa9e4066f08beec538e775443c5be79dd423fcabahrens * to have a function to return the usage message based on a command index.
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock *
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * These commands are organized according to how they are displayed in the usage
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * message. An empty command (one with a NULL name) indicates an empty line in
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * the generic usage message.
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock */
65cd9f2809a015b46790a9c5c2ef992d56177624eschrockstatic zpool_command_t command_table[] = {
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "create", zpool_do_create, HELP_CREATE },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "destroy", zpool_do_destroy, HELP_DESTROY },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { NULL },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "add", zpool_do_add, HELP_ADD },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "remove", zpool_do_remove, HELP_REMOVE },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { NULL },
99653d4ee642c6528e88224f12409a5f23060994eschrock { "list", zpool_do_list, HELP_LIST },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "iostat", zpool_do_iostat, HELP_IOSTAT },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "status", zpool_do_status, HELP_STATUS },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { NULL },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "online", zpool_do_online, HELP_ONLINE },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "offline", zpool_do_offline, HELP_OFFLINE },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "clear", zpool_do_clear, HELP_CLEAR },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { NULL },
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock { "attach", zpool_do_attach, HELP_ATTACH },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "detach", zpool_do_detach, HELP_DETACH },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "replace", zpool_do_replace, HELP_REPLACE },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { NULL },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "scrub", zpool_do_scrub, HELP_SCRUB },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { NULL },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "import", zpool_do_import, HELP_IMPORT },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "export", zpool_do_export, HELP_EXPORT },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "upgrade", zpool_do_upgrade, HELP_UPGRADE },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { NULL },
06eeb2ad640ce72d394ac521094bed7681044408ek { "history", zpool_do_history, HELP_HISTORY },
06eeb2ad640ce72d394ac521094bed7681044408ek { "get", zpool_do_get, HELP_GET },
b1b8ab34de515a5e83206da22c3d7e563241b021lling { "set", zpool_do_set, HELP_SET },
b1b8ab34de515a5e83206da22c3d7e563241b021lling};
b1b8ab34de515a5e83206da22c3d7e563241b021lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define NCOMMAND (sizeof (command_table) / sizeof (command_table[0]))
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_command_t *current_command;
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic char history_str[HIS_MAX_RECORD_LEN];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
2a6b87f07ac0c0b819179c84afe5a60afa04cfa5ekstatic const char *
fa9e4066f08beec538e775443c5be79dd423fcabahrensget_usage(zpool_help_t idx) {
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock switch (idx) {
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_ADD:
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock return (gettext("\tadd [-fn] <pool> <vdev> ...\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_ATTACH:
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock return (gettext("\tattach [-f] <pool> <device> "
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock "<new-device>\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_CLEAR:
e45ce728996d8e573eecb27f555fb86aaff0cafdahrens return (gettext("\tclear <pool> [device]\n"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock case HELP_CREATE:
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock return (gettext("\tcreate [-fn] [-o property=value] ... \n"
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock "\t [-O file-system-property=value] ... \n"
990b4856d0eaada6f8140335733a1b1771ed2746lling "\t [-m mountpoint] [-R root] <pool> <vdev> ...\n"));
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh case HELP_DESTROY:
990b4856d0eaada6f8140335733a1b1771ed2746lling return (gettext("\tdestroy [-f] <pool>\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_DETACH:
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock return (gettext("\tdetach <pool> <device>\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_EXPORT:
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock return (gettext("\texport [-f] <pool> ...\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_HISTORY:
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock return (gettext("\thistory [-il] [<pool>] ...\n"));
06eeb2ad640ce72d394ac521094bed7681044408ek case HELP_IMPORT:
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks return (gettext("\timport [-d dir] [-D]\n"
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock "\timport [-o mntopts] [-o property=value] ... \n"
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm "\t [-d dir | -c cachefile] [-D] [-f] [-R root] -a\n"
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock "\timport [-o mntopts] [-o property=value] ... \n"
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock "\t [-d dir | -c cachefile] [-D] [-f] [-R root] "
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock "<pool | id> [newpool]\n"));
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock case HELP_IOSTAT:
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock return (gettext("\tiostat [-v] [pool] ... [interval "
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock "[count]]\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_LIST:
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock return (gettext("\tlist [-H] [-o property[,...]] "
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock "[pool] ...\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling case HELP_OFFLINE:
990b4856d0eaada6f8140335733a1b1771ed2746lling return (gettext("\toffline [-t] <pool> <device> ...\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_ONLINE:
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling return (gettext("\tonline <pool> <device> ...\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_REPLACE:
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling return (gettext("\treplace [-f] <pool> <device> "
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock "[new-device]\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_REMOVE:
e45ce728996d8e573eecb27f555fb86aaff0cafdahrens return (gettext("\tremove <pool> <device> ...\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case HELP_SCRUB:
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan return (gettext("\tscrub [-s] <pool> ...\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_STATUS:
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock return (gettext("\tstatus [-vx] [pool] ...\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_UPGRADE:
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock return (gettext("\tupgrade\n"
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "\tupgrade -v\n"
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "\tupgrade [-V version] <-a | pool ...>\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case HELP_GET:
990b4856d0eaada6f8140335733a1b1771ed2746lling return (gettext("\tget <\"all\" | property[,...]> "
b1b8ab34de515a5e83206da22c3d7e563241b021lling "<pool> ...\n"));
e45ce728996d8e573eecb27f555fb86aaff0cafdahrens case HELP_SET:
b1b8ab34de515a5e83206da22c3d7e563241b021lling return (gettext("\tset <property=value> <pool> \n"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling }
b1b8ab34de515a5e83206da22c3d7e563241b021lling
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock abort();
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock /* NOTREACHED */
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock}
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Callback routine that will print out a pool property value.
b1b8ab34de515a5e83206da22c3d7e563241b021lling */
b1b8ab34de515a5e83206da22c3d7e563241b021llingstatic int
b1b8ab34de515a5e83206da22c3d7e563241b021llingprint_prop_cb(int prop, void *cb)
990b4856d0eaada6f8140335733a1b1771ed2746lling{
990b4856d0eaada6f8140335733a1b1771ed2746lling FILE *fp = cb;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) fprintf(fp, "\t%-13s ", zpool_prop_to_name(prop));
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling if (zpool_prop_readonly(prop))
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) fprintf(fp, " NO ");
990b4856d0eaada6f8140335733a1b1771ed2746lling else
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) fprintf(fp, " YES ");
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling if (zpool_prop_values(prop) == NULL)
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) fprintf(fp, "-\n");
b1b8ab34de515a5e83206da22c3d7e563241b021lling else
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) fprintf(fp, "%s\n", zpool_prop_values(prop));
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling return (ZPROP_CONT);
b1b8ab34de515a5e83206da22c3d7e563241b021lling}
990b4856d0eaada6f8140335733a1b1771ed2746lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling/*
b1b8ab34de515a5e83206da22c3d7e563241b021lling * Display usage message. If we're inside a command, display only the usage for
fa9e4066f08beec538e775443c5be79dd423fcabahrens * that command. Otherwise, iterate over the entire command table and display
fa9e4066f08beec538e775443c5be79dd423fcabahrens * a complete usage message.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrensusage(boolean_t requested)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
99653d4ee642c6528e88224f12409a5f23060994eschrock 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++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (command_table[i].name == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(fp, "\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(fp, "%s",
fa9e4066f08beec538e775443c5be79dd423fcabahrens get_usage(command_table[i].usage));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(fp, gettext("usage:\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(fp, "%s", get_usage(current_command->usage));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (current_command != NULL &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((strcmp(current_command->name, "set") == 0) ||
b1b8ab34de515a5e83206da22c3d7e563241b021lling (strcmp(current_command->name, "get") == 0) ||
b1b8ab34de515a5e83206da22c3d7e563241b021lling (strcmp(current_command->name, "list") == 0))) {
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) fprintf(fp,
b1b8ab34de515a5e83206da22c3d7e563241b021lling gettext("\nthe following properties are supported:\n"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) fprintf(fp, "\n\t%-13s %s %s\n\n",
b1b8ab34de515a5e83206da22c3d7e563241b021lling "PROPERTY", "EDIT", "VALUES");
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling /* Iterate over all properties */
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) zprop_iter(print_prop_cb, fp, B_FALSE, B_TRUE,
b1b8ab34de515a5e83206da22c3d7e563241b021lling ZFS_TYPE_POOL);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling /*
b1b8ab34de515a5e83206da22c3d7e563241b021lling * See comments at end of main().
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock */
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock if (getenv("ZFS_ABORT") != NULL) {
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock (void) printf("dumping core by request\n");
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock abort();
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock }
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock exit(requested ? 0 : 2);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrensprint_vdev_tree(zpool_handle_t *zhp, const char *name, nvlist_t *nv, int indent,
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t print_logs)
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin{
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin nvlist_t **child;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint_t c, children;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *vname;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock if (name != NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("\t%*s%s\n", indent, "", name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
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 uint64_t is_log = B_FALSE;
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin (void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG,
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin &is_log);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin if ((is_log && !print_logs) || (!is_log && print_logs))
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin continue;
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin vname = zpool_vdev_name(g_zfs, zhp, child[c]);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin print_vdev_tree(zhp, vname, child[c], indent + 2,
99653d4ee642c6528e88224f12409a5f23060994eschrock B_FALSE);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin free(vname);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin }
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock}
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Add a property pair (name, string-value) into a property nvlist.
990b4856d0eaada6f8140335733a1b1771ed2746lling */
990b4856d0eaada6f8140335733a1b1771ed2746llingstatic int
990b4856d0eaada6f8140335733a1b1771ed2746llingadd_prop_list(const char *propname, char *propval, nvlist_t **props,
990b4856d0eaada6f8140335733a1b1771ed2746lling boolean_t poolprop)
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh{
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh zpool_prop_t prop = ZPROP_INVAL;
990b4856d0eaada6f8140335733a1b1771ed2746lling zfs_prop_t fprop;
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh nvlist_t *proplist;
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh const char *normnm;
990b4856d0eaada6f8140335733a1b1771ed2746lling char *strval;
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh if (*props == NULL &&
990b4856d0eaada6f8140335733a1b1771ed2746lling nvlist_alloc(props, NV_UNIQUE_NAME, 0) != 0) {
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) fprintf(stderr,
990b4856d0eaada6f8140335733a1b1771ed2746lling gettext("internal error: out of memory\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling return (1);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling proplist = *props;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling if (poolprop) {
990b4856d0eaada6f8140335733a1b1771ed2746lling if ((prop = zpool_name_to_prop(propname)) == ZPROP_INVAL) {
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh (void) fprintf(stderr, gettext("property '%s' is "
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh "not a valid pool property\n"), propname);
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh return (2);
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh }
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh normnm = zpool_prop_to_name(prop);
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh } else {
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh if ((fprop = zfs_name_to_prop(propname)) == ZPROP_INVAL) {
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh (void) fprintf(stderr, gettext("property '%s' is "
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh "not a valid file system property\n"), propname);
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh return (2);
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh }
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh normnm = zfs_prop_to_name(fprop);
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh }
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh
990b4856d0eaada6f8140335733a1b1771ed2746lling if (nvlist_lookup_string(proplist, normnm, &strval) == 0 &&
990b4856d0eaada6f8140335733a1b1771ed2746lling prop != ZPOOL_PROP_CACHEFILE) {
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh (void) fprintf(stderr, gettext("property '%s' "
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh "specified multiple times\n"), propname);
990b4856d0eaada6f8140335733a1b1771ed2746lling return (2);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling if (nvlist_add_string(proplist, normnm, propval) != 0) {
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) fprintf(stderr, gettext("internal "
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh "error: out of memory\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling return (1);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling return (0);
990b4856d0eaada6f8140335733a1b1771ed2746lling}
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling/*
990b4856d0eaada6f8140335733a1b1771ed2746lling * zpool add [-fn] <pool> <vdev> ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Force addition of devices, even if they appear in use
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -n Do not add the devices, but display the resulting layout if
fa9e4066f08beec538e775443c5be79dd423fcabahrens * they were to be added.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Adds the given vdevs to 'pool'. As with create, the bulk of this work is
fa9e4066f08beec538e775443c5be79dd423fcabahrens * handled by get_vdev_spec(), which constructs the nvlist needed to pass to
fa9e4066f08beec538e775443c5be79dd423fcabahrens * libzfs.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_add(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t force = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t dryrun = B_FALSE;
99653d4ee642c6528e88224f12409a5f23060994eschrock int c;
99653d4ee642c6528e88224f12409a5f23060994eschrock 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;
99653d4ee642c6528e88224f12409a5f23060994eschrock case 'n':
fa9e4066f08beec538e775443c5be79dd423fcabahrens dryrun = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
99653d4ee642c6528e88224f12409a5f23060994eschrock case '?':
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens optopt);
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
99653d4ee642c6528e88224f12409a5f23060994eschrock }
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"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
99653d4ee642c6528e88224f12409a5f23060994eschrock if (argc < 2) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing vdev specification\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens poolname = argv[0];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc--;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv++;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((config = zpool_get_config(zhp, NULL)) == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("pool '%s' is unavailable\n"),
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock poolname);
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* pass off to get_vdev_spec for processing */
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvroot = make_root_vdev(zhp, force, !force, B_FALSE, dryrun,
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc, argv);
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor if (nvroot == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (dryrun) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *poolnvroot;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &poolnvroot) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("would update '%s' to the following "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "configuration:\n"), zpool_get_name(zhp));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* print original main pool and new tree */
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin print_vdev_tree(zhp, poolname, poolnvroot, 0, B_FALSE);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin print_vdev_tree(zhp, NULL, nvroot, 0, B_FALSE);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin /* Do the same for the logs */
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin if (num_logs(poolnvroot) > 0) {
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin print_vdev_tree(zhp, "logs", poolnvroot, 0, B_TRUE);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin print_vdev_tree(zhp, NULL, nvroot, 0, B_TRUE);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin } else if (num_logs(nvroot) > 0) {
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin print_vdev_tree(zhp, "logs", nvroot, 0, B_TRUE);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin }
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = (zpool_add(zhp, nvroot) != 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_free(nvroot);
99653d4ee642c6528e88224f12409a5f23060994eschrock zpool_close(zhp);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock return (ret);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock/*
99653d4ee642c6528e88224f12409a5f23060994eschrock * zpool remove <pool> <vdev> ...
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan *
99653d4ee642c6528e88224f12409a5f23060994eschrock * Removes the given vdev from the pool. Currently, this only supports removing
99653d4ee642c6528e88224f12409a5f23060994eschrock * spares and cache devices from the pool. Eventually, we'll want to support
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan * removing leaf vdevs (as an alias for 'detach') as well as toplevel vdevs.
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan */
99653d4ee642c6528e88224f12409a5f23060994eschrockint
99653d4ee642c6528e88224f12409a5f23060994eschrockzpool_do_remove(int argc, char **argv)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock char *poolname;
99653d4ee642c6528e88224f12409a5f23060994eschrock int i, ret = 0;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan zpool_handle_t *zhp;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock argc--;
99653d4ee642c6528e88224f12409a5f23060994eschrock argv++;
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 }
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 for (i = 1; i < argc; i++) {
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (zpool_vdev_remove(zhp, argv[i]) != 0)
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan ret = 1;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan }
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
99653d4ee642c6528e88224f12409a5f23060994eschrock return (ret);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool create [-fn] [-o property=value] ...
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh * [-O file-system-property=value] ...
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh * [-R root] [-m mountpoint] <pool> <dev> ...
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Force creation, even if devices appear in use
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -n Do not create the pool, but display the resulting layout if it
fa9e4066f08beec538e775443c5be79dd423fcabahrens * were to be created.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -R Create a pool under an alternate root
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -m Set default mountpoint for the root dataset. By default it's
fa9e4066f08beec538e775443c5be79dd423fcabahrens * '/<pool>'
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -o Set property=value.
990b4856d0eaada6f8140335733a1b1771ed2746lling * -O Set fsproperty=value in the pool's root file system
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Creates the named pool according to the given vdev specification. The
b1b8ab34de515a5e83206da22c3d7e563241b021lling * bulk of the vdev processing is done in get_vdev_spec() in zpool_vdev.c. Once
fa9e4066f08beec538e775443c5be79dd423fcabahrens * we get the nvlist back from get_vdev_spec(), we either print out the contents
fa9e4066f08beec538e775443c5be79dd423fcabahrens * (if '-n' was specified), or pass it to libzfs to do the creation.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_create(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t force = B_FALSE;
99653d4ee642c6528e88224f12409a5f23060994eschrock boolean_t dryrun = B_FALSE;
99653d4ee642c6528e88224f12409a5f23060994eschrock int c;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *nvroot = NULL;
990b4856d0eaada6f8140335733a1b1771ed2746lling char *poolname;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ret = 1;
990b4856d0eaada6f8140335733a1b1771ed2746lling char *altroot = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *mountpoint = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *fsprops = NULL;
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh nvlist_t *props = NULL;
990b4856d0eaada6f8140335733a1b1771ed2746lling char *propval;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((c = getopt(argc, argv, ":fnR:m:o:O:")) != -1) {
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'f':
fa9e4066f08beec538e775443c5be79dd423fcabahrens force = B_TRUE;
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'n':
fa9e4066f08beec538e775443c5be79dd423fcabahrens dryrun = B_TRUE;
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'R':
fa9e4066f08beec538e775443c5be79dd423fcabahrens altroot = optarg;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (add_prop_list(zpool_prop_to_name(
990b4856d0eaada6f8140335733a1b1771ed2746lling ZPOOL_PROP_ALTROOT), optarg, &props, B_TRUE))
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh goto errout;
990b4856d0eaada6f8140335733a1b1771ed2746lling if (nvlist_lookup_string(props,
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock zpool_prop_to_name(ZPOOL_PROP_CACHEFILE),
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock &propval) == 0)
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock break;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock if (add_prop_list(zpool_prop_to_name(
990b4856d0eaada6f8140335733a1b1771ed2746lling ZPOOL_PROP_CACHEFILE), "none", &props, B_TRUE))
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh goto errout;
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'm':
fa9e4066f08beec538e775443c5be79dd423fcabahrens mountpoint = optarg;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'o':
990b4856d0eaada6f8140335733a1b1771ed2746lling if ((propval = strchr(optarg, '=')) == NULL) {
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) fprintf(stderr, gettext("missing "
990b4856d0eaada6f8140335733a1b1771ed2746lling "'=' for -o option\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling goto errout;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling *propval = '\0';
990b4856d0eaada6f8140335733a1b1771ed2746lling propval++;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling if (add_prop_list(optarg, propval, &props, B_TRUE))
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh goto errout;
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh break;
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh case 'O':
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh if ((propval = strchr(optarg, '=')) == NULL) {
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh (void) fprintf(stderr, gettext("missing "
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh "'=' for -O option\n"));
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh goto errout;
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh }
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh *propval = '\0';
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh propval++;
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh if (add_prop_list(optarg, propval, &fsprops, B_FALSE))
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh goto errout;
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
990b4856d0eaada6f8140335733a1b1771ed2746lling case ':':
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing argument for "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "'%c' option\n"), optopt);
fa9e4066f08beec538e775443c5be79dd423fcabahrens goto badusage;
990b4856d0eaada6f8140335733a1b1771ed2746lling case '?':
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens optopt);
fa9e4066f08beec538e775443c5be79dd423fcabahrens goto badusage;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
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"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens goto badusage;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 2) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing vdev specification\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens goto badusage;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens poolname = argv[0];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * 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 "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "character '/' in pool name\n"), poolname);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("use 'zfs create' to "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "create a dataset\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens goto errout;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* pass off to get_vdev_spec for bulk processing */
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvroot = make_root_vdev(NULL, force, !force, B_FALSE, dryrun,
99653d4ee642c6528e88224f12409a5f23060994eschrock argc - 1, argv + 1);
99653d4ee642c6528e88224f12409a5f23060994eschrock if (nvroot == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens goto errout;
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* make_root_vdev() allows 0 toplevel children if there are spares */
99653d4ee642c6528e88224f12409a5f23060994eschrock if (!zfs_allocatable_devs(nvroot)) {
b7b97454b9b1f6625e7e655e9651e744a8dee09dperrin (void) fprintf(stderr, gettext("invalid vdev "
99653d4ee642c6528e88224f12409a5f23060994eschrock "specification: at least one toplevel vdev must be "
99653d4ee642c6528e88224f12409a5f23060994eschrock "specified\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock goto errout;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if (altroot != NULL && altroot[0] != '/') {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid alternate root '%s': "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "must be an absolute path\n"), altroot);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock goto errout;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
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.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mountpoint == NULL ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens (strcmp(mountpoint, ZFS_MOUNTPOINT_LEGACY) != 0 &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens strcmp(mountpoint, ZFS_MOUNTPOINT_NONE) != 0)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens char buf[MAXPATHLEN];
fa9e4066f08beec538e775443c5be79dd423fcabahrens DIR *dirp;
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh
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 goto errout;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mountpoint == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (altroot != NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) snprintf(buf, sizeof (buf), "%s/%s",
fa9e4066f08beec538e775443c5be79dd423fcabahrens altroot, poolname);
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) snprintf(buf, sizeof (buf), "/%s",
fa9e4066f08beec538e775443c5be79dd423fcabahrens poolname);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (altroot != NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) snprintf(buf, sizeof (buf), "%s%s",
fa9e4066f08beec538e775443c5be79dd423fcabahrens altroot, mountpoint);
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) snprintf(buf, sizeof (buf), "%s",
fa9e4066f08beec538e775443c5be79dd423fcabahrens mountpoint);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((dirp = opendir(buf)) == NULL && errno != ENOENT) {
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh (void) fprintf(stderr, gettext("mountpoint '%s' : "
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh "%s\n"), buf, strerror(errno));
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh (void) fprintf(stderr, gettext("use '-m' "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "option to provide a different default\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens goto errout;
990b4856d0eaada6f8140335733a1b1771ed2746lling } else if (dirp) {
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh int count = 0;
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh while (count < 3 && readdir(dirp) != NULL)
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh count++;
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh (void) closedir(dirp);
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh if (count > 2) {
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh (void) fprintf(stderr, gettext("mountpoint "
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh "'%s' exists and is not empty\n"), buf);
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh (void) fprintf(stderr, gettext("use '-m' "
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh "option to provide a "
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh "different default\n"));
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh goto errout;
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh }
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh }
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 */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("would create '%s' with the "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "following layout:\n\n"), poolname);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_vdev_tree(NULL, poolname, nvroot, 0, B_FALSE);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin if (num_logs(nvroot) > 0)
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin print_vdev_tree(NULL, "logs", nvroot, 0, B_TRUE);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Hand off to libzfs.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zpool_create(g_zfs, poolname,
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh nvroot, props, fsprops) == 0) {
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh zfs_handle_t *pool = zfs_open(g_zfs, poolname,
99653d4ee642c6528e88224f12409a5f23060994eschrock ZFS_TYPE_FILESYSTEM);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (pool != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mountpoint != NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(zfs_prop_set(pool,
fa9e4066f08beec538e775443c5be79dd423fcabahrens zfs_prop_to_name(
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock ZFS_PROP_MOUNTPOINT),
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock mountpoint) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zfs_mount(pool, NULL, 0) == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = zfs_shareall(pool);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw zfs_close(pool);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else if (libzfs_errno(g_zfs) == EZFS_INVALIDNAME) {
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, gettext("pool name may have "
99653d4ee642c6528e88224f12409a5f23060994eschrock "been omitted\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenserrout:
990b4856d0eaada6f8140335733a1b1771ed2746lling nvlist_free(nvroot);
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock nvlist_free(fsprops);
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh nvlist_free(props);
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock return (ret);
fa9e4066f08beec538e775443c5be79dd423fcabahrensbadusage:
990b4856d0eaada6f8140335733a1b1771ed2746lling nvlist_free(fsprops);
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh nvlist_free(props);
990b4856d0eaada6f8140335733a1b1771ed2746lling usage(B_FALSE);
990b4856d0eaada6f8140335733a1b1771ed2746lling return (2);
990b4856d0eaada6f8140335733a1b1771ed2746lling}
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.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_destroy(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t force = B_FALSE;
99653d4ee642c6528e88224f12409a5f23060994eschrock int c;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *pool;
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_handle_t *zhp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ret;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((c = getopt(argc, argv, "f")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'f':
fa9e4066f08beec538e775443c5be79dd423fcabahrens force = B_TRUE;
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case '?':
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens optopt);
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
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);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc > 1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("too many arguments\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pool = argv[0];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((zhp = zpool_open_canfail(g_zfs, pool)) == NULL) {
99653d4ee642c6528e88224f12409a5f23060994eschrock /*
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 }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zpool_disable_datasets(zhp, force) != 0) {
f3861e1a2ceec23a5b699c24d814b7775a9e0b52ahl (void) fprintf(stderr, gettext("could not destroy '%s': "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "could not unmount datasets\n"), zpool_get_name(zhp));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = (zpool_destroy(zhp) != 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool export [-f] <pool> ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Forcefully unmount datasets
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Export the given pools. By default, the command will attempt to cleanly
b1b8ab34de515a5e83206da22c3d7e563241b021lling * unmount any active datasets within the pool. If the '-f' flag is specified,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * then the datasets will be forcefully unmounted.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_export(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t force = B_FALSE;
99653d4ee642c6528e88224f12409a5f23060994eschrock boolean_t hardforce = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c;
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_handle_t *zhp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ret;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((c = getopt(argc, argv, "fF")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'f':
99653d4ee642c6528e88224f12409a5f23060994eschrock force = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'F':
fa9e4066f08beec538e775443c5be79dd423fcabahrens hardforce = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
99653d4ee642c6528e88224f12409a5f23060994eschrock 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
99653d4ee642c6528e88224f12409a5f23060994eschrock /* check arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool argument\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < argc; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((zhp = zpool_open_canfail(g_zfs, argv[i])) == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 1;
f3861e1a2ceec23a5b699c24d814b7775a9e0b52ahl continue;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zpool_disable_datasets(zhp, force) != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens continue;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (hardforce) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zpool_export_force(zhp) != 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else if (zpool_export(zhp, force) != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Given a vdev configuration, determine the maximum width needed for the device
fa9e4066f08beec538e775443c5be79dd423fcabahrens * name column.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
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);
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock nvlist_t **child;
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock uint_t c, children;
99653d4ee642c6528e88224f12409a5f23060994eschrock int ret;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if (strlen(name) + depth > max)
99653d4ee642c6528e88224f12409a5f23060994eschrock max = strlen(name) + depth;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock free(name);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_SPARES,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan &child, &children) == 0) {
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan for (c = 0; c < children; c++)
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if ((ret = max_width(zhp, child[c], depth + 2,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan max)) > max)
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan max = ret;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan }
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_L2CACHE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &child, &children) == 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock for (c = 0; c < children; c++)
99653d4ee642c6528e88224f12409a5f23060994eschrock if ((ret = max_width(zhp, child[c], depth + 2,
99653d4ee642c6528e88224f12409a5f23060994eschrock max)) > max)
99653d4ee642c6528e88224f12409a5f23060994eschrock max = ret;
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
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}
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
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 */
afefbcddfd8caf5f3b2da510d9439471ab225040eschrockvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrensprint_import_config(const char *name, nvlist_t *nv, int namewidth, int depth,
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t print_logs)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens 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);
990b4856d0eaada6f8140335733a1b1771ed2746lling if (strcmp(type, VDEV_TYPE_MISSING) == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock verify(nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_STATS,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (uint64_t **)&vs, &c) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("\t%*s%-*s", depth, "", namewidth - depth, name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(" %s", zpool_state_to_name(vs->vs_state, vs->vs_aux));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (vs->vs_aux != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(" ");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (vs->vs_aux) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case VDEV_AUX_OPEN_FAILED:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("cannot open"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case VDEV_AUX_BAD_GUID_SUM:
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("missing device"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock break;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case VDEV_AUX_NO_REPLICAS:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) printf(gettext("insufficient replicas"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock break;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock case VDEV_AUX_VERSION_NEWER:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("newer version"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case VDEV_AUX_ERR_EXCEEDED:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("too many errors"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens default:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("corrupted data"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock }
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin (void) printf("\n");
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin &child, &children) != 0)
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin return;
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin for (c = 0; c < children; c++) {
99653d4ee642c6528e88224f12409a5f23060994eschrock uint64_t is_log = B_FALSE;
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin (void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG,
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock &is_log);
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock if ((is_log && !print_logs) || (!is_log && print_logs))
99653d4ee642c6528e88224f12409a5f23060994eschrock continue;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan vname = zpool_vdev_name(g_zfs, NULL, child[c]);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan print_import_config(vname, child[c],
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan namewidth, depth + 2, B_FALSE);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan free(vname);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan }
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_L2CACHE,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan &child, &children) == 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext("\tcache\n"));
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan for (c = 0; c < children; c++) {
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan vname = zpool_vdev_name(g_zfs, NULL, child[c]);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan (void) printf("\t %s\n", vname);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan free(vname);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan }
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan }
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_SPARES,
99653d4ee642c6528e88224f12409a5f23060994eschrock &child, &children) == 0) {
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/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Display the status for the given pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void
fa9e4066f08beec538e775443c5be79dd423fcabahrensshow_import(nvlist_t *config)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
46657f8d750bdb71753495ce2919170f126b8e34mmusante uint64_t pool_state;
fa9e4066f08beec538e775443c5be79dd423fcabahrens vdev_stat_t *vs;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *name;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t guid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *msgid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens 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);
990b4856d0eaada6f8140335733a1b1771ed2746lling verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_STATE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &pool_state) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &nvroot) == 0);
46657f8d750bdb71753495ce2919170f126b8e34mmusante
46657f8d750bdb71753495ce2919170f126b8e34mmusante verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_STATS,
46657f8d750bdb71753495ce2919170f126b8e34mmusante (uint64_t **)&vs, &vsc) == 0);
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm health = zpool_state_to_name(vs->vs_state, vs->vs_aux);
b1b8ab34de515a5e83206da22c3d7e563241b021lling
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm reason = zpool_import_status(config, &msgid);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext(" pool: %s\n"), name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext(" id: %llu\n"), (u_longlong_t)guid);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext(" state: %s"), health);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (pool_state == POOL_STATE_DESTROYED)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext(" (DESTROYED)"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (reason) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_MISSING_DEV_R:
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_MISSING_DEV_NR:
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_BAD_GUID_SUM:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: One or more devices are missing "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "from the system.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_CORRUPT_LABEL_R:
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_CORRUPT_LABEL_NR:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: One or more devices contains "
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling "corrupted data.\n"));
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling break;
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling case ZPOOL_STATUS_CORRUPT_DATA:
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling (void) printf(gettext("status: The pool data is corrupted.\n"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock break;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock case ZPOOL_STATUS_OFFLINE_DEV:
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) printf(gettext("status: One or more devices "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "are offlined.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock break;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case ZPOOL_STATUS_CORRUPT_POOL:
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("status: The pool metadata is "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "corrupted.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock break;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case ZPOOL_STATUS_VERSION_OLDER:
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("status: The pool is formatted using an "
95173954d2b811ceb583a9012c3b16e1d0dd6438ek "older on-disk version.\n"));
95173954d2b811ceb583a9012c3b16e1d0dd6438ek break;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek
95173954d2b811ceb583a9012c3b16e1d0dd6438ek case ZPOOL_STATUS_VERSION_NEWER:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) printf(gettext("status: The pool is formatted using an "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "incompatible version.\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock break;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock case ZPOOL_STATUS_HOSTID_MISMATCH:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) printf(gettext("status: The pool was last accessed by "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "another system.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_FAULTED_DEV_R:
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_FAULTED_DEV_NR:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: One or more devices are "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "faulted.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_BAD_LOG:
46657f8d750bdb71753495ce2919170f126b8e34mmusante (void) printf(gettext("status: An intent log record cannot be "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "read.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock break;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock default:
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock /*
95173954d2b811ceb583a9012c3b16e1d0dd6438ek * No other status can be seen when importing pools.
95173954d2b811ceb583a9012c3b16e1d0dd6438ek */
95173954d2b811ceb583a9012c3b16e1d0dd6438ek assert(reason == ZPOOL_STATUS_OK);
95173954d2b811ceb583a9012c3b16e1d0dd6438ek }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock /*
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * Print out an action according to the overall state of the pool.
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock */
46657f8d750bdb71753495ce2919170f126b8e34mmusante if (vs->vs_state == VDEV_STATE_HEALTHY) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (reason == ZPOOL_STATUS_VERSION_OLDER)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: The pool can be "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "imported using its name or numeric identifier, "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "though\n\tsome features will not be available "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "without an explicit 'zpool upgrade'.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock else if (reason == ZPOOL_STATUS_HOSTID_MISMATCH)
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("action: The pool can be "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "imported using its name or numeric "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "identifier and\n\tthe '-f' flag.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock else
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("action: The pool can be "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "imported using its name or numeric "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "identifier.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock } 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"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock } else {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock switch (reason) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_VERSION_NEWER:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: The pool cannot be "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "imported. Access the pool on a system running "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "newer\n\tsoftware, or recreate the pool from "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "backup.\n"));
46657f8d750bdb71753495ce2919170f126b8e34mmusante break;
46657f8d750bdb71753495ce2919170f126b8e34mmusante case ZPOOL_STATUS_MISSING_DEV_R:
46657f8d750bdb71753495ce2919170f126b8e34mmusante case ZPOOL_STATUS_MISSING_DEV_NR:
46657f8d750bdb71753495ce2919170f126b8e34mmusante case ZPOOL_STATUS_BAD_GUID_SUM:
46657f8d750bdb71753495ce2919170f126b8e34mmusante (void) printf(gettext("action: The pool cannot be "
46657f8d750bdb71753495ce2919170f126b8e34mmusante "imported. Attach the missing\n\tdevices and try "
46657f8d750bdb71753495ce2919170f126b8e34mmusante "again.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock break;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock default:
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("action: The pool cannot be "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "imported due to damaged devices or data.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
18ce54df8809e9f672d0ed1a53e99669df0a6df0ek }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If the state is "closed" or "can't open", and the aux state
fa9e4066f08beec538e775443c5be79dd423fcabahrens * is "corrupt data":
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (((vs->vs_state == VDEV_STATE_CLOSED) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens (vs->vs_state == VDEV_STATE_CANT_OPEN)) &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens (vs->vs_aux == VDEV_AUX_CORRUPT_DATA)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (pool_state == POOL_STATE_DESTROYED)
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock (void) printf(gettext("\tThe pool was destroyed, "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "but can be imported using the '-Df' flags.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens else if (pool_state != POOL_STATE_EXPORTED)
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin (void) printf(gettext("\tThe pool may be active on "
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin "another system, but can be imported using\n\t"
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin "the '-f' flag.\n"));
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin }
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin if (msgid != NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext(" see: http://www.sun.com/msg/%s\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens msgid);
46657f8d750bdb71753495ce2919170f126b8e34mmusante
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("config:\n\n"));
46657f8d750bdb71753495ce2919170f126b8e34mmusante
fa9e4066f08beec538e775443c5be79dd423fcabahrens namewidth = max_width(NULL, nvroot, 0, 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (namewidth < 10)
fa9e4066f08beec538e775443c5be79dd423fcabahrens namewidth = 10;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_import_config(name, nvroot, namewidth, 0, B_FALSE);
990b4856d0eaada6f8140335733a1b1771ed2746lling if (num_logs(nvroot) > 0) {
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf(gettext("\tlogs\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_import_config(name, nvroot, namewidth, 0, B_TRUE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock if (reason == ZPOOL_STATUS_BAD_GUID_SUM) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("\n\tAdditional devices are known to "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "be part of this pool, though their\n\texact "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "configuration cannot be determined.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock}
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Perform the import for the given configuration. This passes the heavy
fa9e4066f08beec538e775443c5be79dd423fcabahrens * lifting off to zpool_import_props(), and then mounts the datasets contained
fa9e4066f08beec538e775443c5be79dd423fcabahrens * within the pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockdo_import(nvlist_t *config, const char *newname, const char *mntopts,
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock int force, nvlist_t *props, boolean_t allowfaulted)
e7437265dc2a4920c197ed4337665539d358b22cahrens{
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock zpool_handle_t *zhp;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock char *name;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock uint64_t state;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock uint64_t version;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek int error = 0;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek
95173954d2b811ceb583a9012c3b16e1d0dd6438ek verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME,
95173954d2b811ceb583a9012c3b16e1d0dd6438ek &name) == 0);
95173954d2b811ceb583a9012c3b16e1d0dd6438ek
95173954d2b811ceb583a9012c3b16e1d0dd6438ek verify(nvlist_lookup_uint64(config,
95173954d2b811ceb583a9012c3b16e1d0dd6438ek ZPOOL_CONFIG_POOL_STATE, &state) == 0);
95173954d2b811ceb583a9012c3b16e1d0dd6438ek verify(nvlist_lookup_uint64(config,
95173954d2b811ceb583a9012c3b16e1d0dd6438ek ZPOOL_CONFIG_VERSION, &version) == 0);
95173954d2b811ceb583a9012c3b16e1d0dd6438ek if (version > SPA_VERSION) {
95173954d2b811ceb583a9012c3b16e1d0dd6438ek (void) fprintf(stderr, gettext("cannot import '%s': pool "
95173954d2b811ceb583a9012c3b16e1d0dd6438ek "is formatted using a newer ZFS version\n"), name);
95173954d2b811ceb583a9012c3b16e1d0dd6438ek return (1);
95173954d2b811ceb583a9012c3b16e1d0dd6438ek } else if (state != POOL_STATE_EXPORTED && !force) {
95173954d2b811ceb583a9012c3b16e1d0dd6438ek uint64_t hostid;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek
95173954d2b811ceb583a9012c3b16e1d0dd6438ek if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_HOSTID,
95173954d2b811ceb583a9012c3b16e1d0dd6438ek &hostid) == 0) {
95173954d2b811ceb583a9012c3b16e1d0dd6438ek if ((unsigned long)hostid != gethostid()) {
95173954d2b811ceb583a9012c3b16e1d0dd6438ek char *hostname;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek uint64_t timestamp;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek time_t t;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek
95173954d2b811ceb583a9012c3b16e1d0dd6438ek verify(nvlist_lookup_string(config,
95173954d2b811ceb583a9012c3b16e1d0dd6438ek ZPOOL_CONFIG_HOSTNAME, &hostname) == 0);
95173954d2b811ceb583a9012c3b16e1d0dd6438ek verify(nvlist_lookup_uint64(config,
95173954d2b811ceb583a9012c3b16e1d0dd6438ek ZPOOL_CONFIG_TIMESTAMP, &timestamp) == 0);
95173954d2b811ceb583a9012c3b16e1d0dd6438ek t = timestamp;
95173954d2b811ceb583a9012c3b16e1d0dd6438ek (void) fprintf(stderr, gettext("cannot import "
95173954d2b811ceb583a9012c3b16e1d0dd6438ek "'%s': pool may be in use from other "
95173954d2b811ceb583a9012c3b16e1d0dd6438ek "system, it was last accessed by %s "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "(hostid: 0x%lx) on %s"), name, hostname,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (unsigned long)hostid,
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock asctime(localtime(&t)));
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock (void) fprintf(stderr, gettext("use '-f' to "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "import anyway\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("cannot import '%s': "
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock "pool may be in use from other system\n"), name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("use '-f' to import "
f3861e1a2ceec23a5b699c24d814b7775a9e0b52ahl "anyway\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zpool_import_props(g_zfs, config, newname, props,
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks allowfaulted) != 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (newname != NULL)
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm name = (char *)newname;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock verify((zhp = zpool_open_canfail(g_zfs, name)) != NULL);
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock if (zpool_get_state(zhp) != POOL_STATE_UNAVAIL &&
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock zpool_enable_datasets(zhp, mntopts, 0) != 0) {
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock zpool_close(zhp);
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (error);
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm}
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool import [-d dir] [-D]
fa9e4066f08beec538e775443c5be79dd423fcabahrens * import [-o mntopts] [-o prop=value] ... [-R root] [-D]
fa9e4066f08beec538e775443c5be79dd423fcabahrens * [-d dir | -c cachefile] [-f] -a
fa9e4066f08beec538e775443c5be79dd423fcabahrens * import [-o mntopts] [-o prop=value] ... [-R root] [-D]
fa9e4066f08beec538e775443c5be79dd423fcabahrens * [-d dir | -c cachefile] [-f] <pool | id> [newpool]
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock * -c Read pool information from a cachefile instead of searching
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock * devices.
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock *
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock * -d Scan in a specific directory, other than /dev/dsk. More than
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock * one directory can be specified using multiple '-d' options.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -D Scan for previously destroyed pools or import all or only
990b4856d0eaada6f8140335733a1b1771ed2746lling * specified destroyed pools.
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -R Temporarily import the pool, with all mountpoints relative to
fa9e4066f08beec538e775443c5be79dd423fcabahrens * 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 * -F Import even in the presence of faulted vdevs. This is an
fa9e4066f08beec538e775443c5be79dd423fcabahrens * intentionally undocumented option for testing purposes, and
fa9e4066f08beec538e775443c5be79dd423fcabahrens * treats the pool configuration as complete, leaving any bad
fa9e4066f08beec538e775443c5be79dd423fcabahrens * vdevs in the FAULTED state.
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock *
99653d4ee642c6528e88224f12409a5f23060994eschrock * -a Import all pools found.
99653d4ee642c6528e88224f12409a5f23060994eschrock *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -o Set property=value and/or temporary mount options (without '=').
99653d4ee642c6528e88224f12409a5f23060994eschrock *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The import command scans for pools to import, and import pools based on pool
fa9e4066f08beec538e775443c5be79dd423fcabahrens * name and GUID. The pool can also be renamed as part of the import process.
24e697d414a4df0377b91a2875f029e7b5f97247ck */
24e697d414a4df0377b91a2875f029e7b5f97247ckint
990b4856d0eaada6f8140335733a1b1771ed2746llingzpool_do_import(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks char **searchdirs = NULL;
99653d4ee642c6528e88224f12409a5f23060994eschrock int nsearch = 0;
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock int c;
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm int err;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock nvlist_t *pools = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t do_all = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t do_destroyed = B_FALSE;
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock char *mntopts = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t do_force = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvpair_t *elem;
99653d4ee642c6528e88224f12409a5f23060994eschrock nvlist_t *config;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t searchguid = 0;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock char *searchname = NULL;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock char *propval;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock nvlist_t *found_config;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *props = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t first;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t allow_faulted = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t pool_state;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *cachefile = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((c = getopt(argc, argv, ":ac:d:DfFo:p:R:")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'a':
fa9e4066f08beec538e775443c5be79dd423fcabahrens do_all = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'c':
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm cachefile = optarg;
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm case 'd':
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (searchdirs == NULL) {
99653d4ee642c6528e88224f12409a5f23060994eschrock searchdirs = safe_malloc(sizeof (char *));
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock char **tmp = safe_malloc((nsearch + 1) *
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock sizeof (char *));
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock bcopy(searchdirs, tmp, nsearch *
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (char *));
990b4856d0eaada6f8140335733a1b1771ed2746lling free(searchdirs);
990b4856d0eaada6f8140335733a1b1771ed2746lling searchdirs = tmp;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh searchdirs[nsearch++] = optarg;
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh break;
990b4856d0eaada6f8140335733a1b1771ed2746lling case 'D':
990b4856d0eaada6f8140335733a1b1771ed2746lling do_destroyed = B_TRUE;
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
990b4856d0eaada6f8140335733a1b1771ed2746lling case 'f':
fa9e4066f08beec538e775443c5be79dd423fcabahrens do_force = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
990b4856d0eaada6f8140335733a1b1771ed2746lling case 'F':
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh allow_faulted = B_TRUE;
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock case 'o':
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock if ((propval = strchr(optarg, '=')) != NULL) {
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock *propval = '\0';
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock propval++;
990b4856d0eaada6f8140335733a1b1771ed2746lling if (add_prop_list(optarg, propval,
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh &props, B_TRUE))
990b4856d0eaada6f8140335733a1b1771ed2746lling goto error;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mntopts = optarg;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
99653d4ee642c6528e88224f12409a5f23060994eschrock case 'R':
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (add_prop_list(zpool_prop_to_name(
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZPOOL_PROP_ALTROOT), optarg, &props, B_TRUE))
fa9e4066f08beec538e775443c5be79dd423fcabahrens goto error;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_string(props,
99653d4ee642c6528e88224f12409a5f23060994eschrock zpool_prop_to_name(ZPOOL_PROP_CACHEFILE),
fa9e4066f08beec538e775443c5be79dd423fcabahrens &propval) == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (add_prop_list(zpool_prop_to_name(
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZPOOL_PROP_CACHEFILE), "none", &props, B_TRUE))
fa9e4066f08beec538e775443c5be79dd423fcabahrens goto error;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock case ':':
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock (void) fprintf(stderr, gettext("missing argument for "
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock "'%c' option\n"), optopt);
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock usage(B_FALSE);
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock 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
99653d4ee642c6528e88224f12409a5f23060994eschrock if (cachefile && nsearch != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("-c is incompatible with -d\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock if (searchdirs == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens searchdirs = safe_malloc(sizeof (char *));
fa9e4066f08beec538e775443c5be79dd423fcabahrens searchdirs[0] = "/dev/dsk";
fa9e4066f08beec538e775443c5be79dd423fcabahrens nsearch = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check argument count */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (do_all) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("too many arguments\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc > 2) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("too many arguments\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Check for the SYS_CONFIG privilege. We do this explicitly
fa9e4066f08beec538e775443c5be79dd423fcabahrens * here because otherwise any attempt to discover pools will
fa9e4066f08beec538e775443c5be79dd423fcabahrens * silently fail.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc == 0 && !priv_ineffect(PRIV_SYS_CONFIG)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("cannot "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "discover pools: permission denied\n"));
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm free(searchdirs);
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Depending on the arguments given, we do one of the following:
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * <none> Iterate through all pools and display information about
fa9e4066f08beec538e775443c5be79dd423fcabahrens * each one.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -a Iterate through all pools and try to import each one.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
24e697d414a4df0377b91a2875f029e7b5f97247ck * <id> Find the pool that corresponds to the given GUID/pool
e829d913cde9eeff0efd355502799863d4f74f69ck * name and import that one.
e829d913cde9eeff0efd355502799863d4f74f69ck *
24e697d414a4df0377b91a2875f029e7b5f97247ck * -D Above options applies only to destroyed pools.
24e697d414a4df0377b91a2875f029e7b5f97247ck */
24e697d414a4df0377b91a2875f029e7b5f97247ck if (argc != 0) {
24e697d414a4df0377b91a2875f029e7b5f97247ck char *endptr;
24e697d414a4df0377b91a2875f029e7b5f97247ck
24e697d414a4df0377b91a2875f029e7b5f97247ck errno = 0;
24e697d414a4df0377b91a2875f029e7b5f97247ck searchguid = strtoull(argv[0], &endptr, 10);
24e697d414a4df0377b91a2875f029e7b5f97247ck if (errno != 0 || *endptr != '\0')
24e697d414a4df0377b91a2875f029e7b5f97247ck searchname = argv[0];
24e697d414a4df0377b91a2875f029e7b5f97247ck found_config = NULL;
24e697d414a4df0377b91a2875f029e7b5f97247ck }
24e697d414a4df0377b91a2875f029e7b5f97247ck
24e697d414a4df0377b91a2875f029e7b5f97247ck if (cachefile) {
24e697d414a4df0377b91a2875f029e7b5f97247ck pools = zpool_find_import_cached(g_zfs, cachefile, searchname,
24e697d414a4df0377b91a2875f029e7b5f97247ck searchguid);
24e697d414a4df0377b91a2875f029e7b5f97247ck } else if (searchname != NULL) {
24e697d414a4df0377b91a2875f029e7b5f97247ck pools = zpool_find_import_byname(g_zfs, nsearch, searchdirs,
24e697d414a4df0377b91a2875f029e7b5f97247ck searchname);
24e697d414a4df0377b91a2875f029e7b5f97247ck } else {
24e697d414a4df0377b91a2875f029e7b5f97247ck /*
24e697d414a4df0377b91a2875f029e7b5f97247ck * It's OK to search by guid even if searchguid is 0.
24e697d414a4df0377b91a2875f029e7b5f97247ck */
24e697d414a4df0377b91a2875f029e7b5f97247ck pools = zpool_find_import_byguid(g_zfs, nsearch, searchdirs,
24e697d414a4df0377b91a2875f029e7b5f97247ck searchguid);
24e697d414a4df0377b91a2875f029e7b5f97247ck }
24e697d414a4df0377b91a2875f029e7b5f97247ck
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (pools == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc != 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, gettext("cannot import '%s': "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "no such pool available\n"), argv[0]);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(searchdirs);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm }
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm /*
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm * At this point we have a list of import candidate configs. Even if
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm * we were searching by pool name or guid, we still need to
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm * post-process the list to deal with pool state and possible
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm * duplicate names.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens err = 0;
99653d4ee642c6528e88224f12409a5f23060994eschrock elem = NULL;
3bb79bece53191f2cf27aa61a72ea1784a7ce700eschrock first = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((elem = nvlist_next_nvpair(pools, elem)) != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvpair_value_nvlist(elem, &config) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock 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)
fa9e4066f08beec538e775443c5be79dd423fcabahrens first = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens else if (!do_all)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (do_all)
fa9e4066f08beec538e775443c5be79dd423fcabahrens err |= do_import(config, NULL, mntopts,
fa9e4066f08beec538e775443c5be79dd423fcabahrens do_force, props, allow_faulted);
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens show_import(config);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else if (searchname != NULL) {
99653d4ee642c6528e88224f12409a5f23060994eschrock char *name;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * We are searching for a pool based on name.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_string(config,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZPOOL_CONFIG_POOL_NAME, &name) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strcmp(name, searchname) == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (found_config != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext(
fa9e4066f08beec538e775443c5be79dd423fcabahrens "cannot import '%s': more than "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "one matching pool\n"), searchname);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext(
fa9e4066f08beec538e775443c5be79dd423fcabahrens "import by numeric ID instead\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens err = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens found_config = config;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t guid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Search for a pool by guid.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64(config,
99653d4ee642c6528e88224f12409a5f23060994eschrock ZPOOL_CONFIG_POOL_GUID, &guid) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (guid == searchguid)
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock found_config = config;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If we were searching for a specific pool, verify that we found a
fa9e4066f08beec538e775443c5be79dd423fcabahrens * pool, and then do the import.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
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]);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks err = B_TRUE;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens err |= do_import(found_config, argc == 1 ? NULL :
99653d4ee642c6528e88224f12409a5f23060994eschrock argv[1], mntopts, do_force, props, allow_faulted);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If we were just looking for pools, report an error if none were
fa9e4066f08beec538e775443c5be79dd423fcabahrens * found.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc == 0 && first)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens gettext("no pools available to import\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenserror:
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_free(props);
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_free(pools);
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(searchdirs);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (err ? 1 : 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct iostat_cbdata {
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_list_t *cb_list;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int cb_verbose;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int cb_iteration;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int cb_namewidth;
fa9e4066f08beec538e775443c5be79dd423fcabahrens} iostat_cbdata_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void
fa9e4066f08beec538e775443c5be79dd423fcabahrensprint_iostat_separator(iostat_cbdata_t *cb)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < cb->cb_namewidth; i++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("-");
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(" ----- ----- ----- ----- ----- -----\n");
990b4856d0eaada6f8140335733a1b1771ed2746lling}
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}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Display a single statistic.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrockstatic void
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrockprint_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
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock/*
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.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
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{
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t **oldchild, **newchild;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint_t c, children;
fa9e4066f08beec538e775443c5be79dd423fcabahrens vdev_stat_t *oldvs, *newvs;
fa9e4066f08beec538e775443c5be79dd423fcabahrens vdev_stat_t zerovs = { 0 };
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t tdelta;
fa9e4066f08beec538e775443c5be79dd423fcabahrens double scale;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *vname;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (oldnv != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64_array(oldnv, ZPOOL_CONFIG_STATS,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (uint64_t **)&oldvs, &c) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens oldvs = &zerovs;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens 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(" - -");
fa9e4066f08beec538e775443c5be79dd423fcabahrens } 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] -
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock oldvs->vs_bytes[ZIO_TYPE_WRITE])));
99653d4ee642c6528e88224f12409a5f23060994eschrock
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock (void) printf("\n");
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock if (!cb->cb_verbose)
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock return;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (nvlist_lookup_nvlist_array(newnv, ZPOOL_CONFIG_CHILDREN,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan &newchild, &children) != 0)
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan return;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (oldnv && nvlist_lookup_nvlist_array(oldnv, ZPOOL_CONFIG_CHILDREN,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan &oldchild, &c) != 0)
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan return;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan for (c = 0; c < children; c++) {
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan vname = zpool_vdev_name(g_zfs, zhp, newchild[c]);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan print_vdev_stats(zhp, vname, oldnv ? oldchild[c] : NULL,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan newchild[c], cb, depth + 2);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan free(vname);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan }
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan /*
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan * Include level 2 ARC devices in iostat output
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan */
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (nvlist_lookup_nvlist_array(newnv, ZPOOL_CONFIG_L2CACHE,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan &newchild, &children) != 0)
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (oldnv && nvlist_lookup_nvlist_array(oldnv, ZPOOL_CONFIG_L2CACHE,
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock &oldchild, &c) != 0)
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock return;
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock if (children > 0) {
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock (void) printf("%-*s - - - - - "
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock "-\n", cb->cb_namewidth, "cache");
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock for (c = 0; c < children; c++) {
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock vname = zpool_vdev_name(g_zfs, zhp, newchild[c]);
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock print_vdev_stats(zhp, vname, oldnv ? oldchild[c] : NULL,
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock newchild[c], cb, depth + 2);
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock free(vname);
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock }
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock }
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock}
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrockstatic int
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrockrefresh_iostat(zpool_handle_t *zhp, void *data)
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock{
fa9e4066f08beec538e775443c5be79dd423fcabahrens iostat_cbdata_t *cb = data;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t missing;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
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)
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock pool_list_remove(cb->cb_list, zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Callback to print out the iostats for the given pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrockint
fa9e4066f08beec538e775443c5be79dd423fcabahrensprint_iostat(zpool_handle_t *zhp, void *data)
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock{
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock iostat_cbdata_t *cb = data;
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock nvlist_t *oldconfig, *newconfig;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *oldnvroot, *newnvroot;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens newconfig = zpool_get_config(zhp, &oldconfig);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock 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);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print out the statistics for the pool.
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock */
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
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrensget_namewidth(zpool_handle_t *zhp, void *data)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens iostat_cbdata_t *cb = data;
fa9e4066f08beec538e775443c5be79dd423fcabahrens 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
fa9e4066f08beec538e775443c5be79dd423fcabahrens 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
99653d4ee642c6528e88224f12409a5f23060994eschrock *
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 */
99653d4ee642c6528e88224f12409a5f23060994eschrockint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_iostat(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ret;
99653d4ee642c6528e88224f12409a5f23060994eschrock 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;
99653d4ee642c6528e88224f12409a5f23060994eschrock 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;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens errno = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens interval = strtoul(argv[argc - 1], &end, 10);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (*end == '\0' && errno == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (interval == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("interval "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "cannot be zero\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Ignore the last parameter
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc--;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If this is not a valid number, just plow on. The
fa9e4066f08beec538e775443c5be79dd423fcabahrens * user will get a more informative error message later
fa9e4066f08beec538e775443c5be79dd423fcabahrens * on.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens interval = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock /*
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
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (*end == '\0' && errno == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (interval == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("interval "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "cannot be zero\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
b1b8ab34de515a5e83206da22c3d7e563241b021lling }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
99653d4ee642c6528e88224f12409a5f23060994eschrock * Ignore the last parameter
99653d4ee642c6528e88224f12409a5f23060994eschrock */
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc--;
99653d4ee642c6528e88224f12409a5f23060994eschrock } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens interval = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
99653d4ee642c6528e88224f12409a5f23060994eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Construct the list of all interesting pools.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((list = pool_list_get(argc, argv, NULL, &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"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock /*
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * Enter the main iostat loop.
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock */
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock cb.cb_list = list;
99653d4ee642c6528e88224f12409a5f23060994eschrock cb.cb_verbose = verbose;
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock cb.cb_iteration = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens cb.cb_namewidth = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (;;) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens pool_list_update(list);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock 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 */
99653d4ee642c6528e88224f12409a5f23060994eschrock (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 */
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock if (++cb.cb_iteration == 1 || verbose)
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock print_iostat_header(&cb);
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock (void) pool_list_iter(list, B_FALSE, print_iostat, &cb);
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If there's more than one pool, and we're not in verbose mode
fa9e4066f08beec538e775443c5be79dd423fcabahrens * (which prints a separator for us), then print a separator.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (npools > 1 && !verbose)
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_iostat_separator(&cb);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (verbose)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Flush the output so that redirection to a file isn't buffered
fa9e4066f08beec538e775443c5be79dd423fcabahrens * indefinitely.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fflush(stdout);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock if (interval == 0)
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
990b4856d0eaada6f8140335733a1b1771ed2746lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (count != 0 && --count == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) sleep(interval);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling pool_list_free(list);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling return (ret);
990b4856d0eaada6f8140335733a1b1771ed2746lling}
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746llingtypedef struct list_cbdata {
990b4856d0eaada6f8140335733a1b1771ed2746lling boolean_t cb_scripted;
990b4856d0eaada6f8140335733a1b1771ed2746lling boolean_t cb_first;
990b4856d0eaada6f8140335733a1b1771ed2746lling zprop_list_t *cb_proplist;
fa9e4066f08beec538e775443c5be79dd423fcabahrens} list_cbdata_t;
990b4856d0eaada6f8140335733a1b1771ed2746lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Given a list of columns to display, output appropriate headers for each one.
990b4856d0eaada6f8140335733a1b1771ed2746lling */
990b4856d0eaada6f8140335733a1b1771ed2746llingstatic void
990b4856d0eaada6f8140335733a1b1771ed2746llingprint_header(zprop_list_t *pl)
990b4856d0eaada6f8140335733a1b1771ed2746lling{
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *header;
990b4856d0eaada6f8140335733a1b1771ed2746lling boolean_t first = B_TRUE;
990b4856d0eaada6f8140335733a1b1771ed2746lling boolean_t right_justify;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling for (; pl != NULL; pl = pl->pl_next) {
990b4856d0eaada6f8140335733a1b1771ed2746lling if (pl->pl_prop == ZPROP_INVAL)
990b4856d0eaada6f8140335733a1b1771ed2746lling continue;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!first)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(" ");
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens first = B_FALSE;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling header = zpool_prop_column_name(pl->pl_prop);
990b4856d0eaada6f8140335733a1b1771ed2746lling right_justify = zpool_prop_align_right(pl->pl_prop);
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling if (pl->pl_next == NULL && !right_justify)
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf("%s", header);
fa9e4066f08beec538e775443c5be79dd423fcabahrens else if (right_justify)
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf("%*s", pl->pl_width, header);
990b4856d0eaada6f8140335733a1b1771ed2746lling else
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf("%-*s", pl->pl_width, header);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf("\n");
990b4856d0eaada6f8140335733a1b1771ed2746lling}
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Given a pool and a list of properties, print out all the properties according
fa9e4066f08beec538e775443c5be79dd423fcabahrens * to the described layout.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
990b4856d0eaada6f8140335733a1b1771ed2746llingstatic void
990b4856d0eaada6f8140335733a1b1771ed2746llingprint_pool(zpool_handle_t *zhp, zprop_list_t *pl, int scripted)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t first = B_TRUE;
990b4856d0eaada6f8140335733a1b1771ed2746lling char property[ZPOOL_MAXPROPLEN];
990b4856d0eaada6f8140335733a1b1771ed2746lling char *propstr;
990b4856d0eaada6f8140335733a1b1771ed2746lling boolean_t right_justify;
990b4856d0eaada6f8140335733a1b1771ed2746lling int width;
990b4856d0eaada6f8140335733a1b1771ed2746lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (; pl != NULL; pl = pl->pl_next) {
990b4856d0eaada6f8140335733a1b1771ed2746lling if (!first) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (scripted)
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf("\t");
990b4856d0eaada6f8140335733a1b1771ed2746lling else
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf(" ");
990b4856d0eaada6f8140335733a1b1771ed2746lling } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens first = B_FALSE;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling right_justify = B_FALSE;
990b4856d0eaada6f8140335733a1b1771ed2746lling if (pl->pl_prop != ZPROP_INVAL) {
990b4856d0eaada6f8140335733a1b1771ed2746lling if (zpool_get_prop(zhp, pl->pl_prop, property,
990b4856d0eaada6f8140335733a1b1771ed2746lling sizeof (property), NULL) != 0)
990b4856d0eaada6f8140335733a1b1771ed2746lling propstr = "-";
990b4856d0eaada6f8140335733a1b1771ed2746lling else
990b4856d0eaada6f8140335733a1b1771ed2746lling propstr = property;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling right_justify = zpool_prop_align_right(pl->pl_prop);
990b4856d0eaada6f8140335733a1b1771ed2746lling } else {
990b4856d0eaada6f8140335733a1b1771ed2746lling propstr = "-";
990b4856d0eaada6f8140335733a1b1771ed2746lling }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling width = pl->pl_width;
990b4856d0eaada6f8140335733a1b1771ed2746lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
990b4856d0eaada6f8140335733a1b1771ed2746lling * If this is being called in scripted mode, or if this is the
990b4856d0eaada6f8140335733a1b1771ed2746lling * last column and it is left-justified, don't include a width
990b4856d0eaada6f8140335733a1b1771ed2746lling * format specifier.
990b4856d0eaada6f8140335733a1b1771ed2746lling */
990b4856d0eaada6f8140335733a1b1771ed2746lling if (scripted || (pl->pl_next == NULL && !right_justify))
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf("%s", propstr);
990b4856d0eaada6f8140335733a1b1771ed2746lling else if (right_justify)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("%*s", width, propstr);
990b4856d0eaada6f8140335733a1b1771ed2746lling else
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf("%-*s", width, propstr);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
990b4856d0eaada6f8140335733a1b1771ed2746lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Generic callback function to list a pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenslist_callback(zpool_handle_t *zhp, void *data)
990b4856d0eaada6f8140335733a1b1771ed2746lling{
fa9e4066f08beec538e775443c5be79dd423fcabahrens list_cbdata_t *cbp = data;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling if (cbp->cb_first) {
990b4856d0eaada6f8140335733a1b1771ed2746lling if (!cbp->cb_scripted)
990b4856d0eaada6f8140335733a1b1771ed2746lling print_header(cbp->cb_proplist);
fa9e4066f08beec538e775443c5be79dd423fcabahrens cbp->cb_first = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_pool(zhp, cbp->cb_proplist, cbp->cb_scripted);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool list [-H] [-o prop[,prop]*] [pool] ...
990b4856d0eaada6f8140335733a1b1771ed2746lling *
990b4856d0eaada6f8140335733a1b1771ed2746lling * -H Scripted mode. Don't display headers, and separate properties
990b4856d0eaada6f8140335733a1b1771ed2746lling * by a single tab.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -o List of properties to display. Defaults to
fa9e4066f08beec538e775443c5be79dd423fcabahrens * "name,size,used,available,capacity,health,altroot"
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * List all pools in the system, whether or not they're healthy. Output space
fa9e4066f08beec538e775443c5be79dd423fcabahrens * statistics for each one, as well as health status summary.
99653d4ee642c6528e88224f12409a5f23060994eschrock */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_list(int argc, char **argv)
990b4856d0eaada6f8140335733a1b1771ed2746lling{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ret;
fa9e4066f08beec538e775443c5be79dd423fcabahrens list_cbdata_t cb = { 0 };
fa9e4066f08beec538e775443c5be79dd423fcabahrens static char default_props[] =
99653d4ee642c6528e88224f12409a5f23060994eschrock "name,size,used,available,capacity,health,altroot";
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *props = default_props;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((c = getopt(argc, argv, ":Ho:")) != -1) {
99653d4ee642c6528e88224f12409a5f23060994eschrock switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'H':
fa9e4066f08beec538e775443c5be79dd423fcabahrens cb.cb_scripted = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'o':
fa9e4066f08beec538e775443c5be79dd423fcabahrens props = optarg;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
990b4856d0eaada6f8140335733a1b1771ed2746lling case ':':
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) fprintf(stderr, gettext("missing argument for "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "'%c' option\n"), optopt);
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
990b4856d0eaada6f8140335733a1b1771ed2746lling case '?':
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) fprintf(stderr, gettext("invalid option '%c'\n"),
990b4856d0eaada6f8140335733a1b1771ed2746lling optopt);
990b4856d0eaada6f8140335733a1b1771ed2746lling usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fce7d82b2f44c64aedba1312d169198f858de333mmusante }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc -= optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv += optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zprop_get_list(g_zfs, props, &cb.cb_proplist, ZFS_TYPE_POOL) != 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens cb.cb_first = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = for_each_pool(argc, argv, B_TRUE, &cb.cb_proplist,
fa9e4066f08beec538e775443c5be79dd423fcabahrens list_callback, &cb);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens zprop_free_list(cb.cb_proplist);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc == 0 && cb.cb_first && !cb.cb_scripted) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("no pools available\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic nvlist_t *
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_get_vdev_by_name(nvlist_t *nv, char *name)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t **child;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint_t c, children;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *match;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *path;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &child, &children) != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strncmp(name, "/dev/dsk/", 9) == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens name += 9;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strncmp(path, "/dev/dsk/", 9) == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens path += 9;
99653d4ee642c6528e88224f12409a5f23060994eschrock if (strcmp(name, path) == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (nv);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock for (c = 0; c < children; c++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((match = zpool_get_vdev_by_name(child[c], name)) != NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (match);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_attach_or_replace(int argc, char **argv, int replacing)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t force = B_FALSE;
99653d4ee642c6528e88224f12409a5f23060994eschrock int c;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *nvroot;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *poolname, *old_disk, *new_disk;
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_handle_t *zhp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ret;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((c = getopt(argc, argv, "f")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'f':
99653d4ee642c6528e88224f12409a5f23060994eschrock force = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case '?':
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens optopt);
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
99653d4ee642c6528e88224f12409a5f23060994eschrock
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"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens poolname = argv[0];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 2) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens gettext("missing <device> specification\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens old_disk = argv[1];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 3) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!replacing) {
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens gettext("missing <new_device> specification\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens new_disk = old_disk;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc -= 1;
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor argv += 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens new_disk = argv[2];
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc -= 2;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv += 2;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor 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)
99653d4ee642c6528e88224f12409a5f23060994eschrock return (1);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if (zpool_get_config(zhp, NULL) == NULL) {
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, gettext("pool '%s' is unavailable\n"),
99653d4ee642c6528e88224f12409a5f23060994eschrock poolname);
99653d4ee642c6528e88224f12409a5f23060994eschrock zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvroot = make_root_vdev(zhp, force, B_FALSE, replacing, B_FALSE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc, argv);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvroot == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = zpool_vdev_attach(zhp, old_disk, new_disk, nvroot, replacing);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_free(nvroot);
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool replace [-f] <pool> <device> <new_device>
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -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}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
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
fa9e4066f08beec538e775443c5be79dd423fcabahrens * <device> and <new_device>. In either case, <new_device> will begin life
fa9e4066f08beec538e775443c5be79dd423fcabahrens * with a DTL of [0, now], and will immediately begin to resilver itself.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_attach(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (zpool_do_attach_or_replace(argc, argv, B_FALSE));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
99653d4ee642c6528e88224f12409a5f23060994eschrock * 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 */
99653d4ee642c6528e88224f12409a5f23060994eschrock/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_detach(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *poolname, *path;
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_handle_t *zhp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ret;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
99653d4ee642c6528e88224f12409a5f23060994eschrock 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);
99653d4ee642c6528e88224f12409a5f23060994eschrock 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) {
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, gettext("missing pool name argument\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if (argc < 2) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens gettext("missing <device> specification\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling }
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);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool online <pool> <device> ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
99653d4ee642c6528e88224f12409a5f23060994eschrockint
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 vdev_state_t newstate;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
99653d4ee642c6528e88224f12409a5f23060994eschrock while ((c = getopt(argc, argv, "t")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 't':
fa9e4066f08beec538e775443c5be79dd423fcabahrens case '?':
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens optopt);
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc -= optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv += optind;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock /* get pool name and check number of arguments */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (argc < 1) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) fprintf(stderr, gettext("missing pool name\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock usage(B_FALSE);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (argc < 2) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) fprintf(stderr, gettext("missing device name\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock usage(B_FALSE);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock poolname = argv[0];
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (1);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 1; i < argc; i++) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (zpool_vdev_online(zhp, argv[i], 0, &newstate) == 0) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (newstate != VDEV_STATE_HEALTHY) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("warning: device '%s' "
99653d4ee642c6528e88224f12409a5f23060994eschrock "onlined, but remains in faulted state\n"),
99653d4ee642c6528e88224f12409a5f23060994eschrock argv[i]);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (newstate == VDEV_STATE_FAULTED)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("use 'zpool "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "clear' to restore a faulted "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "device\n"));
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling else
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("use 'zpool "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "replace' to replace devices "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "that are no longer present\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
99653d4ee642c6528e88224f12409a5f23060994eschrock * zpool offline [-ft] <pool> <device> ...
99653d4ee642c6528e88224f12409a5f23060994eschrock *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Force the device into the offline state, even if doing
fa9e4066f08beec538e775443c5be79dd423fcabahrens * so would appear to compromise pool availability.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * (not supported yet)
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -t Only take the device off-line temporarily. The offline
99653d4ee642c6528e88224f12409a5f23060994eschrock * state will not be persistent across reboots.
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling */
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_offline(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
99653d4ee642c6528e88224f12409a5f23060994eschrock int c, i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *poolname;
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_handle_t *zhp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ret = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t istmp = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((c = getopt(argc, argv, "ft")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 't':
99653d4ee642c6528e88224f12409a5f23060994eschrock 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 }
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc -= optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv += optind;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock /* get pool name and check number of arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 1) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) fprintf(stderr, gettext("missing pool name\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock if (argc < 2) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing device name\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock poolname = argv[0];
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock return (1);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock for (i = 1; i < argc; i++) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (zpool_vdev_offline(zhp, argv[i], istmp) != 0)
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock ret = 1;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock zpool_close(zhp);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock return (ret);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock/*
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * zpool clear <pool> [device]
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock *
99653d4ee642c6528e88224f12409a5f23060994eschrock * Clear all errors associated with a pool or a particular device.
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockint
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockzpool_do_clear(int argc, char **argv)
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock{
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock int ret = 0;
99653d4ee642c6528e88224f12409a5f23060994eschrock zpool_handle_t *zhp;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock char *pool, *device;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (argc < 2) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) fprintf(stderr, gettext("missing pool name\n"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock usage(B_FALSE);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (argc > 3) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) fprintf(stderr, gettext("too many arguments\n"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
06eeb2ad640ce72d394ac521094bed7681044408ek pool = argv[1];
06eeb2ad640ce72d394ac521094bed7681044408ek device = argc == 3 ? argv[2] : NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((zhp = zpool_open_canfail(g_zfs, pool)) == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zpool_clear(zhp, device) != 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 1;
06eeb2ad640ce72d394ac521094bed7681044408ek
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock return (ret);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock}
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrocktypedef struct scrub_cbdata {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock int cb_type;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock int cb_argc;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock char **cb_argv;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock} scrub_cbdata_t;
06eeb2ad640ce72d394ac521094bed7681044408ek
06eeb2ad640ce72d394ac521094bed7681044408ekint
06eeb2ad640ce72d394ac521094bed7681044408ekscrub_callback(zpool_handle_t *zhp, void *data)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens scrub_cbdata_t *cb = data;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int err;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * 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));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens err = zpool_scrub(zhp, cb->cb_type);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (err != 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool scrub [-s] <pool> ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -s Stop. Stops any in-progress scrub.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
99653d4ee642c6528e88224f12409a5f23060994eschrockzpool_do_scrub(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c;
fa9e4066f08beec538e775443c5be79dd423fcabahrens scrub_cbdata_t cb;
06eeb2ad640ce72d394ac521094bed7681044408ek
06eeb2ad640ce72d394ac521094bed7681044408ek cb.cb_type = POOL_SCRUB_EVERYTHING;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((c = getopt(argc, argv, "s")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 's':
99653d4ee642c6528e88224f12409a5f23060994eschrock cb.cb_type = POOL_SCRUB_NONE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case '?':
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens optopt);
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
99653d4ee642c6528e88224f12409a5f23060994eschrock }
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock cb.cb_argc = argc;
99653d4ee642c6528e88224f12409a5f23060994eschrock cb.cb_argv = argv;
99653d4ee642c6528e88224f12409a5f23060994eschrock argc -= optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv += optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name argument\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (for_each_pool(argc, argv, B_TRUE, NULL, scrub_callback, &cb));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct status_cbdata {
fa9e4066f08beec538e775443c5be79dd423fcabahrens int cb_count;
18ce54df8809e9f672d0ed1a53e99669df0a6df0ek boolean_t cb_allpools;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t cb_verbose;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t cb_explain;
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t cb_first;
fa9e4066f08beec538e775443c5be79dd423fcabahrens} status_cbdata_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print out detailed scrub status.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrensprint_scrub_status(nvlist_t *nvroot)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens vdev_stat_t *vs;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint_t vsc;
fa9e4066f08beec538e775443c5be79dd423fcabahrens time_t start, end, now;
fa9e4066f08beec538e775443c5be79dd423fcabahrens double fraction_done;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t examined, total, minutes_left, minutes_taken;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *scrub_type;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
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.
18ce54df8809e9f672d0ed1a53e99669df0a6df0ek */
18ce54df8809e9f672d0ed1a53e99669df0a6df0ek if (vs->vs_scrub_end == 0 && vs->vs_scrub_type == POOL_SCRUB_NONE) {
18ce54df8809e9f672d0ed1a53e99669df0a6df0ek (void) printf(gettext("none requested\n"));
18ce54df8809e9f672d0ed1a53e99669df0a6df0ek return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
18ce54df8809e9f672d0ed1a53e99669df0a6df0ek
18ce54df8809e9f672d0ed1a53e99669df0a6df0ek 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 minutes_taken = (uint64_t)((end - start) / 60);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("%s %s after %lluh%um with %llu errors "
18ce54df8809e9f672d0ed1a53e99669df0a6df0ek "on %s"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens scrub_type, vs->vs_scrub_complete ? "completed" : "stopped",
18ce54df8809e9f672d0ed1a53e99669df0a6df0ek (u_longlong_t)(minutes_taken / 60),
18ce54df8809e9f672d0ed1a53e99669df0a6df0ek (uint_t)(minutes_taken % 60),
18ce54df8809e9f672d0ed1a53e99669df0a6df0ek (u_longlong_t)vs->vs_scrub_errors, ctime(&end));
18ce54df8809e9f672d0ed1a53e99669df0a6df0ek return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (examined == 0)
99653d4ee642c6528e88224f12409a5f23060994eschrock examined = 1;
99653d4ee642c6528e88224f12409a5f23060994eschrock if (examined > total)
99653d4ee642c6528e88224f12409a5f23060994eschrock total = examined;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock fraction_done = (double)examined / total;
99653d4ee642c6528e88224f12409a5f23060994eschrock minutes_left = (uint64_t)((now - start) *
99653d4ee642c6528e88224f12409a5f23060994eschrock (1 - fraction_done) / fraction_done / 60);
99653d4ee642c6528e88224f12409a5f23060994eschrock minutes_taken = (uint64_t)((now - start) / 60);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext("%s in progress for %lluh%um, %.2f%% done, "
99653d4ee642c6528e88224f12409a5f23060994eschrock "%lluh%um to go\n"),
99653d4ee642c6528e88224f12409a5f23060994eschrock scrub_type, (u_longlong_t)(minutes_taken / 60),
99653d4ee642c6528e88224f12409a5f23060994eschrock (uint_t)(minutes_taken % 60), 100 * fraction_done,
99653d4ee642c6528e88224f12409a5f23060994eschrock (u_longlong_t)(minutes_left / 60), (uint_t)(minutes_left % 60));
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrocktypedef struct spare_cbdata {
99653d4ee642c6528e88224f12409a5f23060994eschrock uint64_t cb_guid;
99653d4ee642c6528e88224f12409a5f23060994eschrock zpool_handle_t *cb_zhp;
99653d4ee642c6528e88224f12409a5f23060994eschrock} spare_cbdata_t;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrockstatic boolean_t
99653d4ee642c6528e88224f12409a5f23060994eschrockfind_vdev(nvlist_t *nv, uint64_t search)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock uint64_t guid;
99653d4ee642c6528e88224f12409a5f23060994eschrock nvlist_t **child;
99653d4ee642c6528e88224f12409a5f23060994eschrock uint_t c, children;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &guid) == 0 &&
99653d4ee642c6528e88224f12409a5f23060994eschrock search == guid)
99653d4ee642c6528e88224f12409a5f23060994eschrock return (B_TRUE);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
99653d4ee642c6528e88224f12409a5f23060994eschrock &child, &children) == 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock for (c = 0; c < children; c++)
99653d4ee642c6528e88224f12409a5f23060994eschrock if (find_vdev(child[c], search))
99653d4ee642c6528e88224f12409a5f23060994eschrock return (B_TRUE);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock return (B_FALSE);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrockstatic int
99653d4ee642c6528e88224f12409a5f23060994eschrockfind_spare(zpool_handle_t *zhp, void *data)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
fa9e4066f08beec538e775443c5be79dd423fcabahrens spare_cbdata_t *cbp = data;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *config, *nvroot;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens config = zpool_get_config(zhp, NULL);
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin &nvroot) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (find_vdev(nvroot, cbp->cb_guid)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens cbp->cb_zhp = zhp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock zpool_close(zhp);
99653d4ee642c6528e88224f12409a5f23060994eschrock return (0);
990b4856d0eaada6f8140335733a1b1771ed2746lling}
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, boolean_t print_logs)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
990b4856d0eaada6f8140335733a1b1771ed2746lling nvlist_t **child;
99653d4ee642c6528e88224f12409a5f23060994eschrock uint_t c, children;
99653d4ee642c6528e88224f12409a5f23060994eschrock vdev_stat_t *vs;
99653d4ee642c6528e88224f12409a5f23060994eschrock char rbuf[6], wbuf[6], cbuf[6], repaired[7];
99653d4ee642c6528e88224f12409a5f23060994eschrock char *vname;
99653d4ee642c6528e88224f12409a5f23060994eschrock uint64_t notpresent;
99653d4ee642c6528e88224f12409a5f23060994eschrock spare_cbdata_t cb;
99653d4ee642c6528e88224f12409a5f23060994eschrock char *state;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock verify(nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_STATS,
99653d4ee642c6528e88224f12409a5f23060994eschrock (uint64_t **)&vs, &c) == 0);
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
99653d4ee642c6528e88224f12409a5f23060994eschrock &child, &children) != 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens children = 0;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock state = zpool_state_to_name(vs->vs_state, vs->vs_aux);
99653d4ee642c6528e88224f12409a5f23060994eschrock if (isspare) {
99653d4ee642c6528e88224f12409a5f23060994eschrock /*
99653d4ee642c6528e88224f12409a5f23060994eschrock * For hot spares, we use the terms 'INUSE' and 'AVAILABLE' for
99653d4ee642c6528e88224f12409a5f23060994eschrock * online drives.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (vs->vs_aux == VDEV_AUX_SPARED)
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock state = "INUSE";
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock else if (vs->vs_state == VDEV_STATE_HEALTHY)
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock state = "AVAIL";
0917b783fd655a0c943e0b8fb848db2301774947eschrock }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("\t%*s%-*s %-8s", depth, "", namewidth - depth,
fa9e4066f08beec538e775443c5be79dd423fcabahrens name, state);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!isspare) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens zfs_nicenum(vs->vs_read_errors, rbuf, sizeof (rbuf));
fa9e4066f08beec538e775443c5be79dd423fcabahrens zfs_nicenum(vs->vs_write_errors, wbuf, sizeof (wbuf));
fa9e4066f08beec538e775443c5be79dd423fcabahrens zfs_nicenum(vs->vs_checksum_errors, cbuf, sizeof (cbuf));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(" %5s %5s %5s", rbuf, wbuf, cbuf);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &notpresent) == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *path;
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(" was %s", path);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock } else if (vs->vs_aux != 0) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(" ");
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock 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
99653d4ee642c6528e88224f12409a5f23060994eschrock case VDEV_AUX_NO_REPLICAS:
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext("insufficient replicas"));
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock case VDEV_AUX_VERSION_NEWER:
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext("newer version"));
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock case VDEV_AUX_SPARED:
99653d4ee642c6528e88224f12409a5f23060994eschrock verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock &cb.cb_guid) == 0);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (zpool_iter(g_zfs, find_spare, &cb) == 1) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (strcmp(zpool_get_name(cb.cb_zhp),
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock zpool_get_name(zhp)) == 0)
32b87932f3ef0887d873b7f6d2d1943799b2afc0ek (void) printf(gettext("currently in "
32b87932f3ef0887d873b7f6d2d1943799b2afc0ek "use"));
32b87932f3ef0887d873b7f6d2d1943799b2afc0ek else
32b87932f3ef0887d873b7f6d2d1943799b2afc0ek (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"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case VDEV_AUX_ERR_EXCEEDED:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("too many errors"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case VDEV_AUX_IO_FAILURE:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("experienced I/O failures"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock case VDEV_AUX_BAD_LOG:
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin (void) printf(gettext("bad intent log"));
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin break;
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin default:
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin (void) printf(gettext("corrupted data"));
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin break;
99653d4ee642c6528e88224f12409a5f23060994eschrock }
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock } else if (vs->vs_scrub_repaired != 0 && children == 0) {
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin /*
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock * Report bytes resilvered/repaired on leaf devices.
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock */
fa9e4066f08beec538e775443c5be79dd423fcabahrens zfs_nicenum(vs->vs_scrub_repaired, repaired, sizeof (repaired));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext(" %s %s"), repaired,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (vs->vs_scrub_type == POOL_SCRUB_RESILVER) ?
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "resilvered" : "repaired");
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
75519f380eac71fe6d10b26e736f01567d6c13c9ek
55434c770c89aa1b84474f2559a106803511aba0ek (void) printf("\n");
55434c770c89aa1b84474f2559a106803511aba0ek
55434c770c89aa1b84474f2559a106803511aba0ek for (c = 0; c < children; c++) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock uint64_t is_log = B_FALSE;
55434c770c89aa1b84474f2559a106803511aba0ek
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock &is_log);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if ((is_log && !print_logs) || (!is_log && print_logs))
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock continue;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock vname = zpool_vdev_name(g_zfs, zhp, child[c]);
55434c770c89aa1b84474f2559a106803511aba0ek print_status_config(zhp, vname, child[c],
55434c770c89aa1b84474f2559a106803511aba0ek namewidth, depth + 2, isspare, B_FALSE);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock free(vname);
55434c770c89aa1b84474f2559a106803511aba0ek }
55434c770c89aa1b84474f2559a106803511aba0ek}
55434c770c89aa1b84474f2559a106803511aba0ek
55434c770c89aa1b84474f2559a106803511aba0ekstatic void
55434c770c89aa1b84474f2559a106803511aba0ekprint_error_log(zpool_handle_t *zhp)
55434c770c89aa1b84474f2559a106803511aba0ek{
55434c770c89aa1b84474f2559a106803511aba0ek nvlist_t *nverrlist = NULL;
55434c770c89aa1b84474f2559a106803511aba0ek nvpair_t *elem;
55434c770c89aa1b84474f2559a106803511aba0ek char *pathname;
55434c770c89aa1b84474f2559a106803511aba0ek size_t len = MAXPATHLEN * 2;
55434c770c89aa1b84474f2559a106803511aba0ek
55434c770c89aa1b84474f2559a106803511aba0ek if (zpool_get_errlog(zhp, &nverrlist) != 0) {
55434c770c89aa1b84474f2559a106803511aba0ek (void) printf("errors: List of errors unavailable "
55434c770c89aa1b84474f2559a106803511aba0ek "(insufficient privileges)\n");
55434c770c89aa1b84474f2559a106803511aba0ek return;
55434c770c89aa1b84474f2559a106803511aba0ek }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) printf("errors: Permanent errors have been "
99653d4ee642c6528e88224f12409a5f23060994eschrock "detected in the following files:\n\n");
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock pathname = safe_malloc(len);
99653d4ee642c6528e88224f12409a5f23060994eschrock elem = NULL;
99653d4ee642c6528e88224f12409a5f23060994eschrock 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);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin }
99653d4ee642c6528e88224f12409a5f23060994eschrock free(pathname);
99653d4ee642c6528e88224f12409a5f23060994eschrock nvlist_free(nverrlist);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendanstatic void
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendanprint_spares(zpool_handle_t *zhp, nvlist_t **spares, uint_t nspares,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan int namewidth)
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan{
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan uint_t i;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan char *name;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (nspares == 0)
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan return;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan (void) printf(gettext("\tspares\n"));
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan for (i = 0; i < nspares; i++) {
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan name = zpool_vdev_name(g_zfs, zhp, spares[i]);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan print_status_config(zhp, name, spares[i],
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan namewidth, 2, B_TRUE, B_FALSE);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan free(name);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan }
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan}
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void
fa9e4066f08beec538e775443c5be79dd423fcabahrensprint_l2cache(zpool_handle_t *zhp, nvlist_t **l2cache, uint_t nl2cache,
fa9e4066f08beec538e775443c5be79dd423fcabahrens int namewidth)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint_t i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *name;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nl2cache == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) printf(gettext("\tcache\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < nl2cache; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens name = zpool_vdev_name(g_zfs, zhp, l2cache[i]);
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_status_config(zhp, name, l2cache[i],
fa9e4066f08beec538e775443c5be79dd423fcabahrens namewidth, 2, B_FALSE, B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Display a summary of pool status. Displays a summary such as:
46657f8d750bdb71753495ce2919170f126b8e34mmusante *
46657f8d750bdb71753495ce2919170f126b8e34mmusante * pool: tank
46657f8d750bdb71753495ce2919170f126b8e34mmusante * status: DEGRADED
fa9e4066f08beec538e775443c5be79dd423fcabahrens * reason: One or more devices ...
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * see: http://www.sun.com/msg/ZFS-xxxx-01
fa9e4066f08beec538e775443c5be79dd423fcabahrens * config:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * mirror DEGRADED
fa9e4066f08beec538e775443c5be79dd423fcabahrens * c1t0d0 OK
fa9e4066f08beec538e775443c5be79dd423fcabahrens * c2t0d0 UNAVAIL
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * When given the '-v' option, we print out the complete config. If the '-e'
fa9e4066f08beec538e775443c5be79dd423fcabahrens * option is specified, then we print out error rate information as well.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrockint
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrockstatus_callback(zpool_handle_t *zhp, void *data)
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock{
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock status_cbdata_t *cbp = data;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock nvlist_t *config, *nvroot;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock char *msgid;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock int reason;
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *health;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock uint_t c;
fa9e4066f08beec538e775443c5be79dd423fcabahrens vdev_stat_t *vs;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock config = zpool_get_config(zhp, NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens reason = zpool_get_status(zhp, &msgid);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens cbp->cb_count++;
46657f8d750bdb71753495ce2919170f126b8e34mmusante
46657f8d750bdb71753495ce2919170f126b8e34mmusante /*
46657f8d750bdb71753495ce2919170f126b8e34mmusante * If we were given 'zpool status -x', only report those pools with
46657f8d750bdb71753495ce2919170f126b8e34mmusante * problems.
990b4856d0eaada6f8140335733a1b1771ed2746lling */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (reason == ZPOOL_STATUS_OK && cbp->cb_explain) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!cbp->cb_allpools) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("pool '%s' is healthy\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_get_name(zhp));
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (cbp->cb_first)
fa9e4066f08beec538e775443c5be79dd423fcabahrens cbp->cb_first = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (cbp->cb_first)
fa9e4066f08beec538e775443c5be79dd423fcabahrens cbp->cb_first = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &nvroot) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_STATS,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (uint64_t **)&vs, &c) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens health = zpool_state_to_name(vs->vs_state, vs->vs_aux);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext(" pool: %s\n"), zpool_get_name(zhp));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext(" state: %s\n"), health);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (reason) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_MISSING_DEV_R:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: One or more devices could not "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "be opened. Sufficient replicas exist for\n\tthe pool to "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "continue functioning in a degraded state.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: Attach the missing device and "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "online it using 'zpool online'.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_MISSING_DEV_NR:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: One or more devices could not "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "be opened. There are insufficient\n\treplicas for the "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "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"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) printf(gettext("action: Replace the device using "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "'zpool replace'.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_CORRUPT_LABEL_NR:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: One or more devices could not "
d7d4af51b4d115490d97f0b89993fdbaaf441c94mmusante "be used because 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
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_FAILING_DEV:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: One or more devices has "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "experienced an unrecoverable error. An\n\tattempt was "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "made to correct the error. Applications are "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "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"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock break;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock case ZPOOL_STATUS_OFFLINE_DEV:
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) printf(gettext("status: One or more devices has "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "been taken offline by the administrator.\n\tSufficient "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "replicas exist for the pool to continue functioning in "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "a\n\tdegraded state.\n"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) printf(gettext("action: Online the device using "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "'zpool online' or replace the device with\n\t'zpool "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "replace'.\n"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock break;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock case ZPOOL_STATUS_RESILVERING:
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) printf(gettext("status: One or more devices is "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "currently being resilvered. The pool will\n\tcontinue "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "to function, possibly in a degraded state.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("action: Wait for the resilver to "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "complete.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock break;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case ZPOOL_STATUS_CORRUPT_DATA:
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("status: One or more devices has "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "experienced an error resulting in data\n\tcorruption. "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "Applications may be affected.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("action: Restore the file in question "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "if possible. Otherwise restore the\n\tentire pool from "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "backup.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock break;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case ZPOOL_STATUS_CORRUPT_POOL:
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("status: The pool metadata is corrupted "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "and the pool cannot be opened.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("action: Destroy and re-create the pool "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "from a backup source.\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock break;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock case ZPOOL_STATUS_VERSION_OLDER:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) printf(gettext("status: The pool is formatted using an "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "older on-disk format. The pool can\n\tstill be used, but "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "some features are unavailable.\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) printf(gettext("action: Upgrade the pool using 'zpool "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "upgrade'. Once this is done, the\n\tpool will no longer "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "be accessible on older software versions.\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock break;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock case ZPOOL_STATUS_VERSION_NEWER:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) printf(gettext("status: The pool has been upgraded to a "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "newer, incompatible on-disk version.\n\tThe pool cannot "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "be accessed on this system.\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) printf(gettext("action: Access the pool from a system "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "running more recent software, or\n\trestore the pool from "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "backup.\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock break;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
32b87932f3ef0887d873b7f6d2d1943799b2afc0ek case ZPOOL_STATUS_FAULTED_DEV_R:
32b87932f3ef0887d873b7f6d2d1943799b2afc0ek (void) printf(gettext("status: One or more devices are "
32b87932f3ef0887d873b7f6d2d1943799b2afc0ek "faulted in response to persistent errors.\n\tSufficient "
8a79c1b573d7814f1e432b1de8c9ed00bc876becek "replicas exist for the pool to continue functioning "
32b87932f3ef0887d873b7f6d2d1943799b2afc0ek "in a\n\tdegraded state.\n"));
32b87932f3ef0887d873b7f6d2d1943799b2afc0ek (void) printf(gettext("action: Replace the faulted device, "
32b87932f3ef0887d873b7f6d2d1943799b2afc0ek "or use 'zpool clear' to mark the device\n\trepaired.\n"));
32b87932f3ef0887d873b7f6d2d1943799b2afc0ek break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_FAULTED_DEV_NR:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: One or more devices are "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "faulted in response to persistent errors. There are "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "insufficient replicas for the pool to\n\tcontinue "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "functioning.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: Destroy and re-create the pool "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "from a backup source. Manually marking the device\n"
fa9e4066f08beec538e775443c5be79dd423fcabahrens "\trepaired using 'zpool clear' may allow some data "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "to be recovered.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_IO_FAILURE_WAIT:
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock case ZPOOL_STATUS_IO_FAILURE_CONTINUE:
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan (void) printf(gettext("status: One or more devices are "
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan "faulted in response to IO failures.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: Make sure the affected devices "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "are connected, then run 'zpool clear'.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_BAD_LOG:
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock (void) printf(gettext("status: An intent log record "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "could not be read.\n"
fa9e4066f08beec538e775443c5be79dd423fcabahrens "\tWaiting for adminstrator intervention to fix the "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "faulted pool.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: Either restore the affected "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "device(s) and run 'zpool online',\n"
fa9e4066f08beec538e775443c5be79dd423fcabahrens "\tor ignore the intent log records by running "
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock "'zpool clear'.\n"));
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin break;
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin default:
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin /*
99653d4ee642c6528e88224f12409a5f23060994eschrock * The remaining errors can't actually be generated, yet.
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan */
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan assert(reason == ZPOOL_STATUS_OK);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan }
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
99653d4ee642c6528e88224f12409a5f23060994eschrock if (msgid != NULL)
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext(" see: http://www.sun.com/msg/%s\n"),
99653d4ee642c6528e88224f12409a5f23060994eschrock msgid);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (config != NULL) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock int namewidth;
55434c770c89aa1b84474f2559a106803511aba0ek uint64_t nerr;
55434c770c89aa1b84474f2559a106803511aba0ek nvlist_t **spares, **l2cache;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock uint_t nspares, nl2cache;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) printf(gettext(" scrub: "));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock print_scrub_status(nvroot);
75519f380eac71fe6d10b26e736f01567d6c13c9ek
55434c770c89aa1b84474f2559a106803511aba0ek namewidth = max_width(zhp, nvroot, 0, 0);
55434c770c89aa1b84474f2559a106803511aba0ek if (namewidth < 10)
55434c770c89aa1b84474f2559a106803511aba0ek namewidth = 10;
55434c770c89aa1b84474f2559a106803511aba0ek
55434c770c89aa1b84474f2559a106803511aba0ek (void) printf(gettext("config:\n\n"));
55434c770c89aa1b84474f2559a106803511aba0ek (void) printf(gettext("\t%-*s %-8s %5s %5s %5s\n"), namewidth,
55434c770c89aa1b84474f2559a106803511aba0ek "NAME", "STATE", "READ", "WRITE", "CKSUM");
55434c770c89aa1b84474f2559a106803511aba0ek print_status_config(zhp, zpool_get_name(zhp), nvroot,
55434c770c89aa1b84474f2559a106803511aba0ek namewidth, 0, B_FALSE, B_FALSE);
55434c770c89aa1b84474f2559a106803511aba0ek if (num_logs(nvroot) > 0)
55434c770c89aa1b84474f2559a106803511aba0ek print_status_config(zhp, "logs", nvroot, namewidth, 0,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock B_FALSE, B_TRUE);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_L2CACHE,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock &l2cache, &nl2cache) == 0)
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock print_l2cache(zhp, l2cache, nl2cache, namewidth);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock &spares, &nspares) == 0)
5ad820458efd0fdb914baff9c1447c22b819fa23nd print_spares(zhp, spares, nspares, namewidth);
5ad820458efd0fdb914baff9c1447c22b819fa23nd
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_ERRCOUNT,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock &nerr) == 0) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock nvlist_t *nverrlist = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If the approximate error count is small, get a
fa9e4066f08beec538e775443c5be79dd423fcabahrens * precise count by fetching the entire log and
fa9e4066f08beec538e775443c5be79dd423fcabahrens * uniquifying the results.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nerr > 0 && nerr < 100 && !cbp->cb_verbose &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_get_errlog(zhp, &nverrlist) == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvpair_t *elem;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens elem = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nerr = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((elem = nvlist_next_nvpair(nverrlist,
fa9e4066f08beec538e775443c5be79dd423fcabahrens elem)) != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens nerr++;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_free(nverrlist);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nerr == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("errors: No known data "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "errors\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens else if (!cbp->cb_verbose)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("errors: %llu data "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "errors, use '-v' for a list\n"),
99653d4ee642c6528e88224f12409a5f23060994eschrock (u_longlong_t)nerr);
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_error_log(zhp);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("config: The configuration cannot be "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "determined.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool status [-vx] [pool] ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
99653d4ee642c6528e88224f12409a5f23060994eschrock * -v Display complete error logs
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -x Display only pools with potential problems
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock *
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * Describes the health status of all pools or some subset.
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock */
b1b8ab34de515a5e83206da22c3d7e563241b021llingint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_status(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock int ret;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock status_cbdata_t cb = { 0 };
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((c = getopt(argc, argv, "vx")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case 'v':
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock cb.cb_verbose = B_TRUE;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock break;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case 'x':
06eeb2ad640ce72d394ac521094bed7681044408ek cb.cb_explain = B_TRUE;
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
06eeb2ad640ce72d394ac521094bed7681044408ek case '?':
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) fprintf(stderr, gettext("invalid option '%c'\n"),
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock optopt);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock usage(B_FALSE);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock argc -= optind;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock argv += optind;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock cb.cb_first = B_TRUE;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (argc == 0)
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock cb.cb_allpools = B_TRUE;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
e7437265dc2a4920c197ed4337665539d358b22cahrens ret = for_each_pool(argc, argv, B_TRUE, NULL, status_callback, &cb);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (argc == 0 && cb.cb_count == 0)
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("no pools available\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock else if (cb.cb_explain && cb.cb_first && cb.cb_allpools)
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("all pools are healthy\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock return (ret);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock}
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrocktypedef struct upgrade_cbdata {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock int cb_all;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock int cb_first;
5ad820458efd0fdb914baff9c1447c22b819fa23nd int cb_newer;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock int cb_argc;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock uint64_t cb_version;
99653d4ee642c6528e88224f12409a5f23060994eschrock char **cb_argv;
990b4856d0eaada6f8140335733a1b1771ed2746lling} upgrade_cbdata_t;
06eeb2ad640ce72d394ac521094bed7681044408ek
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockstatic int
990b4856d0eaada6f8140335733a1b1771ed2746llingupgrade_cb(zpool_handle_t *zhp, void *arg)
06eeb2ad640ce72d394ac521094bed7681044408ek{
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock upgrade_cbdata_t *cbp = arg;
e7437265dc2a4920c197ed4337665539d358b22cahrens nvlist_t *config;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock uint64_t version;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock int ret = 0;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock config = zpool_get_config(zhp, NULL);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION,
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock &version) == 0);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (!cbp->cb_newer && version < SPA_VERSION) {
99653d4ee642c6528e88224f12409a5f23060994eschrock if (!cbp->cb_all) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (cbp->cb_first) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("The following pools are "
5ad820458efd0fdb914baff9c1447c22b819fa23nd "out of date, and can be upgraded. After "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "being\nupgraded, these pools will no "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "longer be accessible by older software "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "versions.\n\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("VER POOL\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("--- ------------\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock cbp->cb_first = B_FALSE;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf("%2llu %s\n", (u_longlong_t)version,
06eeb2ad640ce72d394ac521094bed7681044408ek zpool_get_name(zhp));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock } else {
990b4856d0eaada6f8140335733a1b1771ed2746lling cbp->cb_first = B_FALSE;
990b4856d0eaada6f8140335733a1b1771ed2746lling ret = zpool_upgrade(zhp, cbp->cb_version);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (!ret) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("Successfully upgraded "
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin "'%s'\n\n"), zpool_get_name(zhp));
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin }
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin }
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin } else if (cbp->cb_newer && version > SPA_VERSION) {
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin assert(!cbp->cb_all);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
990b4856d0eaada6f8140335733a1b1771ed2746lling if (cbp->cb_first) {
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf(gettext("The following pools are "
e6c728e129b367a26c1972c43cc89654eb585941brendan "formatted using a newer software version and\n"
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "cannot be accessed on the current system.\n\n"));
e6c728e129b367a26c1972c43cc89654eb585941brendan (void) printf(gettext("VER POOL\n"));
e6c728e129b367a26c1972c43cc89654eb585941brendan (void) printf(gettext("--- ------------\n"));
e6c728e129b367a26c1972c43cc89654eb585941brendan cbp->cb_first = B_FALSE;
e6c728e129b367a26c1972c43cc89654eb585941brendan }
e6c728e129b367a26c1972c43cc89654eb585941brendan
e6c728e129b367a26c1972c43cc89654eb585941brendan (void) printf("%2llu %s\n", (u_longlong_t)version,
e6c728e129b367a26c1972c43cc89654eb585941brendan zpool_get_name(zhp));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock zpool_close(zhp);
990b4856d0eaada6f8140335733a1b1771ed2746lling return (ret);
06eeb2ad640ce72d394ac521094bed7681044408ek}
06eeb2ad640ce72d394ac521094bed7681044408ek
44cd46cadd9aab751dae6a4023c1cb5bf316d274billm/* ARGSUSED */
990b4856d0eaada6f8140335733a1b1771ed2746llingstatic int
990b4856d0eaada6f8140335733a1b1771ed2746llingupgrade_one(zpool_handle_t *zhp, void *data)
990b4856d0eaada6f8140335733a1b1771ed2746lling{
06eeb2ad640ce72d394ac521094bed7681044408ek upgrade_cbdata_t *cbp = data;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock uint64_t cur_version;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock int ret;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (strcmp("log", zpool_get_name(zhp)) == 0) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("'log' is now a reserved word\n"
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "Pool 'log' must be renamed using export and import"
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock " to upgrade.\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling return (1);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock cur_version = zpool_get_prop_int(zhp, ZPOOL_PROP_VERSION, NULL);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (cur_version > cbp->cb_version) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("Pool '%s' is already formatted "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "using more current version '%llu'.\n"),
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock zpool_get_name(zhp), cur_version);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock return (0);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (cur_version == cbp->cb_version) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("Pool '%s' is already formatted "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "using the current version.\n"), zpool_get_name(zhp));
990b4856d0eaada6f8140335733a1b1771ed2746lling return (0);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock ret = zpool_upgrade(zhp, cbp->cb_version);
990b4856d0eaada6f8140335733a1b1771ed2746lling
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (!ret) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("Successfully upgraded '%s' "
99653d4ee642c6528e88224f12409a5f23060994eschrock "from version %llu to version %llu\n\n"),
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock zpool_get_name(zhp), (u_longlong_t)cur_version,
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (u_longlong_t)cbp->cb_version);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
990b4856d0eaada6f8140335733a1b1771ed2746lling return (ret != 0);
990b4856d0eaada6f8140335733a1b1771ed2746lling}
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling/*
990b4856d0eaada6f8140335733a1b1771ed2746lling * zpool upgrade
990b4856d0eaada6f8140335733a1b1771ed2746lling * zpool upgrade -v
990b4856d0eaada6f8140335733a1b1771ed2746lling * zpool upgrade [-V version] <-a | pool ...>
990b4856d0eaada6f8140335733a1b1771ed2746lling *
990b4856d0eaada6f8140335733a1b1771ed2746lling * 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 */
99653d4ee642c6528e88224f12409a5f23060994eschrockint
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockzpool_do_upgrade(int argc, char **argv)
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock{
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock int c;
06eeb2ad640ce72d394ac521094bed7681044408ek upgrade_cbdata_t cb = { 0 };
06eeb2ad640ce72d394ac521094bed7681044408ek int ret = 0;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock boolean_t showversions = B_FALSE;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock char *end;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling /* check options */
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling while ((c = getopt(argc, argv, "avV:")) != -1) {
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling switch (c) {
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling case 'a':
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling cb.cb_all = B_TRUE;
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling break;
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling case 'v':
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock showversions = B_TRUE;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock break;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case 'V':
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock cb.cb_version = strtoll(optarg, &end, 10);
99653d4ee642c6528e88224f12409a5f23060994eschrock if (*end != '\0' || cb.cb_version > SPA_VERSION ||
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock cb.cb_version < SPA_VERSION_1) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) fprintf(stderr,
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock gettext("invalid version '%s'\n"), optarg);
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling usage(B_FALSE);
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling }
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case '?':
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) fprintf(stderr, gettext("invalid option '%c'\n"),
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock optopt);
e7437265dc2a4920c197ed4337665539d358b22cahrens usage(B_FALSE);
e7437265dc2a4920c197ed4337665539d358b22cahrens }
99653d4ee642c6528e88224f12409a5f23060994eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock cb.cb_argc = argc;
d7d4af51b4d115490d97f0b89993fdbaaf441c94mmusante cb.cb_argv = argv;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock argc -= optind;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock argv += optind;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if (cb.cb_version == 0) {
44cd46cadd9aab751dae6a4023c1cb5bf316d274billm cb.cb_version = SPA_VERSION;
44cd46cadd9aab751dae6a4023c1cb5bf316d274billm } else if (!cb.cb_all && argc == 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, gettext("-V option is "
99653d4ee642c6528e88224f12409a5f23060994eschrock "incompatible with other arguments\n"));
d7306b64c847d897abb9ece8624fca9cf28d358fek usage(B_FALSE);
c9431fa1e59a88c2f0abf611f25b97af964449e5ahl }
c9431fa1e59a88c2f0abf611f25b97af964449e5ahl
990b4856d0eaada6f8140335733a1b1771ed2746lling if (showversions) {
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin if (cb.cb_all || argc != 0) {
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (void) fprintf(stderr, gettext("-v option is "
8eed72d43abf6184b757f3eb9228c3c4979aca10ck "incompatible with other arguments\n"));
a9799022bd90b13722204e80112efaa5bf573099ck usage(B_FALSE);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan }
088f389458728c464569a5506b58070254fa4f7dahrens } else if (cb.cb_all) {
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin if (argc != 0) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) fprintf(stderr, gettext("-a option should not "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "be used along with a pool name\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock usage(B_FALSE);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("This system is currently running "
99653d4ee642c6528e88224f12409a5f23060994eschrock "ZFS pool version %llu.\n\n"), SPA_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");
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext(" 1 Initial ZFS version\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext(" 2 Ditto blocks "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "(replicated metadata)\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext(" 3 Hot spares and double parity "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "RAID-Z\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext(" 4 zpool history\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext(" 5 Compression using the gzip "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "algorithm\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext(" 6 bootfs pool property\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext(" 7 Separate intent log devices\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext(" 8 Delegated administration\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext(" 9 refquota and refreservation "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "properties\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext(" 10 Cache devices\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext(" 11 Improved scrub performance\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext(" 12 Snapshot properties\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext(" 13 snapused property\n"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) printf(gettext(" 14 passthrough-x aclinherit "
b1b8ab34de515a5e83206da22c3d7e563241b021lling "support\n"));
06eeb2ad640ce72d394ac521094bed7681044408ek (void) printf(gettext("For more information on a particular "
06eeb2ad640ce72d394ac521094bed7681044408ek "version, including supported releases, see:\n\n"));
06eeb2ad640ce72d394ac521094bed7681044408ek (void) printf("http://www.opensolaris.org/os/community/zfs/"
06eeb2ad640ce72d394ac521094bed7681044408ek "version/N\n\n");
06eeb2ad640ce72d394ac521094bed7681044408ek (void) printf(gettext("Where 'N' is the version number.\n"));
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks } else if (argc == 0) {
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks int notfound;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks ret = zpool_iter(g_zfs, upgrade_cb, &cb);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks notfound = cb.cb_first;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks if (!cb.cb_all && ret == 0) {
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks if (!cb.cb_first)
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (void) printf("\n");
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks cb.cb_first = B_TRUE;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks cb.cb_newer = B_TRUE;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks ret = zpool_iter(g_zfs, upgrade_cb, &cb);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks if (!cb.cb_first) {
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks notfound = B_FALSE;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (void) printf("\n");
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks }
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks }
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks if (ret == 0) {
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks if (notfound)
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (void) printf(gettext("All pools are formatted "
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "using this version.\n"));
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks else if (!cb.cb_all)
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (void) printf(gettext("Use 'zpool upgrade -v' "
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "for a list of available versions and "
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "their associated\nfeatures.\n"));
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks }
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks } else {
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks ret = for_each_pool(argc, argv, B_FALSE, NULL,
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks upgrade_one, &cb);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks }
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks return (ret);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks}
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarkstypedef struct hist_cbdata {
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks boolean_t first;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks int longfmt;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks int internal;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks} hist_cbdata_t;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
e7437265dc2a4920c197ed4337665539d358b22cahrenschar *hist_event_table[LOG_END] = {
a9799022bd90b13722204e80112efaa5bf573099ck "invalid event",
a9799022bd90b13722204e80112efaa5bf573099ck "pool create",
088f389458728c464569a5506b58070254fa4f7dahrens "vdev add",
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "pool remove",
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "pool destroy",
06eeb2ad640ce72d394ac521094bed7681044408ek "pool export",
06eeb2ad640ce72d394ac521094bed7681044408ek "pool import",
06eeb2ad640ce72d394ac521094bed7681044408ek "vdev attach",
06eeb2ad640ce72d394ac521094bed7681044408ek "vdev replace",
06eeb2ad640ce72d394ac521094bed7681044408ek "vdev detach",
06eeb2ad640ce72d394ac521094bed7681044408ek "vdev online",
06eeb2ad640ce72d394ac521094bed7681044408ek "vdev offline",
06eeb2ad640ce72d394ac521094bed7681044408ek "vdev upgrade",
06eeb2ad640ce72d394ac521094bed7681044408ek "pool clear",
06eeb2ad640ce72d394ac521094bed7681044408ek "pool scrub",
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "pool property set",
06eeb2ad640ce72d394ac521094bed7681044408ek "create",
06eeb2ad640ce72d394ac521094bed7681044408ek "clone",
06eeb2ad640ce72d394ac521094bed7681044408ek "destroy",
06eeb2ad640ce72d394ac521094bed7681044408ek "destroy_begin_sync",
06eeb2ad640ce72d394ac521094bed7681044408ek "inherit",
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "property set",
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "quota set",
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "permission update",
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "permission remove",
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "permission who remove",
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "promote",
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "receive",
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "rename",
06eeb2ad640ce72d394ac521094bed7681044408ek "reservation set",
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "replay_inc_sync",
06eeb2ad640ce72d394ac521094bed7681044408ek "replay_full_sync",
06eeb2ad640ce72d394ac521094bed7681044408ek "rollback",
06eeb2ad640ce72d394ac521094bed7681044408ek "snapshot",
06eeb2ad640ce72d394ac521094bed7681044408ek "filesystem version upgrade",
06eeb2ad640ce72d394ac521094bed7681044408ek "refquota set",
06eeb2ad640ce72d394ac521094bed7681044408ek "refreservation set",
06eeb2ad640ce72d394ac521094bed7681044408ek "pool scrub done",
06eeb2ad640ce72d394ac521094bed7681044408ek};
06eeb2ad640ce72d394ac521094bed7681044408ek
06eeb2ad640ce72d394ac521094bed7681044408ek/*
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks * Print out the command history for a specific pool.
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks */
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarksstatic int
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarksget_history_one(zpool_handle_t *zhp, void *data)
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks{
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks nvlist_t *nvhis;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks nvlist_t **records;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks uint_t numrecords;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks char *cmdstr;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks char *pathstr;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks uint64_t dst_time;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks time_t tsec;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks struct tm t;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks char tbuf[30];
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks int ret, i;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks uint64_t who;
088f389458728c464569a5506b58070254fa4f7dahrens struct passwd *pwd;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks char *hostname;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks char *zonename;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks char internalstr[MAXPATHLEN];
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks hist_cbdata_t *cb = (hist_cbdata_t *)data;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks uint64_t txg;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks uint64_t ievent;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
06eeb2ad640ce72d394ac521094bed7681044408ek cb->first = B_FALSE;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (void) printf(gettext("History for '%s':\n"), zpool_get_name(zhp));
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks if ((ret = zpool_get_history(zhp, &nvhis)) != 0)
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks return (ret);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks verify(nvlist_lookup_nvlist_array(nvhis, ZPOOL_HIST_RECORD,
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks &records, &numrecords) == 0);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks for (i = 0; i < numrecords; i++) {
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks if (nvlist_lookup_uint64(records[i], ZPOOL_HIST_TIME,
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks &dst_time) != 0)
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks continue;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks /* is it an internal event or a standard event? */
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks if (nvlist_lookup_string(records[i], ZPOOL_HIST_CMD,
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks &cmdstr) != 0) {
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks if (cb->internal == 0)
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks continue;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks if (nvlist_lookup_uint64(records[i],
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks ZPOOL_HIST_INT_EVENT, &ievent) != 0)
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks continue;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks verify(nvlist_lookup_uint64(records[i],
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks ZPOOL_HIST_TXG, &txg) == 0);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks verify(nvlist_lookup_string(records[i],
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks ZPOOL_HIST_INT_STR, &pathstr) == 0);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks if (ievent >= LOG_END)
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks continue;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (void) snprintf(internalstr,
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks sizeof (internalstr),
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "[internal %s txg:%lld] %s",
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks hist_event_table[ievent], txg,
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks pathstr);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks cmdstr = internalstr;
06eeb2ad640ce72d394ac521094bed7681044408ek }
06eeb2ad640ce72d394ac521094bed7681044408ek tsec = dst_time;
06eeb2ad640ce72d394ac521094bed7681044408ek (void) localtime_r(&tsec, &t);
06eeb2ad640ce72d394ac521094bed7681044408ek (void) strftime(tbuf, sizeof (tbuf), "%F.%T", &t);
06eeb2ad640ce72d394ac521094bed7681044408ek (void) printf("%s %s", tbuf, cmdstr);
06eeb2ad640ce72d394ac521094bed7681044408ek
06eeb2ad640ce72d394ac521094bed7681044408ek if (!cb->longfmt) {
06eeb2ad640ce72d394ac521094bed7681044408ek (void) printf("\n");
06eeb2ad640ce72d394ac521094bed7681044408ek continue;
06eeb2ad640ce72d394ac521094bed7681044408ek }
06eeb2ad640ce72d394ac521094bed7681044408ek (void) printf(" [");
06eeb2ad640ce72d394ac521094bed7681044408ek if (nvlist_lookup_uint64(records[i],
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks ZPOOL_HIST_WHO, &who) == 0) {
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks pwd = getpwuid((uid_t)who);
06eeb2ad640ce72d394ac521094bed7681044408ek if (pwd)
06eeb2ad640ce72d394ac521094bed7681044408ek (void) printf("user %s on",
06eeb2ad640ce72d394ac521094bed7681044408ek pwd->pw_name);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks else
06eeb2ad640ce72d394ac521094bed7681044408ek (void) printf("user %d on",
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (int)who);
06eeb2ad640ce72d394ac521094bed7681044408ek } else {
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (void) printf(gettext("no info]\n"));
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks continue;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks }
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks if (nvlist_lookup_string(records[i],
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks ZPOOL_HIST_HOST, &hostname) == 0) {
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (void) printf(" %s", hostname);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks }
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks if (nvlist_lookup_string(records[i],
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks ZPOOL_HIST_ZONE, &zonename) == 0) {
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (void) printf(":%s", zonename);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks }
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (void) printf("]");
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (void) printf("\n");
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks }
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (void) printf("\n");
06eeb2ad640ce72d394ac521094bed7681044408ek nvlist_free(nvhis);
06eeb2ad640ce72d394ac521094bed7681044408ek
06eeb2ad640ce72d394ac521094bed7681044408ek return (ret);
b1b8ab34de515a5e83206da22c3d7e563241b021lling}
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
06eeb2ad640ce72d394ac521094bed7681044408ek/*
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks * zpool history <pool>
06eeb2ad640ce72d394ac521094bed7681044408ek *
06eeb2ad640ce72d394ac521094bed7681044408ek * Displays the history of commands that modified pools.
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock */
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockint
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockzpool_do_history(int argc, char **argv)
b1b8ab34de515a5e83206da22c3d7e563241b021lling{
b1b8ab34de515a5e83206da22c3d7e563241b021lling hist_cbdata_t cbdata = { 0 };
b1b8ab34de515a5e83206da22c3d7e563241b021lling int ret;
990b4856d0eaada6f8140335733a1b1771ed2746lling int c;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
990b4856d0eaada6f8140335733a1b1771ed2746lling cbdata.first = B_TRUE;
990b4856d0eaada6f8140335733a1b1771ed2746lling /* check options */
b1b8ab34de515a5e83206da22c3d7e563241b021lling while ((c = getopt(argc, argv, "li")) != -1) {
b1b8ab34de515a5e83206da22c3d7e563241b021lling switch (c) {
b1b8ab34de515a5e83206da22c3d7e563241b021lling case 'l':
b1b8ab34de515a5e83206da22c3d7e563241b021lling cbdata.longfmt = 1;
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
990b4856d0eaada6f8140335733a1b1771ed2746lling case 'i':
b1b8ab34de515a5e83206da22c3d7e563241b021lling cbdata.internal = 1;
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
b1b8ab34de515a5e83206da22c3d7e563241b021lling case '?':
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) fprintf(stderr, gettext("invalid option '%c'\n"),
b1b8ab34de515a5e83206da22c3d7e563241b021lling optopt);
b1b8ab34de515a5e83206da22c3d7e563241b021lling usage(B_FALSE);
b1b8ab34de515a5e83206da22c3d7e563241b021lling }
b1b8ab34de515a5e83206da22c3d7e563241b021lling }
b1b8ab34de515a5e83206da22c3d7e563241b021lling argc -= optind;
990b4856d0eaada6f8140335733a1b1771ed2746lling argv += optind;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling ret = for_each_pool(argc, argv, B_FALSE, NULL, get_history_one,
b1b8ab34de515a5e83206da22c3d7e563241b021lling &cbdata);
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling if (argc == 0 && cbdata.first == B_TRUE) {
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) printf(gettext("no pools available\n"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling return (0);
b1b8ab34de515a5e83206da22c3d7e563241b021lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling return (ret);
b1b8ab34de515a5e83206da22c3d7e563241b021lling}
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021llingstatic int
b1b8ab34de515a5e83206da22c3d7e563241b021llingget_callback(zpool_handle_t *zhp, void *data)
b1b8ab34de515a5e83206da22c3d7e563241b021lling{
b1b8ab34de515a5e83206da22c3d7e563241b021lling zprop_get_cbdata_t *cbp = (zprop_get_cbdata_t *)data;
990b4856d0eaada6f8140335733a1b1771ed2746lling char value[MAXNAMELEN];
b1b8ab34de515a5e83206da22c3d7e563241b021lling zprop_source_t srctype;
b1b8ab34de515a5e83206da22c3d7e563241b021lling zprop_list_t *pl;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling for (pl = cbp->cb_proplist; pl != NULL; pl = pl->pl_next) {
990b4856d0eaada6f8140335733a1b1771ed2746lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling /*
990b4856d0eaada6f8140335733a1b1771ed2746lling * Skip the special fake placeholder. This will also skip
990b4856d0eaada6f8140335733a1b1771ed2746lling * over the name property when 'all' is specified.
b1b8ab34de515a5e83206da22c3d7e563241b021lling */
b1b8ab34de515a5e83206da22c3d7e563241b021lling if (pl->pl_prop == ZPOOL_PROP_NAME &&
b1b8ab34de515a5e83206da22c3d7e563241b021lling pl == cbp->cb_proplist)
990b4856d0eaada6f8140335733a1b1771ed2746lling continue;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling if (zpool_get_prop(zhp, pl->pl_prop,
b1b8ab34de515a5e83206da22c3d7e563241b021lling value, sizeof (value), &srctype) != 0)
b1b8ab34de515a5e83206da22c3d7e563241b021lling continue;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling zprop_print_one_property(zpool_get_name(zhp), cbp,
b1b8ab34de515a5e83206da22c3d7e563241b021lling zpool_prop_to_name(pl->pl_prop), value, srctype, NULL);
b1b8ab34de515a5e83206da22c3d7e563241b021lling }
b1b8ab34de515a5e83206da22c3d7e563241b021lling return (0);
990b4856d0eaada6f8140335733a1b1771ed2746lling}
b1b8ab34de515a5e83206da22c3d7e563241b021lling
990b4856d0eaada6f8140335733a1b1771ed2746llingint
b1b8ab34de515a5e83206da22c3d7e563241b021llingzpool_do_get(int argc, char **argv)
b1b8ab34de515a5e83206da22c3d7e563241b021lling{
b1b8ab34de515a5e83206da22c3d7e563241b021lling zprop_get_cbdata_t cb = { 0 };
b1b8ab34de515a5e83206da22c3d7e563241b021lling zprop_list_t fake_name = { 0 };
b1b8ab34de515a5e83206da22c3d7e563241b021lling int ret;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling if (argc < 3)
b1b8ab34de515a5e83206da22c3d7e563241b021lling usage(B_FALSE);
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling cb.cb_first = B_TRUE;
b1b8ab34de515a5e83206da22c3d7e563241b021lling cb.cb_sources = ZPROP_SRC_ALL;
b1b8ab34de515a5e83206da22c3d7e563241b021lling cb.cb_columns[0] = GET_COL_NAME;
b1b8ab34de515a5e83206da22c3d7e563241b021lling cb.cb_columns[1] = GET_COL_PROPERTY;
b1b8ab34de515a5e83206da22c3d7e563241b021lling cb.cb_columns[2] = GET_COL_VALUE;
b1b8ab34de515a5e83206da22c3d7e563241b021lling cb.cb_columns[3] = GET_COL_SOURCE;
b1b8ab34de515a5e83206da22c3d7e563241b021lling cb.cb_type = ZFS_TYPE_POOL;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling if (zprop_get_list(g_zfs, argv[1], &cb.cb_proplist,
b1b8ab34de515a5e83206da22c3d7e563241b021lling ZFS_TYPE_POOL) != 0)
b1b8ab34de515a5e83206da22c3d7e563241b021lling usage(B_FALSE);
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling if (cb.cb_proplist != NULL) {
b1b8ab34de515a5e83206da22c3d7e563241b021lling fake_name.pl_prop = ZPOOL_PROP_NAME;
b1b8ab34de515a5e83206da22c3d7e563241b021lling fake_name.pl_width = strlen(gettext("NAME"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling fake_name.pl_next = cb.cb_proplist;
b1b8ab34de515a5e83206da22c3d7e563241b021lling cb.cb_proplist = &fake_name;
b1b8ab34de515a5e83206da22c3d7e563241b021lling }
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling ret = for_each_pool(argc - 2, argv + 2, B_TRUE, &cb.cb_proplist,
b1b8ab34de515a5e83206da22c3d7e563241b021lling get_callback, &cb);
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling if (cb.cb_proplist == &fake_name)
b1b8ab34de515a5e83206da22c3d7e563241b021lling zprop_free_list(fake_name.pl_next);
b1b8ab34de515a5e83206da22c3d7e563241b021lling else
b1b8ab34de515a5e83206da22c3d7e563241b021lling zprop_free_list(cb.cb_proplist);
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling return (ret);
b1b8ab34de515a5e83206da22c3d7e563241b021lling}
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021llingtypedef struct set_cbdata {
b1b8ab34de515a5e83206da22c3d7e563241b021lling char *cb_propname;
b1b8ab34de515a5e83206da22c3d7e563241b021lling char *cb_value;
b1b8ab34de515a5e83206da22c3d7e563241b021lling boolean_t cb_any_successful;
b1b8ab34de515a5e83206da22c3d7e563241b021lling} set_cbdata_t;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021llingint
b1b8ab34de515a5e83206da22c3d7e563241b021llingset_callback(zpool_handle_t *zhp, void *data)
b1b8ab34de515a5e83206da22c3d7e563241b021lling{
b1b8ab34de515a5e83206da22c3d7e563241b021lling int error;
b1b8ab34de515a5e83206da22c3d7e563241b021lling set_cbdata_t *cb = (set_cbdata_t *)data;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling error = zpool_set_prop(zhp, cb->cb_propname, cb->cb_value);
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling if (!error)
b1b8ab34de515a5e83206da22c3d7e563241b021lling cb->cb_any_successful = B_TRUE;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling return (error);
b1b8ab34de515a5e83206da22c3d7e563241b021lling}
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021llingint
b1b8ab34de515a5e83206da22c3d7e563241b021llingzpool_do_set(int argc, char **argv)
b1b8ab34de515a5e83206da22c3d7e563241b021lling{
b1b8ab34de515a5e83206da22c3d7e563241b021lling set_cbdata_t cb = { 0 };
b1b8ab34de515a5e83206da22c3d7e563241b021lling int error;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling if (argc > 1 && argv[1][0] == '-') {
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) fprintf(stderr, gettext("invalid option '%c'\n"),
b1b8ab34de515a5e83206da22c3d7e563241b021lling argv[1][1]);
b1b8ab34de515a5e83206da22c3d7e563241b021lling usage(B_FALSE);
b1b8ab34de515a5e83206da22c3d7e563241b021lling }
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling if (argc < 2) {
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) fprintf(stderr, gettext("missing property=value "
b1b8ab34de515a5e83206da22c3d7e563241b021lling "argument\n"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling usage(B_FALSE);
b1b8ab34de515a5e83206da22c3d7e563241b021lling }
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling if (argc < 3) {
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) fprintf(stderr, gettext("missing pool name\n"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling usage(B_FALSE);
b1b8ab34de515a5e83206da22c3d7e563241b021lling }
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling if (argc > 3) {
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) fprintf(stderr, gettext("too many pool names\n"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling usage(B_FALSE);
b1b8ab34de515a5e83206da22c3d7e563241b021lling }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens cb.cb_propname = argv[1];
fa9e4066f08beec538e775443c5be79dd423fcabahrens cb.cb_value = strchr(cb.cb_propname, '=');
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (cb.cb_value == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing value in "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "property=value argument\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens *(cb.cb_value) = '\0';
99653d4ee642c6528e88224f12409a5f23060994eschrock cb.cb_value++;
99653d4ee642c6528e88224f12409a5f23060994eschrock
203a47d89d37e993340060207ea2299ade638d68nd error = for_each_pool(argc - 2, argv + 2, B_TRUE, NULL,
99653d4ee642c6528e88224f12409a5f23060994eschrock set_callback, &cb);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock return (error);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensfind_command_idx(char *command, int *idx)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < NCOMMAND; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (command_table[i].name == NULL)
99653d4ee642c6528e88224f12409a5f23060994eschrock continue;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strcmp(command, command_table[i].name) == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens *idx = i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
2a6b87f07ac0c0b819179c84afe5a60afa04cfa5ekmain(int argc, char **argv)
2a6b87f07ac0c0b819179c84afe5a60afa04cfa5ek{
2a6b87f07ac0c0b819179c84afe5a60afa04cfa5ek int ret;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *cmdname;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) setlocale(LC_ALL, "");
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) textdomain(TEXT_DOMAIN);
b1b8ab34de515a5e83206da22c3d7e563241b021lling
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens if ((g_zfs = libzfs_init()) == NULL) {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens (void) fprintf(stderr, gettext("internal error: failed to "
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens "initialize ZFS library\n"));
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens return (1);
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens }
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens libzfs_print_on_error(g_zfs, B_TRUE);
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens opterr = 0;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Make sure the user has specified some command.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens if (argc < 2) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing command\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_FALSE);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens cmdname = argv[1];
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Special case '-?'
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strcmp(cmdname, "-?") == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage(B_TRUE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_set_history_str("zpool", argc, argv, history_str);
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(zpool_stage_history(g_zfs, history_str) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Run the appropriate command.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
if (find_command_idx(cmdname, &i) == 0) {
current_command = &command_table[i];
ret = command_table[i].func(argc - 1, argv + 1);
} else if (strchr(cmdname, '=')) {
verify(find_command_idx("set", &i) == 0);
current_command = &command_table[i];
ret = command_table[i].func(argc, argv);
} else if (strcmp(cmdname, "freeze") == 0 && argc == 3) {
/*
* 'freeze' is a vile debugging abomination, so we treat
* it as such.
*/
char buf[16384];
int fd = open(ZFS_DEV, O_RDWR);
(void) strcpy((void *)buf, argv[2]);
return (!!ioctl(fd, ZFS_IOC_POOL_FREEZE, buf));
} else {
(void) fprintf(stderr, gettext("unrecognized "
"command '%s'\n"), cmdname);
usage(B_FALSE);
}
libzfs_fini(g_zfs);
/*
* The 'ZFS_ABORT' environment variable causes us to dump core on exit
* for the purposes of running ::findleaks.
*/
if (getenv("ZFS_ABORT") != NULL) {
(void) printf("dumping core by request\n");
abort();
}
return (ret);
}