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/*
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
ca0cc3918a1789fa839194af2a9245f801a06b1aMatthew Ahrens * Copyright (c) 2011, 2015 by Delphix. All rights reserved.
e1d5e507a890a0408b8299bf95cad4678fc2390eFrederik Wessels * Copyright (c) 2012 by Frederik Wessels. All rights reserved.
9edf9ebd727ac2046be0269a5e275785e2131bcbPrasad Joshi * Copyright (c) 2013 by Prasad Joshi (sTec). All rights reserved.
b327cd3f3b4dab4f29e7140159b1e01ed2ceef2aIgor Kozhukhov * Copyright 2016 Igor Kozhukhov <ikozhukhov@gmail.com>.
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews * Copyright 2016 Nexenta Systems, Inc.
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>
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks#include <pwd.h>
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks#include <zone.h>
4263d13f00c9691fa14620eff82abef795be0693George Wilson#include <zfs_prop.h>
b1b8ab34de515a5e83206da22c3d7e563241b021lling#include <sys/fs/zfs.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/stat.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <libzfs.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "zpool_util.h"
b7b97454b9b1f6625e7e655e9651e744a8dee09dperrin#include "zfs_comutil.h"
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden#include "zfeature_common.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens
26fd77009b17f8c8fb32eb362584cfd635e87ad9Krishnendu Sadhukhan - Sun Microsystems#include "statcommon.h"
26fd77009b17f8c8fb32eb362584cfd635e87ad9Krishnendu Sadhukhan - Sun Microsystems
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_create(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_destroy(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_add(int, char **);
99653d4ee642c6528e88224f12409a5f23060994eschrockstatic int zpool_do_remove(int, char **);
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrewsstatic int zpool_do_labelclear(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic 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 **);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockstatic int zpool_do_clear(int, char **);
4263d13f00c9691fa14620eff82abef795be0693George Wilsonstatic int zpool_do_reopen(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amorestatic int zpool_do_reguid(int, char **);
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_attach(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_detach(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_replace(int, char **);
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musantestatic int zpool_do_split(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
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockstatic int zpool_do_upgrade(int, char **);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
06eeb2ad640ce72d394ac521094bed7681044408ekstatic int zpool_do_history(int, char **);
06eeb2ad640ce72d394ac521094bed7681044408ek
b1b8ab34de515a5e83206da22c3d7e563241b021llingstatic int zpool_do_get(int, char **);
b1b8ab34de515a5e83206da22c3d7e563241b021llingstatic int zpool_do_set(int, char **);
b1b8ab34de515a5e83206da22c3d7e563241b021lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * These libumem hooks provide a reasonable set of defaults for the allocator's
fa9e4066f08beec538e775443c5be79dd423fcabahrens * debugging facilities.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
29ab75c9a733dad2978c4860efd954b5625e3467rm
29ab75c9a733dad2978c4860efd954b5625e3467rm#ifdef DEBUG
fa9e4066f08beec538e775443c5be79dd423fcabahrensconst char *
99653d4ee642c6528e88224f12409a5f23060994eschrock_umem_debug_init(void)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens return ("default,verbose"); /* $UMEM_DEBUG setting */
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensconst char *
fa9e4066f08beec538e775443c5be79dd423fcabahrens_umem_logging_init(void)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens return ("fail,contents"); /* $UMEM_LOGGING setting */
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
29ab75c9a733dad2978c4860efd954b5625e3467rm#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens
65cd9f2809a015b46790a9c5c2ef992d56177624eschrocktypedef enum {
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_ADD,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_ATTACH,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock HELP_CLEAR,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_CREATE,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_DESTROY,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_DETACH,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_EXPORT,
06eeb2ad640ce72d394ac521094bed7681044408ek HELP_HISTORY,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_IMPORT,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_IOSTAT,
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews HELP_LABELCLEAR,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_LIST,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_OFFLINE,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_ONLINE,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_REPLACE,
99653d4ee642c6528e88224f12409a5f23060994eschrock HELP_REMOVE,
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock HELP_SCRUB,
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock HELP_STATUS,
b1b8ab34de515a5e83206da22c3d7e563241b021lling HELP_UPGRADE,
b1b8ab34de515a5e83206da22c3d7e563241b021lling HELP_GET,
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante HELP_SET,
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore HELP_SPLIT,
4263d13f00c9691fa14620eff82abef795be0693George Wilson HELP_REGUID,
4263d13f00c9691fa14620eff82abef795be0693George Wilson HELP_REOPEN
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock} zpool_help_t;
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct zpool_command {
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *name;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int (*func)(int, char **);
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock zpool_help_t usage;
fa9e4066f08beec538e775443c5be79dd423fcabahrens} zpool_command_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Master command table. Each ZFS command has a name, associated function, and
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * usage message. The usage messages need to be internationalized, so we have
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * to have a function to return the usage message based on a command index.
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock *
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * 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.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic zpool_command_t command_table[] = {
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "create", zpool_do_create, HELP_CREATE },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "destroy", zpool_do_destroy, HELP_DESTROY },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { NULL },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "add", zpool_do_add, HELP_ADD },
99653d4ee642c6528e88224f12409a5f23060994eschrock { "remove", zpool_do_remove, HELP_REMOVE },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { NULL },
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews { "labelclear", zpool_do_labelclear, HELP_LABELCLEAR },
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews { NULL },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "list", zpool_do_list, HELP_LIST },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "iostat", zpool_do_iostat, HELP_IOSTAT },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "status", zpool_do_status, HELP_STATUS },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { NULL },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "online", zpool_do_online, HELP_ONLINE },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "offline", zpool_do_offline, HELP_OFFLINE },
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock { "clear", zpool_do_clear, HELP_CLEAR },
4263d13f00c9691fa14620eff82abef795be0693George Wilson { "reopen", zpool_do_reopen, HELP_REOPEN },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { NULL },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "attach", zpool_do_attach, HELP_ATTACH },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "detach", zpool_do_detach, HELP_DETACH },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "replace", zpool_do_replace, HELP_REPLACE },
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante { "split", zpool_do_split, HELP_SPLIT },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { NULL },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "scrub", zpool_do_scrub, HELP_SCRUB },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { NULL },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "import", zpool_do_import, HELP_IMPORT },
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock { "export", zpool_do_export, HELP_EXPORT },
06eeb2ad640ce72d394ac521094bed7681044408ek { "upgrade", zpool_do_upgrade, HELP_UPGRADE },
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore { "reguid", zpool_do_reguid, HELP_REGUID },
06eeb2ad640ce72d394ac521094bed7681044408ek { NULL },
b1b8ab34de515a5e83206da22c3d7e563241b021lling { "history", zpool_do_history, HELP_HISTORY },
b1b8ab34de515a5e83206da22c3d7e563241b021lling { "get", zpool_do_get, HELP_GET },
b1b8ab34de515a5e83206da22c3d7e563241b021lling { "set", zpool_do_set, HELP_SET },
fa9e4066f08beec538e775443c5be79dd423fcabahrens};
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define NCOMMAND (sizeof (command_table) / sizeof (command_table[0]))
fa9e4066f08beec538e775443c5be79dd423fcabahrens
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrensstatic zpool_command_t *current_command;
2a6b87f07ac0c0b819179c84afe5a60afa04cfa5ekstatic char history_str[HIS_MAX_RECORD_LEN];
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrensstatic boolean_t log_history = B_TRUE;
26fd77009b17f8c8fb32eb362584cfd635e87ad9Krishnendu Sadhukhan - Sun Microsystemsstatic uint_t timestamp_fmt = NODATE;
26fd77009b17f8c8fb32eb362584cfd635e87ad9Krishnendu Sadhukhan - Sun Microsystems
65cd9f2809a015b46790a9c5c2ef992d56177624eschrockstatic const char *
9a686fbc186e8e2a64e9a5094d44c7d6fa0ea167Paul Dagnelieget_usage(zpool_help_t idx)
9a686fbc186e8e2a64e9a5094d44c7d6fa0ea167Paul Dagnelie{
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> "
e45ce728996d8e573eecb27f555fb86aaff0cafdahrens "<new-device>\n"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock case HELP_CLEAR:
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley return (gettext("\tclear [-nF] <pool> [device]\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_CREATE:
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden return (gettext("\tcreate [-fnd] [-o property=value] ... \n"
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh "\t [-O file-system-property=value] ... \n"
990b4856d0eaada6f8140335733a1b1771ed2746lling "\t [-m mountpoint] [-R root] <pool> <vdev> ...\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_DESTROY:
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock return (gettext("\tdestroy [-f] <pool>\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_DETACH:
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock return (gettext("\tdetach <pool> <device>\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_EXPORT:
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock return (gettext("\texport [-f] <pool> ...\n"));
06eeb2ad640ce72d394ac521094bed7681044408ek case HELP_HISTORY:
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks return (gettext("\thistory [-il] [<pool>] ...\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_IMPORT:
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm return (gettext("\timport [-d dir] [-D]\n"
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson "\timport [-d dir | -c cachefile] [-F [-n]] <pool | id>\n"
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock "\timport [-o mntopts] [-o property=value] ... \n"
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson "\t [-d dir | -c cachefile] [-D] [-f] [-m] [-N] "
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson "[-R root] [-F [-n]] -a\n"
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock "\timport [-o mntopts] [-o property=value] ... \n"
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson "\t [-d dir | -c cachefile] [-D] [-f] [-m] [-N] "
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson "[-R root] [-F [-n]]\n"
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson "\t <pool | id> [newpool]\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_IOSTAT:
26fd77009b17f8c8fb32eb362584cfd635e87ad9Krishnendu Sadhukhan - Sun Microsystems return (gettext("\tiostat [-v] [-T d|u] [pool] ... [interval "
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock "[count]]\n"));
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews case HELP_LABELCLEAR:
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews return (gettext("\tlabelclear [-f] <vdev>\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_LIST:
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko return (gettext("\tlist [-Hp] [-o property[,...]] "
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling "[-T d|u] [pool] ... [interval [count]]\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_OFFLINE:
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling return (gettext("\toffline [-t] <pool> <device> ...\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_ONLINE:
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling return (gettext("\tonline <pool> <device> ...\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_REPLACE:
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock return (gettext("\treplace [-f] <pool> <device> "
e45ce728996d8e573eecb27f555fb86aaff0cafdahrens "[new-device]\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case HELP_REMOVE:
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan return (gettext("\tremove <pool> <device> ...\n"));
4263d13f00c9691fa14620eff82abef795be0693George Wilson case HELP_REOPEN:
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson return (gettext("\treopen <pool>\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_SCRUB:
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock return (gettext("\tscrub [-s] <pool> ...\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock case HELP_STATUS:
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling return (gettext("\tstatus [-vx] [-T d|u] [pool] ... [interval "
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling "[count]]\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case HELP_UPGRADE:
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock return (gettext("\tupgrade\n"
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "\tupgrade -v\n"
990b4856d0eaada6f8140335733a1b1771ed2746lling "\tupgrade [-V version] <-a | pool ...>\n"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling case HELP_GET:
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko return (gettext("\tget [-Hp] [-o \"all\" | field[,...]] "
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko "<\"all\" | property[,...]> <pool> ...\n"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling case HELP_SET:
b1b8ab34de515a5e83206da22c3d7e563241b021lling return (gettext("\tset <property=value> <pool> \n"));
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante case HELP_SPLIT:
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante return (gettext("\tsplit [-n] [-R altroot] [-o mntopts]\n"
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante "\t [-o property=value] <pool> <newpool> "
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante "[<device> ...]\n"));
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore case HELP_REGUID:
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore return (gettext("\treguid <pool>\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock }
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock abort();
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock /* NOTREACHED */
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock}
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens
b1b8ab34de515a5e83206da22c3d7e563241b021lling/*
b1b8ab34de515a5e83206da22c3d7e563241b021lling * Callback routine that will print out a pool property value.
b1b8ab34de515a5e83206da22c3d7e563241b021lling */
990b4856d0eaada6f8140335733a1b1771ed2746llingstatic int
990b4856d0eaada6f8140335733a1b1771ed2746llingprint_prop_cb(int prop, void *cb)
b1b8ab34de515a5e83206da22c3d7e563241b021lling{
b1b8ab34de515a5e83206da22c3d7e563241b021lling FILE *fp = cb;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick (void) fprintf(fp, "\t%-15s ", zpool_prop_to_name(prop));
b1b8ab34de515a5e83206da22c3d7e563241b021lling
990b4856d0eaada6f8140335733a1b1771ed2746lling if (zpool_prop_readonly(prop))
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) fprintf(fp, " NO ");
990b4856d0eaada6f8140335733a1b1771ed2746lling else
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick (void) fprintf(fp, " YES ");
990b4856d0eaada6f8140335733a1b1771ed2746lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling if (zpool_prop_values(prop) == NULL)
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) fprintf(fp, "-\n");
b1b8ab34de515a5e83206da22c3d7e563241b021lling else
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) fprintf(fp, "%s\n", zpool_prop_values(prop));
b1b8ab34de515a5e83206da22c3d7e563241b021lling
990b4856d0eaada6f8140335733a1b1771ed2746lling return (ZPROP_CONT);
b1b8ab34de515a5e83206da22c3d7e563241b021lling}
b1b8ab34de515a5e83206da22c3d7e563241b021lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Display usage message. If we're inside a command, display only the usage for
fa9e4066f08beec538e775443c5be79dd423fcabahrens * that command. Otherwise, iterate over the entire command table and display
fa9e4066f08beec538e775443c5be79dd423fcabahrens * a complete usage message.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
99653d4ee642c6528e88224f12409a5f23060994eschrockusage(boolean_t requested)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens FILE *fp = requested ? stdout : stderr;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (current_command == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(fp, gettext("usage: zpool command args ...\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(fp,
fa9e4066f08beec538e775443c5be79dd423fcabahrens gettext("where 'command' is one of the following:\n\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < NCOMMAND; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (command_table[i].name == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(fp, "\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(fp, "%s",
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock get_usage(command_table[i].usage));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(fp, gettext("usage:\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock (void) fprintf(fp, "%s", get_usage(current_command->usage));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
b1b8ab34de515a5e83206da22c3d7e563241b021lling if (current_command != NULL &&
b1b8ab34de515a5e83206da22c3d7e563241b021lling ((strcmp(current_command->name, "set") == 0) ||
990b4856d0eaada6f8140335733a1b1771ed2746lling (strcmp(current_command->name, "get") == 0) ||
990b4856d0eaada6f8140335733a1b1771ed2746lling (strcmp(current_command->name, "list") == 0))) {
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) fprintf(fp,
b1b8ab34de515a5e83206da22c3d7e563241b021lling gettext("\nthe following properties are supported:\n"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick (void) fprintf(fp, "\n\t%-15s %s %s\n\n",
990b4856d0eaada6f8140335733a1b1771ed2746lling "PROPERTY", "EDIT", "VALUES");
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling /* Iterate over all properties */
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) zprop_iter(print_prop_cb, fp, B_FALSE, B_TRUE,
990b4856d0eaada6f8140335733a1b1771ed2746lling ZFS_TYPE_POOL);
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) fprintf(fp, "\t%-15s ", "feature@...");
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) fprintf(fp, "YES disabled | enabled | active\n");
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) fprintf(fp, gettext("\nThe feature@ properties must be "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "appended with a feature name.\nSee zpool-features(5).\n"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling }
b1b8ab34de515a5e83206da22c3d7e563241b021lling
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock /*
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * 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
fa9e4066f08beec538e775443c5be79dd423fcabahrens exit(requested ? 0 : 2);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
8654d0253136055bd4cc2423d87378e8a37f2eb5perrinprint_vdev_tree(zpool_handle_t *zhp, const char *name, nvlist_t *nv, int indent,
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin boolean_t print_logs)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t **child;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint_t c, children;
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock char *vname;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens 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
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock for (c = 0; c < children; c++) {
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin uint64_t is_log = B_FALSE;
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
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
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson vname = zpool_vdev_name(g_zfs, zhp, child[c], B_FALSE);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin print_vdev_tree(zhp, vname, child[c], indent + 2,
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin B_FALSE);
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock free(vname);
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Sidenstatic boolean_t
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Sidenprop_list_contains_feature(nvlist_t *proplist)
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden{
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden nvpair_t *nvp;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden for (nvp = nvlist_next_nvpair(proplist, NULL); NULL != nvp;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden nvp = nvlist_next_nvpair(proplist, nvp)) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (zpool_prop_feature(nvpair_name(nvp)))
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden return (B_TRUE);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden }
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden return (B_FALSE);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden}
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
990b4856d0eaada6f8140335733a1b1771ed2746lling/*
990b4856d0eaada6f8140335733a1b1771ed2746lling * Add a property pair (name, string-value) into a property nvlist.
990b4856d0eaada6f8140335733a1b1771ed2746lling */
990b4856d0eaada6f8140335733a1b1771ed2746llingstatic int
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimhadd_prop_list(const char *propname, char *propval, nvlist_t **props,
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh boolean_t poolprop)
990b4856d0eaada6f8140335733a1b1771ed2746lling{
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh zpool_prop_t prop = ZPROP_INVAL;
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh zfs_prop_t fprop;
990b4856d0eaada6f8140335733a1b1771ed2746lling nvlist_t *proplist;
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh const char *normnm;
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh char *strval;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling 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
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh if (poolprop) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden const char *vname = zpool_prop_to_name(ZPOOL_PROP_VERSION);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden if ((prop = zpool_name_to_prop(propname)) == ZPROP_INVAL &&
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden !zpool_prop_feature(propname)) {
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh (void) fprintf(stderr, gettext("property '%s' is "
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh "not a valid pool property\n"), propname);
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh return (2);
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh }
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden /*
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden * feature@ properties and version should not be specified
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden * at the same time.
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden */
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if ((prop == ZPROP_INVAL && zpool_prop_feature(propname) &&
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden nvlist_exists(proplist, vname)) ||
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (prop == ZPOOL_PROP_VERSION &&
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden prop_list_contains_feature(proplist))) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) fprintf(stderr, gettext("'feature@' and "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "'version' properties cannot be specified "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "together\n"));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden return (2);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden }
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden if (zpool_prop_feature(propname))
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden normnm = propname;
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden else
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden normnm = zpool_prop_to_name(prop);
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh } else {
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens if ((fprop = zfs_name_to_prop(propname)) != ZPROP_INVAL) {
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens normnm = zfs_prop_to_name(fprop);
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens } else {
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens normnm = propname;
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh }
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh if (nvlist_lookup_string(proplist, normnm, &strval) == 0 &&
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh prop != ZPOOL_PROP_CACHEFILE) {
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) fprintf(stderr, gettext("property '%s' "
990b4856d0eaada6f8140335733a1b1771ed2746lling "specified multiple times\n"), propname);
990b4856d0eaada6f8140335733a1b1771ed2746lling return (2);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh if (nvlist_add_string(proplist, normnm, propval) != 0) {
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) fprintf(stderr, gettext("internal "
990b4856d0eaada6f8140335733a1b1771ed2746lling "error: out of memory\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling return (1);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling return (0);
990b4856d0eaada6f8140335733a1b1771ed2746lling}
990b4856d0eaada6f8140335733a1b1771ed2746lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * 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{
99653d4ee642c6528e88224f12409a5f23060994eschrock boolean_t force = B_FALSE;
99653d4ee642c6528e88224f12409a5f23060994eschrock boolean_t dryrun = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c;
fa9e4066f08beec538e775443c5be79dd423fcabahrens 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':
99653d4ee642c6528e88224f12409a5f23060994eschrock force = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'n':
99653d4ee642c6528e88224f12409a5f23060994eschrock dryrun = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
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;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get pool name and check number of arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name argument\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 2) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing vdev specification\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens poolname = argv[0];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc--;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv++;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock if ((config = zpool_get_config(zhp, NULL)) == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("pool '%s' is unavailable\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens poolname);
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* pass off to get_vdev_spec for processing */
705040ed336e23b47ac6a3421d1f23ab5e86871bEric Taylor nvroot = make_root_vdev(zhp, force, !force, B_FALSE, dryrun,
705040ed336e23b47ac6a3421d1f23ab5e86871bEric Taylor argc, argv);
fa9e4066f08beec538e775443c5be79dd423fcabahrens 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
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin /* 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 }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = (zpool_add(zhp, nvroot) != 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock nvlist_free(nvroot);
99653d4ee642c6528e88224f12409a5f23060994eschrock zpool_close(zhp);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock return (ret);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock/*
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * zpool remove <pool> <vdev> ...
99653d4ee642c6528e88224f12409a5f23060994eschrock *
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * Removes the given vdev from the pool. Currently, this supports removing
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * spares, cache, and log devices from the pool.
99653d4ee642c6528e88224f12409a5f23060994eschrock */
99653d4ee642c6528e88224f12409a5f23060994eschrockint
99653d4ee642c6528e88224f12409a5f23060994eschrockzpool_do_remove(int argc, char **argv)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock char *poolname;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan int i, ret = 0;
99653d4ee642c6528e88224f12409a5f23060994eschrock 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
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan for (i = 1; i < argc; i++) {
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (zpool_vdev_remove(zhp, argv[i]) != 0)
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan ret = 1;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan }
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews/*
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews * zpool labelclear [-f] <vdev>
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews *
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews * -f Force clearing the label for the vdevs which are members of
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews * the exported or foreign pools.
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews *
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews * Verifies that the vdev is not active and zeros out the label information
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews * on the device.
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews */
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrewsint
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrewszpool_do_labelclear(int argc, char **argv)
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews{
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews char vdev[MAXPATHLEN];
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews char *name = NULL;
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews struct stat st;
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews int c, fd, ret = 0;
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews nvlist_t *config;
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews pool_state_t state;
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews boolean_t inuse = B_FALSE;
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews boolean_t force = B_FALSE;
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews /* check options */
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews while ((c = getopt(argc, argv, "f")) != -1) {
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews switch (c) {
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews case 'f':
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews force = B_TRUE;
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews break;
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews default:
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews (void) fprintf(stderr, gettext("invalid option '%c'\n"),
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews optopt);
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews usage(B_FALSE);
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews }
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews }
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews argc -= optind;
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews argv += optind;
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews /* get vdev name */
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews if (argc < 1) {
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews (void) fprintf(stderr, gettext("missing vdev name\n"));
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews usage(B_FALSE);
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews }
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews if (argc > 1) {
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews (void) fprintf(stderr, gettext("too many arguments\n"));
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews usage(B_FALSE);
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews }
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews /*
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews * Check if we were given absolute path and use it as is.
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews * Otherwise if the provided vdev name doesn't point to a file,
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews * try prepending dsk path and appending s0.
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews */
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews (void) strlcpy(vdev, argv[0], sizeof (vdev));
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews if (vdev[0] != '/' && stat(vdev, &st) != 0) {
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews char *s;
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews (void) snprintf(vdev, sizeof (vdev), "%s/%s",
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews ZFS_DISK_ROOT, argv[0]);
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews if ((s = strrchr(argv[0], 's')) == NULL ||
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews !isdigit(*(s + 1)))
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews (void) strlcat(vdev, "s0", sizeof (vdev));
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews if (stat(vdev, &st) != 0) {
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews (void) fprintf(stderr, gettext(
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews "failed to find device %s, try specifying absolute "
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews "path instead\n"), argv[0]);
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews return (1);
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews }
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews }
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews if ((fd = open(vdev, O_RDWR)) < 0) {
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews (void) fprintf(stderr, gettext("failed to open %s: %s\n"),
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews vdev, strerror(errno));
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews return (1);
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews }
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews if (zpool_read_label(fd, &config) != 0 || config == NULL) {
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews (void) fprintf(stderr,
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews gettext("failed to read label from %s\n"), vdev);
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews return (1);
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews }
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews nvlist_free(config);
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews ret = zpool_in_use(g_zfs, fd, &state, &name, &inuse);
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews if (ret != 0) {
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews (void) fprintf(stderr,
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews gettext("failed to check state for %s\n"), vdev);
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews return (1);
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews }
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews if (!inuse)
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews goto wipe_label;
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews switch (state) {
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews default:
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews case POOL_STATE_ACTIVE:
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews case POOL_STATE_SPARE:
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews case POOL_STATE_L2CACHE:
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews (void) fprintf(stderr, gettext(
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews "%s is a member (%s) of pool \"%s\"\n"),
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews vdev, zpool_pool_state_to_name(state), name);
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews ret = 1;
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews goto errout;
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews case POOL_STATE_EXPORTED:
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews if (force)
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews break;
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews (void) fprintf(stderr, gettext(
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews "use '-f' to override the following error:\n"
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews "%s is a member of exported pool \"%s\"\n"),
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews vdev, name);
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews ret = 1;
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews goto errout;
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews case POOL_STATE_POTENTIALLY_ACTIVE:
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews if (force)
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews break;
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews (void) fprintf(stderr, gettext(
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews "use '-f' to override the following error:\n"
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews "%s is a member of potentially active pool \"%s\"\n"),
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews vdev, name);
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews ret = 1;
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews goto errout;
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews case POOL_STATE_DESTROYED:
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews /* inuse should never be set for a destroyed pool */
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews assert(0);
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews break;
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews }
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrewswipe_label:
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews ret = zpool_clear_label(fd);
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews if (ret != 0) {
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews (void) fprintf(stderr,
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews gettext("failed to clear label for %s\n"), vdev);
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews }
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrewserrout:
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews free(name);
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews (void) close(fd);
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews return (ret);
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews}
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden * zpool create [-fnd] [-o property=value] ...
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh * [-O file-system-property=value] ...
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh * [-R root] [-m mountpoint] <pool> <dev> ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
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
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden * '/<pool>'
990b4856d0eaada6f8140335733a1b1771ed2746lling * -o Set property=value.
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden * -d Don't automatically enable all supported pool features
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden * (individual features can be enabled with -o).
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh * -O Set fsproperty=value in the pool's root file system
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
b1b8ab34de515a5e83206da22c3d7e563241b021lling * Creates the named pool according to the given vdev specification. The
fa9e4066f08beec538e775443c5be79dd423fcabahrens * bulk of the vdev processing is done in get_vdev_spec() in zpool_vdev.c. Once
fa9e4066f08beec538e775443c5be79dd423fcabahrens * we get the nvlist back from get_vdev_spec(), we either print out the contents
fa9e4066f08beec538e775443c5be79dd423fcabahrens * (if '-n' was specified), or pass it to libzfs to do the creation.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_create(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
99653d4ee642c6528e88224f12409a5f23060994eschrock boolean_t force = B_FALSE;
99653d4ee642c6528e88224f12409a5f23060994eschrock boolean_t dryrun = B_FALSE;
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden boolean_t enable_all_pool_feat = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c;
990b4856d0eaada6f8140335733a1b1771ed2746lling nvlist_t *nvroot = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *poolname;
990b4856d0eaada6f8140335733a1b1771ed2746lling int ret = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *altroot = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *mountpoint = NULL;
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh nvlist_t *fsprops = NULL;
990b4856d0eaada6f8140335733a1b1771ed2746lling nvlist_t *props = NULL;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock char *propval;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden while ((c = getopt(argc, argv, ":fndR:m:o:O:")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'f':
99653d4ee642c6528e88224f12409a5f23060994eschrock force = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'n':
99653d4ee642c6528e88224f12409a5f23060994eschrock dryrun = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden case 'd':
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden enable_all_pool_feat = B_FALSE;
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'R':
fa9e4066f08beec538e775443c5be79dd423fcabahrens altroot = optarg;
990b4856d0eaada6f8140335733a1b1771ed2746lling if (add_prop_list(zpool_prop_to_name(
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh ZPOOL_PROP_ALTROOT), optarg, &props, B_TRUE))
990b4856d0eaada6f8140335733a1b1771ed2746lling goto errout;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock if (nvlist_lookup_string(props,
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock zpool_prop_to_name(ZPOOL_PROP_CACHEFILE),
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock &propval) == 0)
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock break;
990b4856d0eaada6f8140335733a1b1771ed2746lling if (add_prop_list(zpool_prop_to_name(
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh ZPOOL_PROP_CACHEFILE), "none", &props, B_TRUE))
990b4856d0eaada6f8140335733a1b1771ed2746lling goto errout;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'm':
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews /* Equivalent to -O mountpoint=optarg */
fa9e4066f08beec538e775443c5be79dd423fcabahrens mountpoint = optarg;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
990b4856d0eaada6f8140335733a1b1771ed2746lling 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
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh if (add_prop_list(optarg, propval, &props, B_TRUE))
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh goto errout;
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden /*
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden * If the user is creating a pool that doesn't support
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden * feature flags, don't enable any features.
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden */
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden if (zpool_name_to_prop(optarg) == ZPOOL_PROP_VERSION) {
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden char *end;
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden u_longlong_t ver;
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden ver = strtoull(propval, &end, 10);
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden if (*end == '\0' &&
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden ver < SPA_VERSION_FEATURES) {
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden enable_all_pool_feat = B_FALSE;
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden }
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden }
c423721f9bcd45c2409ef7b73fc103ac2889f9e9Xin Li if (zpool_name_to_prop(optarg) == ZPOOL_PROP_ALTROOT)
c423721f9bcd45c2409ef7b73fc103ac2889f9e9Xin Li altroot = propval;
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
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews /*
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews * Mountpoints are checked and then added later.
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews * Uniquely among properties, they can be specified
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews * more than once, to avoid conflict with -m.
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews */
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews if (0 == strcmp(optarg,
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews zfs_prop_to_name(ZFS_PROP_MOUNTPOINT))) {
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews mountpoint = propval;
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews } else if (add_prop_list(optarg, propval, &fsprops,
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews B_FALSE)) {
990b4856d0eaada6f8140335733a1b1771ed2746lling goto errout;
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews }
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ':':
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing argument for "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "'%c' option\n"), optopt);
990b4856d0eaada6f8140335733a1b1771ed2746lling goto badusage;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case '?':
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens optopt);
990b4856d0eaada6f8140335733a1b1771ed2746lling goto badusage;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc -= optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv += optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get pool name and check number of arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name argument\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling goto badusage;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 2) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing vdev specification\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling goto badusage;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
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"));
990b4856d0eaada6f8140335733a1b1771ed2746lling goto errout;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* pass off to get_vdev_spec for bulk processing */
705040ed336e23b47ac6a3421d1f23ab5e86871bEric Taylor nvroot = make_root_vdev(NULL, force, !force, B_FALSE, dryrun,
705040ed336e23b47ac6a3421d1f23ab5e86871bEric Taylor argc - 1, argv + 1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvroot == NULL)
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh goto errout;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock /* make_root_vdev() allows 0 toplevel children if there are spares */
b7b97454b9b1f6625e7e655e9651e744a8dee09dperrin if (!zfs_allocatable_devs(nvroot)) {
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, gettext("invalid vdev "
99653d4ee642c6528e88224f12409a5f23060994eschrock "specification: at least one toplevel vdev must be "
99653d4ee642c6528e88224f12409a5f23060994eschrock "specified\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling goto errout;
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (altroot != NULL && altroot[0] != '/') {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid alternate root '%s': "
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock "must be an absolute path\n"), altroot);
990b4856d0eaada6f8140335733a1b1771ed2746lling goto errout;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
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];
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh DIR *dirp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mountpoint && mountpoint[0] != '/') {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid mountpoint "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "'%s': must be an absolute path, 'legacy', or "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "'none'\n"), mountpoint);
990b4856d0eaada6f8140335733a1b1771ed2746lling goto errout;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
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
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh if ((dirp = opendir(buf)) == NULL && errno != ENOENT) {
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh (void) fprintf(stderr, gettext("mountpoint '%s' : "
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh "%s\n"), buf, strerror(errno));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("use '-m' "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "option to provide a different default\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling goto errout;
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh } 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 }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews /*
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews * Now that the mountpoint's validity has been checked, ensure that
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews * the property is set appropriately prior to creating the pool.
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews */
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews if (mountpoint != NULL) {
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews ret = add_prop_list(zfs_prop_to_name(ZFS_PROP_MOUNTPOINT),
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews mountpoint, &fsprops, B_FALSE);
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews if (ret != 0)
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews goto errout;
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews }
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews ret = 1;
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
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin 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);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Hand off to libzfs.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden if (enable_all_pool_feat) {
2acef22db7808606888f8f92715629ff3ba555b9Matthew Ahrens spa_feature_t i;
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden for (i = 0; i < SPA_FEATURES; i++) {
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden char propname[MAXPATHLEN];
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden zfeature_info_t *feat = &spa_feature_table[i];
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) snprintf(propname, sizeof (propname),
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "feature@%s", feat->fi_uname);
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden /*
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden * Skip feature if user specified it manually
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden * on the command line.
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden */
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden if (nvlist_exists(props, propname))
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden continue;
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews ret = add_prop_list(propname,
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews ZFS_FEATURE_ENABLED, &props, B_TRUE);
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews if (ret != 0)
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden goto errout;
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden }
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden }
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews
8b713775314bbbf24edd503b4869342d8711ce95Will Andrews ret = 1;
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh if (zpool_create(g_zfs, poolname,
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh nvroot, props, fsprops) == 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_handle_t *pool = zfs_open(g_zfs, poolname,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZFS_TYPE_FILESYSTEM);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (pool != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zfs_mount(pool, NULL, 0) == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = zfs_shareall(pool);
fa9e4066f08beec538e775443c5be79dd423fcabahrens zfs_close(pool);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
99653d4ee642c6528e88224f12409a5f23060994eschrock } else if (libzfs_errno(g_zfs) == EZFS_INVALIDNAME) {
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, gettext("pool name may have "
99653d4ee642c6528e88224f12409a5f23060994eschrock "been omitted\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746llingerrout:
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock nvlist_free(nvroot);
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh nvlist_free(fsprops);
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock nvlist_free(props);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
990b4856d0eaada6f8140335733a1b1771ed2746llingbadusage:
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh nvlist_free(fsprops);
990b4856d0eaada6f8140335733a1b1771ed2746lling nvlist_free(props);
990b4856d0eaada6f8140335733a1b1771ed2746lling usage(B_FALSE);
990b4856d0eaada6f8140335733a1b1771ed2746lling return (2);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool destroy <pool>
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Forcefully unmount any datasets
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Destroy the given pool. Automatically unmounts any datasets in the pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_destroy(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
99653d4ee642c6528e88224f12409a5f23060994eschrock boolean_t force = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens 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':
99653d4ee642c6528e88224f12409a5f23060994eschrock force = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
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;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool argument\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc > 1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("too many arguments\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pool = argv[0];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock if ((zhp = zpool_open_canfail(g_zfs, pool)) == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * As a special case, check for use of '/' in the name, and
fa9e4066f08beec538e775443c5be79dd423fcabahrens * direct the user to use 'zfs destroy' instead.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strchr(pool, '/') != NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("use 'zfs destroy' to "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "destroy a dataset\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
f3861e1a2ceec23a5b699c24d814b7775a9e0b52ahl if (zpool_disable_datasets(zhp, force) != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("could not destroy '%s': "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "could not unmount datasets\n"), zpool_get_name(zhp));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens /* The history must be logged as part of the export */
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens log_history = B_FALSE;
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens ret = (zpool_destroy(zhp, history_str) != 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 *
b1b8ab34de515a5e83206da22c3d7e563241b021lling * Export the given pools. By default, the command will attempt to cleanly
fa9e4066f08beec538e775443c5be79dd423fcabahrens * unmount any active datasets within the pool. If the '-f' flag is specified,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * then the datasets will be forcefully unmounted.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_export(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
99653d4ee642c6528e88224f12409a5f23060994eschrock boolean_t force = B_FALSE;
394ab0cbe9de0b3be5bf232d9224a9d050999ae5George Wilson boolean_t hardforce = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c;
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_handle_t *zhp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ret;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
394ab0cbe9de0b3be5bf232d9224a9d050999ae5George Wilson while ((c = getopt(argc, argv, "fF")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'f':
99653d4ee642c6528e88224f12409a5f23060994eschrock force = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
394ab0cbe9de0b3be5bf232d9224a9d050999ae5George Wilson case 'F':
394ab0cbe9de0b3be5bf232d9224a9d050999ae5George Wilson hardforce = B_TRUE;
394ab0cbe9de0b3be5bf232d9224a9d050999ae5George Wilson break;
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;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool argument\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < argc; i++) {
99653d4ee642c6528e88224f12409a5f23060994eschrock if ((zhp = zpool_open_canfail(g_zfs, argv[i])) == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens continue;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
f3861e1a2ceec23a5b699c24d814b7775a9e0b52ahl if (zpool_disable_datasets(zhp, force) != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens continue;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens /* The history must be logged as part of the export */
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens log_history = B_FALSE;
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens
394ab0cbe9de0b3be5bf232d9224a9d050999ae5George Wilson if (hardforce) {
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens if (zpool_export_force(zhp, history_str) != 0)
394ab0cbe9de0b3be5bf232d9224a9d050999ae5George Wilson ret = 1;
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens } else if (zpool_export(zhp, force, history_str) != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 1;
394ab0cbe9de0b3be5bf232d9224a9d050999ae5George Wilson }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Given a vdev configuration, determine the maximum width needed for the device
fa9e4066f08beec538e775443c5be79dd423fcabahrens * name column.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrockmax_width(zpool_handle_t *zhp, nvlist_t *nv, int depth, int max)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson char *name = zpool_vdev_name(g_zfs, zhp, nv, B_TRUE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t **child;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint_t c, children;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ret;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strlen(name) + depth > max)
fa9e4066f08beec538e775443c5be79dd423fcabahrens max = strlen(name) + depth;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock free(name);
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_SPARES,
99653d4ee642c6528e88224f12409a5f23060994eschrock &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
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_L2CACHE,
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
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
99653d4ee642c6528e88224f12409a5f23060994eschrock &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 }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (max);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilsontypedef struct spare_cbdata {
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson uint64_t cb_guid;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson zpool_handle_t *cb_zhp;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson} spare_cbdata_t;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilsonstatic boolean_t
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilsonfind_vdev(nvlist_t *nv, uint64_t search)
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson{
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson uint64_t guid;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson nvlist_t **child;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson uint_t c, children;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &guid) == 0 &&
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson search == guid)
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson return (B_TRUE);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson &child, &children) == 0) {
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson for (c = 0; c < children; c++)
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson if (find_vdev(child[c], search))
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson return (B_TRUE);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson }
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson return (B_FALSE);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson}
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilsonstatic int
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilsonfind_spare(zpool_handle_t *zhp, void *data)
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson{
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson spare_cbdata_t *cbp = data;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson nvlist_t *config, *nvroot;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson config = zpool_get_config(zhp, NULL);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson &nvroot) == 0);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson if (find_vdev(nvroot, cbp->cb_guid)) {
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson cbp->cb_zhp = zhp;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson return (1);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson }
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson zpool_close(zhp);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson return (0);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson}
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson/*
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson * Print out configuration state as requested by status_callback.
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson */
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilsonvoid
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilsonprint_status_config(zpool_handle_t *zhp, const char *name, nvlist_t *nv,
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson int namewidth, int depth, boolean_t isspare)
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson{
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson nvlist_t **child;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson uint_t c, children;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling pool_scan_stat_t *ps = NULL;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson vdev_stat_t *vs;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling char rbuf[6], wbuf[6], cbuf[6];
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson char *vname;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson uint64_t notpresent;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson spare_cbdata_t cb;
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews const char *state;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson &child, &children) != 0)
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson children = 0;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling verify(nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_VDEV_STATS,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (uint64_t **)&vs, &c) == 0);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson state = zpool_state_to_name(vs->vs_state, vs->vs_aux);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson if (isspare) {
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson /*
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson * For hot spares, we use the terms 'INUSE' and 'AVAILABLE' for
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson * online drives.
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson */
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson if (vs->vs_aux == VDEV_AUX_SPARED)
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson state = "INUSE";
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson else if (vs->vs_state == VDEV_STATE_HEALTHY)
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson state = "AVAIL";
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson }
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson (void) printf("\t%*s%-*s %-8s", depth, "", namewidth - depth,
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson name, state);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson if (!isspare) {
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson zfs_nicenum(vs->vs_read_errors, rbuf, sizeof (rbuf));
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson zfs_nicenum(vs->vs_write_errors, wbuf, sizeof (wbuf));
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson zfs_nicenum(vs->vs_checksum_errors, cbuf, sizeof (cbuf));
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson (void) printf(" %5s %5s %5s", rbuf, wbuf, cbuf);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson }
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT,
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson &notpresent) == 0) {
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson char *path;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson (void) printf(" was %s", path);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson } else if (vs->vs_aux != 0) {
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson (void) printf(" ");
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson switch (vs->vs_aux) {
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson case VDEV_AUX_OPEN_FAILED:
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson (void) printf(gettext("cannot open"));
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson break;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson case VDEV_AUX_BAD_GUID_SUM:
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson (void) printf(gettext("missing device"));
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson break;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson case VDEV_AUX_NO_REPLICAS:
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson (void) printf(gettext("insufficient replicas"));
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson break;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson case VDEV_AUX_VERSION_NEWER:
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson (void) printf(gettext("newer version"));
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson break;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden case VDEV_AUX_UNSUP_FEAT:
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) printf(gettext("unsupported feature(s)"));
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden break;
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson case VDEV_AUX_SPARED:
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID,
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson &cb.cb_guid) == 0);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson if (zpool_iter(g_zfs, find_spare, &cb) == 1) {
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson if (strcmp(zpool_get_name(cb.cb_zhp),
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson zpool_get_name(zhp)) == 0)
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson (void) printf(gettext("currently in "
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson "use"));
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson else
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson (void) printf(gettext("in use by "
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson "pool '%s'"),
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson zpool_get_name(cb.cb_zhp));
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson zpool_close(cb.cb_zhp);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson } else {
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson (void) printf(gettext("currently in use"));
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson }
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson break;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson case VDEV_AUX_ERR_EXCEEDED:
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson (void) printf(gettext("too many errors"));
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson break;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson case VDEV_AUX_IO_FAILURE:
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson (void) printf(gettext("experienced I/O failures"));
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson break;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson case VDEV_AUX_BAD_LOG:
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson (void) printf(gettext("bad intent log"));
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson break;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock case VDEV_AUX_EXTERNAL:
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock (void) printf(gettext("external device fault"));
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock break;
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante case VDEV_AUX_SPLIT_POOL:
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante (void) printf(gettext("split into new pool"));
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante break;
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson default:
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson (void) printf(gettext("corrupted data"));
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson break;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson }
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling }
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void) nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_SCAN_STATS,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (uint64_t **)&ps, &c);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (ps && ps->pss_state == DSS_SCANNING &&
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling vs->vs_scan_processed != 0 && children == 0) {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void) printf(gettext(" (%s)"),
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (ps->pss_func == POOL_SCAN_RESILVER) ?
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling "resilvering" : "repairing");
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson }
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson (void) printf("\n");
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson for (c = 0; c < children; c++) {
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson uint64_t islog = B_FALSE, ishole = B_FALSE;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson /* Don't print logs or holes here */
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson (void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG,
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson &islog);
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson (void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_HOLE,
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson &ishole);
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson if (islog || ishole)
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson continue;
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson vname = zpool_vdev_name(g_zfs, zhp, child[c], B_TRUE);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson print_status_config(zhp, vname, child[c],
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson namewidth, depth + 2, isspare);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson free(vname);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson }
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson}
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print the configuration of an exported pool. Iterate over all vdevs in the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * pool, printing out the name and status for each one.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilsonprint_import_config(const char *name, nvlist_t *nv, int namewidth, int depth)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t **child;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint_t c, children;
fa9e4066f08beec538e775443c5be79dd423fcabahrens vdev_stat_t *vs;
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock char *type, *vname;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &type) == 0);
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson if (strcmp(type, VDEV_TYPE_MISSING) == 0 ||
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson strcmp(type, VDEV_TYPE_HOLE) == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling verify(nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_VDEV_STATS,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (uint64_t **)&vs, &c) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("\t%*s%-*s", depth, "", namewidth - depth, name);
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf(" %s", zpool_state_to_name(vs->vs_state, vs->vs_aux));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (vs->vs_aux != 0) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (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:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("missing device"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case VDEV_AUX_NO_REPLICAS:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("insufficient replicas"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case VDEV_AUX_VERSION_NEWER:
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("newer version"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock break;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden case VDEV_AUX_UNSUP_FEAT:
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) printf(gettext("unsupported feature(s)"));
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden break;
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock case VDEV_AUX_ERR_EXCEEDED:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) printf(gettext("too many errors"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock break;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens default:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("corrupted data"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &child, &children) != 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock for (c = 0; c < children; c++) {
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin uint64_t is_log = B_FALSE;
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin (void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG,
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin &is_log);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson if (is_log)
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin continue;
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson vname = zpool_vdev_name(g_zfs, NULL, child[c], B_TRUE);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson print_import_config(vname, child[c], namewidth, depth + 2);
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock free(vname);
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_L2CACHE,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan &child, &children) == 0) {
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan (void) printf(gettext("\tcache\n"));
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan for (c = 0; c < children; c++) {
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson vname = zpool_vdev_name(g_zfs, NULL, child[c], B_FALSE);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan (void) printf("\t %s\n", vname);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan free(vname);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan }
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan }
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_SPARES,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan &child, &children) == 0) {
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan (void) printf(gettext("\tspares\n"));
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan for (c = 0; c < children; c++) {
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson vname = zpool_vdev_name(g_zfs, NULL, child[c], B_FALSE);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan (void) printf("\t %s\n", vname);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan free(vname);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan }
99653d4ee642c6528e88224f12409a5f23060994eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson/*
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson * Print log vdevs.
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson * Logs are recorded as top level vdevs in the main pool child array
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson * but with "is_log" set to 1. We use either print_status_config() or
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson * print_import_config() to print the top level logs then any log
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson * children (eg mirrored slogs) are printed recursively - which
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson * works because only the top level vdev is marked "is_log"
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson */
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilsonstatic void
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilsonprint_logs(zpool_handle_t *zhp, nvlist_t *nv, int namewidth, boolean_t verbose)
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson{
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson uint_t c, children;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson nvlist_t **child;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN, &child,
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson &children) != 0)
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson return;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson (void) printf(gettext("\tlogs\n"));
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson for (c = 0; c < children; c++) {
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson uint64_t is_log = B_FALSE;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson char *name;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson (void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG,
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson &is_log);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson if (!is_log)
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson continue;
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson name = zpool_vdev_name(g_zfs, zhp, child[c], B_TRUE);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson if (verbose)
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson print_status_config(zhp, name, child[c], namewidth,
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson 2, B_FALSE);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson else
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson print_import_config(name, child[c], namewidth, 2);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson free(name);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson }
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson}
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Display the status for the given pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void
fa9e4066f08beec538e775443c5be79dd423fcabahrensshow_import(nvlist_t *config)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens 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;
46657f8d750bdb71753495ce2919170f126b8e34mmusante const char *health;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint_t vsc;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int namewidth;
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald char *comment;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &name) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &guid) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_STATE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &pool_state) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &nvroot) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_VDEV_STATS,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (uint64_t **)&vs, &vsc) == 0);
990b4856d0eaada6f8140335733a1b1771ed2746lling health = zpool_state_to_name(vs->vs_state, vs->vs_aux);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens reason = zpool_import_status(config, &msgid);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" pool: %s\n"), name);
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" id: %llu\n"), (u_longlong_t)guid);
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" state: %s"), health);
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm if (pool_state == POOL_STATE_DESTROYED)
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) printf(gettext(" (DESTROYED)"));
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm (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:
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" status: One or more devices are "
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald "missing from the system.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_CORRUPT_LABEL_R:
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_CORRUPT_LABEL_NR:
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" status: One or more devices contains "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "corrupted data.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_CORRUPT_DATA:
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald gettext(" status: The pool data is corrupted.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling case ZPOOL_STATUS_OFFLINE_DEV:
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" status: One or more devices "
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling "are offlined.\n"));
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling break;
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock case ZPOOL_STATUS_CORRUPT_POOL:
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" status: The pool metadata is "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "corrupted.\n"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock break;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case ZPOOL_STATUS_VERSION_OLDER:
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext(" status: The pool is formatted using a "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "legacy on-disk version.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock break;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case ZPOOL_STATUS_VERSION_NEWER:
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" status: The pool is formatted using an "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "incompatible version.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock break;
b87f3af36bb994656da117319f5129ddfd05ed21perrin
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden case ZPOOL_STATUS_FEAT_DISABLED:
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext(" status: Some supported features are "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "not enabled on the pool.\n"));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden break;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden case ZPOOL_STATUS_UNSUP_FEAT_READ:
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) printf(gettext("status: The pool uses the following "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "feature(s) not supported on this sytem:\n"));
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden zpool_print_unsup_feat(config);
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden break;
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden case ZPOOL_STATUS_UNSUP_FEAT_WRITE:
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) printf(gettext("status: The pool can only be accessed "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "in read-only mode on this system. It\n\tcannot be "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "accessed in read-write mode because it uses the "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "following\n\tfeature(s) not supported on this system:\n"));
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden zpool_print_unsup_feat(config);
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden break;
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden
95173954d2b811ceb583a9012c3b16e1d0dd6438ek case ZPOOL_STATUS_HOSTID_MISMATCH:
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" status: The pool was last accessed by "
95173954d2b811ceb583a9012c3b16e1d0dd6438ek "another system.\n"));
95173954d2b811ceb583a9012c3b16e1d0dd6438ek break;
b87f3af36bb994656da117319f5129ddfd05ed21perrin
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock case ZPOOL_STATUS_FAULTED_DEV_R:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock case ZPOOL_STATUS_FAULTED_DEV_NR:
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" status: One or more devices are "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "faulted.\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock break;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
b87f3af36bb994656da117319f5129ddfd05ed21perrin case ZPOOL_STATUS_BAD_LOG:
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" status: An intent log record cannot be "
b87f3af36bb994656da117319f5129ddfd05ed21perrin "read.\n"));
b87f3af36bb994656da117319f5129ddfd05ed21perrin break;
b87f3af36bb994656da117319f5129ddfd05ed21perrin
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling case ZPOOL_STATUS_RESILVERING:
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" status: One or more devices were being "
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling "resilvered.\n"));
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling break;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
fa9e4066f08beec538e775443c5be79dd423fcabahrens default:
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * No other status can be seen when importing pools.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens assert(reason == ZPOOL_STATUS_OK);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print out an action according to the overall state of the pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
46657f8d750bdb71753495ce2919170f126b8e34mmusante if (vs->vs_state == VDEV_STATE_HEALTHY) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (reason == ZPOOL_STATUS_VERSION_OLDER ||
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden reason == ZPOOL_STATUS_FEAT_DISABLED) {
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" action: The pool can be "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "imported using its name or numeric identifier, "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "though\n\tsome features will not be available "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "without an explicit 'zpool upgrade'.\n"));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden } else if (reason == ZPOOL_STATUS_HOSTID_MISMATCH) {
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" action: The pool can be "
95173954d2b811ceb583a9012c3b16e1d0dd6438ek "imported using its name or numeric "
95173954d2b811ceb583a9012c3b16e1d0dd6438ek "identifier and\n\tthe '-f' flag.\n"));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden } else {
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" action: The pool can be "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "imported using its name or numeric "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "identifier.\n"));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden }
46657f8d750bdb71753495ce2919170f126b8e34mmusante } else if (vs->vs_state == VDEV_STATE_DEGRADED) {
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" action: The pool can be imported "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "despite missing or damaged devices. The\n\tfault "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "tolerance of the pool may be compromised if imported.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock switch (reason) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case ZPOOL_STATUS_VERSION_NEWER:
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (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"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock break;
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden case ZPOOL_STATUS_UNSUP_FEAT_READ:
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) printf(gettext("action: The pool cannot be "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "imported. Access the pool on a system that "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "supports\n\tthe required feature(s), or recreate "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "the pool from backup.\n"));
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden break;
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden case ZPOOL_STATUS_UNSUP_FEAT_WRITE:
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) printf(gettext("action: The pool cannot be "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "imported in read-write mode. Import the pool "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "with\n"
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "\t\"-o readonly=on\", access the pool on a system "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "that supports the\n\trequired feature(s), or "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "recreate the pool from backup.\n"));
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden break;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case ZPOOL_STATUS_MISSING_DEV_R:
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case ZPOOL_STATUS_MISSING_DEV_NR:
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case ZPOOL_STATUS_BAD_GUID_SUM:
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" action: The pool cannot be "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "imported. Attach the missing\n\tdevices and try "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "again.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock break;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock default:
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" action: The pool cannot be "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "imported due to damaged devices or data.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald /* Print the comment attached to the pool. */
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald if (nvlist_lookup_string(config, ZPOOL_CONFIG_COMMENT, &comment) == 0)
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext("comment: %s\n"), comment);
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald
46657f8d750bdb71753495ce2919170f126b8e34mmusante /*
46657f8d750bdb71753495ce2919170f126b8e34mmusante * If the state is "closed" or "can't open", and the aux state
46657f8d750bdb71753495ce2919170f126b8e34mmusante * is "corrupt data":
46657f8d750bdb71753495ce2919170f126b8e34mmusante */
46657f8d750bdb71753495ce2919170f126b8e34mmusante if (((vs->vs_state == VDEV_STATE_CLOSED) ||
46657f8d750bdb71753495ce2919170f126b8e34mmusante (vs->vs_state == VDEV_STATE_CANT_OPEN)) &&
46657f8d750bdb71753495ce2919170f126b8e34mmusante (vs->vs_aux == VDEV_AUX_CORRUPT_DATA)) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (pool_state == POOL_STATE_DESTROYED)
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("\tThe pool was destroyed, "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "but can be imported using the '-Df' flags.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock else if (pool_state != POOL_STATE_EXPORTED)
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("\tThe pool may be active on "
18ce54df8809e9f672d0ed1a53e99669df0a6df0ek "another system, but can be imported using\n\t"
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "the '-f' flag.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (msgid != NULL)
654b400c387942fc00d4f6869539adbd7b25fbceJoshua M. Clulow (void) printf(gettext(" see: http://illumos.org/msg/%s\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens msgid);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" config:\n\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock namewidth = max_width(NULL, nvroot, 0, 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (namewidth < 10)
fa9e4066f08beec538e775443c5be79dd423fcabahrens namewidth = 10;
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson print_import_config(name, nvroot, namewidth, 0);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson if (num_logs(nvroot) > 0)
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson print_logs(NULL, nvroot, namewidth, B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (reason == ZPOOL_STATUS_BAD_GUID_SUM) {
46657f8d750bdb71753495ce2919170f126b8e34mmusante (void) printf(gettext("\n\tAdditional devices are known to "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "be part of this pool, though their\n\texact "
46657f8d750bdb71753495ce2919170f126b8e34mmusante "configuration cannot be determined.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Perform the import for the given configuration. This passes the heavy
990b4856d0eaada6f8140335733a1b1771ed2746lling * lifting off to zpool_import_props(), and then mounts the datasets contained
990b4856d0eaada6f8140335733a1b1771ed2746lling * within the pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensdo_import(nvlist_t *config, const char *newname, const char *mntopts,
4b964ada391d44b89d97e7e930e6a9a136e0a2f4George Wilson nvlist_t *props, int flags)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_handle_t *zhp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *name;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t state;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock uint64_t version;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &name) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64(config,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZPOOL_CONFIG_POOL_STATE, &state) == 0);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock verify(nvlist_lookup_uint64(config,
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock ZPOOL_CONFIG_VERSION, &version) == 0);
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden if (!SPA_VERSION_IS_SUPPORTED(version)) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) fprintf(stderr, gettext("cannot import '%s': pool "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "is formatted using an unsupported ZFS version\n"), name);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock return (1);
4b964ada391d44b89d97e7e930e6a9a136e0a2f4George Wilson } else if (state != POOL_STATE_EXPORTED &&
4b964ada391d44b89d97e7e930e6a9a136e0a2f4George Wilson !(flags & ZFS_IMPORT_ANY_HOST)) {
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 "
95173954d2b811ceb583a9012c3b16e1d0dd6438ek "(hostid: 0x%lx) on %s"), name, hostname,
95173954d2b811ceb583a9012c3b16e1d0dd6438ek (unsigned long)hostid,
95173954d2b811ceb583a9012c3b16e1d0dd6438ek asctime(localtime(&t)));
95173954d2b811ceb583a9012c3b16e1d0dd6438ek (void) fprintf(stderr, gettext("use '-f' to "
95173954d2b811ceb583a9012c3b16e1d0dd6438ek "import anyway\n"));
95173954d2b811ceb583a9012c3b16e1d0dd6438ek return (1);
95173954d2b811ceb583a9012c3b16e1d0dd6438ek }
95173954d2b811ceb583a9012c3b16e1d0dd6438ek } else {
95173954d2b811ceb583a9012c3b16e1d0dd6438ek (void) fprintf(stderr, gettext("cannot import '%s': "
95173954d2b811ceb583a9012c3b16e1d0dd6438ek "pool may be in use from other system\n"), name);
95173954d2b811ceb583a9012c3b16e1d0dd6438ek (void) fprintf(stderr, gettext("use '-f' to import "
95173954d2b811ceb583a9012c3b16e1d0dd6438ek "anyway\n"));
95173954d2b811ceb583a9012c3b16e1d0dd6438ek return (1);
95173954d2b811ceb583a9012c3b16e1d0dd6438ek }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
4b964ada391d44b89d97e7e930e6a9a136e0a2f4George Wilson if (zpool_import_props(g_zfs, config, newname, props, flags) != 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (newname != NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens name = (char *)newname;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
4f0f5e5be9d3811b437d9156675d584e2a2f204aVictor Latushkin if ((zhp = zpool_open_canfail(g_zfs, name)) == NULL)
4f0f5e5be9d3811b437d9156675d584e2a2f204aVictor Latushkin return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
379c004d1f26b343f034bba8a350290691d00d38Eric Schrock if (zpool_get_state(zhp) != POOL_STATE_UNAVAIL &&
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson !(flags & ZFS_IMPORT_ONLY) &&
379c004d1f26b343f034bba8a350290691d00d38Eric Schrock zpool_enable_datasets(zhp, mntopts, 0) != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm * zpool import [-d dir] [-D]
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock * import [-o mntopts] [-o prop=value] ... [-R root] [-D]
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock * [-d dir | -c cachefile] [-f] -a
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock * import [-o mntopts] [-o prop=value] ... [-R root] [-D]
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley * [-d dir | -c cachefile] [-f] [-n] [-F] <pool | id> [newpool]
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock *
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock * -c Read pool information from a cachefile instead of searching
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock * devices.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -d Scan in a specific directory, other than /dev/dsk. More than
fa9e4066f08beec538e775443c5be79dd423fcabahrens * one directory can be specified using multiple '-d' options.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm * -D Scan for previously destroyed pools or import all or only
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm * specified destroyed pools.
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm *
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 *
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley * -V Import even in the presence of faulted vdevs. This is an
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock * intentionally undocumented option for testing purposes, and
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock * treats the pool configuration as complete, leaving any bad
4f0f5e5be9d3811b437d9156675d584e2a2f204aVictor Latushkin * vdevs in the FAULTED state. In other words, it does verbatim
4f0f5e5be9d3811b437d9156675d584e2a2f204aVictor Latushkin * import.
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock *
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley * -f Force import, even if it appears that the pool is active.
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley *
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley * -F Attempt rewind if necessary.
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley *
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley * -n See if rewind would work, but don't actually rewind.
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley *
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson * -N Import the pool but don't mount datasets.
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson *
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson * -T Specify a starting txg to use for import. This option is
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson * intentionally undocumented option for testing purposes.
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -a Import all pools found.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
990b4856d0eaada6f8140335733a1b1771ed2746lling * -o Set property=value and/or temporary mount options (without '=').
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The import command scans for pools to import, and import pools based on pool
fa9e4066f08beec538e775443c5be79dd423fcabahrens * name and GUID. The pool can also be renamed as part of the import process.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_import(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens char **searchdirs = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int nsearch = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c;
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante int err = 0;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock nvlist_t *pools = NULL;
99653d4ee642c6528e88224f12409a5f23060994eschrock boolean_t do_all = B_FALSE;
99653d4ee642c6528e88224f12409a5f23060994eschrock boolean_t do_destroyed = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *mntopts = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvpair_t *elem;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *config;
24e697d414a4df0377b91a2875f029e7b5f97247ck uint64_t searchguid = 0;
24e697d414a4df0377b91a2875f029e7b5f97247ck char *searchname = NULL;
990b4856d0eaada6f8140335733a1b1771ed2746lling char *propval;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *found_config;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley nvlist_t *policy = NULL;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks nvlist_t *props = NULL;
99653d4ee642c6528e88224f12409a5f23060994eschrock boolean_t first;
4b964ada391d44b89d97e7e930e6a9a136e0a2f4George Wilson int flags = ZFS_IMPORT_NORMAL;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley uint32_t rewind_policy = ZPOOL_NO_REWIND;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley boolean_t dryrun = B_FALSE;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley boolean_t do_rewind = B_FALSE;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley boolean_t xtreme_rewind = B_FALSE;
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson uint64_t pool_state, txg = -1ULL;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock char *cachefile = NULL;
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante importargs_t idata = { 0 };
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson char *endptr;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson while ((c = getopt(argc, argv, ":aCc:d:DEfFmnNo:rR:T:VX")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'a':
99653d4ee642c6528e88224f12409a5f23060994eschrock do_all = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock case 'c':
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock cachefile = optarg;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'd':
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (searchdirs == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens searchdirs = safe_malloc(sizeof (char *));
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens char **tmp = safe_malloc((nsearch + 1) *
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (char *));
fa9e4066f08beec538e775443c5be79dd423fcabahrens bcopy(searchdirs, tmp, nsearch *
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (char *));
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(searchdirs);
fa9e4066f08beec538e775443c5be79dd423fcabahrens searchdirs = tmp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens searchdirs[nsearch++] = optarg;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm case 'D':
99653d4ee642c6528e88224f12409a5f23060994eschrock do_destroyed = B_TRUE;
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'f':
4b964ada391d44b89d97e7e930e6a9a136e0a2f4George Wilson flags |= ZFS_IMPORT_ANY_HOST;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock case 'F':
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley do_rewind = B_TRUE;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley break;
4b964ada391d44b89d97e7e930e6a9a136e0a2f4George Wilson case 'm':
4b964ada391d44b89d97e7e930e6a9a136e0a2f4George Wilson flags |= ZFS_IMPORT_MISSING_LOG;
4b964ada391d44b89d97e7e930e6a9a136e0a2f4George Wilson break;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley case 'n':
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley dryrun = B_TRUE;
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock break;
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson case 'N':
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson flags |= ZFS_IMPORT_ONLY;
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'o':
990b4856d0eaada6f8140335733a1b1771ed2746lling if ((propval = strchr(optarg, '=')) != NULL) {
990b4856d0eaada6f8140335733a1b1771ed2746lling *propval = '\0';
990b4856d0eaada6f8140335733a1b1771ed2746lling propval++;
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh if (add_prop_list(optarg, propval,
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh &props, B_TRUE))
990b4856d0eaada6f8140335733a1b1771ed2746lling goto error;
990b4856d0eaada6f8140335733a1b1771ed2746lling } else {
990b4856d0eaada6f8140335733a1b1771ed2746lling mntopts = optarg;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'R':
990b4856d0eaada6f8140335733a1b1771ed2746lling if (add_prop_list(zpool_prop_to_name(
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh ZPOOL_PROP_ALTROOT), optarg, &props, B_TRUE))
990b4856d0eaada6f8140335733a1b1771ed2746lling goto error;
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock if (nvlist_lookup_string(props,
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock zpool_prop_to_name(ZPOOL_PROP_CACHEFILE),
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock &propval) == 0)
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock break;
990b4856d0eaada6f8140335733a1b1771ed2746lling if (add_prop_list(zpool_prop_to_name(
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh ZPOOL_PROP_CACHEFILE), "none", &props, B_TRUE))
990b4856d0eaada6f8140335733a1b1771ed2746lling goto error;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson case 'T':
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson errno = 0;
e42d205944d245bf5d1c4fc45261cbe09e28a7b9Matthew Ahrens txg = strtoull(optarg, &endptr, 0);
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson if (errno != 0 || *endptr != '\0') {
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson (void) fprintf(stderr,
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson gettext("invalid txg value\n"));
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson usage(B_FALSE);
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson }
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson rewind_policy = ZPOOL_DO_REWIND | ZPOOL_EXTREME_REWIND;
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson break;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley case 'V':
4b964ada391d44b89d97e7e930e6a9a136e0a2f4George Wilson flags |= ZFS_IMPORT_VERBATIM;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley break;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley case 'X':
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley xtreme_rewind = B_TRUE;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ':':
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing argument for "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "'%c' option\n"), optopt);
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
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;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock if (cachefile && nsearch != 0) {
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock (void) fprintf(stderr, gettext("-c is incompatible with -d\n"));
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock usage(B_FALSE);
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock }
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley if ((dryrun || xtreme_rewind) && !do_rewind) {
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley (void) fprintf(stderr,
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley gettext("-n or -X only meaningful with -F\n"));
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley usage(B_FALSE);
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley }
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley if (dryrun)
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley rewind_policy = ZPOOL_TRY_REWIND;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley else if (do_rewind)
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley rewind_policy = ZPOOL_DO_REWIND;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley if (xtreme_rewind)
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley rewind_policy |= ZPOOL_EXTREME_REWIND;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley /* In the future, we can capture further policy and include it here */
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley if (nvlist_alloc(&policy, NV_UNIQUE_NAME, 0) != 0 ||
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson nvlist_add_uint64(policy, ZPOOL_REWIND_REQUEST_TXG, txg) != 0 ||
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley nvlist_add_uint32(policy, ZPOOL_REWIND_REQUEST, rewind_policy) != 0)
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley goto error;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (searchdirs == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens searchdirs = safe_malloc(sizeof (char *));
6401734d545a04c18f68b448202f9d9a77216bb9Will Andrews searchdirs[0] = ZFS_DISK_ROOT;
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"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc > 2) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("too many arguments\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock 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"));
99653d4ee642c6528e88224f12409a5f23060994eschrock free(searchdirs);
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley nvlist_free(policy);
fa9e4066f08beec538e775443c5be79dd423fcabahrens 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 *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * <id> Find the pool that corresponds to the given GUID/pool
fa9e4066f08beec538e775443c5be79dd423fcabahrens * name and import that one.
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm *
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm * -D Above options applies only to destroyed pools.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *endptr;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens errno = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens searchguid = strtoull(argv[0], &endptr, 10);
9edf9ebd727ac2046be0269a5e275785e2131bcbPrasad Joshi if (errno != 0 || *endptr != '\0') {
fa9e4066f08beec538e775443c5be79dd423fcabahrens searchname = argv[0];
9edf9ebd727ac2046be0269a5e275785e2131bcbPrasad Joshi searchguid = 0;
9edf9ebd727ac2046be0269a5e275785e2131bcbPrasad Joshi }
fa9e4066f08beec538e775443c5be79dd423fcabahrens found_config = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
24e697d414a4df0377b91a2875f029e7b5f97247ck /*
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante * User specified a name or guid. Ensure it's unique.
24e697d414a4df0377b91a2875f029e7b5f97247ck */
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante idata.unique = B_TRUE;
24e697d414a4df0377b91a2875f029e7b5f97247ck }
24e697d414a4df0377b91a2875f029e7b5f97247ck
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante idata.path = searchdirs;
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante idata.paths = nsearch;
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante idata.poolname = searchname;
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante idata.guid = searchguid;
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante idata.cachefile = cachefile;
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante pools = zpool_search_import(g_zfs, &idata);
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante if (pools != NULL && idata.exists &&
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante (argc == 1 || strcmp(argv[0], argv[1]) == 0)) {
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante (void) fprintf(stderr, gettext("cannot import '%s': "
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante "a pool with that name already exists\n"),
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante argv[0]);
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante (void) fprintf(stderr, gettext("use the form '%s "
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante "<pool | id> <newpool>' to give it a new name\n"),
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante "zpool import");
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante err = 1;
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante } else if (pools == NULL && idata.exists) {
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante (void) fprintf(stderr, gettext("cannot import '%s': "
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante "a pool with that name is already created/imported,\n"),
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante argv[0]);
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante (void) fprintf(stderr, gettext("and no additional pools "
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante "with that name were found\n"));
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante err = 1;
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante } else if (pools == NULL) {
24e697d414a4df0377b91a2875f029e7b5f97247ck if (argc != 0) {
24e697d414a4df0377b91a2875f029e7b5f97247ck (void) fprintf(stderr, gettext("cannot import '%s': "
24e697d414a4df0377b91a2875f029e7b5f97247ck "no such pool available\n"), argv[0]);
24e697d414a4df0377b91a2875f029e7b5f97247ck }
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante err = 1;
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante }
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante if (err == 1) {
24e697d414a4df0377b91a2875f029e7b5f97247ck free(searchdirs);
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley nvlist_free(policy);
24e697d414a4df0377b91a2875f029e7b5f97247ck return (1);
24e697d414a4df0377b91a2875f029e7b5f97247ck }
24e697d414a4df0377b91a2875f029e7b5f97247ck
24e697d414a4df0377b91a2875f029e7b5f97247ck /*
24e697d414a4df0377b91a2875f029e7b5f97247ck * At this point we have a list of import candidate configs. Even if
24e697d414a4df0377b91a2875f029e7b5f97247ck * we were searching by pool name or guid, we still need to
24e697d414a4df0377b91a2875f029e7b5f97247ck * post-process the list to deal with pool state and possible
24e697d414a4df0377b91a2875f029e7b5f97247ck * duplicate names.
24e697d414a4df0377b91a2875f029e7b5f97247ck */
fa9e4066f08beec538e775443c5be79dd423fcabahrens err = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens elem = NULL;
99653d4ee642c6528e88224f12409a5f23060994eschrock first = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((elem = nvlist_next_nvpair(pools, elem)) != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvpair_value_nvlist(elem, &config) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_STATE,
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm &pool_state) == 0);
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm if (!do_destroyed && pool_state == POOL_STATE_DESTROYED)
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm continue;
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm if (do_destroyed && pool_state != POOL_STATE_DESTROYED)
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm continue;
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley verify(nvlist_add_nvlist(config, ZPOOL_REWIND_POLICY,
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley policy) == 0);
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (first)
99653d4ee642c6528e88224f12409a5f23060994eschrock first = B_FALSE;
3bb79bece53191f2cf27aa61a72ea1784a7ce700eschrock else if (!do_all)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley if (do_all) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens err |= do_import(config, NULL, mntopts,
4b964ada391d44b89d97e7e930e6a9a136e0a2f4George Wilson props, flags);
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens show_import(config);
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else if (searchname != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens 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"));
99653d4ee642c6528e88224f12409a5f23060994eschrock 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,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZPOOL_CONFIG_POOL_GUID, &guid) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (guid == searchguid)
fa9e4066f08beec538e775443c5be79dd423fcabahrens 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]);
99653d4ee642c6528e88224f12409a5f23060994eschrock err = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens err |= do_import(found_config, argc == 1 ? NULL :
4b964ada391d44b89d97e7e930e6a9a136e0a2f4George Wilson argv[1], mntopts, props, flags);
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
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarkserror:
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock nvlist_free(props);
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_free(pools);
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley nvlist_free(policy);
99653d4ee642c6528e88224f12409a5f23060994eschrock free(searchdirs);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (err ? 1 : 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct iostat_cbdata {
4263d13f00c9691fa14620eff82abef795be0693George Wilson boolean_t cb_verbose;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int cb_namewidth;
4263d13f00c9691fa14620eff82abef795be0693George Wilson int cb_iteration;
4263d13f00c9691fa14620eff82abef795be0693George Wilson zpool_list_t *cb_list;
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");
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic void
fa9e4066f08beec538e775443c5be79dd423fcabahrensprint_iostat_header(iostat_cbdata_t *cb)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("%*s capacity operations bandwidth\n",
fa9e4066f08beec538e775443c5be79dd423fcabahrens cb->cb_namewidth, "");
485bbbf5450c6645352388d798251c1a89ef4c9cGeorge Wilson (void) printf("%-*s alloc free read write read write\n",
fa9e4066f08beec538e775443c5be79dd423fcabahrens cb->cb_namewidth, "pool");
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_iostat_separator(cb);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Display a single statistic.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
990b4856d0eaada6f8140335733a1b1771ed2746llingstatic void
fa9e4066f08beec538e775443c5be79dd423fcabahrensprint_one_stat(uint64_t value)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens char buf[64];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens zfs_nicenum(value, buf, sizeof (buf));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(" %5s", buf);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print out all the statistics for the given vdev. This can either be the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * toplevel configuration, or called recursively. If 'name' is NULL, then this
fa9e4066f08beec538e775443c5be79dd423fcabahrens * is a verbose output, and we don't want to display the toplevel pool stats.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrockprint_vdev_stats(zpool_handle_t *zhp, const char *name, nvlist_t *oldnv,
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock 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;
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock char *vname;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (oldnv != NULL) {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling verify(nvlist_lookup_uint64_array(oldnv,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling ZPOOL_CONFIG_VDEV_STATS, (uint64_t **)&oldvs, &c) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens oldvs = &zerovs;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling verify(nvlist_lookup_uint64_array(newnv, ZPOOL_CONFIG_VDEV_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] -
fa9e4066f08beec538e775443c5be79dd423fcabahrens oldvs->vs_bytes[ZIO_TYPE_WRITE])));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!cb->cb_verbose)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(newnv, ZPOOL_CONFIG_CHILDREN,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &newchild, &children) != 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (oldnv && nvlist_lookup_nvlist_array(oldnv, ZPOOL_CONFIG_CHILDREN,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &oldchild, &c) != 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock for (c = 0; c < children; c++) {
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch uint64_t ishole = B_FALSE, islog = B_FALSE;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch (void) nvlist_lookup_uint64(newchild[c], ZPOOL_CONFIG_IS_HOLE,
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch &ishole);
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch (void) nvlist_lookup_uint64(newchild[c], ZPOOL_CONFIG_IS_LOG,
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch &islog);
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch if (ishole || islog)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling continue;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson vname = zpool_vdev_name(g_zfs, zhp, newchild[c], B_FALSE);
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock print_vdev_stats(zhp, vname, oldnv ? oldchild[c] : NULL,
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock newchild[c], cb, depth + 2);
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock free(vname);
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock }
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch /*
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch * Log device section
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch */
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch if (num_logs(newnv) > 0) {
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch (void) printf("%-*s - - - - - "
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch "-\n", cb->cb_namewidth, "logs");
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch for (c = 0; c < children; c++) {
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch uint64_t islog = B_FALSE;
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch (void) nvlist_lookup_uint64(newchild[c],
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch ZPOOL_CONFIG_IS_LOG, &islog);
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch if (islog) {
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch vname = zpool_vdev_name(g_zfs, zhp, newchild[c],
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch B_FALSE);
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch print_vdev_stats(zhp, vname, oldnv ?
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch oldchild[c] : NULL, newchild[c],
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch cb, depth + 2);
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch free(vname);
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch }
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch }
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch }
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch
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;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (oldnv && nvlist_lookup_nvlist_array(oldnv, ZPOOL_CONFIG_L2CACHE,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan &oldchild, &c) != 0)
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan return;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (children > 0) {
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan (void) printf("%-*s - - - - - "
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan "-\n", cb->cb_namewidth, "cache");
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan for (c = 0; c < children; c++) {
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson vname = zpool_vdev_name(g_zfs, zhp, newchild[c],
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson B_FALSE);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan print_vdev_stats(zhp, vname, oldnv ? oldchild[c] : NULL,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan newchild[c], cb, depth + 2);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan free(vname);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan }
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrockstatic int
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrockrefresh_iostat(zpool_handle_t *zhp, void *data)
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock{
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock iostat_cbdata_t *cb = data;
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock boolean_t missing;
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock /*
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * If the pool has disappeared, remove it from the list and continue.
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock */
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock if (zpool_refresh_stats(zhp, &missing) != 0)
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock return (-1);
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock if (missing)
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock pool_list_remove(cb->cb_list, zhp);
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock return (0);
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock}
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Callback to print out the iostats for the given pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrensprint_iostat(zpool_handle_t *zhp, void *data)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens iostat_cbdata_t *cb = data;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *oldconfig, *newconfig;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *oldnvroot, *newnvroot;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock newconfig = zpool_get_config(zhp, &oldconfig);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock if (cb->cb_iteration == 1)
fa9e4066f08beec538e775443c5be79dd423fcabahrens oldconfig = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist(newconfig, ZPOOL_CONFIG_VDEV_TREE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &newnvroot) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock if (oldconfig == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens oldnvroot = NULL;
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock else
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock verify(nvlist_lookup_nvlist(oldconfig, ZPOOL_CONFIG_VDEV_TREE,
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock &oldnvroot) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print out the statistics for the pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock print_vdev_stats(zhp, zpool_get_name(zhp), oldnvroot, newnvroot, cb, 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (cb->cb_verbose)
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_iostat_separator(cb);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrensget_namewidth(zpool_handle_t *zhp, void *data)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens iostat_cbdata_t *cb = data;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *config, *nvroot;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock 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
e1d5e507a890a0408b8299bf95cad4678fc2390eFrederik Wessels cb->cb_namewidth = max_width(zhp, nvroot, 0,
e1d5e507a890a0408b8299bf95cad4678fc2390eFrederik Wessels cb->cb_namewidth);
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/*
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * Parse the input string, get the 'interval' and 'count' value if there is one.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Lingstatic void
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Lingget_interval_count(int *argcp, char **argv, unsigned long *iv,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling unsigned long *cnt)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens unsigned long interval = 0, count = 0;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling int argc = *argcp, errno;
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"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
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
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If the last argument is also an integer, then we have both a count
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * and an interval.
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"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Ignore the last parameter
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc--;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens interval = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling *iv = interval;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling *cnt = count;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling *argcp = argc;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling}
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Lingstatic void
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Lingget_timestamp_arg(char c)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling{
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (c == 'u')
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling timestamp_fmt = UDATE;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling else if (c == 'd')
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling timestamp_fmt = DDATE;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling else
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling usage(B_FALSE);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling}
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling/*
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * zpool iostat [-v] [-T d|u] [pool] ... [interval [count]]
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling *
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * -v Display statistics for individual vdevs
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * -T Display a timestamp in date(1) or Unix format
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling *
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * This command can be tricky because we want to be able to deal with pool
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * creation/destruction as well as vdev configuration changes. The bulk of this
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * processing is handled by the pool_list_* routines in zpool_iter.c. We rely
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * on pool_list_update() to detect the addition of new pools. Configuration
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * changes are all handled within libzfs.
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling */
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Lingint
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Lingzpool_do_iostat(int argc, char **argv)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling{
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling int c;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling int ret;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling int npools;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling unsigned long interval = 0, count = 0;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling zpool_list_t *list;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling boolean_t verbose = B_FALSE;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling iostat_cbdata_t cb;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling /* check options */
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling while ((c = getopt(argc, argv, "T:v")) != -1) {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling switch (c) {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling case 'T':
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling get_timestamp_arg(*optarg);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling break;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling case 'v':
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling verbose = B_TRUE;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling break;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling case '?':
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void) fprintf(stderr, gettext("invalid option '%c'\n"),
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling optopt);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling usage(B_FALSE);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling }
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling }
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling argc -= optind;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling argv += optind;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling get_interval_count(&argc, argv, &interval, &count);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Construct the list of all interesting pools.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 0;
b1b8ab34de515a5e83206da22c3d7e563241b021lling if ((list = pool_list_get(argc, argv, NULL, &ret)) == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock if (pool_list_count(list) == 0 && argc != 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock pool_list_free(list);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (pool_list_count(list) == 0 && interval == 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock pool_list_free(list);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("no pools available\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Enter the main iostat loop.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens cb.cb_list = list;
fa9e4066f08beec538e775443c5be79dd423fcabahrens cb.cb_verbose = verbose;
fa9e4066f08beec538e775443c5be79dd423fcabahrens cb.cb_iteration = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens cb.cb_namewidth = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (;;) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens pool_list_update(list);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((npools = pool_list_count(list)) == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock /*
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * Refresh all statistics. This is done as an explicit step
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * before calculating the maximum name width, so that any
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * configuration changes are properly accounted for.
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock */
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) pool_list_iter(list, B_FALSE, refresh_iostat, &cb);
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock
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;
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) pool_list_iter(list, B_FALSE, get_namewidth, &cb);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
26fd77009b17f8c8fb32eb362584cfd635e87ad9Krishnendu Sadhukhan - Sun Microsystems if (timestamp_fmt != NODATE)
26fd77009b17f8c8fb32eb362584cfd635e87ad9Krishnendu Sadhukhan - Sun Microsystems print_timestamp(timestamp_fmt);
26fd77009b17f8c8fb32eb362584cfd635e87ad9Krishnendu Sadhukhan - Sun Microsystems
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If it's the first time, or verbose mode, print the header.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (++cb.cb_iteration == 1 || verbose)
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_iostat_header(&cb);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) pool_list_iter(list, B_FALSE, print_iostat, &cb);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
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
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock /*
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock * Flush the output so that redirection to a file isn't buffered
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock * indefinitely.
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock */
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock (void) fflush(stdout);
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (interval == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (count != 0 && --count == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) sleep(interval);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens pool_list_free(list);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct list_cbdata {
4263d13f00c9691fa14620eff82abef795be0693George Wilson boolean_t cb_verbose;
4263d13f00c9691fa14620eff82abef795be0693George Wilson int cb_namewidth;
99653d4ee642c6528e88224f12409a5f23060994eschrock boolean_t cb_scripted;
990b4856d0eaada6f8140335733a1b1771ed2746lling zprop_list_t *cb_proplist;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko boolean_t cb_literal;
fa9e4066f08beec538e775443c5be79dd423fcabahrens} list_cbdata_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Given a list of columns to display, output appropriate headers for each one.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
990b4856d0eaada6f8140335733a1b1771ed2746llingstatic void
4263d13f00c9691fa14620eff82abef795be0693George Wilsonprint_header(list_cbdata_t *cb)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
4263d13f00c9691fa14620eff82abef795be0693George Wilson zprop_list_t *pl = cb->cb_proplist;
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden char headerbuf[ZPOOL_MAXPROPLEN];
990b4856d0eaada6f8140335733a1b1771ed2746lling const char *header;
990b4856d0eaada6f8140335733a1b1771ed2746lling boolean_t first = B_TRUE;
990b4856d0eaada6f8140335733a1b1771ed2746lling boolean_t right_justify;
4263d13f00c9691fa14620eff82abef795be0693George Wilson size_t width = 0;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling for (; pl != NULL; pl = pl->pl_next) {
4263d13f00c9691fa14620eff82abef795be0693George Wilson width = pl->pl_width;
4263d13f00c9691fa14620eff82abef795be0693George Wilson if (first && cb->cb_verbose) {
4263d13f00c9691fa14620eff82abef795be0693George Wilson /*
4263d13f00c9691fa14620eff82abef795be0693George Wilson * Reset the width to accommodate the verbose listing
4263d13f00c9691fa14620eff82abef795be0693George Wilson * of devices.
4263d13f00c9691fa14620eff82abef795be0693George Wilson */
4263d13f00c9691fa14620eff82abef795be0693George Wilson width = cb->cb_namewidth;
4263d13f00c9691fa14620eff82abef795be0693George Wilson }
4263d13f00c9691fa14620eff82abef795be0693George Wilson
990b4856d0eaada6f8140335733a1b1771ed2746lling if (!first)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(" ");
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
990b4856d0eaada6f8140335733a1b1771ed2746lling first = B_FALSE;
990b4856d0eaada6f8140335733a1b1771ed2746lling
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden right_justify = B_FALSE;
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden if (pl->pl_prop != ZPROP_INVAL) {
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden header = zpool_prop_column_name(pl->pl_prop);
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden right_justify = zpool_prop_align_right(pl->pl_prop);
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden } else {
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden int i;
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden for (i = 0; pl->pl_user_prop[i] != '\0'; i++)
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden headerbuf[i] = toupper(pl->pl_user_prop[i]);
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden headerbuf[i] = '\0';
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden header = headerbuf;
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling if (pl->pl_next == NULL && !right_justify)
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf("%s", header);
990b4856d0eaada6f8140335733a1b1771ed2746lling else if (right_justify)
4263d13f00c9691fa14620eff82abef795be0693George Wilson (void) printf("%*s", width, header);
990b4856d0eaada6f8140335733a1b1771ed2746lling else
4263d13f00c9691fa14620eff82abef795be0693George Wilson (void) printf("%-*s", width, header);
4263d13f00c9691fa14620eff82abef795be0693George Wilson
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling/*
990b4856d0eaada6f8140335733a1b1771ed2746lling * Given a pool and a list of properties, print out all the properties according
990b4856d0eaada6f8140335733a1b1771ed2746lling * to the described layout.
990b4856d0eaada6f8140335733a1b1771ed2746lling */
990b4856d0eaada6f8140335733a1b1771ed2746llingstatic void
4263d13f00c9691fa14620eff82abef795be0693George Wilsonprint_pool(zpool_handle_t *zhp, list_cbdata_t *cb)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
4263d13f00c9691fa14620eff82abef795be0693George Wilson zprop_list_t *pl = cb->cb_proplist;
990b4856d0eaada6f8140335733a1b1771ed2746lling boolean_t first = B_TRUE;
990b4856d0eaada6f8140335733a1b1771ed2746lling char property[ZPOOL_MAXPROPLEN];
990b4856d0eaada6f8140335733a1b1771ed2746lling char *propstr;
990b4856d0eaada6f8140335733a1b1771ed2746lling boolean_t right_justify;
4263d13f00c9691fa14620eff82abef795be0693George Wilson size_t width;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling for (; pl != NULL; pl = pl->pl_next) {
4263d13f00c9691fa14620eff82abef795be0693George Wilson
4263d13f00c9691fa14620eff82abef795be0693George Wilson width = pl->pl_width;
4263d13f00c9691fa14620eff82abef795be0693George Wilson if (first && cb->cb_verbose) {
4263d13f00c9691fa14620eff82abef795be0693George Wilson /*
4263d13f00c9691fa14620eff82abef795be0693George Wilson * Reset the width to accommodate the verbose listing
4263d13f00c9691fa14620eff82abef795be0693George Wilson * of devices.
4263d13f00c9691fa14620eff82abef795be0693George Wilson */
4263d13f00c9691fa14620eff82abef795be0693George Wilson width = cb->cb_namewidth;
4263d13f00c9691fa14620eff82abef795be0693George Wilson }
4263d13f00c9691fa14620eff82abef795be0693George Wilson
990b4856d0eaada6f8140335733a1b1771ed2746lling if (!first) {
4263d13f00c9691fa14620eff82abef795be0693George Wilson if (cb->cb_scripted)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("\t");
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(" ");
990b4856d0eaada6f8140335733a1b1771ed2746lling } else {
990b4856d0eaada6f8140335733a1b1771ed2746lling first = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling right_justify = B_FALSE;
990b4856d0eaada6f8140335733a1b1771ed2746lling if (pl->pl_prop != ZPROP_INVAL) {
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson if (zpool_get_prop(zhp, pl->pl_prop, property,
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko sizeof (property), NULL, cb->cb_literal) != 0)
990b4856d0eaada6f8140335733a1b1771ed2746lling propstr = "-";
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
990b4856d0eaada6f8140335733a1b1771ed2746lling propstr = property;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling right_justify = zpool_prop_align_right(pl->pl_prop);
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden } else if ((zpool_prop_feature(pl->pl_user_prop) ||
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden zpool_prop_unsupported(pl->pl_user_prop)) &&
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden zpool_prop_get_feature(zhp, pl->pl_user_prop, property,
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden sizeof (property)) == 0) {
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden propstr = property;
990b4856d0eaada6f8140335733a1b1771ed2746lling } else {
990b4856d0eaada6f8140335733a1b1771ed2746lling propstr = "-";
990b4856d0eaada6f8140335733a1b1771ed2746lling }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling /*
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 */
4263d13f00c9691fa14620eff82abef795be0693George Wilson if (cb->cb_scripted || (pl->pl_next == NULL && !right_justify))
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf("%s", propstr);
990b4856d0eaada6f8140335733a1b1771ed2746lling else if (right_justify)
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf("%*s", width, propstr);
990b4856d0eaada6f8140335733a1b1771ed2746lling else
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf("%-*s", width, propstr);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf("\n");
990b4856d0eaada6f8140335733a1b1771ed2746lling}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
4263d13f00c9691fa14620eff82abef795be0693George Wilsonstatic void
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilsonprint_one_column(zpool_prop_t prop, uint64_t value, boolean_t scripted,
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson boolean_t valid)
4263d13f00c9691fa14620eff82abef795be0693George Wilson{
4263d13f00c9691fa14620eff82abef795be0693George Wilson char propval[64];
4263d13f00c9691fa14620eff82abef795be0693George Wilson boolean_t fixed;
4263d13f00c9691fa14620eff82abef795be0693George Wilson size_t width = zprop_width(prop, &fixed, ZFS_TYPE_POOL);
4263d13f00c9691fa14620eff82abef795be0693George Wilson
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson switch (prop) {
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson case ZPOOL_PROP_EXPANDSZ:
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson if (value == 0)
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson (void) strlcpy(propval, "-", sizeof (propval));
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson else
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson zfs_nicenum(value, propval, sizeof (propval));
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson break;
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson case ZPOOL_PROP_FRAGMENTATION:
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson if (value == ZFS_FRAG_INVALID) {
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson (void) strlcpy(propval, "-", sizeof (propval));
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson } else {
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson (void) snprintf(propval, sizeof (propval), "%llu%%",
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson value);
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson }
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson break;
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson case ZPOOL_PROP_CAPACITY:
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson (void) snprintf(propval, sizeof (propval), "%llu%%", value);
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson break;
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson default:
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson zfs_nicenum(value, propval, sizeof (propval));
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson }
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson if (!valid)
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson (void) strlcpy(propval, "-", sizeof (propval));
4263d13f00c9691fa14620eff82abef795be0693George Wilson
4263d13f00c9691fa14620eff82abef795be0693George Wilson if (scripted)
4263d13f00c9691fa14620eff82abef795be0693George Wilson (void) printf("\t%s", propval);
4263d13f00c9691fa14620eff82abef795be0693George Wilson else
4263d13f00c9691fa14620eff82abef795be0693George Wilson (void) printf(" %*s", width, propval);
4263d13f00c9691fa14620eff82abef795be0693George Wilson}
4263d13f00c9691fa14620eff82abef795be0693George Wilson
4263d13f00c9691fa14620eff82abef795be0693George Wilsonvoid
4263d13f00c9691fa14620eff82abef795be0693George Wilsonprint_list_stats(zpool_handle_t *zhp, const char *name, nvlist_t *nv,
4263d13f00c9691fa14620eff82abef795be0693George Wilson list_cbdata_t *cb, int depth)
4263d13f00c9691fa14620eff82abef795be0693George Wilson{
4263d13f00c9691fa14620eff82abef795be0693George Wilson nvlist_t **child;
4263d13f00c9691fa14620eff82abef795be0693George Wilson vdev_stat_t *vs;
4263d13f00c9691fa14620eff82abef795be0693George Wilson uint_t c, children;
4263d13f00c9691fa14620eff82abef795be0693George Wilson char *vname;
4263d13f00c9691fa14620eff82abef795be0693George Wilson boolean_t scripted = cb->cb_scripted;
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy uint64_t islog = B_FALSE;
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy boolean_t haslog = B_FALSE;
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy char *dashes = "%-*s - - - - - -\n";
4263d13f00c9691fa14620eff82abef795be0693George Wilson
4263d13f00c9691fa14620eff82abef795be0693George Wilson verify(nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_VDEV_STATS,
4263d13f00c9691fa14620eff82abef795be0693George Wilson (uint64_t **)&vs, &c) == 0);
4263d13f00c9691fa14620eff82abef795be0693George Wilson
4263d13f00c9691fa14620eff82abef795be0693George Wilson if (name != NULL) {
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson boolean_t toplevel = (vs->vs_space != 0);
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson uint64_t cap;
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson
4263d13f00c9691fa14620eff82abef795be0693George Wilson if (scripted)
4263d13f00c9691fa14620eff82abef795be0693George Wilson (void) printf("\t%s", name);
4263d13f00c9691fa14620eff82abef795be0693George Wilson else if (strlen(name) + depth > cb->cb_namewidth)
4263d13f00c9691fa14620eff82abef795be0693George Wilson (void) printf("%*s%s", depth, "", name);
4263d13f00c9691fa14620eff82abef795be0693George Wilson else
4263d13f00c9691fa14620eff82abef795be0693George Wilson (void) printf("%*s%s%*s", depth, "", name,
4263d13f00c9691fa14620eff82abef795be0693George Wilson (int)(cb->cb_namewidth - strlen(name) - depth), "");
4263d13f00c9691fa14620eff82abef795be0693George Wilson
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson /*
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson * Print the properties for the individual vdevs. Some
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson * properties are only applicable to toplevel vdevs. The
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson * 'toplevel' boolean value is passed to the print_one_column()
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson * to indicate that the value is valid.
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson */
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson print_one_column(ZPOOL_PROP_SIZE, vs->vs_space, scripted,
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson toplevel);
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson print_one_column(ZPOOL_PROP_ALLOCATED, vs->vs_alloc, scripted,
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson toplevel);
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson print_one_column(ZPOOL_PROP_FREE, vs->vs_space - vs->vs_alloc,
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson scripted, toplevel);
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson print_one_column(ZPOOL_PROP_EXPANDSZ, vs->vs_esize, scripted,
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson B_TRUE);
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson print_one_column(ZPOOL_PROP_FRAGMENTATION,
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson vs->vs_fragmentation, scripted,
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson (vs->vs_fragmentation != ZFS_FRAG_INVALID && toplevel));
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson cap = (vs->vs_space == 0) ? 0 :
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson (vs->vs_alloc * 100 / vs->vs_space);
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson print_one_column(ZPOOL_PROP_CAPACITY, cap, scripted, toplevel);
4263d13f00c9691fa14620eff82abef795be0693George Wilson (void) printf("\n");
4263d13f00c9691fa14620eff82abef795be0693George Wilson }
4263d13f00c9691fa14620eff82abef795be0693George Wilson
4263d13f00c9691fa14620eff82abef795be0693George Wilson if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
4263d13f00c9691fa14620eff82abef795be0693George Wilson &child, &children) != 0)
4263d13f00c9691fa14620eff82abef795be0693George Wilson return;
4263d13f00c9691fa14620eff82abef795be0693George Wilson
4263d13f00c9691fa14620eff82abef795be0693George Wilson for (c = 0; c < children; c++) {
4263d13f00c9691fa14620eff82abef795be0693George Wilson uint64_t ishole = B_FALSE;
4263d13f00c9691fa14620eff82abef795be0693George Wilson
4263d13f00c9691fa14620eff82abef795be0693George Wilson if (nvlist_lookup_uint64(child[c],
4263d13f00c9691fa14620eff82abef795be0693George Wilson ZPOOL_CONFIG_IS_HOLE, &ishole) == 0 && ishole)
4263d13f00c9691fa14620eff82abef795be0693George Wilson continue;
4263d13f00c9691fa14620eff82abef795be0693George Wilson
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy if (nvlist_lookup_uint64(child[c],
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy ZPOOL_CONFIG_IS_LOG, &islog) == 0 && islog) {
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy haslog = B_TRUE;
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy continue;
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy }
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy
4263d13f00c9691fa14620eff82abef795be0693George Wilson vname = zpool_vdev_name(g_zfs, zhp, child[c], B_FALSE);
4263d13f00c9691fa14620eff82abef795be0693George Wilson print_list_stats(zhp, vname, child[c], cb, depth + 2);
4263d13f00c9691fa14620eff82abef795be0693George Wilson free(vname);
4263d13f00c9691fa14620eff82abef795be0693George Wilson }
4263d13f00c9691fa14620eff82abef795be0693George Wilson
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy if (haslog == B_TRUE) {
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy /* LINTED E_SEC_PRINTF_VAR_FMT */
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy (void) printf(dashes, cb->cb_namewidth, "log");
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy for (c = 0; c < children; c++) {
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy if (nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG,
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy &islog) != 0 || !islog)
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy continue;
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy vname = zpool_vdev_name(g_zfs, zhp, child[c], B_FALSE);
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy print_list_stats(zhp, vname, child[c], cb, depth + 2);
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy free(vname);
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy }
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy }
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy
4263d13f00c9691fa14620eff82abef795be0693George Wilson if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_L2CACHE,
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy &child, &children) == 0 && children > 0) {
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy /* LINTED E_SEC_PRINTF_VAR_FMT */
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy (void) printf(dashes, cb->cb_namewidth, "cache");
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy for (c = 0; c < children; c++) {
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy vname = zpool_vdev_name(g_zfs, zhp, child[c], B_FALSE);
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy print_list_stats(zhp, vname, child[c], cb, depth + 2);
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy free(vname);
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy }
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy }
4263d13f00c9691fa14620eff82abef795be0693George Wilson
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_SPARES, &child,
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy &children) == 0 && children > 0) {
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy /* LINTED E_SEC_PRINTF_VAR_FMT */
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy (void) printf(dashes, cb->cb_namewidth, "spare");
4263d13f00c9691fa14620eff82abef795be0693George Wilson for (c = 0; c < children; c++) {
52244c0958bdf281ca42932b449f644b4decfdc2John Wren Kennedy vname = zpool_vdev_name(g_zfs, zhp, child[c], B_FALSE);
4263d13f00c9691fa14620eff82abef795be0693George Wilson print_list_stats(zhp, vname, child[c], cb, depth + 2);
4263d13f00c9691fa14620eff82abef795be0693George Wilson free(vname);
4263d13f00c9691fa14620eff82abef795be0693George Wilson }
4263d13f00c9691fa14620eff82abef795be0693George Wilson }
4263d13f00c9691fa14620eff82abef795be0693George Wilson}
4263d13f00c9691fa14620eff82abef795be0693George Wilson
4263d13f00c9691fa14620eff82abef795be0693George Wilson
990b4856d0eaada6f8140335733a1b1771ed2746lling/*
990b4856d0eaada6f8140335733a1b1771ed2746lling * Generic callback function to list a pool.
990b4856d0eaada6f8140335733a1b1771ed2746lling */
990b4856d0eaada6f8140335733a1b1771ed2746llingint
990b4856d0eaada6f8140335733a1b1771ed2746llinglist_callback(zpool_handle_t *zhp, void *data)
990b4856d0eaada6f8140335733a1b1771ed2746lling{
990b4856d0eaada6f8140335733a1b1771ed2746lling list_cbdata_t *cbp = data;
4263d13f00c9691fa14620eff82abef795be0693George Wilson nvlist_t *config;
4263d13f00c9691fa14620eff82abef795be0693George Wilson nvlist_t *nvroot;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
4263d13f00c9691fa14620eff82abef795be0693George Wilson config = zpool_get_config(zhp, NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
4263d13f00c9691fa14620eff82abef795be0693George Wilson print_pool(zhp, cbp);
4263d13f00c9691fa14620eff82abef795be0693George Wilson if (!cbp->cb_verbose)
4263d13f00c9691fa14620eff82abef795be0693George Wilson return (0);
4263d13f00c9691fa14620eff82abef795be0693George Wilson
4263d13f00c9691fa14620eff82abef795be0693George Wilson verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
4263d13f00c9691fa14620eff82abef795be0693George Wilson &nvroot) == 0);
4263d13f00c9691fa14620eff82abef795be0693George Wilson print_list_stats(zhp, NULL, nvroot, cbp, 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko * zpool list [-Hp] [-o prop[,prop]*] [-T d|u] [pool] ... [interval [count]]
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
990b4856d0eaada6f8140335733a1b1771ed2746lling * -H Scripted mode. Don't display headers, and separate properties
990b4856d0eaada6f8140335733a1b1771ed2746lling * by a single tab.
990b4856d0eaada6f8140335733a1b1771ed2746lling * -o List of properties to display. Defaults to
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson * "name,size,allocated,free,expandsize,fragmentation,capacity,"
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson * "dedupratio,health,altroot"
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko * -p Diplay values in parsable (exact) format.
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * -T Display a timestamp in date(1) or Unix format
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.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_list(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ret;
fa9e4066f08beec538e775443c5be79dd423fcabahrens list_cbdata_t cb = { 0 };
990b4856d0eaada6f8140335733a1b1771ed2746lling static char default_props[] =
7a09f97bc0d52b763c580864e78a665b15be37f8George Wilson "name,size,allocated,free,expandsize,fragmentation,capacity,"
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson "dedupratio,health,altroot";
990b4856d0eaada6f8140335733a1b1771ed2746lling char *props = default_props;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling unsigned long interval = 0, count = 0;
4263d13f00c9691fa14620eff82abef795be0693George Wilson zpool_list_t *list;
4263d13f00c9691fa14620eff82abef795be0693George Wilson boolean_t first = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko while ((c = getopt(argc, argv, ":Ho:pT:v")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'H':
99653d4ee642c6528e88224f12409a5f23060994eschrock cb.cb_scripted = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'o':
990b4856d0eaada6f8140335733a1b1771ed2746lling props = optarg;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko case 'p':
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko cb.cb_literal = B_TRUE;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko break;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling case 'T':
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling get_timestamp_arg(*optarg);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling break;
4263d13f00c9691fa14620eff82abef795be0693George Wilson case 'v':
4263d13f00c9691fa14620eff82abef795be0693George Wilson cb.cb_verbose = B_TRUE;
4263d13f00c9691fa14620eff82abef795be0693George Wilson break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ':':
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing argument for "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "'%c' option\n"), optopt);
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
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;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling get_interval_count(&argc, argv, &interval, &count);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
990b4856d0eaada6f8140335733a1b1771ed2746lling if (zprop_get_list(g_zfs, props, &cb.cb_proplist, ZFS_TYPE_POOL) != 0)
990b4856d0eaada6f8140335733a1b1771ed2746lling usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling for (;;) {
cd67d23d32df7b247d00e5b82257a2220b1e0c13George Wilson if ((list = pool_list_get(argc, argv, &cb.cb_proplist,
cd67d23d32df7b247d00e5b82257a2220b1e0c13George Wilson &ret)) == NULL)
cd67d23d32df7b247d00e5b82257a2220b1e0c13George Wilson return (1);
4263d13f00c9691fa14620eff82abef795be0693George Wilson
4263d13f00c9691fa14620eff82abef795be0693George Wilson if (pool_list_count(list) == 0)
4263d13f00c9691fa14620eff82abef795be0693George Wilson break;
4263d13f00c9691fa14620eff82abef795be0693George Wilson
4263d13f00c9691fa14620eff82abef795be0693George Wilson cb.cb_namewidth = 0;
4263d13f00c9691fa14620eff82abef795be0693George Wilson (void) pool_list_iter(list, B_FALSE, get_namewidth, &cb);
990b4856d0eaada6f8140335733a1b1771ed2746lling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (timestamp_fmt != NODATE)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling print_timestamp(timestamp_fmt);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
4263d13f00c9691fa14620eff82abef795be0693George Wilson if (!cb.cb_scripted && (first || cb.cb_verbose)) {
4263d13f00c9691fa14620eff82abef795be0693George Wilson print_header(&cb);
4263d13f00c9691fa14620eff82abef795be0693George Wilson first = B_FALSE;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling }
4263d13f00c9691fa14620eff82abef795be0693George Wilson ret = pool_list_iter(list, B_TRUE, list_callback, &cb);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (interval == 0)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling break;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (count != 0 && --count == 0)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling break;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
cd67d23d32df7b247d00e5b82257a2220b1e0c13George Wilson pool_list_free(list);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void) sleep(interval);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
cd67d23d32df7b247d00e5b82257a2220b1e0c13George Wilson if (argc == 0 && !cb.cb_scripted && pool_list_count(list) == 0) {
cd67d23d32df7b247d00e5b82257a2220b1e0c13George Wilson (void) printf(gettext("no pools available\n"));
cd67d23d32df7b247d00e5b82257a2220b1e0c13George Wilson ret = 0;
cd67d23d32df7b247d00e5b82257a2220b1e0c13George Wilson }
cd67d23d32df7b247d00e5b82257a2220b1e0c13George Wilson
cd67d23d32df7b247d00e5b82257a2220b1e0c13George Wilson pool_list_free(list);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling zprop_free_list(cb.cb_proplist);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_attach_or_replace(int argc, char **argv, int replacing)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
99653d4ee642c6528e88224f12409a5f23060994eschrock boolean_t force = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *nvroot;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *poolname, *old_disk, *new_disk;
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_handle_t *zhp;
99653d4ee642c6528e88224f12409a5f23060994eschrock 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);
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc -= optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv += optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get pool name and check number of arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name argument\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens poolname = argv[0];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 2) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens gettext("missing <device> specification\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens old_disk = argv[1];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 3) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!replacing) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens gettext("missing <new_device> specification\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens new_disk = old_disk;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc -= 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv += 1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens new_disk = argv[2];
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc -= 2;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv += 2;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc > 1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("too many arguments\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor if (zpool_get_config(zhp, NULL) == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("pool '%s' is unavailable\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens poolname);
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
705040ed336e23b47ac6a3421d1f23ab5e86871bEric Taylor nvroot = make_root_vdev(zhp, force, B_FALSE, replacing, B_FALSE,
705040ed336e23b47ac6a3421d1f23ab5e86871bEric Taylor argc, argv);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvroot == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_close(zhp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock ret = zpool_vdev_attach(zhp, old_disk, new_disk, nvroot, replacing);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock nvlist_free(nvroot);
99653d4ee642c6528e88224f12409a5f23060994eschrock zpool_close(zhp);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock 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/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool detach [-f] <pool> <device>
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Force detach of <device>, even if DTLs argue against it
fa9e4066f08beec538e775443c5be79dd423fcabahrens * (not supported yet)
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Detach a device from a mirror. The operation will be refused if <device>
fa9e4066f08beec538e775443c5be79dd423fcabahrens * is the last device in the mirror, or if the DTLs indicate that this device
fa9e4066f08beec538e775443c5be79dd423fcabahrens * has the only valid copy of some data.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_detach(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *poolname, *path;
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_handle_t *zhp;
99653d4ee642c6528e88224f12409a5f23060994eschrock int ret;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((c = getopt(argc, argv, "f")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'f':
fa9e4066f08beec538e775443c5be79dd423fcabahrens case '?':
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens optopt);
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc -= optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv += optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get pool name and check number of arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name argument\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 2) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr,
fa9e4066f08beec538e775443c5be79dd423fcabahrens gettext("missing <device> specification\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens poolname = argv[0];
fa9e4066f08beec538e775443c5be79dd423fcabahrens path = argv[1];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock ret = zpool_vdev_detach(zhp, path);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock zpool_close(zhp);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock return (ret);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante/*
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante * zpool split [-n] [-o prop=val] ...
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante * [-o mntopt] ...
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante * [-R altroot] <pool> <newpool> [<device> ...]
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante *
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante * -n Do not split the pool, but display the resulting layout if
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante * it were to be split.
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante * -o Set property=value, or set mount options.
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante * -R Mount the split-off pool under an alternate root.
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante *
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante * Splits the named pool and gives it the new pool name. Devices to be split
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante * off may be listed, provided that no more than one device is specified
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante * per top-level vdev mirror. The newly split pool is left in an exported
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante * state unless -R is specified.
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante *
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante * Restrictions: the top-level of the pool pool must only be made up of
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante * mirrors; all devices in the pool must be healthy; no device may be
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante * undergoing a resilvering operation.
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante */
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musanteint
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musantezpool_do_split(int argc, char **argv)
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante{
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante char *srcpool, *newpool, *propval;
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante char *mntopts = NULL;
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante splitflags_t flags;
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante int c, ret = 0;
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante zpool_handle_t *zhp;
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante nvlist_t *config, *props = NULL;
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante flags.dryrun = B_FALSE;
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante flags.import = B_FALSE;
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante /* check options */
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante while ((c = getopt(argc, argv, ":R:no:")) != -1) {
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante switch (c) {
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante case 'R':
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante flags.import = B_TRUE;
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante if (add_prop_list(
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante zpool_prop_to_name(ZPOOL_PROP_ALTROOT), optarg,
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante &props, B_TRUE) != 0) {
aab83bb83be7342f6cfccaed8d5fe0b2f404855dJosef 'Jeff' Sipek nvlist_free(props);
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante usage(B_FALSE);
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante }
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante break;
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante case 'n':
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante flags.dryrun = B_TRUE;
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante break;
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante case 'o':
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante if ((propval = strchr(optarg, '=')) != NULL) {
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante *propval = '\0';
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante propval++;
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante if (add_prop_list(optarg, propval,
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante &props, B_TRUE) != 0) {
aab83bb83be7342f6cfccaed8d5fe0b2f404855dJosef 'Jeff' Sipek nvlist_free(props);
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante usage(B_FALSE);
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante }
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante } else {
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante mntopts = optarg;
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante }
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante break;
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante case ':':
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante (void) fprintf(stderr, gettext("missing argument for "
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante "'%c' option\n"), optopt);
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante usage(B_FALSE);
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante break;
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante case '?':
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante (void) fprintf(stderr, gettext("invalid option '%c'\n"),
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante optopt);
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante usage(B_FALSE);
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante break;
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante }
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante }
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante if (!flags.import && mntopts != NULL) {
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante (void) fprintf(stderr, gettext("setting mntopts is only "
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante "valid when importing the pool\n"));
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante usage(B_FALSE);
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante }
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante argc -= optind;
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante argv += optind;
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante if (argc < 1) {
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante (void) fprintf(stderr, gettext("Missing pool name\n"));
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante usage(B_FALSE);
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante }
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante if (argc < 2) {
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante (void) fprintf(stderr, gettext("Missing new pool name\n"));
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante usage(B_FALSE);
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante }
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante srcpool = argv[0];
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante newpool = argv[1];
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante argc -= 2;
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante argv += 2;
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante if ((zhp = zpool_open(g_zfs, srcpool)) == NULL)
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante return (1);
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante config = split_mirror_vdev(zhp, newpool, props, flags, argc, argv);
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante if (config == NULL) {
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante ret = 1;
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante } else {
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante if (flags.dryrun) {
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante (void) printf(gettext("would create '%s' with the "
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante "following layout:\n\n"), newpool);
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante print_vdev_tree(NULL, newpool, config, 0, B_FALSE);
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante }
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante nvlist_free(config);
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante }
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante zpool_close(zhp);
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante if (ret != 0 || flags.dryrun || !flags.import)
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante return (ret);
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante /*
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante * The split was successful. Now we need to open the new
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante * pool and import it.
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante */
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante if ((zhp = zpool_open_canfail(g_zfs, newpool)) == NULL)
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante return (1);
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante if (zpool_get_state(zhp) != POOL_STATE_UNAVAIL &&
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante zpool_enable_datasets(zhp, mntopts, 0) != 0) {
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante ret = 1;
fe7cd8aa86d5ba3fb4aa1d5fee460467fd4413c9Cyril Plisko (void) fprintf(stderr, gettext("Split was successful, but "
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante "the datasets could not all be mounted\n"));
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante (void) fprintf(stderr, gettext("Try doing '%s' with a "
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante "different altroot\n"), "zpool import");
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante }
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante zpool_close(zhp);
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante return (ret);
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante}
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling * zpool online <pool> <device> ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_online(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c, i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *poolname;
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_handle_t *zhp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ret = 0;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock vdev_state_t newstate;
573ca77e53dd31dcaebef023e7eb41969e6896c1George Wilson int flags = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
573ca77e53dd31dcaebef023e7eb41969e6896c1George Wilson while ((c = getopt(argc, argv, "et")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
573ca77e53dd31dcaebef023e7eb41969e6896c1George Wilson case 'e':
573ca77e53dd31dcaebef023e7eb41969e6896c1George Wilson flags |= ZFS_ONLINE_EXPAND;
573ca77e53dd31dcaebef023e7eb41969e6896c1George Wilson break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 't':
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;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get pool name and check number of arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 2) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing device name\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens poolname = argv[0];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock for (i = 1; i < argc; i++) {
573ca77e53dd31dcaebef023e7eb41969e6896c1George Wilson if (zpool_vdev_online(zhp, argv[i], flags, &newstate) == 0) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (newstate != VDEV_STATE_HEALTHY) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) printf(gettext("warning: device '%s' "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "onlined, but remains in faulted state\n"),
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock argv[i]);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (newstate == VDEV_STATE_FAULTED)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) printf(gettext("use 'zpool "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "clear' to restore a faulted "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "device\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock else
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) printf(gettext("use 'zpool "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "replace' to replace devices "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "that are no longer present\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 1;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock zpool_close(zhp);
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling * zpool offline [-ft] <pool> <device> ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
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
fa9e4066f08beec538e775443c5be79dd423fcabahrens * state will not be persistent across reboots.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_offline(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c, i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *poolname;
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_handle_t *zhp;
99653d4ee642c6528e88224f12409a5f23060994eschrock int ret = 0;
99653d4ee642c6528e88224f12409a5f23060994eschrock 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;
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling break;
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling 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;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get pool name and check number of arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 2) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing device name\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens poolname = argv[0];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock for (i = 1; i < argc; i++) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (zpool_vdev_offline(zhp, argv[i], istmp) != 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = 1;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock zpool_close(zhp);
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock/*
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * zpool clear <pool> [device]
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock *
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * Clear all errors associated with a pool or a particular device.
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockint
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockzpool_do_clear(int argc, char **argv)
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock{
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley int c;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock int ret = 0;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley boolean_t dryrun = B_FALSE;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley boolean_t do_rewind = B_FALSE;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley boolean_t xtreme_rewind = B_FALSE;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley uint32_t rewind_policy = ZPOOL_NO_REWIND;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley nvlist_t *policy = NULL;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock zpool_handle_t *zhp;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock char *pool, *device;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley /* check options */
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley while ((c = getopt(argc, argv, "FnX")) != -1) {
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley switch (c) {
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley case 'F':
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley do_rewind = B_TRUE;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley break;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley case 'n':
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley dryrun = B_TRUE;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley break;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley case 'X':
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley xtreme_rewind = B_TRUE;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley break;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley case '?':
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley (void) fprintf(stderr, gettext("invalid option '%c'\n"),
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley optopt);
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley usage(B_FALSE);
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley }
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley }
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley argc -= optind;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley argv += optind;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley if (argc < 1) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) fprintf(stderr, gettext("missing pool name\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley if (argc > 2) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) fprintf(stderr, gettext("too many arguments\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley if ((dryrun || xtreme_rewind) && !do_rewind) {
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley (void) fprintf(stderr,
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley gettext("-n or -X only meaningful with -F\n"));
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley usage(B_FALSE);
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley }
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley if (dryrun)
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley rewind_policy = ZPOOL_TRY_REWIND;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley else if (do_rewind)
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley rewind_policy = ZPOOL_DO_REWIND;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley if (xtreme_rewind)
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley rewind_policy |= ZPOOL_EXTREME_REWIND;
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley /* In future, further rewind policy choices can be passed along here */
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley if (nvlist_alloc(&policy, NV_UNIQUE_NAME, 0) != 0 ||
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley nvlist_add_uint32(policy, ZPOOL_REWIND_REQUEST, rewind_policy) != 0)
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley return (1);
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley pool = argv[0];
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley device = argc == 2 ? argv[1] : NULL;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley if ((zhp = zpool_open_canfail(g_zfs, pool)) == NULL) {
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley nvlist_free(policy);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock return (1);
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley if (zpool_clear(zhp, device, policy) != 0)
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock ret = 1;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock zpool_close(zhp);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley nvlist_free(policy);
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock return (ret);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock}
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore/*
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore * zpool reguid <pool>
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore */
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amoreint
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amorezpool_do_reguid(int argc, char **argv)
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore{
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore int c;
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore char *poolname;
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore zpool_handle_t *zhp;
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore int ret = 0;
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore /* check options */
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore while ((c = getopt(argc, argv, "")) != -1) {
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore switch (c) {
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore case '?':
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore (void) fprintf(stderr, gettext("invalid option '%c'\n"),
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore optopt);
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore usage(B_FALSE);
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore }
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore }
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore argc -= optind;
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore argv += optind;
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore /* get pool name and check number of arguments */
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore if (argc < 1) {
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore (void) fprintf(stderr, gettext("missing pool name\n"));
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore usage(B_FALSE);
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore }
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore if (argc > 1) {
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore (void) fprintf(stderr, gettext("too many arguments\n"));
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore usage(B_FALSE);
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore }
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore poolname = argv[0];
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore return (1);
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore ret = zpool_reguid(zhp);
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore zpool_close(zhp);
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore return (ret);
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore}
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore
4263d13f00c9691fa14620eff82abef795be0693George Wilson/*
4263d13f00c9691fa14620eff82abef795be0693George Wilson * zpool reopen <pool>
4263d13f00c9691fa14620eff82abef795be0693George Wilson *
4263d13f00c9691fa14620eff82abef795be0693George Wilson * Reopen the pool so that the kernel can update the sizes of all vdevs.
4263d13f00c9691fa14620eff82abef795be0693George Wilson */
4263d13f00c9691fa14620eff82abef795be0693George Wilsonint
4263d13f00c9691fa14620eff82abef795be0693George Wilsonzpool_do_reopen(int argc, char **argv)
4263d13f00c9691fa14620eff82abef795be0693George Wilson{
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson int c;
4263d13f00c9691fa14620eff82abef795be0693George Wilson int ret = 0;
4263d13f00c9691fa14620eff82abef795be0693George Wilson zpool_handle_t *zhp;
4263d13f00c9691fa14620eff82abef795be0693George Wilson char *pool;
4263d13f00c9691fa14620eff82abef795be0693George Wilson
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson /* check options */
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson while ((c = getopt(argc, argv, "")) != -1) {
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson switch (c) {
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson case '?':
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson (void) fprintf(stderr, gettext("invalid option '%c'\n"),
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson optopt);
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson usage(B_FALSE);
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson }
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson }
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson
4263d13f00c9691fa14620eff82abef795be0693George Wilson argc--;
4263d13f00c9691fa14620eff82abef795be0693George Wilson argv++;
4263d13f00c9691fa14620eff82abef795be0693George Wilson
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson if (argc < 1) {
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson (void) fprintf(stderr, gettext("missing pool name\n"));
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson usage(B_FALSE);
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson }
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson if (argc > 1) {
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson (void) fprintf(stderr, gettext("too many arguments\n"));
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson usage(B_FALSE);
31d7e8fa33fae995f558673adb22641b5aa8b6e1George Wilson }
4263d13f00c9691fa14620eff82abef795be0693George Wilson
4263d13f00c9691fa14620eff82abef795be0693George Wilson pool = argv[0];
4263d13f00c9691fa14620eff82abef795be0693George Wilson if ((zhp = zpool_open_canfail(g_zfs, pool)) == NULL)
4263d13f00c9691fa14620eff82abef795be0693George Wilson return (1);
4263d13f00c9691fa14620eff82abef795be0693George Wilson
4263d13f00c9691fa14620eff82abef795be0693George Wilson ret = zpool_reopen(zhp);
4263d13f00c9691fa14620eff82abef795be0693George Wilson zpool_close(zhp);
4263d13f00c9691fa14620eff82abef795be0693George Wilson return (ret);
4263d13f00c9691fa14620eff82abef795be0693George Wilson}
4263d13f00c9691fa14620eff82abef795be0693George Wilson
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct scrub_cbdata {
fa9e4066f08beec538e775443c5be79dd423fcabahrens int cb_type;
06eeb2ad640ce72d394ac521094bed7681044408ek int cb_argc;
06eeb2ad640ce72d394ac521094bed7681044408ek char **cb_argv;
fa9e4066f08beec538e775443c5be79dd423fcabahrens} scrub_cbdata_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrensscrub_callback(zpool_handle_t *zhp, void *data)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens scrub_cbdata_t *cb = data;
06eeb2ad640ce72d394ac521094bed7681044408ek int err;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock /*
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * Ignore faulted pools.
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (zpool_get_state(zhp) == POOL_STATE_UNAVAIL) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) fprintf(stderr, gettext("cannot scrub '%s': pool is "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "currently unavailable\n"), zpool_get_name(zhp));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock return (1);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling err = zpool_scan(zhp, cb->cb_type);
06eeb2ad640ce72d394ac521094bed7681044408ek
06eeb2ad640ce72d394ac521094bed7681044408ek return (err != 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool scrub [-s] <pool> ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -s Stop. Stops any in-progress scrub.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_scrub(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c;
fa9e4066f08beec538e775443c5be79dd423fcabahrens scrub_cbdata_t cb;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling cb.cb_type = POOL_SCAN_SCRUB;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((c = getopt(argc, argv, "s")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 's':
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling cb.cb_type = POOL_SCAN_NONE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case '?':
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens optopt);
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
06eeb2ad640ce72d394ac521094bed7681044408ek cb.cb_argc = argc;
06eeb2ad640ce72d394ac521094bed7681044408ek cb.cb_argv = argv;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc -= optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens argv += optind;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name argument\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
b1b8ab34de515a5e83206da22c3d7e563241b021lling return (for_each_pool(argc, argv, B_TRUE, NULL, scrub_callback, &cb));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct status_cbdata {
99653d4ee642c6528e88224f12409a5f23060994eschrock int cb_count;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock boolean_t cb_allpools;
99653d4ee642c6528e88224f12409a5f23060994eschrock boolean_t cb_verbose;
99653d4ee642c6528e88224f12409a5f23060994eschrock boolean_t cb_explain;
99653d4ee642c6528e88224f12409a5f23060994eschrock boolean_t cb_first;
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson boolean_t cb_dedup_stats;
fa9e4066f08beec538e775443c5be79dd423fcabahrens} status_cbdata_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print out detailed scrub status.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Lingprint_scan_status(pool_scan_stat_t *ps)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling time_t start, end;
73d314ce9dc7feccc3b74f8109a8f7ee8ff67b42Lin Ling uint64_t elapsed, mins_left, hours_left;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling uint64_t pass_exam, examined, total;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling uint_t rate;
fa9e4066f08beec538e775443c5be79dd423fcabahrens double fraction_done;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling char processed_buf[7], examined_buf[7], total_buf[7], rate_buf[7];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
ce72e614c133351311e87bbbe4eba8fea9e77768Yuri Pankov (void) printf(gettext(" scan: "));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling /* If there's never been a scan, there's not much to say. */
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (ps == NULL || ps->pss_func == POOL_SCAN_NONE ||
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling ps->pss_func >= POOL_SCAN_FUNCS) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("none requested\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling start = ps->pss_start_time;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling end = ps->pss_end_time;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling zfs_nicenum(ps->pss_processed, processed_buf, sizeof (processed_buf));
fa9e4066f08beec538e775443c5be79dd423fcabahrens
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling assert(ps->pss_func == POOL_SCAN_SCRUB ||
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling ps->pss_func == POOL_SCAN_RESILVER);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling /*
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * Scan is finished or canceled.
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling */
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (ps->pss_state == DSS_FINISHED) {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling uint64_t minutes_taken = (end - start) / 60;
b327cd3f3b4dab4f29e7140159b1e01ed2ceef2aIgor Kozhukhov char *fmt = NULL;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (ps->pss_func == POOL_SCAN_SCRUB) {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling fmt = gettext("scrub repaired %s in %lluh%um with "
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling "%llu errors on %s");
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling } else if (ps->pss_func == POOL_SCAN_RESILVER) {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling fmt = gettext("resilvered %s in %lluh%um with "
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling "%llu errors on %s");
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling }
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling /* LINTED */
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void) printf(fmt, processed_buf,
18ce54df8809e9f672d0ed1a53e99669df0a6df0ek (u_longlong_t)(minutes_taken / 60),
18ce54df8809e9f672d0ed1a53e99669df0a6df0ek (uint_t)(minutes_taken % 60),
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (u_longlong_t)ps->pss_errors,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling ctime((time_t *)&end));
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling return;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling } else if (ps->pss_state == DSS_CANCELED) {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (ps->pss_func == POOL_SCAN_SCRUB) {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void) printf(gettext("scrub canceled on %s"),
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling ctime(&end));
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling } else if (ps->pss_func == POOL_SCAN_RESILVER) {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void) printf(gettext("resilver canceled on %s"),
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling ctime(&end));
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling }
fa9e4066f08beec538e775443c5be79dd423fcabahrens return;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling assert(ps->pss_state == DSS_SCANNING);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling /*
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * Scan is in progress.
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling */
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (ps->pss_func == POOL_SCAN_SCRUB) {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void) printf(gettext("scrub in progress since %s"),
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling ctime(&start));
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling } else if (ps->pss_func == POOL_SCAN_RESILVER) {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void) printf(gettext("resilver in progress since %s"),
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling ctime(&start));
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling examined = ps->pss_examined ? ps->pss_examined : 1;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling total = ps->pss_to_examine;
fa9e4066f08beec538e775443c5be79dd423fcabahrens fraction_done = (double)examined / total;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling /* elapsed time for this pass */
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling elapsed = time(NULL) - ps->pss_pass_start;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling elapsed = elapsed ? elapsed : 1;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling pass_exam = ps->pss_pass_exam ? ps->pss_pass_exam : 1;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling rate = pass_exam / elapsed;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling rate = rate ? rate : 1;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling mins_left = ((total - examined) / rate) / 60;
73d314ce9dc7feccc3b74f8109a8f7ee8ff67b42Lin Ling hours_left = mins_left / 60;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling zfs_nicenum(examined, examined_buf, sizeof (examined_buf));
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling zfs_nicenum(total, total_buf, sizeof (total_buf));
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling zfs_nicenum(rate, rate_buf, sizeof (rate_buf));
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
73d314ce9dc7feccc3b74f8109a8f7ee8ff67b42Lin Ling /*
73d314ce9dc7feccc3b74f8109a8f7ee8ff67b42Lin Ling * do not print estimated time if hours_left is more than 30 days
73d314ce9dc7feccc3b74f8109a8f7ee8ff67b42Lin Ling */
73d314ce9dc7feccc3b74f8109a8f7ee8ff67b42Lin Ling (void) printf(gettext(" %s scanned out of %s at %s/s"),
73d314ce9dc7feccc3b74f8109a8f7ee8ff67b42Lin Ling examined_buf, total_buf, rate_buf);
73d314ce9dc7feccc3b74f8109a8f7ee8ff67b42Lin Ling if (hours_left < (30 * 24)) {
73d314ce9dc7feccc3b74f8109a8f7ee8ff67b42Lin Ling (void) printf(gettext(", %lluh%um to go\n"),
73d314ce9dc7feccc3b74f8109a8f7ee8ff67b42Lin Ling (u_longlong_t)hours_left, (uint_t)(mins_left % 60));
73d314ce9dc7feccc3b74f8109a8f7ee8ff67b42Lin Ling } else {
73d314ce9dc7feccc3b74f8109a8f7ee8ff67b42Lin Ling (void) printf(gettext(
73d314ce9dc7feccc3b74f8109a8f7ee8ff67b42Lin Ling ", (scan is slow, no estimated time)\n"));
73d314ce9dc7feccc3b74f8109a8f7ee8ff67b42Lin Ling }
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (ps->pss_func == POOL_SCAN_RESILVER) {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void) printf(gettext(" %s resilvered, %.2f%% done\n"),
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling processed_buf, 100 * fraction_done);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling } else if (ps->pss_func == POOL_SCAN_SCRUB) {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void) printf(gettext(" %s repaired, %.2f%% done\n"),
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling processed_buf, 100 * fraction_done);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockstatic void
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockprint_error_log(zpool_handle_t *zhp)
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock{
75519f380eac71fe6d10b26e736f01567d6c13c9ek nvlist_t *nverrlist = NULL;
55434c770c89aa1b84474f2559a106803511aba0ek nvpair_t *elem;
55434c770c89aa1b84474f2559a106803511aba0ek char *pathname;
55434c770c89aa1b84474f2559a106803511aba0ek size_t len = MAXPATHLEN * 2;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
55434c770c89aa1b84474f2559a106803511aba0ek if (zpool_get_errlog(zhp, &nverrlist) != 0) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) printf("errors: List of errors unavailable "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "(insufficient privileges)\n");
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock return;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
55434c770c89aa1b84474f2559a106803511aba0ek (void) printf("errors: Permanent errors have been "
55434c770c89aa1b84474f2559a106803511aba0ek "detected in the following files:\n\n");
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
55434c770c89aa1b84474f2559a106803511aba0ek pathname = safe_malloc(len);
55434c770c89aa1b84474f2559a106803511aba0ek elem = NULL;
55434c770c89aa1b84474f2559a106803511aba0ek while ((elem = nvlist_next_nvpair(nverrlist, elem)) != NULL) {
55434c770c89aa1b84474f2559a106803511aba0ek nvlist_t *nv;
55434c770c89aa1b84474f2559a106803511aba0ek uint64_t dsobj, obj;
55434c770c89aa1b84474f2559a106803511aba0ek
55434c770c89aa1b84474f2559a106803511aba0ek verify(nvpair_value_nvlist(elem, &nv) == 0);
55434c770c89aa1b84474f2559a106803511aba0ek verify(nvlist_lookup_uint64(nv, ZPOOL_ERR_DATASET,
55434c770c89aa1b84474f2559a106803511aba0ek &dsobj) == 0);
55434c770c89aa1b84474f2559a106803511aba0ek verify(nvlist_lookup_uint64(nv, ZPOOL_ERR_OBJECT,
55434c770c89aa1b84474f2559a106803511aba0ek &obj) == 0);
55434c770c89aa1b84474f2559a106803511aba0ek zpool_obj_to_path(zhp, dsobj, obj, pathname, len);
55434c770c89aa1b84474f2559a106803511aba0ek (void) printf("%7s %s\n", "", pathname);
55434c770c89aa1b84474f2559a106803511aba0ek }
55434c770c89aa1b84474f2559a106803511aba0ek free(pathname);
55434c770c89aa1b84474f2559a106803511aba0ek nvlist_free(nverrlist);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock}
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrockstatic void
99653d4ee642c6528e88224f12409a5f23060994eschrockprint_spares(zpool_handle_t *zhp, nvlist_t **spares, uint_t nspares,
99653d4ee642c6528e88224f12409a5f23060994eschrock int namewidth)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock uint_t i;
99653d4ee642c6528e88224f12409a5f23060994eschrock char *name;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if (nspares == 0)
99653d4ee642c6528e88224f12409a5f23060994eschrock return;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext("\tspares\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock for (i = 0; i < nspares; i++) {
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson name = zpool_vdev_name(g_zfs, zhp, spares[i], B_FALSE);
99653d4ee642c6528e88224f12409a5f23060994eschrock print_status_config(zhp, name, spares[i],
aa8cf21aa2aaa2df3db469354ccc0c47f8cdaab9Neil Perrin namewidth, 2, B_TRUE);
99653d4ee642c6528e88224f12409a5f23060994eschrock free(name);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendanstatic void
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendanprint_l2cache(zpool_handle_t *zhp, nvlist_t **l2cache, uint_t nl2cache,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan int namewidth)
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan{
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan uint_t i;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan char *name;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (nl2cache == 0)
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan return;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan (void) printf(gettext("\tcache\n"));
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan for (i = 0; i < nl2cache; i++) {
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson name = zpool_vdev_name(g_zfs, zhp, l2cache[i], B_FALSE);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan print_status_config(zhp, name, l2cache[i],
aa8cf21aa2aaa2df3db469354ccc0c47f8cdaab9Neil Perrin namewidth, 2, B_FALSE);
aa8cf21aa2aaa2df3db469354ccc0c47f8cdaab9Neil Perrin free(name);
aa8cf21aa2aaa2df3db469354ccc0c47f8cdaab9Neil Perrin }
aa8cf21aa2aaa2df3db469354ccc0c47f8cdaab9Neil Perrin}
aa8cf21aa2aaa2df3db469354ccc0c47f8cdaab9Neil Perrin
9eb19f4d61679ca0382def038665019234458eddGeorge Wilsonstatic void
9eb19f4d61679ca0382def038665019234458eddGeorge Wilsonprint_dedup_stats(nvlist_t *config)
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson{
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson ddt_histogram_t *ddh;
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson ddt_stat_t *dds;
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson ddt_object_t *ddo;
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson uint_t c;
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson /*
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson * If the pool was faulted then we may not have been able to
2384d9f8fcca0a7ef8b3ae674d94df82832c0fceGeorge Wilson * obtain the config. Otherwise, if we have anything in the dedup
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson * table continue processing the stats.
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson */
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson if (nvlist_lookup_uint64_array(config, ZPOOL_CONFIG_DDT_OBJ_STATS,
ce72e614c133351311e87bbbe4eba8fea9e77768Yuri Pankov (uint64_t **)&ddo, &c) != 0)
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson return;
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson (void) printf("\n");
ce72e614c133351311e87bbbe4eba8fea9e77768Yuri Pankov (void) printf(gettext(" dedup: "));
ce72e614c133351311e87bbbe4eba8fea9e77768Yuri Pankov if (ddo->ddo_count == 0) {
ce72e614c133351311e87bbbe4eba8fea9e77768Yuri Pankov (void) printf(gettext("no DDT entries\n"));
ce72e614c133351311e87bbbe4eba8fea9e77768Yuri Pankov return;
ce72e614c133351311e87bbbe4eba8fea9e77768Yuri Pankov }
ce72e614c133351311e87bbbe4eba8fea9e77768Yuri Pankov
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson (void) printf("DDT entries %llu, size %llu on disk, %llu in core\n",
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson (u_longlong_t)ddo->ddo_count,
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson (u_longlong_t)ddo->ddo_dspace,
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson (u_longlong_t)ddo->ddo_mspace);
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson verify(nvlist_lookup_uint64_array(config, ZPOOL_CONFIG_DDT_STATS,
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson (uint64_t **)&dds, &c) == 0);
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson verify(nvlist_lookup_uint64_array(config, ZPOOL_CONFIG_DDT_HISTOGRAM,
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson (uint64_t **)&ddh, &c) == 0);
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson zpool_dump_ddt(dds, ddh);
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson}
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Display a summary of pool status. Displays a summary such as:
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * pool: tank
fa9e4066f08beec538e775443c5be79dd423fcabahrens * status: DEGRADED
fa9e4066f08beec538e775443c5be79dd423fcabahrens * reason: One or more devices ...
654b400c387942fc00d4f6869539adbd7b25fbceJoshua M. Clulow * see: http://illumos.org/msg/ZFS-xxxx-01
fa9e4066f08beec538e775443c5be79dd423fcabahrens * config:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * mirror DEGRADED
fa9e4066f08beec538e775443c5be79dd423fcabahrens * c1t0d0 OK
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * 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 */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatus_callback(zpool_handle_t *zhp, void *data)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens status_cbdata_t *cbp = data;
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvlist_t *config, *nvroot;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *msgid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int reason;
46657f8d750bdb71753495ce2919170f126b8e34mmusante const char *health;
46657f8d750bdb71753495ce2919170f126b8e34mmusante uint_t c;
46657f8d750bdb71753495ce2919170f126b8e34mmusante vdev_stat_t *vs;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock config = zpool_get_config(zhp, NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens reason = zpool_get_status(zhp, &msgid);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens cbp->cb_count++;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If we were given 'zpool status -x', only report those pools with
fa9e4066f08beec538e775443c5be79dd423fcabahrens * problems.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
b3a6f80422cf5830e402a39597c46faacc3df256Tim Connors if (cbp->cb_explain &&
b3a6f80422cf5830e402a39597c46faacc3df256Tim Connors (reason == ZPOOL_STATUS_OK ||
b3a6f80422cf5830e402a39597c46faacc3df256Tim Connors reason == ZPOOL_STATUS_VERSION_OLDER ||
b3a6f80422cf5830e402a39597c46faacc3df256Tim Connors reason == ZPOOL_STATUS_FEAT_DISABLED)) {
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock if (!cbp->cb_allpools) {
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock (void) printf(gettext("pool '%s' is healthy\n"),
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock zpool_get_name(zhp));
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock if (cbp->cb_first)
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock cbp->cb_first = B_FALSE;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (cbp->cb_first)
99653d4ee642c6528e88224f12409a5f23060994eschrock cbp->cb_first = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
46657f8d750bdb71753495ce2919170f126b8e34mmusante verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
46657f8d750bdb71753495ce2919170f126b8e34mmusante &nvroot) == 0);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_VDEV_STATS,
46657f8d750bdb71753495ce2919170f126b8e34mmusante (uint64_t **)&vs, &c) == 0);
990b4856d0eaada6f8140335733a1b1771ed2746lling 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;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
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"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (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 "
b1b8ab34de515a5e83206da22c3d7e563241b021lling "be used because the label is missing \n\tor invalid. "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "There are insufficient replicas for the pool to "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "continue\n\tfunctioning.\n"));
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley zpool_explain_recover(zpool_get_handle(zhp),
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley zpool_get_name(zhp), reason, config);
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 "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "'zpool clear' or replace the device with 'zpool "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "replace'.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_OFFLINE_DEV:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: One or more devices has "
d7d4af51b4d115490d97f0b89993fdbaaf441c94mmusante "been taken offline by the administrator.\n\tSufficient "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "replicas exist for the pool to continue functioning in "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "a\n\tdegraded state.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: Online the device using "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "'zpool online' or replace the device with\n\t'zpool "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "replace'.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
c25309d42d46e04be84e0dbadaf3c9ab3369ad05George Wilson case ZPOOL_STATUS_REMOVED_DEV:
c25309d42d46e04be84e0dbadaf3c9ab3369ad05George Wilson (void) printf(gettext("status: One or more devices has "
c25309d42d46e04be84e0dbadaf3c9ab3369ad05George Wilson "been removed by the administrator.\n\tSufficient "
c25309d42d46e04be84e0dbadaf3c9ab3369ad05George Wilson "replicas exist for the pool to continue functioning in "
c25309d42d46e04be84e0dbadaf3c9ab3369ad05George Wilson "a\n\tdegraded state.\n"));
c25309d42d46e04be84e0dbadaf3c9ab3369ad05George Wilson (void) printf(gettext("action: Online the device using "
c25309d42d46e04be84e0dbadaf3c9ab3369ad05George Wilson "'zpool online' or replace the device with\n\t'zpool "
c25309d42d46e04be84e0dbadaf3c9ab3369ad05George Wilson "replace'.\n"));
c25309d42d46e04be84e0dbadaf3c9ab3369ad05George Wilson break;
c25309d42d46e04be84e0dbadaf3c9ab3369ad05George Wilson
fa9e4066f08beec538e775443c5be79dd423fcabahrens case ZPOOL_STATUS_RESILVERING:
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: One or more devices is "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "currently being resilvered. The pool will\n\tcontinue "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "to function, possibly in a degraded state.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: Wait for the resilver to "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "complete.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock case ZPOOL_STATUS_CORRUPT_DATA:
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) printf(gettext("status: One or more devices has "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "experienced an error resulting in data\n\tcorruption. "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "Applications may be affected.\n"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) printf(gettext("action: Restore the file in question "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "if possible. Otherwise restore the\n\tentire pool from "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "backup.\n"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock break;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock case ZPOOL_STATUS_CORRUPT_POOL:
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) printf(gettext("status: The pool metadata is corrupted "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "and the pool cannot be opened.\n"));
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley zpool_explain_recover(zpool_get_handle(zhp),
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley zpool_get_name(zhp), reason, config);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock break;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case ZPOOL_STATUS_VERSION_OLDER:
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("status: The pool is formatted using a "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "legacy on-disk format. The pool can\n\tstill be used, "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "but some features are unavailable.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("action: Upgrade the pool using 'zpool "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "upgrade'. Once this is done, the\n\tpool will no longer "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "be accessible on software that does not support feature\n"
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "\tflags.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock break;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case ZPOOL_STATUS_VERSION_NEWER:
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("status: The pool has been upgraded to a "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "newer, incompatible on-disk version.\n\tThe pool cannot "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "be accessed on this system.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("action: Access the pool from a system "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "running more recent software, or\n\trestore the pool from "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "backup.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock break;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden case ZPOOL_STATUS_FEAT_DISABLED:
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("status: Some supported features are not "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "enabled on the pool. The pool can\n\tstill be used, but "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "some features are unavailable.\n"));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("action: Enable all features using "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "'zpool upgrade'. Once this is done,\n\tthe pool may no "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "longer be accessible by software that does not support\n\t"
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "the features. See zpool-features(5) for details.\n"));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden break;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden case ZPOOL_STATUS_UNSUP_FEAT_READ:
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) printf(gettext("status: The pool cannot be accessed on "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "this system because it uses the\n\tfollowing feature(s) "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "not supported on this system:\n"));
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden zpool_print_unsup_feat(config);
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) printf("\n");
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) printf(gettext("action: Access the pool from a system "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "that supports the required feature(s),\n\tor restore the "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "pool from backup.\n"));
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden break;
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden case ZPOOL_STATUS_UNSUP_FEAT_WRITE:
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) printf(gettext("status: The pool can only be accessed "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "in read-only mode on this system. It\n\tcannot be "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "accessed in read-write mode because it uses the "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "following\n\tfeature(s) not supported on this system:\n"));
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden zpool_print_unsup_feat(config);
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) printf("\n");
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) printf(gettext("action: The pool cannot be accessed in "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "read-write mode. Import the pool with\n"
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "\t\"-o readonly=on\", access the pool from a system that "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "supports the\n\trequired feature(s), or restore the "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "pool from backup.\n"));
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden break;
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock case ZPOOL_STATUS_FAULTED_DEV_R:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) printf(gettext("status: One or more devices are "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "faulted in response to persistent errors.\n\tSufficient "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "replicas exist for the pool to continue functioning "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "in a\n\tdegraded state.\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) printf(gettext("action: Replace the faulted device, "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "or use 'zpool clear' to mark the device\n\trepaired.\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock break;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock case ZPOOL_STATUS_FAULTED_DEV_NR:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) printf(gettext("status: One or more devices are "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "faulted in response to persistent errors. There are "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "insufficient replicas for the pool to\n\tcontinue "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "functioning.\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) printf(gettext("action: Destroy and re-create the pool "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "from a backup source. Manually marking the device\n"
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "\trepaired using 'zpool clear' may allow some data "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "to be recovered.\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock break;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
32b87932f3ef0887d873b7f6d2d1943799b2afc0ek case ZPOOL_STATUS_IO_FAILURE_WAIT:
32b87932f3ef0887d873b7f6d2d1943799b2afc0ek case ZPOOL_STATUS_IO_FAILURE_CONTINUE:
32b87932f3ef0887d873b7f6d2d1943799b2afc0ek (void) printf(gettext("status: One or more devices are "
8a79c1b573d7814f1e432b1de8c9ed00bc876becek "faulted in response to IO failures.\n"));
32b87932f3ef0887d873b7f6d2d1943799b2afc0ek (void) printf(gettext("action: Make sure the affected devices "
32b87932f3ef0887d873b7f6d2d1943799b2afc0ek "are connected, then run 'zpool clear'.\n"));
32b87932f3ef0887d873b7f6d2d1943799b2afc0ek break;
32b87932f3ef0887d873b7f6d2d1943799b2afc0ek
b87f3af36bb994656da117319f5129ddfd05ed21perrin case ZPOOL_STATUS_BAD_LOG:
b87f3af36bb994656da117319f5129ddfd05ed21perrin (void) printf(gettext("status: An intent log record "
b87f3af36bb994656da117319f5129ddfd05ed21perrin "could not be read.\n"
b87f3af36bb994656da117319f5129ddfd05ed21perrin "\tWaiting for adminstrator intervention to fix the "
b87f3af36bb994656da117319f5129ddfd05ed21perrin "faulted pool.\n"));
b87f3af36bb994656da117319f5129ddfd05ed21perrin (void) printf(gettext("action: Either restore the affected "
b87f3af36bb994656da117319f5129ddfd05ed21perrin "device(s) and run 'zpool online',\n"
b87f3af36bb994656da117319f5129ddfd05ed21perrin "\tor ignore the intent log records by running "
b87f3af36bb994656da117319f5129ddfd05ed21perrin "'zpool clear'.\n"));
b87f3af36bb994656da117319f5129ddfd05ed21perrin break;
b87f3af36bb994656da117319f5129ddfd05ed21perrin
fa9e4066f08beec538e775443c5be79dd423fcabahrens default:
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The remaining errors can't actually be generated, yet.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens assert(reason == ZPOOL_STATUS_OK);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (msgid != NULL)
654b400c387942fc00d4f6869539adbd7b25fbceJoshua M. Clulow (void) printf(gettext(" see: http://illumos.org/msg/%s\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens msgid);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (config != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens int namewidth;
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock uint64_t nerr;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan nvlist_t **spares, **l2cache;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan uint_t nspares, nl2cache;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling pool_scan_stat_t *ps = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void) nvlist_lookup_uint64_array(nvroot,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling ZPOOL_CONFIG_SCAN_STATS, (uint64_t **)&ps, &c);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling print_scan_status(ps);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock namewidth = max_width(zhp, nvroot, 0, 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (namewidth < 10)
fa9e4066f08beec538e775443c5be79dd423fcabahrens namewidth = 10;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("config:\n\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("\t%-*s %-8s %5s %5s %5s\n"), namewidth,
fa9e4066f08beec538e775443c5be79dd423fcabahrens "NAME", "STATE", "READ", "WRITE", "CKSUM");
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock print_status_config(zhp, zpool_get_name(zhp), nvroot,
aa8cf21aa2aaa2df3db469354ccc0c47f8cdaab9Neil Perrin namewidth, 0, B_FALSE);
99653d4ee642c6528e88224f12409a5f23060994eschrock
4dea40f0101dd55f4d4edd657d138d57849fd36dNeil Perrin if (num_logs(nvroot) > 0)
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson print_logs(zhp, nvroot, namewidth, B_TRUE);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_L2CACHE,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan &l2cache, &nl2cache) == 0)
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan print_l2cache(zhp, l2cache, nl2cache, namewidth);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
99653d4ee642c6528e88224f12409a5f23060994eschrock if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
99653d4ee642c6528e88224f12409a5f23060994eschrock &spares, &nspares) == 0)
99653d4ee642c6528e88224f12409a5f23060994eschrock print_spares(zhp, spares, nspares, namewidth);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_ERRCOUNT,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock &nerr) == 0) {
55434c770c89aa1b84474f2559a106803511aba0ek nvlist_t *nverrlist = NULL;
55434c770c89aa1b84474f2559a106803511aba0ek
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock /*
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * If the approximate error count is small, get a
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * precise count by fetching the entire log and
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * uniquifying the results.
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock */
75519f380eac71fe6d10b26e736f01567d6c13c9ek if (nerr > 0 && nerr < 100 && !cbp->cb_verbose &&
55434c770c89aa1b84474f2559a106803511aba0ek zpool_get_errlog(zhp, &nverrlist) == 0) {
55434c770c89aa1b84474f2559a106803511aba0ek nvpair_t *elem;
55434c770c89aa1b84474f2559a106803511aba0ek
55434c770c89aa1b84474f2559a106803511aba0ek elem = NULL;
55434c770c89aa1b84474f2559a106803511aba0ek nerr = 0;
55434c770c89aa1b84474f2559a106803511aba0ek while ((elem = nvlist_next_nvpair(nverrlist,
55434c770c89aa1b84474f2559a106803511aba0ek elem)) != NULL) {
55434c770c89aa1b84474f2559a106803511aba0ek nerr++;
55434c770c89aa1b84474f2559a106803511aba0ek }
55434c770c89aa1b84474f2559a106803511aba0ek }
55434c770c89aa1b84474f2559a106803511aba0ek nvlist_free(nverrlist);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) printf("\n");
99653d4ee642c6528e88224f12409a5f23060994eschrock
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (nerr == 0)
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) printf(gettext("errors: No known data "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "errors\n"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock else if (!cbp->cb_verbose)
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock (void) printf(gettext("errors: %llu data "
5ad820458efd0fdb914baff9c1447c22b819fa23nd "errors, use '-v' for a list\n"),
5ad820458efd0fdb914baff9c1447c22b819fa23nd (u_longlong_t)nerr);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock else
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock print_error_log(zhp);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock }
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson if (cbp->cb_dedup_stats)
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson print_dedup_stats(config);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("config: The configuration cannot be "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "determined.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * zpool status [-vx] [-T d|u] [pool] ... [interval [count]]
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -v Display complete error logs
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -x Display only pools with potential problems
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson * -D Display dedup status (undocumented)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * -T Display a timestamp in date(1) or Unix format
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Describes the health status of all pools or some subset.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_status(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int ret;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling unsigned long interval = 0, count = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens status_cbdata_t cb = { 0 };
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling while ((c = getopt(argc, argv, "vxDT:")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'v':
99653d4ee642c6528e88224f12409a5f23060994eschrock cb.cb_verbose = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case 'x':
99653d4ee642c6528e88224f12409a5f23060994eschrock cb.cb_explain = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson case 'D':
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson cb.cb_dedup_stats = B_TRUE;
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson break;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling case 'T':
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling get_timestamp_arg(*optarg);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling break;
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;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling get_interval_count(&argc, argv, &interval, &count);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock if (argc == 0)
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock cb.cb_allpools = B_TRUE;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling cb.cb_first = B_TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling for (;;) {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (timestamp_fmt != NODATE)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling print_timestamp(timestamp_fmt);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling ret = for_each_pool(argc, argv, B_TRUE, NULL,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling status_callback, &cb);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (argc == 0 && cb.cb_count == 0)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void) printf(gettext("no pools available\n"));
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling else if (cb.cb_explain && cb.cb_first && cb.cb_allpools)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void) printf(gettext("all pools are healthy\n"));
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (ret != 0)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling return (ret);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (interval == 0)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling break;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (count != 0 && --count == 0)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling break;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void) sleep(interval);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling }
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrocktypedef struct upgrade_cbdata {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock int cb_first;
06eeb2ad640ce72d394ac521094bed7681044408ek int cb_argc;
990b4856d0eaada6f8140335733a1b1771ed2746lling uint64_t cb_version;
06eeb2ad640ce72d394ac521094bed7681044408ek char **cb_argv;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock} upgrade_cbdata_t;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Sidenstatic int
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Sidenupgrade_version(zpool_handle_t *zhp, uint64_t version)
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden{
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden int ret;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden nvlist_t *config;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden uint64_t oldversion;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden config = zpool_get_config(zhp, NULL);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION,
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden &oldversion) == 0);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden assert(SPA_VERSION_IS_SUPPORTED(oldversion));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden assert(oldversion < version);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden ret = zpool_upgrade(zhp, version);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (ret != 0)
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden return (ret);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (version >= SPA_VERSION_FEATURES) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("Successfully upgraded "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "'%s' from version %llu to feature flags.\n"),
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden zpool_get_name(zhp), oldversion);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden } else {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("Successfully upgraded "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "'%s' from version %llu to version %llu.\n"),
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden zpool_get_name(zhp), oldversion, version);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden }
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden return (0);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden}
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Sidenstatic int
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Sidenupgrade_enable_all(zpool_handle_t *zhp, int *countp)
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden{
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden int i, ret, count;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden boolean_t firstff = B_TRUE;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden nvlist_t *enabled = zpool_get_features(zhp);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden count = 0;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden for (i = 0; i < SPA_FEATURES; i++) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden const char *fname = spa_feature_table[i].fi_uname;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden const char *fguid = spa_feature_table[i].fi_guid;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (!nvlist_exists(enabled, fguid)) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden char *propname;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden verify(-1 != asprintf(&propname, "feature@%s", fname));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden ret = zpool_set_prop(zhp, propname,
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden ZFS_FEATURE_ENABLED);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (ret != 0) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden free(propname);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden return (ret);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden }
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden count++;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (firstff) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("Enabled the "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "following features on '%s':\n"),
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden zpool_get_name(zhp));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden firstff = B_FALSE;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden }
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext(" %s\n"), fname);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden free(propname);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden }
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden }
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (countp != NULL)
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden *countp = count;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden return (0);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden}
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockstatic int
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockupgrade_cb(zpool_handle_t *zhp, void *arg)
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock{
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock upgrade_cbdata_t *cbp = arg;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock nvlist_t *config;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock uint64_t version;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden boolean_t printnl = B_FALSE;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden int ret;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock config = zpool_get_config(zhp, NULL);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION,
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock &version) == 0);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden assert(SPA_VERSION_IS_SUPPORTED(version));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (version < cbp->cb_version) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden cbp->cb_first = B_FALSE;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden ret = upgrade_version(zhp, cbp->cb_version);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (ret != 0)
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden return (ret);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden printnl = B_TRUE;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden /*
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden * If they did "zpool upgrade -a", then we could
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden * be doing ioctls to different pools. We need
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden * to log this history once to each pool, and bypass
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden * the normal history logging that happens in main().
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden */
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) zpool_log_history(g_zfs, history_str);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden log_history = B_FALSE;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden }
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (cbp->cb_version >= SPA_VERSION_FEATURES) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden int count;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden ret = upgrade_enable_all(zhp, &count);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (ret != 0)
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden return (ret);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (count > 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock cbp->cb_first = B_FALSE;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden printnl = B_TRUE;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (printnl) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("\n"));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden }
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden return (0);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden}
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Sidenstatic int
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Sidenupgrade_list_older_cb(zpool_handle_t *zhp, void *arg)
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden{
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden upgrade_cbdata_t *cbp = arg;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden nvlist_t *config;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden uint64_t version;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden config = zpool_get_config(zhp, NULL);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION,
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden &version) == 0);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden assert(SPA_VERSION_IS_SUPPORTED(version));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (version < SPA_VERSION_FEATURES) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (cbp->cb_first) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("The following pools are "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "formatted with legacy version numbers and can\n"
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "be upgraded to use feature flags. After "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "being upgraded, these pools\nwill no "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "longer be accessible by software that does not "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "support feature\nflags.\n\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("VER POOL\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("--- ------------\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock cbp->cb_first = B_FALSE;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
5ad820458efd0fdb914baff9c1447c22b819fa23nd (void) printf("%2llu %s\n", (u_longlong_t)version,
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock zpool_get_name(zhp));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden return (0);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden}
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Sidenstatic int
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Sidenupgrade_list_disabled_cb(zpool_handle_t *zhp, void *arg)
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden{
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden upgrade_cbdata_t *cbp = arg;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden nvlist_t *config;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden uint64_t version;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden config = zpool_get_config(zhp, NULL);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION,
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden &version) == 0);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (version >= SPA_VERSION_FEATURES) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden int i;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden boolean_t poolfirst = B_TRUE;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden nvlist_t *enabled = zpool_get_features(zhp);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden for (i = 0; i < SPA_FEATURES; i++) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden const char *fguid = spa_feature_table[i].fi_guid;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden const char *fname = spa_feature_table[i].fi_uname;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (!nvlist_exists(enabled, fguid)) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (cbp->cb_first) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("\nSome "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "supported features are not "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "enabled on the following pools. "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "Once a\nfeature is enabled the "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "pool may become incompatible with "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "software\nthat does not support "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "the feature. See "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "zpool-features(5) for "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "details.\n\n"));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("POOL "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "FEATURE\n"));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("------"
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "---------\n"));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden cbp->cb_first = B_FALSE;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden }
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (poolfirst) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("%s\n"),
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden zpool_get_name(zhp));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden poolfirst = B_FALSE;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden }
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext(" %s\n"), fname);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden }
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden }
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden }
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden return (0);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock}
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock/* ARGSUSED */
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockstatic int
06eeb2ad640ce72d394ac521094bed7681044408ekupgrade_one(zpool_handle_t *zhp, void *data)
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock{
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden boolean_t printnl = B_FALSE;
990b4856d0eaada6f8140335733a1b1771ed2746lling upgrade_cbdata_t *cbp = data;
990b4856d0eaada6f8140335733a1b1771ed2746lling uint64_t cur_version;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock int ret;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin if (strcmp("log", zpool_get_name(zhp)) == 0) {
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin (void) printf(gettext("'log' is now a reserved word\n"
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin "Pool 'log' must be renamed using export and import"
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin " to upgrade.\n"));
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin return (1);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin }
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling cur_version = zpool_get_prop_int(zhp, ZPOOL_PROP_VERSION, NULL);
e6c728e129b367a26c1972c43cc89654eb585941brendan if (cur_version > cbp->cb_version) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("Pool '%s' is already formatted "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "using more current version '%llu'.\n\n"),
e6c728e129b367a26c1972c43cc89654eb585941brendan zpool_get_name(zhp), cur_version);
e6c728e129b367a26c1972c43cc89654eb585941brendan return (0);
e6c728e129b367a26c1972c43cc89654eb585941brendan }
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (cbp->cb_version != SPA_VERSION && cur_version == cbp->cb_version) {
e6c728e129b367a26c1972c43cc89654eb585941brendan (void) printf(gettext("Pool '%s' is already formatted "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "using version %llu.\n\n"), zpool_get_name(zhp),
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden cbp->cb_version);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock return (0);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (cur_version != cbp->cb_version) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden printnl = B_TRUE;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden ret = upgrade_version(zhp, cbp->cb_version);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (ret != 0)
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden return (ret);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden }
06eeb2ad640ce72d394ac521094bed7681044408ek
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (cbp->cb_version >= SPA_VERSION_FEATURES) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden int count = 0;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden ret = upgrade_enable_all(zhp, &count);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (ret != 0)
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden return (ret);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (count != 0) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden printnl = B_TRUE;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden } else if (cur_version == SPA_VERSION) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("Pool '%s' already has all "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "supported features enabled.\n"),
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden zpool_get_name(zhp));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden }
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden }
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (printnl) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("\n"));
06eeb2ad640ce72d394ac521094bed7681044408ek }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden return (0);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock}
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock/*
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * zpool upgrade
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * zpool upgrade -v
990b4856d0eaada6f8140335733a1b1771ed2746lling * zpool upgrade [-V version] <-a | pool ...>
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock *
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * With no arguments, display downrev'd ZFS pool available for upgrade.
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * Individual pools can be upgraded by specifying the pool, and '-a' will
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * upgrade all pools.
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock */
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockint
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockzpool_do_upgrade(int argc, char **argv)
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock{
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock int c;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock upgrade_cbdata_t cb = { 0 };
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock int ret = 0;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock boolean_t showversions = B_FALSE;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden boolean_t upgradeall = B_FALSE;
990b4856d0eaada6f8140335733a1b1771ed2746lling char *end;
990b4856d0eaada6f8140335733a1b1771ed2746lling
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock /* check options */
478ed9ada0b6efe1318150a700986aa47e6a926dEric Taylor while ((c = getopt(argc, argv, ":avV:")) != -1) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock switch (c) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case 'a':
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden upgradeall = B_TRUE;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock break;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case 'v':
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock showversions = B_TRUE;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock break;
990b4856d0eaada6f8140335733a1b1771ed2746lling case 'V':
990b4856d0eaada6f8140335733a1b1771ed2746lling cb.cb_version = strtoll(optarg, &end, 10);
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden if (*end != '\0' ||
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden !SPA_VERSION_IS_SUPPORTED(cb.cb_version)) {
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) fprintf(stderr,
990b4856d0eaada6f8140335733a1b1771ed2746lling gettext("invalid version '%s'\n"), optarg);
990b4856d0eaada6f8140335733a1b1771ed2746lling usage(B_FALSE);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
478ed9ada0b6efe1318150a700986aa47e6a926dEric Taylor case ':':
478ed9ada0b6efe1318150a700986aa47e6a926dEric Taylor (void) fprintf(stderr, gettext("missing argument for "
478ed9ada0b6efe1318150a700986aa47e6a926dEric Taylor "'%c' option\n"), optopt);
478ed9ada0b6efe1318150a700986aa47e6a926dEric Taylor usage(B_FALSE);
478ed9ada0b6efe1318150a700986aa47e6a926dEric Taylor break;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock case '?':
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) fprintf(stderr, gettext("invalid option '%c'\n"),
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock optopt);
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
06eeb2ad640ce72d394ac521094bed7681044408ek cb.cb_argc = argc;
06eeb2ad640ce72d394ac521094bed7681044408ek cb.cb_argv = argv;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock argc -= optind;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock argv += optind;
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling if (cb.cb_version == 0) {
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling cb.cb_version = SPA_VERSION;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden } else if (!upgradeall && argc == 0) {
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling (void) fprintf(stderr, gettext("-V option is "
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling "incompatible with other arguments\n"));
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling usage(B_FALSE);
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling }
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (showversions) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (upgradeall || argc != 0) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) fprintf(stderr, gettext("-v option is "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "incompatible with other arguments\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden } else if (upgradeall) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (argc != 0) {
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling (void) fprintf(stderr, gettext("-a option should not "
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling "be used along with a pool name\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) printf(gettext("This system supports ZFS pool feature "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "flags.\n\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (showversions) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden int i;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("The following features are "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "supported:\n\n"));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("FEAT DESCRIPTION\n"));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf("----------------------------------------------"
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "---------------\n");
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden for (i = 0; i < SPA_FEATURES; i++) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden zfeature_info_t *fi = &spa_feature_table[i];
ca0cc3918a1789fa839194af2a9245f801a06b1aMatthew Ahrens const char *ro =
ca0cc3918a1789fa839194af2a9245f801a06b1aMatthew Ahrens (fi->fi_flags & ZFEATURE_FLAG_READONLY_COMPAT) ?
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden " (read-only compatible)" : "";
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf("%-37s%s\n", fi->fi_uname, ro);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(" %s\n", fi->fi_desc);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden }
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf("\n");
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("The following legacy versions are also "
d7d4af51b4d115490d97f0b89993fdbaaf441c94mmusante "supported:\n\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("VER DESCRIPTION\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf("--- -----------------------------------------"
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "---------------\n");
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext(" 1 Initial ZFS version\n"));
44cd46cadd9aab751dae6a4023c1cb5bf316d274billm (void) printf(gettext(" 2 Ditto blocks "
44cd46cadd9aab751dae6a4023c1cb5bf316d274billm "(replicated metadata)\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext(" 3 Hot spares and double parity "
99653d4ee642c6528e88224f12409a5f23060994eschrock "RAID-Z\n"));
d7306b64c847d897abb9ece8624fca9cf28d358fek (void) printf(gettext(" 4 zpool history\n"));
c9431fa1e59a88c2f0abf611f25b97af964449e5ahl (void) printf(gettext(" 5 Compression using the gzip "
c9431fa1e59a88c2f0abf611f25b97af964449e5ahl "algorithm\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf(gettext(" 6 bootfs pool property\n"));
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin (void) printf(gettext(" 7 Separate intent log devices\n"));
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (void) printf(gettext(" 8 Delegated administration\n"));
8eed72d43abf6184b757f3eb9228c3c4979aca10ck (void) printf(gettext(" 9 refquota and refreservation "
a9799022bd90b13722204e80112efaa5bf573099ck "properties\n"));
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan (void) printf(gettext(" 10 Cache devices\n"));
088f389458728c464569a5506b58070254fa4f7dahrens (void) printf(gettext(" 11 Improved scrub performance\n"));
bb0ade0978a02d3fe0b0165cd4725fdcb593fbfbahrens (void) printf(gettext(" 12 Snapshot properties\n"));
74e7dc986c89efca1f2e4451c7a572e05e4a6e4fMatthew Ahrens (void) printf(gettext(" 13 snapused property\n"));
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens (void) printf(gettext(" 14 passthrough-x aclinherit\n"));
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens (void) printf(gettext(" 15 user/group space accounting\n"));
478ed9ada0b6efe1318150a700986aa47e6a926dEric Taylor (void) printf(gettext(" 16 stmf property support\n"));
7aeab329f4988ec63a99e45edac0e54fc5ef9131Adam Leventhal (void) printf(gettext(" 17 Triple-parity RAID-Z\n"));
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick (void) printf(gettext(" 18 Snapshot user holds\n"));
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson (void) printf(gettext(" 19 Log device removal\n"));
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick (void) printf(gettext(" 20 Compression using zle "
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick "(zero-length encoding)\n"));
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick (void) printf(gettext(" 21 Deduplication\n"));
92241e0b80813d0b83c08e730a29b9d1831794fcTom Erickson (void) printf(gettext(" 22 Received properties\n"));
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin (void) printf(gettext(" 23 Slim ZIL\n"));
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum (void) printf(gettext(" 24 System attributes\n"));
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void) printf(gettext(" 25 Improved scrub stats\n"));
cde58dbc6a23d4d38db7c8866312be83221c765fMatthew Ahrens (void) printf(gettext(" 26 Improved snapshot deletion "
cde58dbc6a23d4d38db7c8866312be83221c765fMatthew Ahrens "performance\n"));
6e0cbcaa0c6f2bc34634a4cc17b099f9ecef03d1Matthew Ahrens (void) printf(gettext(" 27 Improved snapshot creation "
6e0cbcaa0c6f2bc34634a4cc17b099f9ecef03d1Matthew Ahrens "performance\n"));
cb04b8739c50e3e6d12e89b790fa7b8d0d899865Mark J Musante (void) printf(gettext(" 28 Multiple vdev replacements\n"));
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick (void) printf(gettext("\nFor more information on a particular "
9a8685acb1980e757acb4b2fdbb106654ef61317stephanie scheffler "version, including supported releases,\n"));
9a8685acb1980e757acb4b2fdbb106654ef61317stephanie scheffler (void) printf(gettext("see the ZFS Administration Guide.\n\n"));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden } else if (argc == 0 && upgradeall) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden cb.cb_first = B_TRUE;
99653d4ee642c6528e88224f12409a5f23060994eschrock ret = zpool_iter(g_zfs, upgrade_cb, &cb);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (ret == 0 && cb.cb_first) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (cb.cb_version == SPA_VERSION) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("All pools are already "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "formatted using feature flags.\n\n"));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("Every feature flags "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "pool already has all supported features "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "enabled.\n"));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden } else {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("All pools are already "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "formatted with version %llu or higher.\n"),
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden cb.cb_version);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden } else if (argc == 0) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden cb.cb_first = B_TRUE;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden ret = zpool_iter(g_zfs, upgrade_list_older_cb, &cb);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden assert(ret == 0);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (cb.cb_first) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("All pools are formatted "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "using feature flags.\n\n"));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden } else {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("\nUse 'zpool upgrade -v' "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "for a list of available legacy versions.\n"));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden }
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden cb.cb_first = B_TRUE;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden ret = zpool_iter(g_zfs, upgrade_list_disabled_cb, &cb);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden assert(ret == 0);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (cb.cb_first) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("Every feature flags pool has "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "all supported features enabled.\n"));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden } else {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock } else {
b1b8ab34de515a5e83206da22c3d7e563241b021lling ret = for_each_pool(argc, argv, B_FALSE, NULL,
b1b8ab34de515a5e83206da22c3d7e563241b021lling upgrade_one, &cb);
06eeb2ad640ce72d394ac521094bed7681044408ek }
06eeb2ad640ce72d394ac521094bed7681044408ek
06eeb2ad640ce72d394ac521094bed7681044408ek return (ret);
06eeb2ad640ce72d394ac521094bed7681044408ek}
06eeb2ad640ce72d394ac521094bed7681044408ek
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarkstypedef struct hist_cbdata {
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks boolean_t first;
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens boolean_t longfmt;
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens boolean_t internal;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks} hist_cbdata_t;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
06eeb2ad640ce72d394ac521094bed7681044408ek/*
06eeb2ad640ce72d394ac521094bed7681044408ek * Print out the command history for a specific pool.
06eeb2ad640ce72d394ac521094bed7681044408ek */
06eeb2ad640ce72d394ac521094bed7681044408ekstatic int
06eeb2ad640ce72d394ac521094bed7681044408ekget_history_one(zpool_handle_t *zhp, void *data)
06eeb2ad640ce72d394ac521094bed7681044408ek{
06eeb2ad640ce72d394ac521094bed7681044408ek nvlist_t *nvhis;
06eeb2ad640ce72d394ac521094bed7681044408ek nvlist_t **records;
06eeb2ad640ce72d394ac521094bed7681044408ek uint_t numrecords;
06eeb2ad640ce72d394ac521094bed7681044408ek int ret, i;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks hist_cbdata_t *cb = (hist_cbdata_t *)data;
06eeb2ad640ce72d394ac521094bed7681044408ek
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks cb->first = B_FALSE;
06eeb2ad640ce72d394ac521094bed7681044408ek
06eeb2ad640ce72d394ac521094bed7681044408ek (void) printf(gettext("History for '%s':\n"), zpool_get_name(zhp));
06eeb2ad640ce72d394ac521094bed7681044408ek
06eeb2ad640ce72d394ac521094bed7681044408ek if ((ret = zpool_get_history(zhp, &nvhis)) != 0)
06eeb2ad640ce72d394ac521094bed7681044408ek return (ret);
06eeb2ad640ce72d394ac521094bed7681044408ek
06eeb2ad640ce72d394ac521094bed7681044408ek verify(nvlist_lookup_nvlist_array(nvhis, ZPOOL_HIST_RECORD,
06eeb2ad640ce72d394ac521094bed7681044408ek &records, &numrecords) == 0);
06eeb2ad640ce72d394ac521094bed7681044408ek for (i = 0; i < numrecords; i++) {
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens nvlist_t *rec = records[i];
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens char tbuf[30] = "";
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens if (nvlist_exists(rec, ZPOOL_HIST_TIME)) {
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens time_t tsec;
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens struct tm t;
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens tsec = fnvlist_lookup_uint64(records[i],
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens ZPOOL_HIST_TIME);
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens (void) localtime_r(&tsec, &t);
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens (void) strftime(tbuf, sizeof (tbuf), "%F.%T", &t);
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens }
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens if (nvlist_exists(rec, ZPOOL_HIST_CMD)) {
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens (void) printf("%s %s", tbuf,
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens fnvlist_lookup_string(rec, ZPOOL_HIST_CMD));
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens } else if (nvlist_exists(rec, ZPOOL_HIST_INT_EVENT)) {
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens int ievent =
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens fnvlist_lookup_uint64(rec, ZPOOL_HIST_INT_EVENT);
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens if (!cb->internal)
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens continue;
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens if (ievent >= ZFS_NUM_LEGACY_HISTORY_EVENTS) {
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens (void) printf("%s unrecognized record:\n",
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens tbuf);
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens dump_nvlist(rec, 4);
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens continue;
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens }
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens (void) printf("%s [internal %s txg:%lld] %s", tbuf,
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens zfs_history_event_names[ievent],
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens fnvlist_lookup_uint64(rec, ZPOOL_HIST_TXG),
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens fnvlist_lookup_string(rec, ZPOOL_HIST_INT_STR));
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens } else if (nvlist_exists(rec, ZPOOL_HIST_INT_NAME)) {
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens if (!cb->internal)
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks continue;
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens (void) printf("%s [txg:%lld] %s", tbuf,
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens fnvlist_lookup_uint64(rec, ZPOOL_HIST_TXG),
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens fnvlist_lookup_string(rec, ZPOOL_HIST_INT_NAME));
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens if (nvlist_exists(rec, ZPOOL_HIST_DSNAME)) {
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens (void) printf(" %s (%llu)",
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens fnvlist_lookup_string(rec,
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens ZPOOL_HIST_DSNAME),
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens fnvlist_lookup_uint64(rec,
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens ZPOOL_HIST_DSID));
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens }
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens (void) printf(" %s", fnvlist_lookup_string(rec,
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens ZPOOL_HIST_INT_STR));
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens } else if (nvlist_exists(rec, ZPOOL_HIST_IOCTL)) {
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens if (!cb->internal)
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens continue;
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens (void) printf("%s ioctl %s\n", tbuf,
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens fnvlist_lookup_string(rec, ZPOOL_HIST_IOCTL));
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens if (nvlist_exists(rec, ZPOOL_HIST_INPUT_NVL)) {
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens (void) printf(" input:\n");
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens dump_nvlist(fnvlist_lookup_nvlist(rec,
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens ZPOOL_HIST_INPUT_NVL), 8);
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens }
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens if (nvlist_exists(rec, ZPOOL_HIST_OUTPUT_NVL)) {
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens (void) printf(" output:\n");
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens dump_nvlist(fnvlist_lookup_nvlist(rec,
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens ZPOOL_HIST_OUTPUT_NVL), 8);
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens }
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens } else {
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens if (!cb->internal)
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks continue;
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens (void) printf("%s unrecognized record:\n", tbuf);
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens dump_nvlist(rec, 4);
06eeb2ad640ce72d394ac521094bed7681044408ek }
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks if (!cb->longfmt) {
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (void) printf("\n");
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks continue;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks }
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (void) printf(" [");
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens if (nvlist_exists(rec, ZPOOL_HIST_WHO)) {
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens uid_t who = fnvlist_lookup_uint64(rec, ZPOOL_HIST_WHO);
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens struct passwd *pwd = getpwuid(who);
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens (void) printf("user %d ", (int)who);
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens if (pwd != NULL)
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens (void) printf("(%s) ", pwd->pw_name);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks }
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens if (nvlist_exists(rec, ZPOOL_HIST_HOST)) {
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens (void) printf("on %s",
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens fnvlist_lookup_string(rec, ZPOOL_HIST_HOST));
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks }
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens if (nvlist_exists(rec, ZPOOL_HIST_ZONE)) {
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens (void) printf(":%s",
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens fnvlist_lookup_string(rec, ZPOOL_HIST_ZONE));
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks }
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (void) printf("]");
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (void) printf("\n");
06eeb2ad640ce72d394ac521094bed7681044408ek }
06eeb2ad640ce72d394ac521094bed7681044408ek (void) printf("\n");
06eeb2ad640ce72d394ac521094bed7681044408ek nvlist_free(nvhis);
06eeb2ad640ce72d394ac521094bed7681044408ek
06eeb2ad640ce72d394ac521094bed7681044408ek return (ret);
06eeb2ad640ce72d394ac521094bed7681044408ek}
06eeb2ad640ce72d394ac521094bed7681044408ek
06eeb2ad640ce72d394ac521094bed7681044408ek/*
06eeb2ad640ce72d394ac521094bed7681044408ek * zpool history <pool>
06eeb2ad640ce72d394ac521094bed7681044408ek *
06eeb2ad640ce72d394ac521094bed7681044408ek * Displays the history of commands that modified pools.
06eeb2ad640ce72d394ac521094bed7681044408ek */
06eeb2ad640ce72d394ac521094bed7681044408ekint
06eeb2ad640ce72d394ac521094bed7681044408ekzpool_do_history(int argc, char **argv)
06eeb2ad640ce72d394ac521094bed7681044408ek{
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks hist_cbdata_t cbdata = { 0 };
06eeb2ad640ce72d394ac521094bed7681044408ek int ret;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks int c;
06eeb2ad640ce72d394ac521094bed7681044408ek
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks cbdata.first = B_TRUE;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks /* check options */
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks while ((c = getopt(argc, argv, "li")) != -1) {
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks switch (c) {
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks case 'l':
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens cbdata.longfmt = B_TRUE;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks break;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks case 'i':
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens cbdata.internal = B_TRUE;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks break;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks case '?':
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (void) fprintf(stderr, gettext("invalid option '%c'\n"),
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks optopt);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks usage(B_FALSE);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks }
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks }
06eeb2ad640ce72d394ac521094bed7681044408ek argc -= optind;
06eeb2ad640ce72d394ac521094bed7681044408ek argv += optind;
06eeb2ad640ce72d394ac521094bed7681044408ek
b1b8ab34de515a5e83206da22c3d7e563241b021lling ret = for_each_pool(argc, argv, B_FALSE, NULL, get_history_one,
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks &cbdata);
06eeb2ad640ce72d394ac521094bed7681044408ek
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks if (argc == 0 && cbdata.first == B_TRUE) {
06eeb2ad640ce72d394ac521094bed7681044408ek (void) printf(gettext("no pools available\n"));
06eeb2ad640ce72d394ac521094bed7681044408ek return (0);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock }
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock return (ret);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock}
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock
b1b8ab34de515a5e83206da22c3d7e563241b021llingstatic int
b1b8ab34de515a5e83206da22c3d7e563241b021llingget_callback(zpool_handle_t *zhp, void *data)
b1b8ab34de515a5e83206da22c3d7e563241b021lling{
990b4856d0eaada6f8140335733a1b1771ed2746lling zprop_get_cbdata_t *cbp = (zprop_get_cbdata_t *)data;
b1b8ab34de515a5e83206da22c3d7e563241b021lling char value[MAXNAMELEN];
990b4856d0eaada6f8140335733a1b1771ed2746lling zprop_source_t srctype;
990b4856d0eaada6f8140335733a1b1771ed2746lling zprop_list_t *pl;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling for (pl = cbp->cb_proplist; pl != NULL; pl = pl->pl_next) {
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling /*
990b4856d0eaada6f8140335733a1b1771ed2746lling * Skip the special fake placeholder. This will also skip
990b4856d0eaada6f8140335733a1b1771ed2746lling * over the name property when 'all' is specified.
b1b8ab34de515a5e83206da22c3d7e563241b021lling */
990b4856d0eaada6f8140335733a1b1771ed2746lling if (pl->pl_prop == ZPOOL_PROP_NAME &&
b1b8ab34de515a5e83206da22c3d7e563241b021lling pl == cbp->cb_proplist)
b1b8ab34de515a5e83206da22c3d7e563241b021lling continue;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden if (pl->pl_prop == ZPROP_INVAL &&
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (zpool_prop_feature(pl->pl_user_prop) ||
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden zpool_prop_unsupported(pl->pl_user_prop))) {
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden srctype = ZPROP_SRC_LOCAL;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden if (zpool_prop_get_feature(zhp, pl->pl_user_prop,
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden value, sizeof (value)) == 0) {
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden zprop_print_one_property(zpool_get_name(zhp),
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden cbp, pl->pl_user_prop, value, srctype,
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden NULL, NULL);
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden }
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden } else {
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden if (zpool_get_prop(zhp, pl->pl_prop, value,
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko sizeof (value), &srctype, cbp->cb_literal) != 0)
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden continue;
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden zprop_print_one_property(zpool_get_name(zhp), cbp,
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden zpool_prop_to_name(pl->pl_prop), value, srctype,
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden NULL, NULL);
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden }
b1b8ab34de515a5e83206da22c3d7e563241b021lling }
b1b8ab34de515a5e83206da22c3d7e563241b021lling return (0);
b1b8ab34de515a5e83206da22c3d7e563241b021lling}
b1b8ab34de515a5e83206da22c3d7e563241b021lling
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko/*
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko * zpool get [-Hp] [-o "all" | field[,...]] <"all" | property[,...]> <pool> ...
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko *
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko * -H Scripted mode. Don't display headers, and separate properties
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko * by a single tab.
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko * -o List of columns to display. Defaults to
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko * "name,property,value,source".
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko * -p Diplay values in parsable (exact) format.
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko *
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko * Get properties of pools in the system. Output space statistics
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko * for each one as well as other attributes.
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko */
b1b8ab34de515a5e83206da22c3d7e563241b021llingint
b1b8ab34de515a5e83206da22c3d7e563241b021llingzpool_do_get(int argc, char **argv)
b1b8ab34de515a5e83206da22c3d7e563241b021lling{
990b4856d0eaada6f8140335733a1b1771ed2746lling zprop_get_cbdata_t cb = { 0 };
990b4856d0eaada6f8140335733a1b1771ed2746lling zprop_list_t fake_name = { 0 };
b1b8ab34de515a5e83206da22c3d7e563241b021lling int ret;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko int c, i;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko char *value;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling cb.cb_first = B_TRUE;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko /*
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko * Set up default columns and sources.
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko */
990b4856d0eaada6f8140335733a1b1771ed2746lling 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;
990b4856d0eaada6f8140335733a1b1771ed2746lling cb.cb_type = ZFS_TYPE_POOL;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko /* check options */
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko while ((c = getopt(argc, argv, ":Hpo:")) != -1) {
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko switch (c) {
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko case 'p':
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko cb.cb_literal = B_TRUE;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko break;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko case 'H':
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko cb.cb_scripted = B_TRUE;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko break;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko case 'o':
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko bzero(&cb.cb_columns, sizeof (cb.cb_columns));
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko i = 0;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko while (*optarg != '\0') {
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko static char *col_subopts[] =
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko { "name", "property", "value", "source",
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko "all", NULL };
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko if (i == ZFS_GET_NCOLS) {
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko (void) fprintf(stderr, gettext("too "
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko "many fields given to -o "
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko "option\n"));
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko usage(B_FALSE);
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko }
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko switch (getsubopt(&optarg, col_subopts,
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko &value)) {
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko case 0:
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko cb.cb_columns[i++] = GET_COL_NAME;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko break;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko case 1:
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko cb.cb_columns[i++] = GET_COL_PROPERTY;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko break;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko case 2:
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko cb.cb_columns[i++] = GET_COL_VALUE;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko break;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko case 3:
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko cb.cb_columns[i++] = GET_COL_SOURCE;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko break;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko case 4:
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko if (i > 0) {
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko (void) fprintf(stderr,
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko gettext("\"all\" conflicts "
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko "with specific fields "
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko "given to -o option\n"));
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko usage(B_FALSE);
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko }
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko cb.cb_columns[0] = GET_COL_NAME;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko cb.cb_columns[1] = GET_COL_PROPERTY;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko cb.cb_columns[2] = GET_COL_VALUE;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko cb.cb_columns[3] = GET_COL_SOURCE;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko i = ZFS_GET_NCOLS;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko break;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko default:
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko (void) fprintf(stderr,
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko gettext("invalid column name "
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko "'%s'\n"), value);
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko usage(B_FALSE);
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko }
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko }
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko break;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko case '?':
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko (void) fprintf(stderr, gettext("invalid option '%c'\n"),
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko optopt);
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko usage(B_FALSE);
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko }
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko }
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko argc -= optind;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko argv += optind;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko if (argc < 1) {
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko (void) fprintf(stderr, gettext("missing property "
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko "argument\n"));
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko usage(B_FALSE);
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko }
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko if (zprop_get_list(g_zfs, argv[0], &cb.cb_proplist,
990b4856d0eaada6f8140335733a1b1771ed2746lling ZFS_TYPE_POOL) != 0)
b1b8ab34de515a5e83206da22c3d7e563241b021lling usage(B_FALSE);
b1b8ab34de515a5e83206da22c3d7e563241b021lling
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko argc--;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko argv++;
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko
b1b8ab34de515a5e83206da22c3d7e563241b021lling if (cb.cb_proplist != NULL) {
990b4856d0eaada6f8140335733a1b1771ed2746lling 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
c58b352673e88983cd2b8a388a8c7625f35e2f18Adam Stevko ret = for_each_pool(argc, argv, B_TRUE, &cb.cb_proplist,
b1b8ab34de515a5e83206da22c3d7e563241b021lling get_callback, &cb);
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling if (cb.cb_proplist == &fake_name)
990b4856d0eaada6f8140335733a1b1771ed2746lling zprop_free_list(fake_name.pl_next);
b1b8ab34de515a5e83206da22c3d7e563241b021lling else
990b4856d0eaada6f8140335733a1b1771ed2746lling 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 }
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling cb.cb_propname = argv[1];
b1b8ab34de515a5e83206da22c3d7e563241b021lling cb.cb_value = strchr(cb.cb_propname, '=');
b1b8ab34de515a5e83206da22c3d7e563241b021lling if (cb.cb_value == NULL) {
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) fprintf(stderr, gettext("missing value in "
b1b8ab34de515a5e83206da22c3d7e563241b021lling "property=value argument\n"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling usage(B_FALSE);
b1b8ab34de515a5e83206da22c3d7e563241b021lling }
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling *(cb.cb_value) = '\0';
b1b8ab34de515a5e83206da22c3d7e563241b021lling cb.cb_value++;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling error = for_each_pool(argc - 2, argv + 2, B_TRUE, NULL,
b1b8ab34de515a5e83206da22c3d7e563241b021lling set_callback, &cb);
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling return (error);
b1b8ab34de515a5e83206da22c3d7e563241b021lling}
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021llingstatic int
b1b8ab34de515a5e83206da22c3d7e563241b021llingfind_command_idx(char *command, int *idx)
b1b8ab34de515a5e83206da22c3d7e563241b021lling{
b1b8ab34de515a5e83206da22c3d7e563241b021lling int i;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling for (i = 0; i < NCOMMAND; i++) {
b1b8ab34de515a5e83206da22c3d7e563241b021lling if (command_table[i].name == NULL)
b1b8ab34de515a5e83206da22c3d7e563241b021lling continue;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling if (strcmp(command, command_table[i].name) == 0) {
b1b8ab34de515a5e83206da22c3d7e563241b021lling *idx = i;
b1b8ab34de515a5e83206da22c3d7e563241b021lling return (0);
b1b8ab34de515a5e83206da22c3d7e563241b021lling }
b1b8ab34de515a5e83206da22c3d7e563241b021lling }
b1b8ab34de515a5e83206da22c3d7e563241b021lling return (1);
b1b8ab34de515a5e83206da22c3d7e563241b021lling}
b1b8ab34de515a5e83206da22c3d7e563241b021lling
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrensmain(int argc, char **argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
b327cd3f3b4dab4f29e7140159b1e01ed2ceef2aIgor Kozhukhov int ret = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *cmdname;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) setlocale(LC_ALL, "");
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) textdomain(TEXT_DOMAIN);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock if ((g_zfs = libzfs_init()) == NULL) {
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, gettext("internal error: failed to "
203a47d89d37e993340060207ea2299ade638d68nd "initialize ZFS library\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (1);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock libzfs_print_on_error(g_zfs, B_TRUE);
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens opterr = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Make sure the user has specified some command.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc < 2) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing command\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens cmdname = argv[1];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Special case '-?'
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strcmp(cmdname, "-?") == 0)
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_TRUE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens zfs_save_arguments(argc, argv, history_str, sizeof (history_str));
2a6b87f07ac0c0b819179c84afe5a60afa04cfa5ek
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Run the appropriate command.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
b1b8ab34de515a5e83206da22c3d7e563241b021lling if (find_command_idx(cmdname, &i) == 0) {
b1b8ab34de515a5e83206da22c3d7e563241b021lling current_command = &command_table[i];
b1b8ab34de515a5e83206da22c3d7e563241b021lling ret = command_table[i].func(argc - 1, argv + 1);
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens } else if (strchr(cmdname, '=')) {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens verify(find_command_idx("set", &i) == 0);
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens current_command = &command_table[i];
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens ret = command_table[i].func(argc, argv);
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens } else if (strcmp(cmdname, "freeze") == 0 && argc == 3) {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens /*
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens * 'freeze' is a vile debugging abomination, so we treat
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens * it as such.
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock char buf[16384];
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock int fd = open(ZFS_DEV, O_RDWR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strcpy((void *)buf, argv[2]);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (!!ioctl(fd, ZFS_IOC_POOL_FREEZE, buf));
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("unrecognized "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "command '%s'\n"), cmdname);
99653d4ee642c6528e88224f12409a5f23060994eschrock usage(B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens if (ret == 0 && log_history)
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens (void) zpool_log_history(g_zfs, history_str);
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock libzfs_fini(g_zfs);
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The 'ZFS_ABORT' environment variable causes us to dump core on exit
fa9e4066f08beec538e775443c5be79dd423fcabahrens * for the purposes of running ::findleaks.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (getenv("ZFS_ABORT") != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("dumping core by request\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens abort();
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}