zpool_main.c revision 379c004d1f26b343f034bba8a350290691d00d38
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
18ce54df8809e9f672d0ed1a53e99669df0a6df0ek * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Use is subject to license terms.
b7b97454b9b1f6625e7e655e9651e744a8dee09dperrinstatic int zpool_do_create(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_destroy(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_add(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_remove(int, char **);
99653d4ee642c6528e88224f12409a5f23060994eschrockstatic int zpool_do_list(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_iostat(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_status(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_online(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_offline(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_clear(int, char **);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockstatic int zpool_do_attach(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_detach(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_replace(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_scrub(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_import(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_export(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int zpool_do_upgrade(int, char **);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockstatic int zpool_do_history(int, char **);
06eeb2ad640ce72d394ac521094bed7681044408ekstatic int zpool_do_get(int, char **);
06eeb2ad640ce72d394ac521094bed7681044408ekstatic int zpool_do_set(int, char **);
b1b8ab34de515a5e83206da22c3d7e563241b021lling * These libumem hooks provide a reasonable set of defaults for the allocator's
fa9e4066f08beec538e775443c5be79dd423fcabahrens * debugging facilities.
29ab75c9a733dad2978c4860efd954b5625e3467rmconst char *
99653d4ee642c6528e88224f12409a5f23060994eschrock return ("default,verbose"); /* $UMEM_DEBUG setting */
fa9e4066f08beec538e775443c5be79dd423fcabahrensconst char *
fa9e4066f08beec538e775443c5be79dd423fcabahrens return ("fail,contents"); /* $UMEM_LOGGING setting */
29ab75c9a733dad2978c4860efd954b5625e3467rmtypedef enum {
65cd9f2809a015b46790a9c5c2ef992d56177624eschrocktypedef struct zpool_command {
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock const char *name;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int (*func)(int, char **);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Master command table. Each ZFS command has a name, associated function, and
fa9e4066f08beec538e775443c5be79dd423fcabahrens * usage message. The usage messages need to be internationalized, so we have
fa9e4066f08beec538e775443c5be79dd423fcabahrens * to have a function to return the usage message based on a command index.
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * These commands are organized according to how they are displayed in the usage
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * message. An empty command (one with a NULL name) indicates an empty line in
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock * the generic usage message.
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define NCOMMAND (sizeof (command_table) / sizeof (command_table[0]))
2a6b87f07ac0c0b819179c84afe5a60afa04cfa5ekstatic const char *
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock return (gettext("\tadd [-fn] <pool> <vdev> ...\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock "<new-device>\n"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock return (gettext("\tcreate [-fn] [-o property=value] ... \n"
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock "\t [-O file-system-property=value] ... \n"
990b4856d0eaada6f8140335733a1b1771ed2746lling "\t [-m mountpoint] [-R root] <pool> <vdev> ...\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock return (gettext("\thistory [-il] [<pool>] ...\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock "\timport [-o mntopts] [-o property=value] ... \n"
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm "\t [-d dir | -c cachefile] [-D] [-f] [-R root] -a\n"
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock "\timport [-o mntopts] [-o property=value] ... \n"
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock "\t [-d dir | -c cachefile] [-D] [-f] [-R root] "
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock "<pool | id> [newpool]\n"));
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock return (gettext("\tiostat [-v] [pool] ... [interval "
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock "[count]]\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock "[pool] ...\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling return (gettext("\toffline [-t] <pool> <device> ...\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock "[new-device]\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "\tupgrade -v\n"
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "\tupgrade [-V version] <-a | pool ...>\n"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling "<pool> ...\n"));
65cd9f2809a015b46790a9c5c2ef992d56177624eschrock /* NOTREACHED */
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Callback routine that will print out a pool property value.
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) fprintf(fp, "\t%-13s ", zpool_prop_to_name(prop));
b1b8ab34de515a5e83206da22c3d7e563241b021lling * Display usage message. If we're inside a command, display only the usage for
fa9e4066f08beec538e775443c5be79dd423fcabahrens * that command. Otherwise, iterate over the entire command table and display
fa9e4066f08beec538e775443c5be79dd423fcabahrens * a complete usage message.
fa9e4066f08beec538e775443c5be79dd423fcabahrens (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++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(fp, "%s", get_usage(current_command->usage));
b1b8ab34de515a5e83206da22c3d7e563241b021lling gettext("\nthe following properties are supported:\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling /* Iterate over all properties */
b1b8ab34de515a5e83206da22c3d7e563241b021lling * See comments at end of main().
fa9e4066f08beec538e775443c5be79dd423fcabahrensprint_vdev_tree(zpool_handle_t *zhp, const char *name, nvlist_t *nv, int indent,
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (c = 0; c < children; c++) {
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin (void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG,
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin if ((is_log && !print_logs) || (!is_log && print_logs))
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Add a property pair (name, string-value) into a property nvlist.
990b4856d0eaada6f8140335733a1b1771ed2746llingadd_prop_list(const char *propname, char *propval, nvlist_t **props,
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh const char *normnm;
990b4856d0eaada6f8140335733a1b1771ed2746lling return (1);
990b4856d0eaada6f8140335733a1b1771ed2746lling if ((prop = zpool_name_to_prop(propname)) == ZPROP_INVAL) {
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh return (2);
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh if ((fprop = zfs_name_to_prop(propname)) == ZPROP_INVAL) {
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh return (2);
990b4856d0eaada6f8140335733a1b1771ed2746lling if (nvlist_lookup_string(proplist, normnm, &strval) == 0 &&
990b4856d0eaada6f8140335733a1b1771ed2746lling return (2);
990b4856d0eaada6f8140335733a1b1771ed2746lling if (nvlist_add_string(proplist, normnm, propval) != 0) {
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh "error: out of memory\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling return (1);
990b4856d0eaada6f8140335733a1b1771ed2746lling return (0);
990b4856d0eaada6f8140335733a1b1771ed2746lling * zpool add [-fn] <pool> <vdev> ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Force addition of devices, even if they appear in use
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -n Do not add the devices, but display the resulting layout if
fa9e4066f08beec538e775443c5be79dd423fcabahrens * they were to be added.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Adds the given vdevs to 'pool'. As with create, the bulk of this work is
fa9e4066f08beec538e775443c5be79dd423fcabahrens * handled by get_vdev_spec(), which constructs the nvlist needed to pass to
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* get pool name and check number of arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name argument\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing vdev specification\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((config = zpool_get_config(zhp, NULL)) == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("pool '%s' is unavailable\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* pass off to get_vdev_spec for processing */
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvroot = make_root_vdev(zhp, force, !force, B_FALSE, dryrun,
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("would update '%s' to the following "
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* print original main pool and new tree */
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin print_vdev_tree(zhp, poolname, poolnvroot, 0, B_FALSE);
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin /* Do the same for the logs */
99653d4ee642c6528e88224f12409a5f23060994eschrock * zpool remove <pool> <vdev> ...
99653d4ee642c6528e88224f12409a5f23060994eschrock * Removes the given vdev from the pool. Currently, this only supports removing
99653d4ee642c6528e88224f12409a5f23060994eschrock * spares and cache devices from the pool. Eventually, we'll want to support
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan * removing leaf vdevs (as an alias for 'detach') as well as toplevel vdevs.
99653d4ee642c6528e88224f12409a5f23060994eschrock 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);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool create [-fn] [-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
fa9e4066f08beec538e775443c5be79dd423fcabahrens * '/<pool>'
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -o Set property=value.
990b4856d0eaada6f8140335733a1b1771ed2746lling * -O Set fsproperty=value in the pool's root file system
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Creates the named pool according to the given vdev specification. The
b1b8ab34de515a5e83206da22c3d7e563241b021lling * bulk of the vdev processing is done in get_vdev_spec() in zpool_vdev.c. Once
fa9e4066f08beec538e775443c5be79dd423fcabahrens * we get the nvlist back from get_vdev_spec(), we either print out the contents
fa9e4066f08beec538e775443c5be79dd423fcabahrens * (if '-n' was specified), or pass it to libzfs to do the creation.
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((c = getopt(argc, argv, ":fnR:m:o:O:")) != -1) {
0a48a24e663a04e34e2ed4e55390ad96f178dbeatimh switch (c) {
990b4856d0eaada6f8140335733a1b1771ed2746lling "'=' for -o option\n"));
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 */
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvroot = make_root_vdev(NULL, force, !force, B_FALSE, dryrun,
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* 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 "
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((dirp = opendir(buf)) == NULL && errno != ENOENT) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens "option to provide a different default\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling } 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.
fa9e4066f08beec538e775443c5be79dd423fcabahrens } 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"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((zhp = zpool_open_canfail(g_zfs, pool)) == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens * As a special case, check for use of '/' in the name, and
fa9e4066f08beec538e775443c5be79dd423fcabahrens * direct the user to use 'zfs destroy' instead.
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("use 'zfs destroy' to "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "destroy a dataset\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
f3861e1a2ceec23a5b699c24d814b7775a9e0b52ahl (void) fprintf(stderr, gettext("could not destroy '%s': "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "could not unmount datasets\n"), zpool_get_name(zhp));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool export [-f] <pool> ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Forcefully unmount datasets
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Export the given pools. By default, the command will attempt to cleanly
b1b8ab34de515a5e83206da22c3d7e563241b021lling * unmount any active datasets within the pool. If the '-f' flag is specified,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * then the datasets will be forcefully unmounted.
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
99653d4ee642c6528e88224f12409a5f23060994eschrock /* check arguments */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool argument\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < argc; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((zhp = zpool_open_canfail(g_zfs, argv[i])) == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Given a vdev configuration, determine the maximum width needed for the device
fa9e4066f08beec538e775443c5be79dd423fcabahrens * name column.
fa9e4066f08beec538e775443c5be79dd423fcabahrensmax_width(zpool_handle_t *zhp, nvlist_t *nv, int depth, int max)
99653d4ee642c6528e88224f12409a5f23060994eschrock if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_SPARES,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan for (c = 0; c < children; c++)
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_L2CACHE,
99653d4ee642c6528e88224f12409a5f23060994eschrock for (c = 0; c < children; c++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (c = 0; c < children; c++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print the configuration of an exported pool. Iterate over all vdevs in the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * pool, printing out the name and status for each one.
fa9e4066f08beec538e775443c5be79dd423fcabahrensprint_import_config(const char *name, nvlist_t *nv, int namewidth, int depth,
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &type) == 0);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock verify(nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_STATS,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("\t%*s%-*s", depth, "", namewidth - depth, name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(" %s", zpool_state_to_name(vs->vs_state, vs->vs_aux));
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin for (c = 0; c < children; c++) {
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin (void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG,
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock if ((is_log && !print_logs) || (!is_log && print_logs))
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_L2CACHE,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan for (c = 0; c < children; c++) {
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_SPARES,
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (c = 0; c < children; c++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Display the status for the given pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *health;
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME,
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID,
990b4856d0eaada6f8140335733a1b1771ed2746lling verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_STATE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
46657f8d750bdb71753495ce2919170f126b8e34mmusante verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_STATS,
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm health = zpool_state_to_name(vs->vs_state, vs->vs_aux);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext(" id: %llu\n"), (u_longlong_t)guid);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: One or more devices are missing "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "from the system.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: One or more devices contains "
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling "corrupted data.\n"));
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling (void) printf(gettext("status: The pool data is corrupted.\n"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) printf(gettext("status: One or more devices "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "are offlined.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("status: The pool metadata is "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "corrupted.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("status: The pool is formatted using an "
95173954d2b811ceb583a9012c3b16e1d0dd6438ek "older on-disk version.\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) printf(gettext("status: The pool is formatted using an "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "incompatible version.\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) printf(gettext("status: The pool was last accessed by "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "another system.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: One or more devices are "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "faulted.\n"));
46657f8d750bdb71753495ce2919170f126b8e34mmusante (void) printf(gettext("status: An intent log record cannot be "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "read.\n"));
95173954d2b811ceb583a9012c3b16e1d0dd6438ek * No other status can be seen when importing pools.
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * Print out an action according to the overall state of the pool.
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "imported using its name or numeric identifier, "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "though\n\tsome features will not be available "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "without an explicit 'zpool upgrade'.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "imported using its name or numeric "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "identifier and\n\tthe '-f' flag.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "imported using its name or numeric "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "identifier.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: The pool can be imported "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "despite missing or damaged devices. The\n\tfault "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "tolerance of the pool may be compromised if imported.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "imported. Access the pool on a system running "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "newer\n\tsoftware, or recreate the pool from "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "backup.\n"));
46657f8d750bdb71753495ce2919170f126b8e34mmusante (void) printf(gettext("action: The pool cannot be "
46657f8d750bdb71753495ce2919170f126b8e34mmusante "imported. Attach the missing\n\tdevices and try "
46657f8d750bdb71753495ce2919170f126b8e34mmusante "again.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("action: The pool cannot be "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "imported due to damaged devices or data.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If the state is "closed" or "can't open", and the aux state
fa9e4066f08beec538e775443c5be79dd423fcabahrens * is "corrupt data":
fa9e4066f08beec538e775443c5be79dd423fcabahrens "but can be imported using the '-Df' flags.\n"));
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin "another system, but can be imported using\n\t"
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin "the '-f' flag.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext(" see: http://www.sun.com/msg/%s\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_import_config(name, nvroot, namewidth, 0, B_FALSE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_import_config(name, nvroot, namewidth, 0, B_TRUE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("\n\tAdditional devices are known to "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "be part of this pool, though their\n\texact "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "configuration cannot be determined.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Perform the import for the given configuration. This passes the heavy
fa9e4066f08beec538e775443c5be79dd423fcabahrens * lifting off to zpool_import_props(), and then mounts the datasets contained
fa9e4066f08beec538e775443c5be79dd423fcabahrens * within the pool.
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrockdo_import(nvlist_t *config, const char *newname, const char *mntopts,
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock int force, nvlist_t *props, boolean_t allowfaulted)
95173954d2b811ceb583a9012c3b16e1d0dd6438ek verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME,
95173954d2b811ceb583a9012c3b16e1d0dd6438ek (void) fprintf(stderr, gettext("cannot import '%s': pool "
95173954d2b811ceb583a9012c3b16e1d0dd6438ek return (1);
95173954d2b811ceb583a9012c3b16e1d0dd6438ek "'%s': pool may be in use from other "
95173954d2b811ceb583a9012c3b16e1d0dd6438ek "system, it was last accessed by %s "
fa9e4066f08beec538e775443c5be79dd423fcabahrens (unsigned long)hostid,
fa9e4066f08beec538e775443c5be79dd423fcabahrens "import anyway\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("cannot import '%s': "
f3861e1a2ceec23a5b699c24d814b7775a9e0b52ahl "anyway\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zpool_import_props(g_zfs, config, newname, props,
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock verify((zhp = zpool_open_canfail(g_zfs, name)) != NULL);
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool import [-d dir] [-D]
fa9e4066f08beec538e775443c5be79dd423fcabahrens * import [-o mntopts] [-o prop=value] ... [-R root] [-D]
fa9e4066f08beec538e775443c5be79dd423fcabahrens * [-d dir | -c cachefile] [-f] -a
fa9e4066f08beec538e775443c5be79dd423fcabahrens * import [-o mntopts] [-o prop=value] ... [-R root] [-D]
fa9e4066f08beec538e775443c5be79dd423fcabahrens * [-d dir | -c cachefile] [-f] <pool | id> [newpool]
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock * -c Read pool information from a cachefile instead of searching
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock * -d Scan in a specific directory, other than /dev/dsk. More than
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock * one directory can be specified using multiple '-d' options.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -D Scan for previously destroyed pools or import all or only
990b4856d0eaada6f8140335733a1b1771ed2746lling * 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.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Force import, even if it appears that the pool is active.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -F Import even in the presence of faulted vdevs. This is an
fa9e4066f08beec538e775443c5be79dd423fcabahrens * intentionally undocumented option for testing purposes, and
fa9e4066f08beec538e775443c5be79dd423fcabahrens * treats the pool configuration as complete, leaving any bad
fa9e4066f08beec538e775443c5be79dd423fcabahrens * vdevs in the FAULTED state.
99653d4ee642c6528e88224f12409a5f23060994eschrock * -a Import all pools found.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -o Set property=value and/or temporary mount options (without '=').
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The import command scans for pools to import, and import pools based on pool
fa9e4066f08beec538e775443c5be79dd423fcabahrens * name and GUID. The pool can also be renamed as part of the import process.
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((c = getopt(argc, argv, ":ac:d:DfFo:p:R:")) != -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock sizeof (char *));
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (char *));
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock (void) fprintf(stderr, gettext("missing argument for "
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("-c is incompatible with -d\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check argument count */
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("too many arguments\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("too many arguments\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Check for the SYS_CONFIG privilege. We do this explicitly
fa9e4066f08beec538e775443c5be79dd423fcabahrens * here because otherwise any attempt to discover pools will
fa9e4066f08beec538e775443c5be79dd423fcabahrens * silently fail.
fa9e4066f08beec538e775443c5be79dd423fcabahrens "discover pools: permission denied\n"));
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm 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.
24e697d414a4df0377b91a2875f029e7b5f97247ck * <id> Find the pool that corresponds to the given GUID/pool
e829d913cde9eeff0efd355502799863d4f74f69ck * name and import that one.
24e697d414a4df0377b91a2875f029e7b5f97247ck * -D Above options applies only to destroyed pools.
24e697d414a4df0377b91a2875f029e7b5f97247ck if (argc != 0) {
24e697d414a4df0377b91a2875f029e7b5f97247ck pools = zpool_find_import_cached(g_zfs, cachefile, searchname,
24e697d414a4df0377b91a2875f029e7b5f97247ck pools = zpool_find_import_byname(g_zfs, nsearch, searchdirs,
24e697d414a4df0377b91a2875f029e7b5f97247ck * It's OK to search by guid even if searchguid is 0.
24e697d414a4df0377b91a2875f029e7b5f97247ck pools = zpool_find_import_byguid(g_zfs, nsearch, searchdirs,
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc != 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, gettext("cannot import '%s': "
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm * At this point we have a list of import candidate configs. Even if
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm * we were searching by pool name or guid, we still need to
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm * post-process the list to deal with pool state and possible
4c58d71403cebfaa40a572ff12b17668ebd56987darrenm * duplicate names.
fa9e4066f08beec538e775443c5be79dd423fcabahrens while ((elem = nvlist_next_nvpair(pools, elem)) != NULL) {
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_STATE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!do_destroyed && pool_state == POOL_STATE_DESTROYED)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (do_destroyed && pool_state != POOL_STATE_DESTROYED)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens * We are searching for a pool based on name.
fa9e4066f08beec538e775443c5be79dd423fcabahrens "cannot import '%s': more than "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "import by numeric ID instead\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Search for a pool by guid.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If we were searching for a specific pool, verify that we found a
fa9e4066f08beec538e775443c5be79dd423fcabahrens * pool, and then do the import.
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("cannot import '%s': "
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If we were just looking for pools, report an error if none were
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct iostat_cbdata {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(" ----- ----- ----- ----- ----- -----\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("%-*s used avail read write read write\n",
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Display a single statistic.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print out all the statistics for the given vdev. This can either be the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * toplevel configuration, or called recursively. If 'name' is NULL, then this
fa9e4066f08beec538e775443c5be79dd423fcabahrens * is a verbose output, and we don't want to display the toplevel pool stats.
fa9e4066f08beec538e775443c5be79dd423fcabahrensprint_vdev_stats(zpool_handle_t *zhp, const char *name, nvlist_t *oldnv,
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64_array(oldnv, ZPOOL_CONFIG_STATS,
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64_array(newnv, ZPOOL_CONFIG_STATS,
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* only toplevel vdevs have capacity stats */
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_one_stat((uint64_t)(scale * (newvs->vs_ops[ZIO_TYPE_READ] -
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_one_stat((uint64_t)(scale * (newvs->vs_ops[ZIO_TYPE_WRITE] -
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_one_stat((uint64_t)(scale * (newvs->vs_bytes[ZIO_TYPE_READ] -
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_one_stat((uint64_t)(scale * (newvs->vs_bytes[ZIO_TYPE_WRITE] -
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (nvlist_lookup_nvlist_array(newnv, ZPOOL_CONFIG_CHILDREN,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (oldnv && nvlist_lookup_nvlist_array(oldnv, ZPOOL_CONFIG_CHILDREN,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan for (c = 0; c < children; c++) {
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan print_vdev_stats(zhp, vname, oldnv ? oldchild[c] : NULL,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan * Include level 2 ARC devices in iostat output
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan if (nvlist_lookup_nvlist_array(newnv, ZPOOL_CONFIG_L2CACHE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (oldnv && nvlist_lookup_nvlist_array(oldnv, ZPOOL_CONFIG_L2CACHE,
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock for (c = 0; c < children; c++) {
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock print_vdev_stats(zhp, vname, oldnv ? oldchild[c] : NULL,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If the pool has disappeared, remove it from the list and continue.
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (-1);
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Callback to print out the iostats for the given pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist(newconfig, ZPOOL_CONFIG_VDEV_TREE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist(oldconfig, ZPOOL_CONFIG_VDEV_TREE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print out the statistics for the pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens print_vdev_stats(zhp, zpool_get_name(zhp), oldnvroot, newnvroot, cb, 0);
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((config = zpool_get_config(zhp, NULL)) != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The width must fall into the range [10,38]. The upper limit is the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * maximum we can have and still fit in 80 columns.
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool iostat [-v] [pool] ... [interval [count]]
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -v Display statistics for individual vdevs
fa9e4066f08beec538e775443c5be79dd423fcabahrens * This command can be tricky because we want to be able to deal with pool
fa9e4066f08beec538e775443c5be79dd423fcabahrens * creation/destruction as well as vdev configuration changes. The bulk of this
fa9e4066f08beec538e775443c5be79dd423fcabahrens * processing is handled by the pool_list_* routines in zpool_iter.c. We rely
fa9e4066f08beec538e775443c5be79dd423fcabahrens * on pool_list_update() to detect the addition of new pools. Configuration
fa9e4066f08beec538e775443c5be79dd423fcabahrens * changes are all handled within libzfs.
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Determine if the last argument is an integer or a pool name
fa9e4066f08beec538e775443c5be79dd423fcabahrens "cannot be zero\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Ignore the last parameter
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If this is not a valid number, just plow on. The
fa9e4066f08beec538e775443c5be79dd423fcabahrens * user will get a more informative error message later
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If the last argument is also an integer, then we have both a count
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and an integer.
fa9e4066f08beec538e775443c5be79dd423fcabahrens "cannot be zero\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock * Ignore the last parameter
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Construct the list of all interesting pools.
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((list = pool_list_get(argc, argv, NULL, &ret)) == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("no pools available\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * Enter the main iostat loop.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Refresh all statistics. This is done as an explicit step
fa9e4066f08beec538e775443c5be79dd423fcabahrens * before calculating the maximum name width, so that any
fa9e4066f08beec538e775443c5be79dd423fcabahrens * configuration changes are properly accounted for.
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.
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) pool_list_iter(list, B_FALSE, get_namewidth, &cb);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If it's the first time, or verbose mode, print the header.
39c23413b8df94a95f67b34cfd4a4dfc3fd0b48deschrock (void) pool_list_iter(list, B_FALSE, print_iostat, &cb);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If there's more than one pool, and we're not in verbose mode
fa9e4066f08beec538e775443c5be79dd423fcabahrens * (which prints a separator for us), then print a separator.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Flush the output so that redirection to a file isn't buffered
fa9e4066f08beec538e775443c5be79dd423fcabahrens * indefinitely.
990b4856d0eaada6f8140335733a1b1771ed2746llingtypedef struct list_cbdata {
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Given a list of columns to display, output appropriate headers for each one.
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *header;
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Given a pool and a list of properties, print out all the properties according
fa9e4066f08beec538e775443c5be79dd423fcabahrens * to the described layout.
990b4856d0eaada6f8140335733a1b1771ed2746llingprint_pool(zpool_handle_t *zhp, zprop_list_t *pl, int scripted)
990b4856d0eaada6f8140335733a1b1771ed2746lling * If this is being called in scripted mode, or if this is the
990b4856d0eaada6f8140335733a1b1771ed2746lling * last column and it is left-justified, don't include a width
990b4856d0eaada6f8140335733a1b1771ed2746lling * format specifier.
990b4856d0eaada6f8140335733a1b1771ed2746lling if (scripted || (pl->pl_next == NULL && !right_justify))
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Generic callback function to list a pool.
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool list [-H] [-o prop[,prop]*] [pool] ...
990b4856d0eaada6f8140335733a1b1771ed2746lling * -H Scripted mode. Don't display headers, and separate properties
990b4856d0eaada6f8140335733a1b1771ed2746lling * by a single tab.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -o List of properties to display. Defaults to
fa9e4066f08beec538e775443c5be79dd423fcabahrens * "name,size,used,available,capacity,health,altroot"
fa9e4066f08beec538e775443c5be79dd423fcabahrens * List all pools in the system, whether or not they're healthy. Output space
fa9e4066f08beec538e775443c5be79dd423fcabahrens * statistics for each one, as well as health status summary.
fa9e4066f08beec538e775443c5be79dd423fcabahrens static char default_props[] =
99653d4ee642c6528e88224f12409a5f23060994eschrock "name,size,used,available,capacity,health,altroot";
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
99653d4ee642c6528e88224f12409a5f23060994eschrock switch (c) {
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) fprintf(stderr, gettext("missing argument for "
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zprop_get_list(g_zfs, props, &cb.cb_proplist, ZFS_TYPE_POOL) != 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = for_each_pool(argc, argv, B_TRUE, &cb.cb_proplist,
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0);
99653d4ee642c6528e88224f12409a5f23060994eschrock 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"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (1);
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, gettext("pool '%s' is unavailable\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens nvroot = make_root_vdev(zhp, force, B_FALSE, replacing, B_FALSE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens ret = zpool_vdev_attach(zhp, old_disk, new_disk, nvroot, replacing);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool replace [-f] <pool> <device> <new_device>
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -f Force attach, even if <new_device> appears to be in use.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Replace <device> with <new_device>.
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
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));
99653d4ee642c6528e88224f12409a5f23060994eschrock * 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.
99653d4ee642c6528e88224f12409a5f23060994eschrock/* 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 */
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, gettext("missing pool name argument\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool online <pool> <device> ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, gettext("invalid option '%c'\n"),
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock /* get pool name and check number of arguments */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) fprintf(stderr, gettext("missing pool name\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) fprintf(stderr, gettext("missing device name\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (1);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (zpool_vdev_online(zhp, argv[i], 0, &newstate) == 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock "onlined, but remains in faulted state\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens "clear' to restore a faulted "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "device\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens "replace' to replace devices "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "that are no longer present\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock * 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
99653d4ee642c6528e88224f12409a5f23060994eschrock * state will not be persistent across reboots.
441d80aa4f613b6298fc8bd3151f4be02dbf84fclling/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, gettext("invalid option '%c'\n"),
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock /* get pool name and check number of arguments */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) fprintf(stderr, gettext("missing pool name\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing device name\n"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock return (1);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * zpool clear <pool> [device]
99653d4ee642c6528e88224f12409a5f23060994eschrock * Clear all errors associated with a pool or a particular device.
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) fprintf(stderr, gettext("missing pool name\n"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) fprintf(stderr, gettext("too many arguments\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrocktypedef struct scrub_cbdata {
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Ignore faulted pools.
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("cannot scrub '%s': pool is "
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (err != 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool scrub [-s] <pool> ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -s Stop. Stops any in-progress scrub.
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) fprintf(stderr, gettext("invalid option '%c'\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing pool name argument\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (for_each_pool(argc, argv, B_TRUE, NULL, scrub_callback, &cb));
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct status_cbdata {
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print out detailed scrub status.
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t examined, total, minutes_left, minutes_taken;
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_STATS,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If there's never been a scrub, there's not much to say.
18ce54df8809e9f672d0ed1a53e99669df0a6df0ek if (vs->vs_scrub_end == 0 && vs->vs_scrub_type == POOL_SCRUB_NONE) {
18ce54df8809e9f672d0ed1a53e99669df0a6df0ek scrub_type = (vs->vs_scrub_type == POOL_SCRUB_RESILVER) ?
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (end != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("%s %s after %lluh%um with %llu errors "
fa9e4066f08beec538e775443c5be79dd423fcabahrens scrub_type, vs->vs_scrub_complete ? "completed" : "stopped",
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext("%s in progress for %lluh%um, %.2f%% done, "
99653d4ee642c6528e88224f12409a5f23060994eschrock "%lluh%um to go\n"),
99653d4ee642c6528e88224f12409a5f23060994eschrock (u_longlong_t)(minutes_left / 60), (uint_t)(minutes_left % 60));
99653d4ee642c6528e88224f12409a5f23060994eschrocktypedef struct spare_cbdata {
99653d4ee642c6528e88224f12409a5f23060994eschrock if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &guid) == 0 &&
99653d4ee642c6528e88224f12409a5f23060994eschrock if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
99653d4ee642c6528e88224f12409a5f23060994eschrock for (c = 0; c < children; c++)
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
99653d4ee642c6528e88224f12409a5f23060994eschrock return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print out configuration state as requested by status_callback.
fa9e4066f08beec538e775443c5be79dd423fcabahrensprint_status_config(zpool_handle_t *zhp, const char *name, nvlist_t *nv,
fa9e4066f08beec538e775443c5be79dd423fcabahrens int namewidth, int depth, boolean_t isspare, boolean_t print_logs)
99653d4ee642c6528e88224f12409a5f23060994eschrock verify(nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_STATS,
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
99653d4ee642c6528e88224f12409a5f23060994eschrock state = zpool_state_to_name(vs->vs_state, vs->vs_aux);
99653d4ee642c6528e88224f12409a5f23060994eschrock * For hot spares, we use the terms 'INUSE' and 'AVAILABLE' for
99653d4ee642c6528e88224f12409a5f23060994eschrock * online drives.
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf("\t%*s%-*s %-8s", depth, "", namewidth - depth,
fa9e4066f08beec538e775443c5be79dd423fcabahrens zfs_nicenum(vs->vs_read_errors, rbuf, sizeof (rbuf));
fa9e4066f08beec538e775443c5be79dd423fcabahrens zfs_nicenum(vs->vs_write_errors, wbuf, sizeof (wbuf));
fa9e4066f08beec538e775443c5be79dd423fcabahrens zfs_nicenum(vs->vs_checksum_errors, cbuf, sizeof (cbuf));
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT,
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens "pool '%s'"),
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock } else if (vs->vs_scrub_repaired != 0 && children == 0) {
afefbcddfd8caf5f3b2da510d9439471ab225040eschrock * Report bytes resilvered/repaired on leaf devices.
fa9e4066f08beec538e775443c5be79dd423fcabahrens zfs_nicenum(vs->vs_scrub_repaired, repaired, sizeof (repaired));
55434c770c89aa1b84474f2559a106803511aba0ek for (c = 0; c < children; c++) {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if ((is_log && !print_logs) || (!is_log && print_logs))
55434c770c89aa1b84474f2559a106803511aba0ekstatic void
55434c770c89aa1b84474f2559a106803511aba0ek "(insufficient privileges)\n");
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) printf("errors: Permanent errors have been "
99653d4ee642c6528e88224f12409a5f23060994eschrock "detected in the following files:\n\n");
99653d4ee642c6528e88224f12409a5f23060994eschrock while ((elem = nvlist_next_nvpair(nverrlist, elem)) != NULL) {
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendanprint_spares(zpool_handle_t *zhp, nvlist_t **spares, uint_t nspares,
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan for (i = 0; i < nspares; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrensprint_l2cache(zpool_handle_t *zhp, nvlist_t **l2cache, uint_t nl2cache,
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < nl2cache; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Display a summary of pool status. Displays a summary such as:
46657f8d750bdb71753495ce2919170f126b8e34mmusante * pool: tank
46657f8d750bdb71753495ce2919170f126b8e34mmusante * status: DEGRADED
fa9e4066f08beec538e775443c5be79dd423fcabahrens * reason: One or more devices ...
fa9e4066f08beec538e775443c5be79dd423fcabahrens * mirror DEGRADED
fa9e4066f08beec538e775443c5be79dd423fcabahrens * c1t0d0 OK
fa9e4066f08beec538e775443c5be79dd423fcabahrens * 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.
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *health;
46657f8d750bdb71753495ce2919170f126b8e34mmusante * If we were given 'zpool status -x', only report those pools with
46657f8d750bdb71753495ce2919170f126b8e34mmusante * problems.
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_STATS,
fa9e4066f08beec538e775443c5be79dd423fcabahrens health = zpool_state_to_name(vs->vs_state, vs->vs_aux);
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext(" 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"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) printf(gettext("action: Replace the device using "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "'zpool replace'.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: One or more devices could not "
d7d4af51b4d115490d97f0b89993fdbaaf441c94mmusante "be used because the label is missing \n\tor invalid. "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "There are insufficient replicas for the pool to "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "continue\n\tfunctioning.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: Destroy and re-create the pool "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "from a backup source.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: One or more devices has "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "experienced an unrecoverable error. An\n\tattempt was "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "made to correct the error. Applications are "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "unaffected.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: Determine if the device needs "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "to be replaced, and clear the errors\n\tusing "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "'zpool clear' or replace the device with 'zpool "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "replace'.\n"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) printf(gettext("status: One or more devices has "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "been taken offline by the administrator.\n\tSufficient "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "replicas exist for the pool to continue functioning in "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "a\n\tdegraded state.\n"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) printf(gettext("action: Online the device using "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "'zpool online' or replace the device with\n\t'zpool "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "replace'.\n"));
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (void) printf(gettext("status: One or more devices is "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "currently being resilvered. The pool will\n\tcontinue "
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock "to function, possibly in a degraded state.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("action: Wait for the resilver to "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "complete.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("status: One or more devices has "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "experienced an error resulting in data\n\tcorruption. "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "Applications may be affected.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("action: Restore the file in question "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "if possible. Otherwise restore the\n\tentire pool from "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "backup.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("status: The pool metadata is corrupted "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "and the pool cannot be opened.\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("action: Destroy and re-create the pool "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "from a backup source.\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) printf(gettext("status: The pool is formatted using an "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "older on-disk format. The pool can\n\tstill be used, but "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "some features are unavailable.\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) printf(gettext("action: Upgrade the pool using 'zpool "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "upgrade'. Once this is done, the\n\tpool will no longer "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "be accessible on older software versions.\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) printf(gettext("status: The pool has been upgraded to a "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "newer, incompatible on-disk version.\n\tThe pool cannot "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "be accessed on this system.\n"));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock (void) printf(gettext("action: Access the pool from a system "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "running more recent software, or\n\trestore the pool from "
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "backup.\n"));
32b87932f3ef0887d873b7f6d2d1943799b2afc0ek "faulted in response to persistent errors.\n\tSufficient "
8a79c1b573d7814f1e432b1de8c9ed00bc876becek "replicas exist for the pool to continue functioning "
32b87932f3ef0887d873b7f6d2d1943799b2afc0ek "in a\n\tdegraded state.\n"));
32b87932f3ef0887d873b7f6d2d1943799b2afc0ek (void) printf(gettext("action: Replace the faulted device, "
32b87932f3ef0887d873b7f6d2d1943799b2afc0ek "or use 'zpool clear' to mark the device\n\trepaired.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("status: One or more devices are "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "faulted in response to persistent errors. There are "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "insufficient replicas for the pool to\n\tcontinue "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "functioning.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: Destroy and re-create the pool "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "from a backup source. Manually marking the device\n"
fa9e4066f08beec538e775443c5be79dd423fcabahrens "\trepaired using 'zpool clear' may allow some data "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "to be recovered.\n"));
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan (void) printf(gettext("status: One or more devices are "
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan "faulted in response to IO failures.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: Make sure the affected devices "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "are connected, then run 'zpool clear'.\n"));
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock (void) printf(gettext("status: An intent log record "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "could not be read.\n"
fa9e4066f08beec538e775443c5be79dd423fcabahrens "\tWaiting for adminstrator intervention to fix the "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "faulted pool.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("action: Either restore the affected "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "device(s) and run 'zpool online',\n"
fa9e4066f08beec538e775443c5be79dd423fcabahrens "\tor ignore the intent log records by running "
c67d9675bbc8392fe45f3a7dfbda1ad4daa1eb07eschrock "'zpool clear'.\n"));
99653d4ee642c6528e88224f12409a5f23060994eschrock * The remaining errors can't actually be generated, yet.
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext(" see: http://www.sun.com/msg/%s\n"),
55434c770c89aa1b84474f2559a106803511aba0ek (void) printf(gettext("\t%-*s %-8s %5s %5s %5s\n"), namewidth,
99653d4ee642c6528e88224f12409a5f23060994eschrock if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_L2CACHE,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_ERRCOUNT,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If the approximate error count is small, get a
fa9e4066f08beec538e775443c5be79dd423fcabahrens * precise count by fetching the entire log and
fa9e4066f08beec538e775443c5be79dd423fcabahrens * uniquifying the results.
fa9e4066f08beec538e775443c5be79dd423fcabahrens "errors\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens "errors, use '-v' for a list\n"),
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) printf(gettext("config: The configuration cannot be "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "determined.\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * zpool status [-vx] [pool] ...
99653d4ee642c6528e88224f12409a5f23060994eschrock * -v Display complete error logs
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -x Display only pools with potential problems
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * Describes the health status of all pools or some subset.
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* check options */
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (c) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) fprintf(stderr, gettext("invalid option '%c'\n"),
e7437265dc2a4920c197ed4337665539d358b22cahrens ret = for_each_pool(argc, argv, B_TRUE, NULL, status_callback, &cb);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock else if (cb.cb_explain && cb.cb_first && cb.cb_allpools)
99653d4ee642c6528e88224f12409a5f23060994eschrocktypedef struct upgrade_cbdata {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION,
5ad820458efd0fdb914baff9c1447c22b819fa23nd "out of date, and can be upgraded. After "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "being\nupgraded, these pools will no "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "longer be accessible by older software "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "versions.\n\n"));
e6c728e129b367a26c1972c43cc89654eb585941brendan "formatted using a newer software version and\n"
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "cannot be accessed on the current system.\n\n"));
44cd46cadd9aab751dae6a4023c1cb5bf316d274billm/* ARGSUSED */
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("'log' is now a reserved word\n"
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "Pool 'log' must be renamed using export and import"
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock " to upgrade.\n"));
990b4856d0eaada6f8140335733a1b1771ed2746lling return (1);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock cur_version = zpool_get_prop_int(zhp, ZPOOL_PROP_VERSION, NULL);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("Pool '%s' is already formatted "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "using more current version '%llu'.\n"),
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock return (0);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("Pool '%s' is already formatted "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "using the current version.\n"), zpool_get_name(zhp));
990b4856d0eaada6f8140335733a1b1771ed2746lling return (0);
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("Successfully upgraded '%s' "
99653d4ee642c6528e88224f12409a5f23060994eschrock "from version %llu to version %llu\n\n"),
990b4856d0eaada6f8140335733a1b1771ed2746lling return (ret != 0);
990b4856d0eaada6f8140335733a1b1771ed2746lling * zpool upgrade
990b4856d0eaada6f8140335733a1b1771ed2746lling * zpool upgrade -v
990b4856d0eaada6f8140335733a1b1771ed2746lling * zpool upgrade [-V version] <-a | pool ...>
990b4856d0eaada6f8140335733a1b1771ed2746lling * With no arguments, display downrev'd ZFS pool available for upgrade.
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * Individual pools can be upgraded by specifying the pool, and '-a' will
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock * upgrade all pools.
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling /* check options */
351420b34707afeafa8d5c3e0c77b7bcffb1edc0lling switch (c) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) fprintf(stderr, gettext("invalid option '%c'\n"),
99653d4ee642c6528e88224f12409a5f23060994eschrock "incompatible with other arguments\n"));
8eed72d43abf6184b757f3eb9228c3c4979aca10ck "incompatible with other arguments\n"));
8654d0253136055bd4cc2423d87378e8a37f2eb5perrin if (argc != 0) {
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) fprintf(stderr, gettext("-a option should not "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "be used along with a pool name\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("This system is currently running "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext("The following versions are "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "supported:\n\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf("--- -----------------------------------------"
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "---------------\n");
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) printf(gettext(" 1 Initial ZFS version\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "(replicated metadata)\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext(" 3 Hot spares and double parity "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "RAID-Z\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext(" 5 Compression using the gzip "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "algorithm\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext(" 6 bootfs pool property\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext(" 7 Separate intent log devices\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext(" 8 Delegated administration\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext(" 9 refquota and refreservation "
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock "properties\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext(" 11 Improved scrub performance\n"));
eaca9bbd5f5d1e4e554da4c7108e8a03c8c33481eschrock (void) printf(gettext(" 12 Snapshot properties\n"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling "support\n"));
06eeb2ad640ce72d394ac521094bed7681044408ek (void) printf(gettext("For more information on a particular "
06eeb2ad640ce72d394ac521094bed7681044408ek "version, including supported releases, see:\n\n"));
06eeb2ad640ce72d394ac521094bed7681044408ek (void) printf("http://www.opensolaris.org/os/community/zfs/"
06eeb2ad640ce72d394ac521094bed7681044408ek "version/N\n\n");
06eeb2ad640ce72d394ac521094bed7681044408ek (void) printf(gettext("Where 'N' is the version number.\n"));
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks } else if (argc == 0) {
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks if (ret == 0) {
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "using this version.\n"));
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "for a list of available versions and "
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "their associated\nfeatures.\n"));
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarkstypedef struct hist_cbdata {
a9799022bd90b13722204e80112efaa5bf573099ck "invalid event",
a9799022bd90b13722204e80112efaa5bf573099ck "pool create",
088f389458728c464569a5506b58070254fa4f7dahrens "vdev add",
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "pool remove",
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "pool destroy",
06eeb2ad640ce72d394ac521094bed7681044408ek "pool export",
06eeb2ad640ce72d394ac521094bed7681044408ek "pool import",
06eeb2ad640ce72d394ac521094bed7681044408ek "vdev attach",
06eeb2ad640ce72d394ac521094bed7681044408ek "vdev replace",
06eeb2ad640ce72d394ac521094bed7681044408ek "vdev detach",
06eeb2ad640ce72d394ac521094bed7681044408ek "vdev online",
06eeb2ad640ce72d394ac521094bed7681044408ek "vdev offline",
06eeb2ad640ce72d394ac521094bed7681044408ek "vdev upgrade",
06eeb2ad640ce72d394ac521094bed7681044408ek "pool clear",
06eeb2ad640ce72d394ac521094bed7681044408ek "pool scrub",
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "pool property set",
06eeb2ad640ce72d394ac521094bed7681044408ek "destroy",
06eeb2ad640ce72d394ac521094bed7681044408ek "destroy_begin_sync",
06eeb2ad640ce72d394ac521094bed7681044408ek "inherit",
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "property set",
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "quota set",
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "permission update",
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "permission remove",
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "permission who remove",
06eeb2ad640ce72d394ac521094bed7681044408ek "reservation set",
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "replay_inc_sync",
06eeb2ad640ce72d394ac521094bed7681044408ek "replay_full_sync",
06eeb2ad640ce72d394ac521094bed7681044408ek "rollback",
06eeb2ad640ce72d394ac521094bed7681044408ek "snapshot",
06eeb2ad640ce72d394ac521094bed7681044408ek "filesystem version upgrade",
06eeb2ad640ce72d394ac521094bed7681044408ek "refquota set",
06eeb2ad640ce72d394ac521094bed7681044408ek "refreservation set",
06eeb2ad640ce72d394ac521094bed7681044408ek "pool scrub done",
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks * Print out the command history for a specific pool.
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (void) printf(gettext("History for '%s':\n"), zpool_get_name(zhp));
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks verify(nvlist_lookup_nvlist_array(nvhis, ZPOOL_HIST_RECORD,
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks for (i = 0; i < numrecords; i++) {
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks /* is it an internal event or a standard event? */
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "[internal %s txg:%lld] %s",
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks * zpool history <pool>
06eeb2ad640ce72d394ac521094bed7681044408ek * Displays the history of commands that modified pools.
990b4856d0eaada6f8140335733a1b1771ed2746lling /* check options */
b1b8ab34de515a5e83206da22c3d7e563241b021lling switch (c) {
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) fprintf(stderr, gettext("invalid option '%c'\n"),
b1b8ab34de515a5e83206da22c3d7e563241b021lling ret = for_each_pool(argc, argv, B_FALSE, NULL, get_history_one,
b1b8ab34de515a5e83206da22c3d7e563241b021lling 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.
b1b8ab34de515a5e83206da22c3d7e563241b021lling zpool_prop_to_name(pl->pl_prop), value, srctype, NULL);
b1b8ab34de515a5e83206da22c3d7e563241b021lling return (0);
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"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens "property=value argument\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < NCOMMAND; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (1);
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens (void) fprintf(stderr, gettext("internal error: failed to "
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens "initialize ZFS library\n"));
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens return (1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Make sure the user has specified some command.
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, gettext("missing command\n"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Special case '-?'
fa9e4066f08beec538e775443c5be79dd423fcabahrens zpool_set_history_str("zpool", argc, argv, history_str);
fa9e4066f08beec538e775443c5be79dd423fcabahrens verify(zpool_stage_history(g_zfs, history_str) == 0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Run the appropriate command.
abort();
return (ret);