zpool_main.c revision 57221772c3fc05faba04bf48ddff45abf2bbf2bd
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fa9e4066f08beec538e775443c5be79dd423fcabahrens * See the License for the specific language governing permissions
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and limitations under the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * When distributing Covered Code, include this CDDL HEADER in each
fa9e4066f08beec538e775443c5be79dd423fcabahrens * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If applicable, add the following below this CDDL HEADER, with the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * fields enclosed by brackets "[]" replaced with your own identifying
fa9e4066f08beec538e775443c5be79dd423fcabahrens * information: Portions Copyright [yyyy] [name of copyright owner]
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER END
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
ce72e614c133351311e87bbbe4eba8fea9e77768Yuri Pankov * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
4263d13f00c9691fa14620eff82abef795be0693George Wilson * Copyright (c) 2012 by Delphix. All rights reserved.
e1d5e507a890a0408b8299bf95cad4678fc2390eFrederik Wessels * Copyright (c) 2012 by Frederik Wessels. All rights reserved.
26fd77009b17f8c8fb32eb362584cfd635e87ad9Krishnendu Sadhukhan - Sun Microsystems#include "statcommon.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_create(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_destroy(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_add(int, char **);
99653d4ee642c6528e88224f12409a5f23060994eschrockstatic int zpool_do_remove(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_list(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_iostat(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_status(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_online(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_offline(int, char **);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockstatic int zpool_do_clear(int, char **);
4263d13f00c9691fa14620eff82abef795be0693George Wilsonstatic int zpool_do_reopen(int, char **);
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amorestatic int zpool_do_reguid(int, char **);
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 **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_scrub(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_import(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_export(int, char **);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockstatic int zpool_do_upgrade(int, char **);
06eeb2ad640ce72d394ac521094bed7681044408ekstatic int zpool_do_history(int, char **);
b1b8ab34de515a5e83206da22c3d7e563241b021llingstatic int zpool_do_get(int, char **);
b1b8ab34de515a5e83206da22c3d7e563241b021llingstatic int zpool_do_set(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * These libumem hooks provide a reasonable set of defaults for the allocator's
fa9e4066f08beec538e775443c5be79dd423fcabahrens * debugging facilities.
fa9e4066f08beec538e775443c5be79dd423fcabahrensconst char *
fa9e4066f08beec538e775443c5be79dd423fcabahrens return ("default,verbose"); /* $UMEM_DEBUG setting */
fa9e4066f08beec538e775443c5be79dd423fcabahrensconst char *
fa9e4066f08beec538e775443c5be79dd423fcabahrens return ("fail,contents"); /* $UMEM_LOGGING setting */
65cd9f2809a015b46790a9c5c2ef992d56177624eschrocktypedef enum {
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct zpool_command {
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *name;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int (*func)(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Master command table. Each ZFS command has a name, associated function, and
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 * 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#define NCOMMAND (sizeof (command_table) / sizeof (command_table[0]))
26fd77009b17f8c8fb32eb362584cfd635e87ad9Krishnendu Sadhukhan - Sun Microsystemsstatic uint_t timestamp_fmt = NODATE;
65cd9f2809a015b46790a9c5c2ef992d56177624eschrockstatic const char *
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock return (gettext("\tadd [-fn] <pool> <vdev> ...\n"));
e45ce728996d8e573eecb27f555fb86aaff0cafdahrens "<new-device>\n"));
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley return (gettext("\tclear [-nF] <pool> [device]\n"));
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"));
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"));
26fd77009b17f8c8fb32eb362584cfd635e87ad9Krishnendu Sadhukhan - Sun Microsystems return (gettext("\tiostat [-v] [-T d|u] [pool] ... [interval "
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock "[count]]\n"));
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling "[-T d|u] [pool] ... [interval [count]]\n"));
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling return (gettext("\toffline [-t] <pool> <device> ...\n"));
e45ce728996d8e573eecb27f555fb86aaff0cafdahrens "[new-device]\n"));
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling return (gettext("\tstatus [-vx] [-T d|u] [pool] ... [interval "
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling "[count]]\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "\tupgrade -v\n"
990b4856d0eaada6f8140335733a1b1771ed2746lling "\tupgrade [-V version] <-a | pool ...>\n"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling "<pool> ...\n"));
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"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock /* NOTREACHED */
b1b8ab34de515a5e83206da22c3d7e563241b021lling * Callback routine that will print out a pool property value.
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick (void) fprintf(fp, "\t%-15s ", zpool_prop_to_name(prop));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Display usage message. If we're inside a command, display only the usage for
fa9e4066f08beec538e775443c5be79dd423fcabahrens * that command. Otherwise, iterate over the entire command table and display
fa9e4066f08beec538e775443c5be79dd423fcabahrens * a complete usage message.
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(fp, gettext("usage: zpool command args ...\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens gettext("where 'command' is one of the following:\n\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < NCOMMAND; i++) {
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock (void) fprintf(fp, "%s", get_usage(current_command->usage));
b1b8ab34de515a5e83206da22c3d7e563241b021lling gettext("\nthe following properties are supported:\n"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling /* Iterate over all properties */
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) fprintf(fp, "\t%-15s ", "feature@...");
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) fprintf(fp, "YES disabled | enabled | active\n");
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) fprintf(fp, gettext("\nThe feature@ properties must be "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "appended with a feature name.\nSee zpool-features(5).\n"));
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * See comments at end of main().
8654d0253136055bd4cc2423d87378e8a37f2eb5perrinprint_vdev_tree(zpool_handle_t *zhp, const char *name, nvlist_t *nv, int indent,
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock for (c = 0; c < children; c++) {
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin (void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG,
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin if ((is_log && !print_logs) || (!is_log && print_logs))
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson vname = zpool_vdev_name(g_zfs, zhp, child[c], B_FALSE);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Sidenprop_list_contains_feature(nvlist_t *proplist)
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden for (nvp = nvlist_next_nvpair(proplist, NULL); NULL != nvp;
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden nvp = nvlist_next_nvpair(proplist, nvp)) {
990b4856d0eaada6f8140335733a1b1771ed2746lling * Add a property pair (name, string-value) into a property nvlist.
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimhadd_prop_list(const char *propname, char *propval, nvlist_t **props,
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh const char *normnm;
990b4856d0eaada6f8140335733a1b1771ed2746lling return (1);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden const char *vname = zpool_prop_to_name(ZPOOL_PROP_VERSION);
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden if ((prop = zpool_name_to_prop(propname)) == ZPROP_INVAL &&
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh return (2);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden * feature@ properties and version should not be specified
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden * at the same time.
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if ((prop == ZPROP_INVAL && zpool_prop_feature(propname) &&
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) fprintf(stderr, gettext("'feature@' and "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "'version' properties cannot be specified "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "together\n"));
148434217c040ea38dc844384f6ba68d9b325906Matthew Ahrens if ((fprop = zfs_name_to_prop(propname)) != ZPROP_INVAL) {
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh if (nvlist_lookup_string(proplist, normnm, &strval) == 0 &&
990b4856d0eaada6f8140335733a1b1771ed2746lling return (2);
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh if (nvlist_add_string(proplist, normnm, propval) != 0) {
990b4856d0eaada6f8140335733a1b1771ed2746lling "error: out of memory\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling return (1);
990b4856d0eaada6f8140335733a1b1771ed2746lling return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool add [-fn] <pool> <vdev> ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Force addition of devices, even if they appear in use
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -n Do not add the devices, but display the resulting layout if
fa9e4066f08beec538e775443c5be79dd423fcabahrens * they were to be added.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Adds the given vdevs to 'pool'. As with create, the bulk of this work is
fa9e4066f08beec538e775443c5be79dd423fcabahrens * handled by get_vdev_spec(), which constructs the nvlist needed to pass to
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get pool name and check number of arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name argument\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing vdev specification\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock if ((config = zpool_get_config(zhp, NULL)) == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("pool '%s' is unavailable\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* pass off to get_vdev_spec for processing */
705040ed336e23b47ac6a3421d1f23ab5e86871bEric Taylor nvroot = make_root_vdev(zhp, force, !force, B_FALSE, dryrun,
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("would update '%s' to the following "
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin /* print original main pool and new tree */
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin print_vdev_tree(zhp, poolname, poolnvroot, 0, B_FALSE);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin /* Do the same for the logs */
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * zpool remove <pool> <vdev> ...
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * Removes the given vdev from the pool. Currently, this supports removing
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * spares, cache, and log devices from the pool.
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan int i, ret = 0;
99653d4ee642c6528e88224f12409a5f23060994eschrock /* get pool name and check number of arguments */
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, gettext("missing pool name argument\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, gettext("missing device\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (1);
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden * zpool create [-fnd] [-o property=value] ...
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh * [-O file-system-property=value] ...
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh * [-R root] [-m mountpoint] <pool> <dev> ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Force creation, even if devices appear in use
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -n Do not create the pool, but display the resulting layout if it
fa9e4066f08beec538e775443c5be79dd423fcabahrens * were to be created.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -R Create a pool under an alternate root
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -m Set default mountpoint for the root dataset. By default it's
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
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 /* check options */
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden while ((c = getopt(argc, argv, ":fndR:m:o:O:")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
990b4856d0eaada6f8140335733a1b1771ed2746lling "'=' for -o option\n"));
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden * If the user is creating a pool that doesn't support
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden * feature flags, don't enable any features.
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden if (zpool_name_to_prop(optarg) == ZPOOL_PROP_VERSION) {
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh "'=' for -O option\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing argument for "
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get pool name and check number of arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name argument\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing vdev specification\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * As a special case, check for use of '/' in the name, and direct the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * user to use 'zfs create' instead.
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("cannot create '%s': invalid "
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("use 'zfs create' to "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "create a dataset\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* pass off to get_vdev_spec for bulk processing */
705040ed336e23b47ac6a3421d1f23ab5e86871bEric Taylor nvroot = make_root_vdev(NULL, force, !force, B_FALSE, dryrun,
99653d4ee642c6528e88224f12409a5f23060994eschrock /* make_root_vdev() allows 0 toplevel children if there are spares */
99653d4ee642c6528e88224f12409a5f23060994eschrock "specification: at least one toplevel vdev must be "
99653d4ee642c6528e88224f12409a5f23060994eschrock "specified\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid alternate root '%s': "
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Check the validity of the mountpoint and direct the user to use the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * '-m' mountpoint option if it looks like its in use.
fa9e4066f08beec538e775443c5be79dd423fcabahrens "'%s': must be an absolute path, 'legacy', or "
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh if ((dirp = opendir(buf)) == NULL && errno != ENOENT) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens "option to provide a different default\n"));
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh } else if (dirp) {
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh "option to provide a "
11022c7cf39f3b863e749f3866f6ddcb445c2d05timh "different default\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * For a dry run invocation, print out a basic message and run
fa9e4066f08beec538e775443c5be79dd423fcabahrens * through all the vdevs in the list and print out in an
fa9e4066f08beec538e775443c5be79dd423fcabahrens * appropriate hierarchy.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Hand off to libzfs.
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden for (i = 0; i < SPA_FEATURES; i++) {
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden zfeature_info_t *feat = &spa_feature_table[i];
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) snprintf(propname, sizeof (propname),
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden * Skip feature if user specified it manually
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden * on the command line.
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden if (add_prop_list(propname, ZFS_FEATURE_ENABLED,
99653d4ee642c6528e88224f12409a5f23060994eschrock } else if (libzfs_errno(g_zfs) == EZFS_INVALIDNAME) {
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, gettext("pool name may have "
99653d4ee642c6528e88224f12409a5f23060994eschrock "been omitted\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling return (2);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool destroy <pool>
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Forcefully unmount any datasets
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Destroy the given pool. Automatically unmounts any datasets in the pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool argument\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("too many arguments\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock if ((zhp = zpool_open_canfail(g_zfs, pool)) == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens * As a special case, check for use of '/' in the name, and
fa9e4066f08beec538e775443c5be79dd423fcabahrens * direct the user to use 'zfs destroy' instead.
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("use 'zfs destroy' to "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "destroy a dataset\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("could not destroy '%s': "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "could not unmount datasets\n"), zpool_get_name(zhp));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens /* The history must be logged as part of the export */
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens ret = (zpool_destroy(zhp, history_str) != 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool export [-f] <pool> ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Forcefully unmount datasets
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 /* check options */
394ab0cbe9de0b3be5bf232d9224a9d050999ae5George Wilson while ((c = getopt(argc, argv, "fF")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool argument\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < argc; i++) {
99653d4ee642c6528e88224f12409a5f23060994eschrock if ((zhp = zpool_open_canfail(g_zfs, argv[i])) == NULL) {
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens /* The history must be logged as part of the export */
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens if (zpool_export_force(zhp, history_str) != 0)
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens } else if (zpool_export(zhp, force, history_str) != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Given a vdev configuration, determine the maximum width needed for the device
fa9e4066f08beec538e775443c5be79dd423fcabahrens * name column.
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrockmax_width(zpool_handle_t *zhp, nvlist_t *nv, int depth, int max)
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson char *name = zpool_vdev_name(g_zfs, zhp, nv, B_TRUE);
99653d4ee642c6528e88224f12409a5f23060994eschrock if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_SPARES,
99653d4ee642c6528e88224f12409a5f23060994eschrock for (c = 0; c < children; c++)
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_L2CACHE,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan for (c = 0; c < children; c++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
99653d4ee642c6528e88224f12409a5f23060994eschrock for (c = 0; c < children; c++)
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilsontypedef struct spare_cbdata {
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &guid) == 0 &&
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson for (c = 0; c < children; c++)
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson * Print out configuration state as requested by status_callback.
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilsonprint_status_config(zpool_handle_t *zhp, const char *name, nvlist_t *nv,
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling verify(nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_VDEV_STATS,
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson state = zpool_state_to_name(vs->vs_state, vs->vs_aux);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson * For hot spares, we use the terms 'INUSE' and 'AVAILABLE' for
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson * online drives.
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson (void) printf("\t%*s%-*s %-8s", depth, "", namewidth - depth,
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 if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT,
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson (void) printf(gettext("insufficient replicas"));
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) printf(gettext("unsupported feature(s)"));
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID,
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson if (zpool_iter(g_zfs, find_spare, &cb) == 1) {
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson "pool '%s'"),
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson (void) printf(gettext("experienced I/O failures"));
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock (void) printf(gettext("external device fault"));
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante (void) printf(gettext("split into new pool"));
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void) nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_SCAN_STATS,
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson for (c = 0; c < children; c++) {
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson /* Don't print logs or holes here */
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson (void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG,
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson (void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_HOLE,
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson vname = zpool_vdev_name(g_zfs, zhp, child[c], B_TRUE);
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.
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilsonprint_import_config(const char *name, nvlist_t *nv, int namewidth, int depth)
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &type) == 0);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling verify(nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_VDEV_STATS,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("\t%*s%-*s", depth, "", namewidth - depth, name);
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf(" %s", zpool_state_to_name(vs->vs_state, vs->vs_aux));
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) printf(gettext("unsupported feature(s)"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock for (c = 0; c < children; c++) {
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin (void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG,
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson vname = zpool_vdev_name(g_zfs, NULL, child[c], B_TRUE);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson print_import_config(vname, child[c], namewidth, depth + 2);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_L2CACHE,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan for (c = 0; c < children; c++) {
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson vname = zpool_vdev_name(g_zfs, NULL, child[c], B_FALSE);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_SPARES,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan for (c = 0; c < children; c++) {
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson vname = zpool_vdev_name(g_zfs, NULL, child[c], B_FALSE);
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 Wilsonprint_logs(zpool_handle_t *zhp, nvlist_t *nv, int namewidth, boolean_t verbose)
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN, &child,
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson for (c = 0; c < children; c++) {
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson (void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG,
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson name = zpool_vdev_name(g_zfs, zhp, child[c], B_TRUE);
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson print_status_config(zhp, name, child[c], namewidth,
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson print_import_config(name, child[c], namewidth, 2);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Display the status for the given pool.
46657f8d750bdb71753495ce2919170f126b8e34mmusante const char *health;
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME,
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID,
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_STATE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_VDEV_STATS,
990b4856d0eaada6f8140335733a1b1771ed2746lling health = zpool_state_to_name(vs->vs_state, vs->vs_aux);
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" id: %llu\n"), (u_longlong_t)guid);
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" status: One or more devices are "
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald "missing from the system.\n"));
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" status: One or more devices contains "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "corrupted data.\n"));
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald gettext(" status: The pool data is corrupted.\n"));
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" status: One or more devices "
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling "are offlined.\n"));
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" status: The pool metadata is "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "corrupted.\n"));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext(" status: The pool is formatted using a "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "legacy on-disk version.\n"));
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" status: The pool is formatted using an "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "incompatible version.\n"));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext(" status: Some supported features are "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "not enabled on the pool.\n"));
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) printf(gettext("status: The pool uses the following "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "feature(s) not supported on this sytem:\n"));
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"));
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" status: The pool was last accessed by "
95173954d2b811ceb583a9012c3b16e1d0dd6438ek "another system.\n"));
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" status: One or more devices are "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "faulted.\n"));
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" status: An intent log record cannot be "
b87f3af36bb994656da117319f5129ddfd05ed21perrin "read.\n"));
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" status: One or more devices were being "
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling "resilvered.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * No other status can be seen when importing pools.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print out an action according to the overall state of the pool.
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (reason == ZPOOL_STATUS_VERSION_OLDER ||
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"));
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" action: The pool can be "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "imported using its name or numeric "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "identifier.\n"));
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"));
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"));
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 (void) printf(gettext("action: The pool cannot be "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "imported in read-write mode. Import the pool "
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"));
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" action: The pool cannot be "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "imported. Attach the missing\n\tdevices and try "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "again.\n"));
8704186e373c9ed74daa395ff3f7fd745396df9eDan McDonald (void) printf(gettext(" action: The pool cannot be "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "imported due to damaged devices or data.\n"));
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);
46657f8d750bdb71753495ce2919170f126b8e34mmusante * If the state is "closed" or "can't open", and the aux state
46657f8d750bdb71753495ce2919170f126b8e34mmusante * is "corrupt data":
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "but can be imported using the '-Df' flags.\n"));
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"));
654b400c387942fc00d4f6869539adbd7b25fbceJoshua M. Clulow (void) printf(gettext(" see: http://illumos.org/msg/%s\n"),
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson print_import_config(name, nvroot, namewidth, 0);
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 * 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.
fa9e4066f08beec538e775443c5be79dd423fcabahrensdo_import(nvlist_t *config, const char *newname, const char *mntopts,
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME,
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) fprintf(stderr, gettext("cannot import '%s': pool "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "is formatted using an unsupported ZFS version\n"), name);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock return (1);
95173954d2b811ceb583a9012c3b16e1d0dd6438ek "'%s': pool may be in use from other "
95173954d2b811ceb583a9012c3b16e1d0dd6438ek "system, it was last accessed by %s "
95173954d2b811ceb583a9012c3b16e1d0dd6438ek (unsigned long)hostid,
95173954d2b811ceb583a9012c3b16e1d0dd6438ek "import anyway\n"));
95173954d2b811ceb583a9012c3b16e1d0dd6438ek return (1);
95173954d2b811ceb583a9012c3b16e1d0dd6438ek "anyway\n"));
95173954d2b811ceb583a9012c3b16e1d0dd6438ek return (1);
4b964ada391d44b89d97e7e930e6a9a136e0a2f4George Wilson if (zpool_import_props(g_zfs, config, newname, props, flags) != 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
4f0f5e5be9d3811b437d9156675d584e2a2f204aVictor Latushkin if ((zhp = zpool_open_canfail(g_zfs, name)) == NULL)
379c004d1f26b343f034bba8a350290691d00d38Eric Schrock if (zpool_get_state(zhp) != POOL_STATE_UNAVAIL &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
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 * -c Read pool information from a cachefile instead of searching
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -d Scan in a specific directory, other than /dev/dsk. More than
fa9e4066f08beec538e775443c5be79dd423fcabahrens * one directory can be specified using multiple '-d' options.
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm * -D Scan for previously destroyed pools or import all or only
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm * specified destroyed pools.
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.
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
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley * -f Force import, even if it appears that the pool is active.
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley * -F Attempt rewind if necessary.
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley * -n See if rewind would work, but don't actually rewind.
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson * -N Import the pool but don't mount datasets.
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson * -T Specify a starting txg to use for import. This option is
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson * intentionally undocumented option for testing purposes.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -a Import all pools found.
990b4856d0eaada6f8140335733a1b1771ed2746lling * -o Set property=value and/or temporary mount options (without '=').
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The import command scans for pools to import, and import pools based on pool
fa9e4066f08beec538e775443c5be79dd423fcabahrens * name and GUID. The pool can also be renamed as part of the import process.
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson while ((c = getopt(argc, argv, ":aCc:d:DEfFmnNo:rR:T:VX")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (char *));
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (char *));
f9af39bacaaa0f9dda3b75ff6858b9f3988a39afGeorge Wilson rewind_policy = ZPOOL_DO_REWIND | ZPOOL_EXTREME_REWIND;
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing argument for "
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock (void) fprintf(stderr, gettext("-c is incompatible with -d\n"));
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)
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check argument count */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("too many arguments\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("too many arguments\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Check for the SYS_CONFIG privilege. We do this explicitly
fa9e4066f08beec538e775443c5be79dd423fcabahrens * here because otherwise any attempt to discover pools will
fa9e4066f08beec538e775443c5be79dd423fcabahrens * silently fail.
fa9e4066f08beec538e775443c5be79dd423fcabahrens "discover pools: permission denied\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Depending on the arguments given, we do one of the following:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * <none> Iterate through all pools and display information about
fa9e4066f08beec538e775443c5be79dd423fcabahrens * each one.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -a Iterate through all pools and try to import each one.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * <id> Find the pool that corresponds to the given GUID/pool
fa9e4066f08beec538e775443c5be79dd423fcabahrens * name and import that one.
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm * -D Above options applies only to destroyed pools.
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc != 0) {
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante * User specified a name or guid. Ensure it's unique.
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 (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 (void) fprintf(stderr, gettext("cannot import '%s': "
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante "a pool with that name is already created/imported,\n"),
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante (void) fprintf(stderr, gettext("and no additional pools "
d41c437653d9e16d837cc66844073e1885276ceeMark J Musante "with that name were found\n"));
24e697d414a4df0377b91a2875f029e7b5f97247ck if (argc != 0) {
24e697d414a4df0377b91a2875f029e7b5f97247ck return (1);
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.
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((elem = nvlist_next_nvpair(pools, elem)) != NULL) {
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_STATE,
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm if (!do_destroyed && pool_state == POOL_STATE_DESTROYED)
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm if (do_destroyed && pool_state != POOL_STATE_DESTROYED)
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley verify(nvlist_add_nvlist(config, ZPOOL_REWIND_POLICY,
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens * We are searching for a pool based on name.
fa9e4066f08beec538e775443c5be79dd423fcabahrens "cannot import '%s': more than "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "import by numeric ID instead\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Search for a pool by guid.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If we were searching for a specific pool, verify that we found a
fa9e4066f08beec538e775443c5be79dd423fcabahrens * pool, and then do the import.
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("cannot import '%s': "
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If we were just looking for pools, report an error if none were
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct iostat_cbdata {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(" ----- ----- ----- ----- ----- -----\n");
485bbbf5450c6645352388d798251c1a89ef4c9cGeorge Wilson (void) printf("%-*s alloc free read write read write\n",
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Display a single statistic.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print out all the statistics for the given vdev. This can either be the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * toplevel configuration, or called recursively. If 'name' is NULL, then this
fa9e4066f08beec538e775443c5be79dd423fcabahrens * is a verbose output, and we don't want to display the toplevel pool stats.
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrockprint_vdev_stats(zpool_handle_t *zhp, const char *name, nvlist_t *oldnv,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling ZPOOL_CONFIG_VDEV_STATS, (uint64_t **)&oldvs, &c) == 0);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling verify(nvlist_lookup_uint64_array(newnv, ZPOOL_CONFIG_VDEV_STATS,
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* only toplevel vdevs have capacity stats */
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_one_stat((uint64_t)(scale * (newvs->vs_ops[ZIO_TYPE_READ] -
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_one_stat((uint64_t)(scale * (newvs->vs_ops[ZIO_TYPE_WRITE] -
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_one_stat((uint64_t)(scale * (newvs->vs_bytes[ZIO_TYPE_READ] -
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_one_stat((uint64_t)(scale * (newvs->vs_bytes[ZIO_TYPE_WRITE] -
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(newnv, ZPOOL_CONFIG_CHILDREN,
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (oldnv && nvlist_lookup_nvlist_array(oldnv, ZPOOL_CONFIG_CHILDREN,
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock for (c = 0; c < children; c++) {
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch (void) nvlist_lookup_uint64(newchild[c], ZPOOL_CONFIG_IS_HOLE,
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch (void) nvlist_lookup_uint64(newchild[c], ZPOOL_CONFIG_IS_LOG,
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson vname = zpool_vdev_name(g_zfs, zhp, newchild[c], B_FALSE);
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock print_vdev_stats(zhp, vname, oldnv ? oldchild[c] : NULL,
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch * Log device section
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch for (c = 0; c < children; c++) {
9d439f9073ca9fcb817d9b0bb14b0e4197e67690Mike Harsch vname = zpool_vdev_name(g_zfs, zhp, newchild[c],
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan * Include level 2 ARC devices in iostat output
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (nvlist_lookup_nvlist_array(newnv, ZPOOL_CONFIG_L2CACHE,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (oldnv && nvlist_lookup_nvlist_array(oldnv, ZPOOL_CONFIG_L2CACHE,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan for (c = 0; c < children; c++) {
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson vname = zpool_vdev_name(g_zfs, zhp, newchild[c],
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan print_vdev_stats(zhp, vname, oldnv ? oldchild[c] : NULL,
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * If the pool has disappeared, remove it from the list and continue.
94de1d4cf6ec0a3bf040dcc4b8df107c4ed36b51eschrock return (-1);
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Callback to print out the iostats for the given pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist(newconfig, ZPOOL_CONFIG_VDEV_TREE,
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock verify(nvlist_lookup_nvlist(oldconfig, ZPOOL_CONFIG_VDEV_TREE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print out the statistics for the pool.
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock print_vdev_stats(zhp, zpool_get_name(zhp), oldnvroot, newnvroot, cb, 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock if ((config = zpool_get_config(zhp, NULL)) != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
e1d5e507a890a0408b8299bf95cad4678fc2390eFrederik Wessels cb->cb_namewidth = max_width(zhp, nvroot, 0,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The width must fall into the range [10,38]. The upper limit is the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * maximum we can have and still fit in 80 columns.
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * Parse the input string, get the 'interval' and 'count' value if there is one.
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Lingget_interval_count(int *argcp, char **argv, unsigned long *iv,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling unsigned long *cnt)
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Determine if the last argument is an integer or a pool name
fa9e4066f08beec538e775443c5be79dd423fcabahrens "cannot be zero\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Ignore the last parameter
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If this is not a valid number, just plow on. The
fa9e4066f08beec538e775443c5be79dd423fcabahrens * user will get a more informative error message later
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If the last argument is also an integer, then we have both a count
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * and an interval.
fa9e4066f08beec538e775443c5be79dd423fcabahrens "cannot be zero\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Ignore the last parameter
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (c == 'u')
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling else if (c == 'd')
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * zpool iostat [-v] [-T d|u] [pool] ... [interval [count]]
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * -v Display statistics for individual vdevs
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * -T Display a timestamp in date(1) or Unix format
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 /* check options */
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling switch (c) {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void) fprintf(stderr, gettext("invalid option '%c'\n"),
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling get_interval_count(&argc, argv, &interval, &count);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Construct the list of all interesting pools.
b1b8ab34de515a5e83206da22c3d7e563241b021lling if ((list = pool_list_get(argc, argv, NULL, &ret)) == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("no pools available\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Enter the main iostat loop.
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.
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) pool_list_iter(list, B_FALSE, refresh_iostat, &cb);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Iterate over all pools to determine the maximum width
fa9e4066f08beec538e775443c5be79dd423fcabahrens * for the pool / device name column across all pools.
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) pool_list_iter(list, B_FALSE, get_namewidth, &cb);
26fd77009b17f8c8fb32eb362584cfd635e87ad9Krishnendu Sadhukhan - Sun Microsystems if (timestamp_fmt != NODATE)
26fd77009b17f8c8fb32eb362584cfd635e87ad9Krishnendu Sadhukhan - Sun Microsystems print_timestamp(timestamp_fmt);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If it's the first time, or verbose mode, print the header.
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) pool_list_iter(list, B_FALSE, print_iostat, &cb);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If there's more than one pool, and we're not in verbose mode
fa9e4066f08beec538e775443c5be79dd423fcabahrens * (which prints a separator for us), then print a separator.
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock * Flush the output so that redirection to a file isn't buffered
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock * indefinitely.
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct list_cbdata {
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Given a list of columns to display, output appropriate headers for each one.
990b4856d0eaada6f8140335733a1b1771ed2746lling const char *header;
4263d13f00c9691fa14620eff82abef795be0693George Wilson * Reset the width to accommodate the verbose listing
4263d13f00c9691fa14620eff82abef795be0693George Wilson * of devices.
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden header = zpool_prop_column_name(pl->pl_prop);
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden right_justify = zpool_prop_align_right(pl->pl_prop);
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden for (i = 0; pl->pl_user_prop[i] != '\0'; i++)
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden headerbuf[i] = toupper(pl->pl_user_prop[i]);
990b4856d0eaada6f8140335733a1b1771ed2746lling * Given a pool and a list of properties, print out all the properties according
990b4856d0eaada6f8140335733a1b1771ed2746lling * to the described layout.
4263d13f00c9691fa14620eff82abef795be0693George Wilsonprint_pool(zpool_handle_t *zhp, list_cbdata_t *cb)
4263d13f00c9691fa14620eff82abef795be0693George Wilson * Reset the width to accommodate the verbose listing
4263d13f00c9691fa14620eff82abef795be0693George Wilson * of devices.
4263d13f00c9691fa14620eff82abef795be0693George Wilson zpool_get_prop_int(zhp, pl->pl_prop, NULL) == 0)
4263d13f00c9691fa14620eff82abef795be0693George Wilson else if (zpool_get_prop(zhp, pl->pl_prop, property,
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) {
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.
4263d13f00c9691fa14620eff82abef795be0693George Wilson if (cb->cb_scripted || (pl->pl_next == NULL && !right_justify))
4263d13f00c9691fa14620eff82abef795be0693George Wilsonprint_one_column(zpool_prop_t prop, uint64_t value, boolean_t scripted)
4263d13f00c9691fa14620eff82abef795be0693George Wilson size_t width = zprop_width(prop, &fixed, ZFS_TYPE_POOL);
4263d13f00c9691fa14620eff82abef795be0693George Wilson zfs_nicenum(value, propval, sizeof (propval));
4263d13f00c9691fa14620eff82abef795be0693George Wilson if (prop == ZPOOL_PROP_EXPANDSZ && value == 0)
4263d13f00c9691fa14620eff82abef795be0693George Wilson (void) strlcpy(propval, "-", sizeof (propval));
4263d13f00c9691fa14620eff82abef795be0693George Wilsonprint_list_stats(zpool_handle_t *zhp, const char *name, nvlist_t *nv,
4263d13f00c9691fa14620eff82abef795be0693George Wilson verify(nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_VDEV_STATS,
4263d13f00c9691fa14620eff82abef795be0693George Wilson else if (strlen(name) + depth > cb->cb_namewidth)
4263d13f00c9691fa14620eff82abef795be0693George Wilson (int)(cb->cb_namewidth - strlen(name) - depth), "");
4263d13f00c9691fa14620eff82abef795be0693George Wilson /* only toplevel vdevs have capacity stats */
4263d13f00c9691fa14620eff82abef795be0693George Wilson print_one_column(ZPOOL_PROP_SIZE, vs->vs_space,
4263d13f00c9691fa14620eff82abef795be0693George Wilson print_one_column(ZPOOL_PROP_CAPACITY, vs->vs_alloc,
4263d13f00c9691fa14620eff82abef795be0693George Wilson print_one_column(ZPOOL_PROP_EXPANDSZ, vs->vs_esize,
4263d13f00c9691fa14620eff82abef795be0693George Wilson if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
4263d13f00c9691fa14620eff82abef795be0693George Wilson for (c = 0; c < children; c++) {
4263d13f00c9691fa14620eff82abef795be0693George Wilson ZPOOL_CONFIG_IS_HOLE, &ishole) == 0 && ishole)
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 * Include level 2 ARC devices in iostat output
4263d13f00c9691fa14620eff82abef795be0693George Wilson if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_L2CACHE,
4263d13f00c9691fa14620eff82abef795be0693George Wilson for (c = 0; c < children; c++) {
4263d13f00c9691fa14620eff82abef795be0693George Wilson print_list_stats(zhp, vname, child[c], cb, depth + 2);
990b4856d0eaada6f8140335733a1b1771ed2746lling * Generic callback function to list a pool.
4263d13f00c9691fa14620eff82abef795be0693George Wilson verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * zpool list [-H] [-o prop[,prop]*] [-T d|u] [pool] ... [interval [count]]
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
485bbbf5450c6645352388d798251c1a89ef4c9cGeorge Wilson * "name,size,allocated,free,capacity,health,altroot"
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * -T Display a timestamp in date(1) or Unix format
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.
990b4856d0eaada6f8140335733a1b1771ed2746lling static char default_props[] =
4263d13f00c9691fa14620eff82abef795be0693George Wilson "name,size,allocated,free,expandsize,capacity,dedupratio,"
4263d13f00c9691fa14620eff82abef795be0693George Wilson "health,altroot";
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
4263d13f00c9691fa14620eff82abef795be0693George Wilson while ((c = getopt(argc, argv, ":Ho:T:v")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing argument for "
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling get_interval_count(&argc, argv, &interval, &count);
990b4856d0eaada6f8140335733a1b1771ed2746lling if (zprop_get_list(g_zfs, props, &cb.cb_proplist, ZFS_TYPE_POOL) != 0)
4263d13f00c9691fa14620eff82abef795be0693George Wilson if ((list = pool_list_get(argc, argv, &cb.cb_proplist, &ret)) == NULL)
4263d13f00c9691fa14620eff82abef795be0693George Wilson if (argc == 0 && !cb.cb_scripted && pool_list_count(list) == 0) {
4263d13f00c9691fa14620eff82abef795be0693George Wilson (void) printf(gettext("no pools available\n"));
4263d13f00c9691fa14620eff82abef795be0693George Wilson (void) pool_list_iter(list, B_FALSE, get_namewidth, &cb);
4263d13f00c9691fa14620eff82abef795be0693George Wilson if (!cb.cb_scripted && (first || cb.cb_verbose)) {
4263d13f00c9691fa14620eff82abef795be0693George Wilson ret = pool_list_iter(list, B_TRUE, list_callback, &cb);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (c = 0; c < children; c++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((match = zpool_get_vdev_by_name(child[c], name)) != NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrenszpool_do_attach_or_replace(int argc, char **argv, int replacing)
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get pool name and check number of arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name argument\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("too many arguments\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("pool '%s' is unavailable\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
705040ed336e23b47ac6a3421d1f23ab5e86871bEric Taylor nvroot = make_root_vdev(zhp, force, B_FALSE, replacing, B_FALSE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
99653d4ee642c6528e88224f12409a5f23060994eschrock ret = zpool_vdev_attach(zhp, old_disk, new_disk, nvroot, replacing);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool replace [-f] <pool> <device> <new_device>
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Force attach, even if <new_device> appears to be in use.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Replace <device> with <new_device>.
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (zpool_do_attach_or_replace(argc, argv, B_TRUE));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool attach [-f] <pool> <device> <new_device>
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Force attach, even if <new_device> appears to be in use.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Attach <new_device> to the mirror containing <device>. If <device> is not
fa9e4066f08beec538e775443c5be79dd423fcabahrens * part of a mirror, then <device> will be transformed into a mirror of
fa9e4066f08beec538e775443c5be79dd423fcabahrens * <device> and <new_device>. In either case, <new_device> will begin life
fa9e4066f08beec538e775443c5be79dd423fcabahrens * with a DTL of [0, now], and will immediately begin to resilver itself.
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (zpool_do_attach_or_replace(argc, argv, B_FALSE));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool detach [-f] <pool> <device>
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Force detach of <device>, even if DTLs argue against it
fa9e4066f08beec538e775443c5be79dd423fcabahrens * (not supported yet)
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Detach a device from a mirror. The operation will be refused if <device>
fa9e4066f08beec538e775443c5be79dd423fcabahrens * is the last device in the mirror, or if the DTLs indicate that this device
fa9e4066f08beec538e775443c5be79dd423fcabahrens * has the only valid copy of some data.
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get pool name and check number of arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name argument\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
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 * -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 * 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 * 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 /* check options */
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante while ((c = getopt(argc, argv, ":R:no:")) != -1) {
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante zpool_prop_to_name(ZPOOL_PROP_ALTROOT), optarg,
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante if ((propval = strchr(optarg, '=')) != NULL) {
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante (void) fprintf(stderr, gettext("missing argument for "
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante (void) fprintf(stderr, gettext("invalid option '%c'\n"),
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante (void) fprintf(stderr, gettext("setting mntopts is only "
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante "valid when importing the pool\n"));
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante (void) fprintf(stderr, gettext("Missing pool name\n"));
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante (void) fprintf(stderr, gettext("Missing new pool name\n"));
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante if ((zhp = zpool_open(g_zfs, srcpool)) == NULL)
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante config = split_mirror_vdev(zhp, newpool, props, flags, argc, argv);
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante (void) printf(gettext("would create '%s' with the "
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante print_vdev_tree(NULL, newpool, config, 0, B_FALSE);
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante if (ret != 0 || flags.dryrun || !flags.import)
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante * The split was successful. Now we need to open the new
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante * pool and import it.
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante if ((zhp = zpool_open_canfail(g_zfs, newpool)) == NULL)
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante if (zpool_get_state(zhp) != POOL_STATE_UNAVAIL &&
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante zpool_enable_datasets(zhp, mntopts, 0) != 0) {
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante (void) fprintf(stderr, gettext("Split was succssful, but "
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante "the datasets could not all be mounted\n"));
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante (void) fprintf(stderr, gettext("Try doing '%s' with a "
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling * zpool online <pool> <device> ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
573ca77e53dd31dcaebef023e7eb41969e6896c1George Wilson while ((c = getopt(argc, argv, "et")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get pool name and check number of arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing device name\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
573ca77e53dd31dcaebef023e7eb41969e6896c1George Wilson if (zpool_vdev_online(zhp, argv[i], flags, &newstate) == 0) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "onlined, but remains in faulted state\n"),
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "clear' to restore a faulted "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "device\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "replace' to replace devices "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "that are no longer present\n"));
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling * zpool offline [-ft] <pool> <device> ...
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 * -t Only take the device off-line temporarily. The offline
fa9e4066f08beec538e775443c5be79dd423fcabahrens * state will not be persistent across reboots.
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get pool name and check number of arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing device name\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * zpool clear <pool> [device]
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * Clear all errors associated with a pool or a particular device.
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley /* check options */
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley switch (c) {
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley (void) fprintf(stderr, gettext("invalid option '%c'\n"),
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) fprintf(stderr, gettext("missing pool name\n"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) fprintf(stderr, gettext("too many arguments\n"));
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 if ((zhp = zpool_open_canfail(g_zfs, pool)) == NULL) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock return (1);
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore * zpool reguid <pool>
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore /* check options */
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore while ((c = getopt(argc, argv, "")) != -1) {
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore (void) fprintf(stderr, gettext("invalid option '%c'\n"),
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore /* get pool name and check number of arguments */
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore (void) fprintf(stderr, gettext("missing pool name\n"));
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore (void) fprintf(stderr, gettext("too many arguments\n"));
e9103aaee0c546d4644791198c54abb03c89969eGarrett D'Amore if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
4263d13f00c9691fa14620eff82abef795be0693George Wilson * zpool reopen <pool>
4263d13f00c9691fa14620eff82abef795be0693George Wilson * Reopen the pool so that the kernel can update the sizes of all vdevs.
4263d13f00c9691fa14620eff82abef795be0693George Wilson * NOTE: This command is currently undocumented. If the command is ever
4263d13f00c9691fa14620eff82abef795be0693George Wilson * exposed then the appropriate usage() messages will need to be made.
4263d13f00c9691fa14620eff82abef795be0693George Wilson if ((zhp = zpool_open_canfail(g_zfs, pool)) == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct scrub_cbdata {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * Ignore faulted pools.
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) fprintf(stderr, gettext("cannot scrub '%s': pool is "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock return (1);
06eeb2ad640ce72d394ac521094bed7681044408ek return (err != 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool scrub [-s] <pool> ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -s Stop. Stops any in-progress scrub.
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name argument\n"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling return (for_each_pool(argc, argv, B_TRUE, NULL, scrub_callback, &cb));
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct status_cbdata {
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print out detailed scrub status.
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling char processed_buf[7], examined_buf[7], total_buf[7], rate_buf[7];
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 zfs_nicenum(ps->pss_processed, processed_buf, sizeof (processed_buf));
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * Scan is finished or canceled.
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling fmt = gettext("scrub repaired %s in %lluh%um with "
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling "%llu errors on %s");
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling "%llu errors on %s");
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling /* LINTED */
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * Scan is in progress.
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void) printf(gettext("scrub in progress since %s"),
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void) printf(gettext("resilver in progress since %s"),
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling examined = ps->pss_examined ? ps->pss_examined : 1;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling /* elapsed time for this pass */
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling pass_exam = ps->pss_pass_exam ? ps->pss_pass_exam : 1;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling zfs_nicenum(examined, examined_buf, sizeof (examined_buf));
73d314ce9dc7feccc3b74f8109a8f7ee8ff67b42Lin Ling * do not print estimated time if hours_left is more than 30 days
73d314ce9dc7feccc3b74f8109a8f7ee8ff67b42Lin Ling (void) printf(gettext(" %s scanned out of %s at %s/s"),
73d314ce9dc7feccc3b74f8109a8f7ee8ff67b42Lin Ling (u_longlong_t)hours_left, (uint_t)(mins_left % 60));
73d314ce9dc7feccc3b74f8109a8f7ee8ff67b42Lin Ling ", (scan is slow, no estimated time)\n"));
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void) printf(gettext(" %s resilvered, %.2f%% done\n"),
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void) printf(gettext(" %s repaired, %.2f%% done\n"),
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) printf("errors: List of errors unavailable "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "(insufficient privileges)\n");
55434c770c89aa1b84474f2559a106803511aba0ek "detected in the following files:\n\n");
55434c770c89aa1b84474f2559a106803511aba0ek while ((elem = nvlist_next_nvpair(nverrlist, elem)) != NULL) {
99653d4ee642c6528e88224f12409a5f23060994eschrockprint_spares(zpool_handle_t *zhp, nvlist_t **spares, uint_t nspares,
99653d4ee642c6528e88224f12409a5f23060994eschrock for (i = 0; i < nspares; i++) {
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson name = zpool_vdev_name(g_zfs, zhp, spares[i], B_FALSE);
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendanprint_l2cache(zpool_handle_t *zhp, nvlist_t **l2cache, uint_t nl2cache,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan for (i = 0; i < nl2cache; i++) {
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson name = zpool_vdev_name(g_zfs, zhp, l2cache[i], B_FALSE);
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 if (nvlist_lookup_uint64_array(config, ZPOOL_CONFIG_DDT_OBJ_STATS,
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson (void) printf("DDT entries %llu, size %llu on disk, %llu in core\n",
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson verify(nvlist_lookup_uint64_array(config, ZPOOL_CONFIG_DDT_STATS,
9eb19f4d61679ca0382def038665019234458eddGeorge Wilson verify(nvlist_lookup_uint64_array(config, ZPOOL_CONFIG_DDT_HISTOGRAM,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Display a summary of pool status. Displays a summary such as:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * pool: tank
fa9e4066f08beec538e775443c5be79dd423fcabahrens * status: DEGRADED
fa9e4066f08beec538e775443c5be79dd423fcabahrens * reason: One or more devices ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens * mirror DEGRADED
fa9e4066f08beec538e775443c5be79dd423fcabahrens * c1t0d0 OK
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * c2t0d0 UNAVAIL
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.
46657f8d750bdb71753495ce2919170f126b8e34mmusante const char *health;
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If we were given 'zpool status -x', only report those pools with
fa9e4066f08beec538e775443c5be79dd423fcabahrens * problems.
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock if (reason == ZPOOL_STATUS_OK && cbp->cb_explain) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
46657f8d750bdb71753495ce2919170f126b8e34mmusante verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_VDEV_STATS,
990b4856d0eaada6f8140335733a1b1771ed2746lling health = zpool_state_to_name(vs->vs_state, vs->vs_aux);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext(" pool: %s\n"), zpool_get_name(zhp));
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 (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 (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 (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"));
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 (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"));
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"));
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"));
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 (void) printf(gettext("status: The pool metadata is corrupted "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "and the pool cannot be opened.\n"));
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 (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"));
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"));
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 (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 (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 (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"));
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 (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"));
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"));
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"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The remaining errors can't actually be generated, yet.
654b400c387942fc00d4f6869539adbd7b25fbceJoshua M. Clulow (void) printf(gettext(" see: http://illumos.org/msg/%s\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("\t%-*s %-8s %5s %5s %5s\n"), namewidth,
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock print_status_config(zhp, zpool_get_name(zhp), nvroot,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_L2CACHE,
99653d4ee642c6528e88224f12409a5f23060994eschrock if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_ERRCOUNT,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * If the approximate error count is small, get a
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * precise count by fetching the entire log and
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * uniquifying the results.
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "errors\n"));
5ad820458efd0fdb914baff9c1447c22b819fa23nd "errors, use '-v' for a list\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("config: The configuration cannot be "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "determined.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * zpool status [-vx] [-T d|u] [pool] ... [interval [count]]
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 * Describes the health status of all pools or some subset.
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling get_interval_count(&argc, argv, &interval, &count);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling else if (cb.cb_explain && cb.cb_first && cb.cb_allpools)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling return (0);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrocktypedef struct upgrade_cbdata {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Sidenupgrade_version(zpool_handle_t *zhp, uint64_t version)
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION,
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden assert(SPA_VERSION_IS_SUPPORTED(oldversion));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("Successfully upgraded "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "'%s' from version %llu to feature flags.\n"),
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 Sidenupgrade_enable_all(zpool_handle_t *zhp, int *countp)
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden nvlist_t *enabled = zpool_get_features(zhp);
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 verify(-1 != asprintf(&propname, "feature@%s", fname));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "following features on '%s':\n"),
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION,
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden assert(SPA_VERSION_IS_SUPPORTED(version));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden ret = upgrade_version(zhp, cbp->cb_version);
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 (void) zpool_log_history(g_zfs, history_str);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (cbp->cb_version >= SPA_VERSION_FEATURES) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Sidenupgrade_list_older_cb(zpool_handle_t *zhp, void *arg)
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION,
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden assert(SPA_VERSION_IS_SUPPORTED(version));
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"));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Sidenupgrade_list_disabled_cb(zpool_handle_t *zhp, void *arg)
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION,
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden nvlist_t *enabled = zpool_get_features(zhp);
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 "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 "FEATURE\n"));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "---------\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock/* ARGSUSED */
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);
990b4856d0eaada6f8140335733a1b1771ed2746lling cur_version = zpool_get_prop_int(zhp, ZPOOL_PROP_VERSION, NULL);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("Pool '%s' is already formatted "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "using more current version '%llu'.\n\n"),
e6c728e129b367a26c1972c43cc89654eb585941brendan return (0);
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),
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock return (0);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden ret = upgrade_version(zhp, cbp->cb_version);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden if (cbp->cb_version >= SPA_VERSION_FEATURES) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("Pool '%s' already has all "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "supported features enabled.\n"),
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * zpool upgrade
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * zpool upgrade -v
990b4856d0eaada6f8140335733a1b1771ed2746lling * zpool upgrade [-V version] <-a | pool ...>
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 /* check options */
478ed9ada0b6efe1318150a700986aa47e6a926dEric Taylor while ((c = getopt(argc, argv, ":avV:")) != -1) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock switch (c) {
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden !SPA_VERSION_IS_SUPPORTED(cb.cb_version)) {
478ed9ada0b6efe1318150a700986aa47e6a926dEric Taylor (void) fprintf(stderr, gettext("missing argument for "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) fprintf(stderr, gettext("invalid option '%c'\n"),
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling "incompatible with other arguments\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "incompatible with other arguments\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock if (argc != 0) {
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling (void) fprintf(stderr, gettext("-a option should not "
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling "be used along with a pool name\n"));
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) printf(gettext("This system supports ZFS pool feature "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "flags.\n\n"));
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];
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf("%-37s%s\n", fi->fi_uname, ro);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("The following legacy versions are also "
d7d4af51b4d115490d97f0b89993fdbaaf441c94mmusante "supported:\n\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf("--- -----------------------------------------"
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "---------------\n");
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext(" 1 Initial ZFS version\n"));
44cd46cadd9aab751dae6a4023c1cb5bf316d274billm "(replicated metadata)\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext(" 3 Hot spares and double parity "
99653d4ee642c6528e88224f12409a5f23060994eschrock "RAID-Z\n"));
c9431fa1e59a88c2f0abf611f25b97af964449e5ahl "algorithm\n"));
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin (void) printf(gettext(" 7 Separate intent log devices\n"));
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (void) printf(gettext(" 8 Delegated administration\n"));
a9799022bd90b13722204e80112efaa5bf573099ck "properties\n"));
088f389458728c464569a5506b58070254fa4f7dahrens (void) printf(gettext(" 11 Improved scrub performance\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"));
92241e0b80813d0b83c08e730a29b9d1831794fcTom Erickson (void) printf(gettext(" 22 Received properties\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 (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 (void) printf(gettext("All pools are already "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "formatted with version %llu or higher.\n"),
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden } else if (argc == 0) {
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden ret = zpool_iter(g_zfs, upgrade_list_older_cb, &cb);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("All pools are formatted "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "using feature flags.\n\n"));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("\nUse 'zpool upgrade -v' "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "for a list of available legacy versions.\n"));
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden ret = zpool_iter(g_zfs, upgrade_list_disabled_cb, &cb);
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden (void) printf(gettext("Every feature flags pool has "
57221772c3fc05faba04bf48ddff45abf2bbf2bdChristopher Siden "all supported features enabled.\n"));
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarkstypedef struct hist_cbdata {
06eeb2ad640ce72d394ac521094bed7681044408ek * Print out the command history for a specific pool.
06eeb2ad640ce72d394ac521094bed7681044408ek (void) printf(gettext("History for '%s':\n"), zpool_get_name(zhp));
06eeb2ad640ce72d394ac521094bed7681044408ek verify(nvlist_lookup_nvlist_array(nvhis, ZPOOL_HIST_RECORD,
06eeb2ad640ce72d394ac521094bed7681044408ek for (i = 0; i < numrecords; i++) {
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens (void) strftime(tbuf, sizeof (tbuf), "%F.%T", &t);
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens } else if (nvlist_exists(rec, ZPOOL_HIST_INT_EVENT)) {
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens fnvlist_lookup_uint64(rec, ZPOOL_HIST_INT_EVENT);
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens if (ievent >= ZFS_NUM_LEGACY_HISTORY_EVENTS) {
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens (void) printf("%s [internal %s txg:%lld] %s", tbuf,
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens fnvlist_lookup_string(rec, ZPOOL_HIST_INT_STR));
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens } else if (nvlist_exists(rec, ZPOOL_HIST_INT_NAME)) {
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens fnvlist_lookup_string(rec, ZPOOL_HIST_INT_NAME));
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens (void) printf(" %s", fnvlist_lookup_string(rec,
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens } else if (nvlist_exists(rec, ZPOOL_HIST_IOCTL)) {
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens fnvlist_lookup_string(rec, ZPOOL_HIST_IOCTL));
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens if (nvlist_exists(rec, ZPOOL_HIST_INPUT_NVL)) {
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens if (nvlist_exists(rec, ZPOOL_HIST_OUTPUT_NVL)) {
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens (void) printf("%s unrecognized record:\n", tbuf);
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens uid_t who = fnvlist_lookup_uint64(rec, ZPOOL_HIST_WHO);
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens fnvlist_lookup_string(rec, ZPOOL_HIST_HOST));
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens fnvlist_lookup_string(rec, ZPOOL_HIST_ZONE));
06eeb2ad640ce72d394ac521094bed7681044408ek * zpool history <pool>
06eeb2ad640ce72d394ac521094bed7681044408ek * Displays the history of commands that modified pools.
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks /* check options */
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks switch (c) {
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (void) fprintf(stderr, gettext("invalid option '%c'\n"),
b1b8ab34de515a5e83206da22c3d7e563241b021lling ret = for_each_pool(argc, argv, B_FALSE, NULL, get_history_one,
06eeb2ad640ce72d394ac521094bed7681044408ek return (0);
b1b8ab34de515a5e83206da22c3d7e563241b021lling for (pl = cbp->cb_proplist; pl != NULL; pl = pl->pl_next) {
990b4856d0eaada6f8140335733a1b1771ed2746lling * Skip the special fake placeholder. This will also skip
990b4856d0eaada6f8140335733a1b1771ed2746lling * over the name property when 'all' is specified.
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden zpool_prop_unsupported(pl->pl_user_prop))) {
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden if (zpool_prop_get_feature(zhp, pl->pl_user_prop,
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden zprop_print_one_property(zpool_get_name(zhp),
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden if (zpool_get_prop(zhp, pl->pl_prop, value,
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden zprop_print_one_property(zpool_get_name(zhp), cbp,
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden zpool_prop_to_name(pl->pl_prop), value, srctype,
b1b8ab34de515a5e83206da22c3d7e563241b021lling return (0);
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (void) fprintf(stderr, gettext("missing property "
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden "argument\n"));
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden if (zprop_get_list(g_zfs, argv[1], &cb.cb_proplist,
b1b8ab34de515a5e83206da22c3d7e563241b021lling ret = for_each_pool(argc - 2, argv + 2, B_TRUE, &cb.cb_proplist,
b1b8ab34de515a5e83206da22c3d7e563241b021llingtypedef struct set_cbdata {
b1b8ab34de515a5e83206da22c3d7e563241b021lling error = zpool_set_prop(zhp, cb->cb_propname, cb->cb_value);
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) fprintf(stderr, gettext("invalid option '%c'\n"),
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) fprintf(stderr, gettext("missing property=value "
b1b8ab34de515a5e83206da22c3d7e563241b021lling "argument\n"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) fprintf(stderr, gettext("missing pool name\n"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) fprintf(stderr, gettext("too many pool names\n"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling "property=value argument\n"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling error = for_each_pool(argc - 2, argv + 2, B_TRUE, NULL,
b1b8ab34de515a5e83206da22c3d7e563241b021lling for (i = 0; i < NCOMMAND; i++) {
b1b8ab34de515a5e83206da22c3d7e563241b021lling return (0);
b1b8ab34de515a5e83206da22c3d7e563241b021lling return (1);
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, gettext("internal error: failed to "
203a47d89d37e993340060207ea2299ade638d68nd "initialize ZFS library\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Make sure the user has specified some command.
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing command\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Special case '-?'
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens zfs_save_arguments(argc, argv, history_str, sizeof (history_str));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Run the appropriate command.
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens } else if (strcmp(cmdname, "freeze") == 0 && argc == 3) {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens * 'freeze' is a vile debugging abomination, so we treat
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens * it as such.
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens (void) zpool_log_history(g_zfs, history_str);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The 'ZFS_ABORT' environment variable causes us to dump core on exit
fa9e4066f08beec538e775443c5be79dd423fcabahrens * for the purposes of running ::findleaks.