usr/src/cmd/zpool/zpool_main.c
author eschrock
Mon, 31 Jul 2006 15:13:30 -0700
changeset 2474 c001ad7e0c25
parent 2142 f6e0487aa9a3
child 2500 12e683f74751
permissions -rw-r--r--
6368751 libzfs interface for mount/umounting all the file systems for a given pool 6385349 zpool import -d /dev hangs 6397052 unmounting datasets should process /etc/mnttab instead of traverse DSL 6403510 zfs remount,noatime option broken 6423412 Two spaces lines are unnecessary after 'zpool import -a' 6434054 'zfs destroy' core dumps if clone is namespace-parent of origin 6440515 namespace_reload() can leak memory on allocation faiure 6440592 nvlist_dup() should not fill in destination pointer on error 6446060 zfs get does not consistently report temporary properties 6448326 zfs(1) 'list' command crashes if hidden property createtxg is requested 6450653 get_dependents() has poor error semantics
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     1
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     2
 * CDDL HEADER START
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     3
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
1485
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1387
diff changeset
     5
 * Common Development and Distribution License (the "License").
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1387
diff changeset
     6
 * You may not use this file except in compliance with the License.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     7
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    11
 * and limitations under the License.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    12
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    18
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    19
 * CDDL HEADER END
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    20
 */
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
    21
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    22
/*
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
    23
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    24
 * Use is subject to license terms.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    25
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    26
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    27
#pragma ident	"%Z%%M%	%I%	%E% SMI"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    28
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    29
#include <assert.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    30
#include <ctype.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    31
#include <dirent.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    32
#include <errno.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    33
#include <fcntl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    34
#include <libgen.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    35
#include <libintl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    36
#include <libuutil.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    37
#include <locale.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    38
#include <stdio.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    39
#include <stdlib.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    40
#include <string.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    41
#include <strings.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    42
#include <unistd.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    43
#include <priv.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    44
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    45
#include <sys/stat.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    46
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    47
#include <libzfs.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    48
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    49
#include "zpool_util.h"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    50
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    51
static int zpool_do_create(int, char **);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    52
static int zpool_do_destroy(int, char **);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    53
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    54
static int zpool_do_add(int, char **);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
    55
static int zpool_do_remove(int, char **);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    56
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    57
static int zpool_do_list(int, char **);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    58
static int zpool_do_iostat(int, char **);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    59
static int zpool_do_status(int, char **);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    60
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    61
static int zpool_do_online(int, char **);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    62
static int zpool_do_offline(int, char **);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
    63
static int zpool_do_clear(int, char **);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    64
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    65
static int zpool_do_attach(int, char **);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    66
static int zpool_do_detach(int, char **);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    67
static int zpool_do_replace(int, char **);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    68
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    69
static int zpool_do_scrub(int, char **);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    70
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    71
static int zpool_do_import(int, char **);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    72
static int zpool_do_export(int, char **);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    73
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
    74
static int zpool_do_upgrade(int, char **);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
    75
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    76
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    77
 * These libumem hooks provide a reasonable set of defaults for the allocator's
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    78
 * debugging facilities.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    79
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    80
const char *
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
    81
_umem_debug_init(void)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    82
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    83
	return ("default,verbose"); /* $UMEM_DEBUG setting */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    84
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    85
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    86
const char *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    87
_umem_logging_init(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    88
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    89
	return ("fail,contents"); /* $UMEM_LOGGING setting */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    90
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    91
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
    92
typedef enum {
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
    93
	HELP_ADD,
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
    94
	HELP_ATTACH,
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
    95
	HELP_CLEAR,
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
    96
	HELP_CREATE,
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
    97
	HELP_DESTROY,
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
    98
	HELP_DETACH,
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
    99
	HELP_EXPORT,
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   100
	HELP_IMPORT,
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   101
	HELP_IOSTAT,
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   102
	HELP_LIST,
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   103
	HELP_OFFLINE,
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   104
	HELP_ONLINE,
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   105
	HELP_REPLACE,
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   106
	HELP_REMOVE,
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   107
	HELP_SCRUB,
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   108
	HELP_STATUS,
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   109
	HELP_UPGRADE
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   110
} zpool_help_t;
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   111
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   112
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   113
typedef struct zpool_command {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   114
	const char	*name;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   115
	int		(*func)(int, char **);
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   116
	zpool_help_t	usage;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   117
} zpool_command_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   118
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   119
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   120
 * Master command table.  Each ZFS command has a name, associated function, and
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   121
 * usage message.  The usage messages need to be internationalized, so we have
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   122
 * to have a function to return the usage message based on a command index.
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   123
 *
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   124
 * These commands are organized according to how they are displayed in the usage
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   125
 * message.  An empty command (one with a NULL name) indicates an empty line in
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   126
 * the generic usage message.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   127
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   128
static zpool_command_t command_table[] = {
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   129
	{ "create",	zpool_do_create,	HELP_CREATE		},
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   130
	{ "destroy",	zpool_do_destroy,	HELP_DESTROY		},
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   131
	{ NULL },
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   132
	{ "add",	zpool_do_add,		HELP_ADD		},
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   133
	{ "remove",	zpool_do_remove,	HELP_REMOVE		},
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   134
	{ NULL },
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   135
	{ "list",	zpool_do_list,		HELP_LIST		},
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   136
	{ "iostat",	zpool_do_iostat,	HELP_IOSTAT		},
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   137
	{ "status",	zpool_do_status,	HELP_STATUS		},
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   138
	{ NULL },
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   139
	{ "online",	zpool_do_online,	HELP_ONLINE		},
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   140
	{ "offline",	zpool_do_offline,	HELP_OFFLINE		},
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   141
	{ "clear",	zpool_do_clear,		HELP_CLEAR		},
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   142
	{ NULL },
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   143
	{ "attach",	zpool_do_attach,	HELP_ATTACH		},
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   144
	{ "detach",	zpool_do_detach,	HELP_DETACH		},
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   145
	{ "replace",	zpool_do_replace,	HELP_REPLACE		},
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   146
	{ NULL },
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   147
	{ "scrub",	zpool_do_scrub,		HELP_SCRUB		},
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   148
	{ NULL },
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   149
	{ "import",	zpool_do_import,	HELP_IMPORT		},
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   150
	{ "export",	zpool_do_export,	HELP_EXPORT		},
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   151
	{ "upgrade",	zpool_do_upgrade,	HELP_UPGRADE		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   152
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   153
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   154
#define	NCOMMAND	(sizeof (command_table) / sizeof (command_table[0]))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   155
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   156
zpool_command_t *current_command;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   157
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   158
static const char *
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   159
get_usage(zpool_help_t idx) {
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   160
	switch (idx) {
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   161
	case HELP_ADD:
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   162
		return (gettext("\tadd [-fn] <pool> <vdev> ...\n"));
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   163
	case HELP_ATTACH:
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   164
		return (gettext("\tattach [-f] <pool> <device> "
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   165
		    "<new_device>\n"));
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   166
	case HELP_CLEAR:
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   167
		return (gettext("\tclear <pool> [device]\n"));
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   168
	case HELP_CREATE:
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   169
		return (gettext("\tcreate  [-fn] [-R root] [-m mountpoint] "
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   170
		    "<pool> <vdev> ...\n"));
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   171
	case HELP_DESTROY:
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   172
		return (gettext("\tdestroy [-f] <pool>\n"));
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   173
	case HELP_DETACH:
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   174
		return (gettext("\tdetach <pool> <device>\n"));
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   175
	case HELP_EXPORT:
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   176
		return (gettext("\texport [-f] <pool> ...\n"));
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   177
	case HELP_IMPORT:
1631
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
   178
		return (gettext("\timport [-d dir] [-D]\n"
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
   179
		    "\timport [-d dir] [-D] [-f] [-o opts] [-R root] -a\n"
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
   180
		    "\timport [-d dir] [-D] [-f] [-o opts] [-R root ]"
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
   181
		    " <pool | id> [newpool]\n"));
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   182
	case HELP_IOSTAT:
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   183
		return (gettext("\tiostat [-v] [pool] ... [interval "
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   184
		    "[count]]\n"));
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   185
	case HELP_LIST:
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   186
		return (gettext("\tlist [-H] [-o field[,field]*] "
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   187
		    "[pool] ...\n"));
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   188
	case HELP_OFFLINE:
1485
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1387
diff changeset
   189
		return (gettext("\toffline [-t] <pool> <device> ...\n"));
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   190
	case HELP_ONLINE:
1485
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1387
diff changeset
   191
		return (gettext("\tonline <pool> <device> ...\n"));
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   192
	case HELP_REPLACE:
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   193
		return (gettext("\treplace [-f] <pool> <device> "
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   194
		    "[new_device]\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   195
	case HELP_REMOVE:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   196
		return (gettext("\tremove <pool> <device>\n"));
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   197
	case HELP_SCRUB:
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   198
		return (gettext("\tscrub [-s] <pool> ...\n"));
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   199
	case HELP_STATUS:
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   200
		return (gettext("\tstatus [-vx] [pool] ...\n"));
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   201
	case HELP_UPGRADE:
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   202
		return (gettext("\tupgrade\n"
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   203
		    "\tupgrade -v\n"
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   204
		    "\tupgrade <-a | pool>\n"));
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   205
	}
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   206
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   207
	abort();
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   208
	/* NOTREACHED */
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   209
}
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   210
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   211
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   212
 * Fields available for 'zpool list'.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   213
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   214
typedef enum {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   215
	ZPOOL_FIELD_NAME,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   216
	ZPOOL_FIELD_SIZE,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   217
	ZPOOL_FIELD_USED,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   218
	ZPOOL_FIELD_AVAILABLE,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   219
	ZPOOL_FIELD_CAPACITY,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   220
	ZPOOL_FIELD_HEALTH,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   221
	ZPOOL_FIELD_ROOT
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   222
} zpool_field_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   223
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   224
#define	MAX_FIELDS	10
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   225
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   226
typedef struct column_def {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   227
	const char	*cd_title;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   228
	size_t		cd_width;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   229
	enum {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   230
		left_justify,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   231
		right_justify
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   232
	}		cd_justify;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   233
} column_def_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   234
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   235
static column_def_t column_table[] = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   236
	{ "NAME",	20,	left_justify	},
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   237
	{ "SIZE",	6,	right_justify	},
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   238
	{ "USED",	6,	right_justify	},
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   239
	{ "AVAIL",	6,	right_justify	},
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   240
	{ "CAP",	5,	right_justify	},
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   241
	{ "HEALTH",	9,	left_justify	},
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   242
	{ "ALTROOT",	15,	left_justify	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   243
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   244
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   245
static char *column_subopts[] = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   246
	"name",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   247
	"size",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   248
	"used",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   249
	"available",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   250
	"capacity",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   251
	"health",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   252
	"root",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   253
	NULL
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   254
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   255
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   256
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   257
 * Display usage message.  If we're inside a command, display only the usage for
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   258
 * that command.  Otherwise, iterate over the entire command table and display
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   259
 * a complete usage message.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   260
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   261
void
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   262
usage(boolean_t requested)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   263
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   264
	int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   265
	FILE *fp = requested ? stdout : stderr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   266
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   267
	if (current_command == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   268
		int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   269
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   270
		(void) fprintf(fp, gettext("usage: zpool command args ...\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   271
		(void) fprintf(fp,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   272
		    gettext("where 'command' is one of the following:\n\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   273
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   274
		for (i = 0; i < NCOMMAND; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   275
			if (command_table[i].name == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   276
				(void) fprintf(fp, "\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   277
			else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   278
				(void) fprintf(fp, "%s",
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   279
				    get_usage(command_table[i].usage));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   280
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   281
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   282
		(void) fprintf(fp, gettext("usage:\n"));
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   283
		(void) fprintf(fp, "%s", get_usage(current_command->usage));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   284
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   285
		if (strcmp(current_command->name, "list") == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   286
			(void) fprintf(fp, gettext("\nwhere 'field' is one "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   287
			    "of the following:\n\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   288
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   289
			for (i = 0; column_subopts[i] != NULL; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   290
				(void) fprintf(fp, "\t%s\n", column_subopts[i]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   291
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   292
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   293
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   294
	exit(requested ? 0 : 2);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   295
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   296
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   297
const char *
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   298
state_to_name(vdev_stat_t *vs)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   299
{
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   300
	switch (vs->vs_state) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   301
	case VDEV_STATE_CLOSED:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   302
	case VDEV_STATE_CANT_OPEN:
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   303
		if (vs->vs_aux == VDEV_AUX_CORRUPT_DATA)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   304
			return (gettext("FAULTED"));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   305
		else
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   306
			return (gettext("UNAVAIL"));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   307
	case VDEV_STATE_OFFLINE:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   308
		return (gettext("OFFLINE"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   309
	case VDEV_STATE_DEGRADED:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   310
		return (gettext("DEGRADED"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   311
	case VDEV_STATE_HEALTHY:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   312
		return (gettext("ONLINE"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   313
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   314
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   315
	return (gettext("UNKNOWN"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   316
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   317
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   318
void
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
   319
print_vdev_tree(zpool_handle_t *zhp, const char *name, nvlist_t *nv, int indent)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   320
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   321
	nvlist_t **child;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   322
	uint_t c, children;
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
   323
	char *vname;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   324
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   325
	if (name != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   326
		(void) printf("\t%*s%s\n", indent, "", name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   327
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   328
	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   329
	    &child, &children) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   330
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   331
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
   332
	for (c = 0; c < children; c++) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   333
		vname = zpool_vdev_name(g_zfs, zhp, child[c]);
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
   334
		print_vdev_tree(zhp, vname, child[c], indent + 2);
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
   335
		free(vname);
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
   336
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   337
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   338
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   339
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   340
 * zpool add [-fn] <pool> <vdev> ...
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   341
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   342
 *	-f	Force addition of devices, even if they appear in use
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   343
 *	-n	Do not add the devices, but display the resulting layout if
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   344
 *		they were to be added.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   345
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   346
 * Adds the given vdevs to 'pool'.  As with create, the bulk of this work is
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   347
 * handled by get_vdev_spec(), which constructs the nvlist needed to pass to
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   348
 * libzfs.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   349
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   350
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   351
zpool_do_add(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   352
{
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   353
	boolean_t force = B_FALSE;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   354
	boolean_t dryrun = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   355
	int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   356
	nvlist_t *nvroot;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   357
	char *poolname;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   358
	int ret;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   359
	zpool_handle_t *zhp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   360
	nvlist_t *config;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   361
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   362
	/* check options */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   363
	while ((c = getopt(argc, argv, "fn")) != -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   364
		switch (c) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   365
		case 'f':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   366
			force = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   367
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   368
		case 'n':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   369
			dryrun = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   370
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   371
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   372
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   373
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   374
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   375
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   376
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   377
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   378
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   379
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   380
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   381
	/* get pool name and check number of arguments */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   382
	if (argc < 1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   383
		(void) fprintf(stderr, gettext("missing pool name argument\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   384
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   385
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   386
	if (argc < 2) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   387
		(void) fprintf(stderr, gettext("missing vdev specification\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   388
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   389
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   390
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   391
	poolname = argv[0];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   392
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   393
	argc--;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   394
	argv++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   395
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   396
	if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   397
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   398
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
   399
	if ((config = zpool_get_config(zhp, NULL)) == NULL) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   400
		(void) fprintf(stderr, gettext("pool '%s' is unavailable\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   401
		    poolname);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   402
		zpool_close(zhp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   403
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   404
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   405
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   406
	/* pass off to get_vdev_spec for processing */
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   407
	nvroot = make_root_vdev(config, force, !force, B_FALSE, argc, argv);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   408
	if (nvroot == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   409
		zpool_close(zhp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   410
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   411
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   412
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   413
	if (dryrun) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   414
		nvlist_t *poolnvroot;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   415
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   416
		verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   417
		    &poolnvroot) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   418
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   419
		(void) printf(gettext("would update '%s' to the following "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   420
		    "configuration:\n"), zpool_get_name(zhp));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   421
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
   422
		print_vdev_tree(zhp, poolname, poolnvroot, 0);
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
   423
		print_vdev_tree(zhp, NULL, nvroot, 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   424
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   425
		ret = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   426
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   427
		ret = (zpool_add(zhp, nvroot) != 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   428
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   429
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   430
	nvlist_free(nvroot);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   431
	zpool_close(zhp);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   432
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   433
	return (ret);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   434
}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   435
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   436
/*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   437
 * zpool remove <pool> <vdev>
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   438
 *
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   439
 * Removes the given vdev from the pool.  Currently, this only supports removing
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   440
 * spares from the pool.  Eventually, we'll want to support removing leaf vdevs
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   441
 * (as an alias for 'detach') as well as toplevel vdevs.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   442
 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   443
int
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   444
zpool_do_remove(int argc, char **argv)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   445
{
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   446
	char *poolname;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   447
	int ret;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   448
	zpool_handle_t *zhp;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   449
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   450
	argc--;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   451
	argv++;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   452
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   453
	/* get pool name and check number of arguments */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   454
	if (argc < 1) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   455
		(void) fprintf(stderr, gettext("missing pool name argument\n"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   456
		usage(B_FALSE);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   457
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   458
	if (argc < 2) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   459
		(void) fprintf(stderr, gettext("missing device\n"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   460
		usage(B_FALSE);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   461
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   462
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   463
	poolname = argv[0];
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   464
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   465
	if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   466
		return (1);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   467
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   468
	ret = (zpool_vdev_remove(zhp, argv[1]) != 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   469
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   470
	return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   471
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   472
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   473
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   474
 * zpool create [-fn] [-R root] [-m mountpoint] <pool> <dev> ...
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   475
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   476
 *	-f	Force creation, even if devices appear in use
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   477
 *	-n	Do not create the pool, but display the resulting layout if it
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   478
 *		were to be created.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   479
 *      -R	Create a pool under an alternate root
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   480
 *      -m	Set default mountpoint for the root dataset.  By default it's
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   481
 *      	'/<pool>'
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   482
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   483
 * Creates the the named pool according to the given vdev specification.  The
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   484
 * bulk of the vdev processing is done in get_vdev_spec() in zpool_vdev.c.  Once
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   485
 * we get the nvlist back from get_vdev_spec(), we either print out the contents
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   486
 * (if '-n' was specified), or pass it to libzfs to do the creation.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   487
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   488
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   489
zpool_do_create(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   490
{
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   491
	boolean_t force = B_FALSE;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   492
	boolean_t dryrun = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   493
	int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   494
	nvlist_t *nvroot;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   495
	char *poolname;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   496
	int ret;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   497
	char *altroot = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   498
	char *mountpoint = NULL;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   499
	nvlist_t **child;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   500
	uint_t children;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   501
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   502
	/* check options */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   503
	while ((c = getopt(argc, argv, ":fnR:m:")) != -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   504
		switch (c) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   505
		case 'f':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   506
			force = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   507
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   508
		case 'n':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   509
			dryrun = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   510
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   511
		case 'R':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   512
			altroot = optarg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   513
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   514
		case 'm':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   515
			mountpoint = optarg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   516
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   517
		case ':':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   518
			(void) fprintf(stderr, gettext("missing argument for "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   519
			    "'%c' option\n"), optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   520
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   521
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   522
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   523
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   524
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   525
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   526
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   527
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   528
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   529
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   530
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   531
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   532
	/* get pool name and check number of arguments */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   533
	if (argc < 1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   534
		(void) fprintf(stderr, gettext("missing pool name argument\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   535
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   536
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   537
	if (argc < 2) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   538
		(void) fprintf(stderr, gettext("missing vdev specification\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   539
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   540
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   541
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   542
	poolname = argv[0];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   543
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   544
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   545
	 * As a special case, check for use of '/' in the name, and direct the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   546
	 * user to use 'zfs create' instead.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   547
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   548
	if (strchr(poolname, '/') != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   549
		(void) fprintf(stderr, gettext("cannot create '%s': invalid "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   550
		    "character '/' in pool name\n"), poolname);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   551
		(void) fprintf(stderr, gettext("use 'zfs create' to "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   552
		    "create a dataset\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   553
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   554
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   555
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   556
	/* pass off to get_vdev_spec for bulk processing */
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   557
	nvroot = make_root_vdev(NULL, force, !force, B_FALSE, argc - 1,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   558
	    argv + 1);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   559
	if (nvroot == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   560
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   561
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   562
	/* make_root_vdev() allows 0 toplevel children if there are spares */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   563
	verify(nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_CHILDREN,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   564
	    &child, &children) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   565
	if (children == 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   566
		(void) fprintf(stderr, gettext("invalid vdev "
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   567
		    "specification: at least one toplevel vdev must be "
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   568
		    "specified\n"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   569
		return (1);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   570
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   571
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   572
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   573
	if (altroot != NULL && altroot[0] != '/') {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   574
		(void) fprintf(stderr, gettext("invalid alternate root '%s': "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   575
		    "must be an absolute path\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   576
		nvlist_free(nvroot);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   577
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   578
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   579
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   580
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   581
	 * Check the validity of the mountpoint and direct the user to use the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   582
	 * '-m' mountpoint option if it looks like its in use.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   583
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   584
	if (mountpoint == NULL ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   585
	    (strcmp(mountpoint, ZFS_MOUNTPOINT_LEGACY) != 0 &&
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   586
	    strcmp(mountpoint, ZFS_MOUNTPOINT_NONE) != 0)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   587
		char buf[MAXPATHLEN];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   588
		struct stat64 statbuf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   589
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   590
		if (mountpoint && mountpoint[0] != '/') {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   591
			(void) fprintf(stderr, gettext("invalid mountpoint "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   592
			    "'%s': must be an absolute path, 'legacy', or "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   593
			    "'none'\n"), mountpoint);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   594
			nvlist_free(nvroot);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   595
			return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   596
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   597
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   598
		if (mountpoint == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   599
			if (altroot != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   600
				(void) snprintf(buf, sizeof (buf), "%s/%s",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   601
				    altroot, poolname);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   602
			else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   603
				(void) snprintf(buf, sizeof (buf), "/%s",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   604
				    poolname);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   605
		} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   606
			if (altroot != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   607
				(void) snprintf(buf, sizeof (buf), "%s%s",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   608
				    altroot, mountpoint);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   609
			else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   610
				(void) snprintf(buf, sizeof (buf), "%s",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   611
				    mountpoint);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   612
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   613
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   614
		if (stat64(buf, &statbuf) == 0 &&
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   615
		    statbuf.st_nlink != 2) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   616
			if (mountpoint == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   617
				(void) fprintf(stderr, gettext("default "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   618
				    "mountpoint '%s' exists and is not "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   619
				    "empty\n"), buf);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   620
			else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   621
				(void) fprintf(stderr, gettext("mountpoint "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   622
				    "'%s' exists and is not empty\n"), buf);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   623
			(void) fprintf(stderr, gettext("use '-m' "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   624
			    "option to provide a different default\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   625
			nvlist_free(nvroot);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   626
			return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   627
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   628
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   629
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   630
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   631
	if (dryrun) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   632
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   633
		 * For a dry run invocation, print out a basic message and run
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   634
		 * through all the vdevs in the list and print out in an
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   635
		 * appropriate hierarchy.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   636
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   637
		(void) printf(gettext("would create '%s' with the "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   638
		    "following layout:\n\n"), poolname);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   639
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
   640
		print_vdev_tree(NULL, poolname, nvroot, 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   641
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   642
		ret = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   643
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   644
		ret = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   645
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   646
		 * Hand off to libzfs.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   647
		 */
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   648
		if (zpool_create(g_zfs, poolname, nvroot, altroot) == 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   649
			zfs_handle_t *pool = zfs_open(g_zfs, poolname,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   650
			    ZFS_TYPE_FILESYSTEM);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   651
			if (pool != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   652
				if (mountpoint != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   653
					verify(zfs_prop_set(pool,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   654
					    ZFS_PROP_MOUNTPOINT,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   655
					    mountpoint) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   656
				if (zfs_mount(pool, NULL, 0) == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   657
					ret = zfs_share(pool);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   658
				zfs_close(pool);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   659
			}
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   660
		} else if (libzfs_errno(g_zfs) == EZFS_INVALIDNAME) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   661
			(void) fprintf(stderr, gettext("pool name may have "
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   662
			    "been omitted\n"));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   663
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   664
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   665
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   666
	nvlist_free(nvroot);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   667
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   668
	return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   669
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   670
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   671
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   672
 * zpool destroy <pool>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   673
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   674
 * 	-f	Forcefully unmount any datasets
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   675
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   676
 * Destroy the given pool.  Automatically unmounts any datasets in the pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   677
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   678
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   679
zpool_do_destroy(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   680
{
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   681
	boolean_t force = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   682
	int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   683
	char *pool;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   684
	zpool_handle_t *zhp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   685
	int ret;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   686
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   687
	/* check options */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   688
	while ((c = getopt(argc, argv, "f")) != -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   689
		switch (c) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   690
		case 'f':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   691
			force = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   692
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   693
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   694
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   695
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   696
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   697
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   698
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   699
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   700
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   701
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   702
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   703
	/* check arguments */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   704
	if (argc < 1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   705
		(void) fprintf(stderr, gettext("missing pool argument\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   706
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   707
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   708
	if (argc > 1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   709
		(void) fprintf(stderr, gettext("too many arguments\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   710
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   711
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   712
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   713
	pool = argv[0];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   714
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   715
	if ((zhp = zpool_open_canfail(g_zfs, pool)) == NULL) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   716
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   717
		 * As a special case, check for use of '/' in the name, and
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   718
		 * direct the user to use 'zfs destroy' instead.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   719
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   720
		if (strchr(pool, '/') != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   721
			(void) fprintf(stderr, gettext("use 'zfs destroy' to "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   722
			    "destroy a dataset\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   723
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   724
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   725
2474
c001ad7e0c25 6368751 libzfs interface for mount/umounting all the file systems for a given pool
eschrock
parents: 2142
diff changeset
   726
	if (zpool_unmount_datasets(zhp, force) != 0) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   727
		(void) fprintf(stderr, gettext("could not destroy '%s': "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   728
		    "could not unmount datasets\n"), zpool_get_name(zhp));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   729
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   730
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   731
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   732
	ret = (zpool_destroy(zhp) != 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   733
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   734
	zpool_close(zhp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   735
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   736
	return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   737
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   738
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   739
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   740
 * zpool export [-f] <pool> ...
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   741
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   742
 *	-f	Forcefully unmount datasets
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   743
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   744
 * Export the the given pools.  By default, the command will attempt to cleanly
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   745
 * unmount any active datasets within the pool.  If the '-f' flag is specified,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   746
 * then the datasets will be forcefully unmounted.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   747
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   748
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   749
zpool_do_export(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   750
{
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   751
	boolean_t force = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   752
	int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   753
	zpool_handle_t *zhp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   754
	int ret;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   755
	int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   756
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   757
	/* check options */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   758
	while ((c = getopt(argc, argv, "f")) != -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   759
		switch (c) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   760
		case 'f':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   761
			force = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   762
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   763
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   764
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   765
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   766
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   767
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   768
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   769
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   770
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   771
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   772
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   773
	/* check arguments */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   774
	if (argc < 1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   775
		(void) fprintf(stderr, gettext("missing pool argument\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   776
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   777
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   778
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   779
	ret = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   780
	for (i = 0; i < argc; i++) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   781
		if ((zhp = zpool_open_canfail(g_zfs, argv[i])) == NULL) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   782
			ret = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   783
			continue;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   784
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   785
2474
c001ad7e0c25 6368751 libzfs interface for mount/umounting all the file systems for a given pool
eschrock
parents: 2142
diff changeset
   786
		if (zpool_unmount_datasets(zhp, force) != 0) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   787
			ret = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   788
			zpool_close(zhp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   789
			continue;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   790
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   791
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   792
		if (zpool_export(zhp) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   793
			ret = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   794
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   795
		zpool_close(zhp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   796
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   797
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   798
	return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   799
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   800
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   801
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   802
 * Given a vdev configuration, determine the maximum width needed for the device
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   803
 * name column.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   804
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   805
static int
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
   806
max_width(zpool_handle_t *zhp, nvlist_t *nv, int depth, int max)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   807
{
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   808
	char *name = zpool_vdev_name(g_zfs, zhp, nv);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   809
	nvlist_t **child;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   810
	uint_t c, children;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   811
	int ret;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   812
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   813
	if (strlen(name) + depth > max)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   814
		max = strlen(name) + depth;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   815
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
   816
	free(name);
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
   817
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   818
	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_SPARES,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   819
	    &child, &children) == 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   820
		for (c = 0; c < children; c++)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   821
			if ((ret = max_width(zhp, child[c], depth + 2,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   822
			    max)) > max)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   823
				max = ret;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   824
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   825
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   826
	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   827
	    &child, &children) == 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   828
		for (c = 0; c < children; c++)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   829
			if ((ret = max_width(zhp, child[c], depth + 2,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   830
			    max)) > max)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   831
				max = ret;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   832
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   833
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   834
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   835
	return (max);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   836
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   837
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   838
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   839
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   840
 * Print the configuration of an exported pool.  Iterate over all vdevs in the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   841
 * pool, printing out the name and status for each one.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   842
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   843
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   844
print_import_config(const char *name, nvlist_t *nv, int namewidth, int depth)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   845
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   846
	nvlist_t **child;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   847
	uint_t c, children;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   848
	vdev_stat_t *vs;
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
   849
	char *type, *vname;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   850
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   851
	verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &type) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   852
	if (strcmp(type, VDEV_TYPE_MISSING) == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   853
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   854
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   855
	verify(nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_STATS,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   856
	    (uint64_t **)&vs, &c) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   857
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   858
	(void) printf("\t%*s%-*s", depth, "", namewidth - depth, name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   859
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   860
	if (vs->vs_aux != 0) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   861
		(void) printf("  %-8s  ", state_to_name(vs));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   862
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   863
		switch (vs->vs_aux) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   864
		case VDEV_AUX_OPEN_FAILED:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   865
			(void) printf(gettext("cannot open"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   866
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   867
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   868
		case VDEV_AUX_BAD_GUID_SUM:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   869
			(void) printf(gettext("missing device"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   870
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   871
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   872
		case VDEV_AUX_NO_REPLICAS:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   873
			(void) printf(gettext("insufficient replicas"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   874
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   875
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   876
		case VDEV_AUX_VERSION_NEWER:
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   877
			(void) printf(gettext("newer version"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   878
			break;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   879
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   880
		default:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   881
			(void) printf(gettext("corrupted data"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   882
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   883
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   884
	} else {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   885
		(void) printf("  %s", state_to_name(vs));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   886
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   887
	(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   888
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   889
	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   890
	    &child, &children) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   891
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   892
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
   893
	for (c = 0; c < children; c++) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   894
		vname = zpool_vdev_name(g_zfs, NULL, child[c]);
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
   895
		print_import_config(vname, child[c],
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   896
		    namewidth, depth + 2);
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
   897
		free(vname);
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
   898
	}
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   899
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   900
	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_SPARES,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   901
	    &child, &children) != 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   902
		return;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   903
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   904
	(void) printf(gettext("\tspares\n"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   905
	for (c = 0; c < children; c++) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   906
		vname = zpool_vdev_name(g_zfs, NULL, child[c]);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   907
		(void) printf("\t  %s\n", vname);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   908
		free(vname);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   909
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   910
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   911
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   912
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   913
 * Display the status for the given pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   914
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   915
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   916
show_import(nvlist_t *config)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   917
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   918
	uint64_t pool_state;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   919
	vdev_stat_t *vs;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   920
	char *name;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   921
	uint64_t guid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   922
	char *msgid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   923
	nvlist_t *nvroot;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   924
	int reason;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   925
	char *health;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   926
	uint_t vsc;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   927
	int namewidth;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   928
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   929
	verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   930
	    &name) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   931
	verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   932
	    &guid) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   933
	verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_STATE,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   934
	    &pool_state) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   935
	verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_HEALTH,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   936
	    &health) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   937
	verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   938
	    &nvroot) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   939
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   940
	verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_STATS,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   941
	    (uint64_t **)&vs, &vsc) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   942
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   943
	reason = zpool_import_status(config, &msgid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   944
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   945
	(void) printf("  pool: %s\n", name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   946
	(void) printf("    id: %llu\n", guid);
1631
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
   947
	(void) printf(" state: %s", health);
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
   948
	if (pool_state == POOL_STATE_DESTROYED)
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
   949
	    (void) printf(" (DESTROYED)");
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
   950
	(void) printf("\n");
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   951
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   952
	switch (reason) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   953
	case ZPOOL_STATUS_MISSING_DEV_R:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   954
	case ZPOOL_STATUS_MISSING_DEV_NR:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   955
	case ZPOOL_STATUS_BAD_GUID_SUM:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   956
		(void) printf(gettext("status: One or more devices are missing "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   957
		    "from the system.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   958
		break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   959
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   960
	case ZPOOL_STATUS_CORRUPT_LABEL_R:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   961
	case ZPOOL_STATUS_CORRUPT_LABEL_NR:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   962
		(void) printf(gettext("status: One or more devices contains "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   963
		    "corrupted data.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   964
		break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   965
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   966
	case ZPOOL_STATUS_CORRUPT_DATA:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   967
		(void) printf(gettext("status: The pool data is corrupted.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   968
		break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   969
1485
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1387
diff changeset
   970
	case ZPOOL_STATUS_OFFLINE_DEV:
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1387
diff changeset
   971
		(void) printf(gettext("status: One or more devices "
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1387
diff changeset
   972
		    "are offlined.\n"));
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1387
diff changeset
   973
		break;
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1387
diff changeset
   974
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   975
	case ZPOOL_STATUS_CORRUPT_POOL:
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   976
		(void) printf(gettext("status: The pool metadata is "
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   977
		    "corrupted.\n"));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   978
		break;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   979
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   980
	case ZPOOL_STATUS_VERSION_OLDER:
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   981
		(void) printf(gettext("status: The pool is formatted using an "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   982
		    "older on-disk version.\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   983
		break;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   984
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   985
	case ZPOOL_STATUS_VERSION_NEWER:
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   986
		(void) printf(gettext("status: The pool is formatted using an "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   987
		    "incompatible version.\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   988
		break;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   989
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   990
	default:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   991
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   992
		 * No other status can be seen when importing pools.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   993
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   994
		assert(reason == ZPOOL_STATUS_OK);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   995
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   996
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   997
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   998
	 * Print out an action according to the overall state of the pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   999
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1000
	if (strcmp(health, gettext("ONLINE")) == 0) {
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1001
		if (reason == ZPOOL_STATUS_VERSION_OLDER)
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1002
			(void) printf(gettext("action: The pool can be "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1003
			    "imported using its name or numeric identifier, "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1004
			    "though\n\tsome features will not be available "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1005
			    "without an explicit 'zpool upgrade'.\n"));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1006
		else
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1007
			(void) printf(gettext("action: The pool can be "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1008
			    "imported using its name or numeric "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1009
			    "identifier.\n"));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1010
	} else if (strcmp(health, gettext("DEGRADED")) == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1011
		(void) printf(gettext("action: The pool can be imported "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1012
		    "despite missing or damaged devices.  The\n\tfault "
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1013
		    "tolerance of the pool may be compromised if imported.\n"));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1014
	} else {
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1015
		switch (reason) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1016
		case ZPOOL_STATUS_VERSION_NEWER:
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1017
			(void) printf(gettext("action: The pool cannot be "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1018
			    "imported.  Access the pool on a system running "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1019
			    "newer\n\tsoftware, or recreate the pool from "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1020
			    "backup.\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1021
			break;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1022
		case ZPOOL_STATUS_MISSING_DEV_R:
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1023
		case ZPOOL_STATUS_MISSING_DEV_NR:
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1024
		case ZPOOL_STATUS_BAD_GUID_SUM:
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1025
			(void) printf(gettext("action: The pool cannot be "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1026
			    "imported. Attach the missing\n\tdevices and try "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1027
			    "again.\n"));
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1028
			break;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1029
		default:
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1030
			(void) printf(gettext("action: The pool cannot be "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1031
			    "imported due to damaged devices or data.\n"));
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1032
		}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1033
	}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1034
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1035
	if (strcmp(health, gettext("FAULTED")) != 0) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1036
		if (pool_state == POOL_STATE_DESTROYED)
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1037
			(void) printf(gettext("\tThe pool was destroyed, "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1038
			    "but can be imported using the '-Df' flags.\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1039
		else if (pool_state != POOL_STATE_EXPORTED)
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1040
			(void) printf(gettext("\tThe pool may be active on "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1041
			    "on another system, but can be imported using\n\t"
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1042
			    "the '-f' flag.\n"));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1043
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1044
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1045
	if (msgid != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1046
		(void) printf(gettext("   see: http://www.sun.com/msg/%s\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1047
		    msgid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1048
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1049
	(void) printf(gettext("config:\n\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1050
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
  1051
	namewidth = max_width(NULL, nvroot, 0, 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1052
	if (namewidth < 10)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1053
		namewidth = 10;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1054
	print_import_config(name, nvroot, namewidth, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1055
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1056
	if (reason == ZPOOL_STATUS_BAD_GUID_SUM) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1057
		(void) printf("\n\tAdditional devices are known to "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1058
		    "be part of this pool, though their\n\texact "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1059
		    "configuration cannot be determined.\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1060
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1061
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1062
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1063
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1064
 * Perform the import for the given configuration.  This passes the heavy
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1065
 * lifting off to zpool_import(), and then mounts the datasets contained within
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1066
 * the pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1067
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1068
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1069
do_import(nvlist_t *config, const char *newname, const char *mntopts,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1070
    const char *altroot, int force)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1071
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1072
	zpool_handle_t *zhp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1073
	char *name;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1074
	uint64_t state;
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1075
	uint64_t version;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1076
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1077
	verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1078
	    &name) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1079
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1080
	verify(nvlist_lookup_uint64(config,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1081
	    ZPOOL_CONFIG_POOL_STATE, &state) == 0);
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1082
	verify(nvlist_lookup_uint64(config,
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1083
	    ZPOOL_CONFIG_VERSION, &version) == 0);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1084
	if (version > ZFS_VERSION) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1085
		(void) fprintf(stderr, gettext("cannot import '%s': pool "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1086
		    "is formatted using a newer ZFS version\n"), name);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1087
		return (1);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1088
	} else if (state != POOL_STATE_EXPORTED && !force) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1089
		(void) fprintf(stderr, gettext("cannot import '%s': pool "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1090
		    "may be in use from other system\n"), name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1091
		(void) fprintf(stderr, gettext("use '-f' to import anyway\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1092
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1093
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1094
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1095
	if (zpool_import(g_zfs, config, newname, altroot) != 0)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1096
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1097
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1098
	if (newname != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1099
		name = (char *)newname;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1100
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1101
	verify((zhp = zpool_open(g_zfs, name)) != NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1102
2474
c001ad7e0c25 6368751 libzfs interface for mount/umounting all the file systems for a given pool
eschrock
parents: 2142
diff changeset
  1103
	if (zpool_mount_datasets(zhp, mntopts) != 0) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1104
		zpool_close(zhp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1105
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1106
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1107
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1108
	zpool_close(zhp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1109
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1110
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1111
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1112
/*
1631
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1113
 * zpool import [-d dir] [-D]
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1114
 *       import [-R root] [-D] [-d dir] [-f] -a
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1115
 *       import [-R root] [-D] [-d dir] [-f] <pool | id> [newpool]
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1116
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1117
 *       -d	Scan in a specific directory, other than /dev/dsk.  More than
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1118
 *		one directory can be specified using multiple '-d' options.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1119
 *
1631
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1120
 *       -D     Scan for previously destroyed pools or import all or only
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1121
 *              specified destroyed pools.
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1122
 *
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1123
 *       -R	Temporarily import the pool, with all mountpoints relative to
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1124
 *		the given root.  The pool will remain exported when the machine
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1125
 *		is rebooted.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1126
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1127
 *       -f	Force import, even if it appears that the pool is active.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1128
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1129
 *       -a	Import all pools found.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1130
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1131
 * The import command scans for pools to import, and import pools based on pool
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1132
 * name and GUID.  The pool can also be renamed as part of the import process.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1133
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1134
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1135
zpool_do_import(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1136
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1137
	char **searchdirs = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1138
	int nsearch = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1139
	int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1140
	int err;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1141
	nvlist_t *pools;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1142
	boolean_t do_all = B_FALSE;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1143
	boolean_t do_destroyed = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1144
	char *altroot = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1145
	char *mntopts = NULL;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1146
	boolean_t do_force = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1147
	nvpair_t *elem;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1148
	nvlist_t *config;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1149
	uint64_t searchguid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1150
	char *searchname;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1151
	nvlist_t *found_config;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1152
	boolean_t first;
1631
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1153
	uint64_t pool_state;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1154
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1155
	/* check options */
1631
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1156
	while ((c = getopt(argc, argv, ":Dfd:R:ao:")) != -1) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1157
		switch (c) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1158
		case 'a':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1159
			do_all = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1160
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1161
		case 'd':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1162
			if (searchdirs == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1163
				searchdirs = safe_malloc(sizeof (char *));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1164
			} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1165
				char **tmp = safe_malloc((nsearch + 1) *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1166
				    sizeof (char *));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1167
				bcopy(searchdirs, tmp, nsearch *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1168
				    sizeof (char *));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1169
				free(searchdirs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1170
				searchdirs = tmp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1171
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1172
			searchdirs[nsearch++] = optarg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1173
			break;
1631
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1174
		case 'D':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1175
			do_destroyed = B_TRUE;
1631
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1176
			break;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1177
		case 'f':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1178
			do_force = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1179
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1180
		case 'o':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1181
			mntopts = optarg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1182
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1183
		case 'R':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1184
			altroot = optarg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1185
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1186
		case ':':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1187
			(void) fprintf(stderr, gettext("missing argument for "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1188
			    "'%c' option\n"), optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1189
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1190
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1191
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1192
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1193
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1194
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1195
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1196
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1197
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1198
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1199
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1200
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1201
	if (searchdirs == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1202
		searchdirs = safe_malloc(sizeof (char *));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1203
		searchdirs[0] = "/dev/dsk";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1204
		nsearch = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1205
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1206
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1207
	/* check argument count */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1208
	if (do_all) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1209
		if (argc != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1210
			(void) fprintf(stderr, gettext("too many arguments\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1211
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1212
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1213
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1214
		if (argc > 2) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1215
			(void) fprintf(stderr, gettext("too many arguments\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1216
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1217
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1218
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1219
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1220
		 * Check for the SYS_CONFIG privilege.  We do this explicitly
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1221
		 * here because otherwise any attempt to discover pools will
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1222
		 * silently fail.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1223
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1224
		if (argc == 0 && !priv_ineffect(PRIV_SYS_CONFIG)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1225
			(void) fprintf(stderr, gettext("cannot "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1226
			    "discover pools: permission denied\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1227
			free(searchdirs);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1228
			return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1229
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1230
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1231
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1232
	if ((pools = zpool_find_import(g_zfs, nsearch, searchdirs)) == NULL) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1233
		free(searchdirs);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1234
		return (1);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1235
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1236
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1237
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1238
	 * We now have a list of all available pools in the given directories.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1239
	 * Depending on the arguments given, we do one of the following:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1240
	 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1241
	 *	<none>	Iterate through all pools and display information about
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1242
	 *		each one.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1243
	 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1244
	 *	-a	Iterate through all pools and try to import each one.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1245
	 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1246
	 *	<id>	Find the pool that corresponds to the given GUID/pool
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1247
	 *		name and import that one.
1631
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1248
	 *
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1249
	 *	-D	Above options applies only to destroyed pools.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1250
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1251
	if (argc != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1252
		char *endptr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1253
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1254
		errno = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1255
		searchguid = strtoull(argv[0], &endptr, 10);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1256
		if (errno != 0 || *endptr != '\0')
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1257
			searchname = argv[0];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1258
		else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1259
			searchname = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1260
		found_config = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1261
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1262
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1263
	err = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1264
	elem = NULL;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1265
	first = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1266
	while ((elem = nvlist_next_nvpair(pools, elem)) != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1267
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1268
		verify(nvpair_value_nvlist(elem, &config) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1269
1631
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1270
		verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_STATE,
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1271
		    &pool_state) == 0);
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1272
		if (!do_destroyed && pool_state == POOL_STATE_DESTROYED)
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1273
			continue;
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1274
		if (do_destroyed && pool_state != POOL_STATE_DESTROYED)
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1275
			continue;
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1276
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1277
		if (argc == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1278
			if (first)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1279
				first = B_FALSE;
2474
c001ad7e0c25 6368751 libzfs interface for mount/umounting all the file systems for a given pool
eschrock
parents: 2142
diff changeset
  1280
			else if (!do_all)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1281
				(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1282
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1283
			if (do_all)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1284
				err |= do_import(config, NULL, mntopts,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1285
				    altroot, do_force);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1286
			else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1287
				show_import(config);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1288
		} else if (searchname != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1289
			char *name;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1290
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1291
			/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1292
			 * We are searching for a pool based on name.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1293
			 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1294
			verify(nvlist_lookup_string(config,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1295
			    ZPOOL_CONFIG_POOL_NAME, &name) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1296
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1297
			if (strcmp(name, searchname) == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1298
				if (found_config != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1299
					(void) fprintf(stderr, gettext(
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1300
					    "cannot import '%s': more than "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1301
					    "one matching pool\n"), searchname);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1302
					(void) fprintf(stderr, gettext(
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1303
					    "import by numeric ID instead\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1304
					err = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1305
				}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1306
				found_config = config;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1307
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1308
		} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1309
			uint64_t guid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1310
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1311
			/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1312
			 * Search for a pool by guid.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1313
			 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1314
			verify(nvlist_lookup_uint64(config,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1315
			    ZPOOL_CONFIG_POOL_GUID, &guid) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1316
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1317
			if (guid == searchguid)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1318
				found_config = config;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1319
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1320
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1321
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1322
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1323
	 * If we were searching for a specific pool, verify that we found a
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1324
	 * pool, and then do the import.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1325
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1326
	if (argc != 0 && err == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1327
		if (found_config == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1328
			(void) fprintf(stderr, gettext("cannot import '%s': "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1329
			    "no such pool available\n"), argv[0]);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1330
			err = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1331
		} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1332
			err |= do_import(found_config, argc == 1 ? NULL :
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1333
			    argv[1], mntopts, altroot, do_force);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1334
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1335
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1336
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1337
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1338
	 * If we were just looking for pools, report an error if none were
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1339
	 * found.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1340
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1341
	if (argc == 0 && first)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1342
		(void) fprintf(stderr,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1343
		    gettext("no pools available to import\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1344
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1345
	nvlist_free(pools);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1346
	free(searchdirs);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1347
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1348
	return (err ? 1 : 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1349
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1350
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1351
typedef struct iostat_cbdata {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1352
	zpool_list_t *cb_list;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1353
	int cb_verbose;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1354
	int cb_iteration;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1355
	int cb_namewidth;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1356
} iostat_cbdata_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1357
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1358
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1359
print_iostat_separator(iostat_cbdata_t *cb)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1360
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1361
	int i = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1362
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1363
	for (i = 0; i < cb->cb_namewidth; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1364
		(void) printf("-");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1365
	(void) printf("  -----  -----  -----  -----  -----  -----\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1366
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1367
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1368
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1369
print_iostat_header(iostat_cbdata_t *cb)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1370
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1371
	(void) printf("%*s     capacity     operations    bandwidth\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1372
	    cb->cb_namewidth, "");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1373
	(void) printf("%-*s   used  avail   read  write   read  write\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1374
	    cb->cb_namewidth, "pool");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1375
	print_iostat_separator(cb);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1376
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1377
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1378
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1379
 * Display a single statistic.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1380
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1381
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1382
print_one_stat(uint64_t value)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1383
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1384
	char buf[64];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1385
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1386
	zfs_nicenum(value, buf, sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1387
	(void) printf("  %5s", buf);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1388
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1389
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1390
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1391
 * Print out all the statistics for the given vdev.  This can either be the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1392
 * toplevel configuration, or called recursively.  If 'name' is NULL, then this
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1393
 * is a verbose output, and we don't want to display the toplevel pool stats.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1394
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1395
void
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
  1396
print_vdev_stats(zpool_handle_t *zhp, const char *name, nvlist_t *oldnv,
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
  1397
    nvlist_t *newnv, iostat_cbdata_t *cb, int depth)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1398
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1399
	nvlist_t **oldchild, **newchild;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1400
	uint_t c, children;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1401
	vdev_stat_t *oldvs, *newvs;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1402
	vdev_stat_t zerovs = { 0 };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1403
	uint64_t tdelta;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1404
	double scale;
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
  1405
	char *vname;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1406
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1407
	if (oldnv != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1408
		verify(nvlist_lookup_uint64_array(oldnv, ZPOOL_CONFIG_STATS,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1409
		    (uint64_t **)&oldvs, &c) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1410
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1411
		oldvs = &zerovs;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1412
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1413
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1414
	verify(nvlist_lookup_uint64_array(newnv, ZPOOL_CONFIG_STATS,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1415
	    (uint64_t **)&newvs, &c) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1416
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1417
	if (strlen(name) + depth > cb->cb_namewidth)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1418
		(void) printf("%*s%s", depth, "", name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1419
	else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1420
		(void) printf("%*s%s%*s", depth, "", name,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1421
		    (int)(cb->cb_namewidth - strlen(name) - depth), "");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1422
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1423
	tdelta = newvs->vs_timestamp - oldvs->vs_timestamp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1424
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1425
	if (tdelta == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1426
		scale = 1.0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1427
	else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1428
		scale = (double)NANOSEC / tdelta;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1429
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1430
	/* only toplevel vdevs have capacity stats */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1431
	if (newvs->vs_space == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1432
		(void) printf("      -      -");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1433
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1434
		print_one_stat(newvs->vs_alloc);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1435
		print_one_stat(newvs->vs_space - newvs->vs_alloc);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1436
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1437
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1438
	print_one_stat((uint64_t)(scale * (newvs->vs_ops[ZIO_TYPE_READ] -
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1439
	    oldvs->vs_ops[ZIO_TYPE_READ])));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1440
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1441
	print_one_stat((uint64_t)(scale * (newvs->vs_ops[ZIO_TYPE_WRITE] -
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1442
	    oldvs->vs_ops[ZIO_TYPE_WRITE])));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1443
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1444
	print_one_stat((uint64_t)(scale * (newvs->vs_bytes[ZIO_TYPE_READ] -
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1445
	    oldvs->vs_bytes[ZIO_TYPE_READ])));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1446
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1447
	print_one_stat((uint64_t)(scale * (newvs->vs_bytes[ZIO_TYPE_WRITE] -
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1448
	    oldvs->vs_bytes[ZIO_TYPE_WRITE])));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1449
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1450
	(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1451
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1452
	if (!cb->cb_verbose)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1453
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1454
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1455
	if (nvlist_lookup_nvlist_array(newnv, ZPOOL_CONFIG_CHILDREN,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1456
	    &newchild, &children) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1457
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1458
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1459
	if (oldnv && nvlist_lookup_nvlist_array(oldnv, ZPOOL_CONFIG_CHILDREN,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1460
	    &oldchild, &c) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1461
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1462
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
  1463
	for (c = 0; c < children; c++) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1464
		vname = zpool_vdev_name(g_zfs, zhp, newchild[c]);
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
  1465
		print_vdev_stats(zhp, vname, oldnv ? oldchild[c] : NULL,
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
  1466
		    newchild[c], cb, depth + 2);
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
  1467
		free(vname);
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
  1468
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1469
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1470
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1471
static int
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1472
refresh_iostat(zpool_handle_t *zhp, void *data)
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1473
{
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1474
	iostat_cbdata_t *cb = data;
2142
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
  1475
	boolean_t missing;
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1476
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1477
	/*
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1478
	 * If the pool has disappeared, remove it from the list and continue.
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1479
	 */
2142
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
  1480
	if (zpool_refresh_stats(zhp, &missing) != 0)
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
  1481
		return (-1);
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
  1482
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
  1483
	if (missing)
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1484
		pool_list_remove(cb->cb_list, zhp);
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1485
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1486
	return (0);
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1487
}
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1488
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1489
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1490
 * Callback to print out the iostats for the given pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1491
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1492
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1493
print_iostat(zpool_handle_t *zhp, void *data)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1494
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1495
	iostat_cbdata_t *cb = data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1496
	nvlist_t *oldconfig, *newconfig;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1497
	nvlist_t *oldnvroot, *newnvroot;
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1498
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1499
	newconfig = zpool_get_config(zhp, &oldconfig);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1500
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1501
	if (cb->cb_iteration == 1)
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1502
		oldconfig = NULL;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1503
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1504
	verify(nvlist_lookup_nvlist(newconfig, ZPOOL_CONFIG_VDEV_TREE,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1505
	    &newnvroot) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1506
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1507
	if (oldconfig == NULL)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1508
		oldnvroot = NULL;
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1509
	else
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1510
		verify(nvlist_lookup_nvlist(oldconfig, ZPOOL_CONFIG_VDEV_TREE,
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1511
		    &oldnvroot) == 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1512
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1513
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1514
	 * Print out the statistics for the pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1515
	 */
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
  1516
	print_vdev_stats(zhp, zpool_get_name(zhp), oldnvroot, newnvroot, cb, 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1517
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1518
	if (cb->cb_verbose)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1519
		print_iostat_separator(cb);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1520
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1521
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1522
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1523
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1524
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1525
get_namewidth(zpool_handle_t *zhp, void *data)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1526
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1527
	iostat_cbdata_t *cb = data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1528
	nvlist_t *config, *nvroot;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1529
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1530
	if ((config = zpool_get_config(zhp, NULL)) != NULL) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1531
		verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1532
		    &nvroot) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1533
		if (!cb->cb_verbose)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1534
			cb->cb_namewidth = strlen(zpool_get_name(zhp));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1535
		else
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
  1536
			cb->cb_namewidth = max_width(zhp, nvroot, 0, 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1537
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1538
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1539
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1540
	 * The width must fall into the range [10,38].  The upper limit is the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1541
	 * maximum we can have and still fit in 80 columns.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1542
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1543
	if (cb->cb_namewidth < 10)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1544
		cb->cb_namewidth = 10;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1545
	if (cb->cb_namewidth > 38)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1546
		cb->cb_namewidth = 38;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1547
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1548
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1549
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1550
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1551
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1552
 * zpool iostat [-v] [pool] ... [interval [count]]
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1553
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1554
 *	-v	Display statistics for individual vdevs
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1555
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1556
 * This command can be tricky because we want to be able to deal with pool
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1557
 * creation/destruction as well as vdev configuration changes.  The bulk of this
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1558
 * processing is handled by the pool_list_* routines in zpool_iter.c.  We rely
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1559
 * on pool_list_update() to detect the addition of new pools.  Configuration
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1560
 * changes are all handled within libzfs.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1561
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1562
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1563
zpool_do_iostat(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1564
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1565
	int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1566
	int ret;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1567
	int npools;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1568
	unsigned long interval = 0, count = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1569
	zpool_list_t *list;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1570
	boolean_t verbose = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1571
	iostat_cbdata_t cb;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1572
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1573
	/* check options */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1574
	while ((c = getopt(argc, argv, "v")) != -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1575
		switch (c) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1576
		case 'v':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1577
			verbose = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1578
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1579
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1580
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1581
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1582
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1583
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1584
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1585
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1586
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1587
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1588
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1589
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1590
	 * Determine if the last argument is an integer or a pool name
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1591
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1592
	if (argc > 0 && isdigit(argv[argc - 1][0])) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1593
		char *end;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1594
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1595
		errno = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1596
		interval = strtoul(argv[argc - 1], &end, 10);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1597
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1598
		if (*end == '\0' && errno == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1599
			if (interval == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1600
				(void) fprintf(stderr, gettext("interval "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1601
				    "cannot be zero\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1602
				usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1603
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1604
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1605
			/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1606
			 * Ignore the last parameter
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1607
			 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1608
			argc--;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1609
		} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1610
			/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1611
			 * If this is not a valid number, just plow on.  The
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1612
			 * user will get a more informative error message later
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1613
			 * on.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1614
			 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1615
			interval = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1616
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1617
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1618
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1619
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1620
	 * If the last argument is also an integer, then we have both a count
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1621
	 * and an integer.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1622
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1623
	if (argc > 0 && isdigit(argv[argc - 1][0])) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1624
		char *end;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1625
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1626
		errno = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1627
		count = interval;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1628
		interval = strtoul(argv[argc - 1], &end, 10);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1629
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1630
		if (*end == '\0' && errno == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1631
			if (interval == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1632
				(void) fprintf(stderr, gettext("interval "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1633
				    "cannot be zero\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1634
				usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1635
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1636
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1637
			/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1638
			 * Ignore the last parameter
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1639
			 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1640
			argc--;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1641
		} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1642
			interval = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1643
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1644
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1645
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1646
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1647
	 * Construct the list of all interesting pools.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1648
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1649
	ret = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1650
	if ((list = pool_list_get(argc, argv, &ret)) == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1651
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1652
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1653
	if (pool_list_count(list) == 0 && argc != 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1654
		pool_list_free(list);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1655
		return (1);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1656
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1657
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1658
	if (pool_list_count(list) == 0 && interval == 0) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1659
		pool_list_free(list);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1660
		(void) fprintf(stderr, gettext("no pools available\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1661
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1662
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1663
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1664
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1665
	 * Enter the main iostat loop.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1666
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1667
	cb.cb_list = list;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1668
	cb.cb_verbose = verbose;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1669
	cb.cb_iteration = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1670
	cb.cb_namewidth = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1671
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1672
	for (;;) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1673
		pool_list_update(list);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1674
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1675
		if ((npools = pool_list_count(list)) == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1676
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1677
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1678
		/*
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1679
		 * Refresh all statistics.  This is done as an explicit step
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1680
		 * before calculating the maximum name width, so that any
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1681
		 * configuration changes are properly accounted for.
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1682
		 */
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1683
		(void) pool_list_iter(list, B_FALSE, refresh_iostat, &cb);
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1684
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1685
		/*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1686
		 * Iterate over all pools to determine the maximum width
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1687
		 * for the pool / device name column across all pools.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1688
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1689
		cb.cb_namewidth = 0;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1690
		(void) pool_list_iter(list, B_FALSE, get_namewidth, &cb);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1691
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1692
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1693
		 * If it's the first time, or verbose mode, print the header.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1694
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1695
		if (++cb.cb_iteration == 1 || verbose)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1696
			print_iostat_header(&cb);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1697
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1698
		(void) pool_list_iter(list, B_FALSE, print_iostat, &cb);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1699
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1700
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1701
		 * If there's more than one pool, and we're not in verbose mode
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1702
		 * (which prints a separator for us), then print a separator.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1703
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1704
		if (npools > 1 && !verbose)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1705
			print_iostat_separator(&cb);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1706
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1707
		if (verbose)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1708
			(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1709
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1710
		if (interval == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1711
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1712
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1713
		if (count != 0 && --count == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1714
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1715
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1716
		(void) sleep(interval);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1717
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1718
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1719
	pool_list_free(list);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1720
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1721
	return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1722
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1723
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1724
typedef struct list_cbdata {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1725
	boolean_t	cb_scripted;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1726
	boolean_t	cb_first;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1727
	int		cb_fields[MAX_FIELDS];
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1728
	int		cb_fieldcount;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1729
} list_cbdata_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1730
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1731
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1732
 * Given a list of columns to display, output appropriate headers for each one.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1733
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1734
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1735
print_header(int *fields, size_t count)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1736
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1737
	int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1738
	column_def_t *col;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1739
	const char *fmt;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1740
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1741
	for (i = 0; i < count; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1742
		col = &column_table[fields[i]];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1743
		if (i != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1744
			(void) printf("  ");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1745
		if (col->cd_justify == left_justify)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1746
			fmt = "%-*s";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1747
		else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1748
			fmt = "%*s";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1749
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1750
		(void) printf(fmt, i == count - 1 ? strlen(col->cd_title) :
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1751
		    col->cd_width, col->cd_title);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1752
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1753
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1754
	(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1755
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1756
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1757
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1758
list_callback(zpool_handle_t *zhp, void *data)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1759
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1760
	list_cbdata_t *cbp = data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1761
	nvlist_t *config;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1762
	int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1763
	char buf[ZPOOL_MAXNAMELEN];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1764
	uint64_t total;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1765
	uint64_t used;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1766
	const char *fmt;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1767
	column_def_t *col;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1768
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1769
	if (cbp->cb_first) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1770
		if (!cbp->cb_scripted)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1771
			print_header(cbp->cb_fields, cbp->cb_fieldcount);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1772
		cbp->cb_first = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1773
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1774
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1775
	if (zpool_get_state(zhp) == POOL_STATE_UNAVAIL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1776
		config = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1777
	} else {
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1778
		config = zpool_get_config(zhp, NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1779
		total = zpool_get_space_total(zhp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1780
		used = zpool_get_space_used(zhp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1781
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1782
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1783
	for (i = 0; i < cbp->cb_fieldcount; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1784
		if (i != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1785
			if (cbp->cb_scripted)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1786
				(void) printf("\t");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1787
			else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1788
				(void) printf("  ");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1789
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1790
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1791
		col = &column_table[cbp->cb_fields[i]];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1792
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1793
		switch (cbp->cb_fields[i]) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1794
		case ZPOOL_FIELD_NAME:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1795
			(void) strlcpy(buf, zpool_get_name(zhp), sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1796
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1797
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1798
		case ZPOOL_FIELD_SIZE:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1799
			if (config == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1800
				(void) strlcpy(buf, "-", sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1801
			else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1802
				zfs_nicenum(total, buf, sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1803
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1804
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1805
		case ZPOOL_FIELD_USED:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1806
			if (config == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1807
				(void) strlcpy(buf, "-", sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1808
			else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1809
				zfs_nicenum(used, buf, sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1810
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1811
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1812
		case ZPOOL_FIELD_AVAILABLE:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1813
			if (config == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1814
				(void) strlcpy(buf, "-", sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1815
			else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1816
				zfs_nicenum(total - used, buf, sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1817
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1818
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1819
		case ZPOOL_FIELD_CAPACITY:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1820
			if (config == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1821
				(void) strlcpy(buf, "-", sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1822
			} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1823
				uint64_t capacity = (total == 0 ? 0 :
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1824
				    (used * 100 / total));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1825
				(void) snprintf(buf, sizeof (buf), "%llu%%",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1826
				    capacity);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1827
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1828
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1829
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1830
		case ZPOOL_FIELD_HEALTH:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1831
			if (config == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1832
				(void) strlcpy(buf, "FAULTED", sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1833
			} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1834
				nvlist_t *nvroot;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1835
				vdev_stat_t *vs;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1836
				uint_t vsc;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1837
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1838
				verify(nvlist_lookup_nvlist(config,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1839
				    ZPOOL_CONFIG_VDEV_TREE, &nvroot) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1840
				verify(nvlist_lookup_uint64_array(nvroot,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1841
				    ZPOOL_CONFIG_STATS, (uint64_t **)&vs,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1842
				    &vsc) == 0);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1843
				(void) strlcpy(buf, state_to_name(vs),
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1844
				    sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1845
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1846
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1847
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1848
		case ZPOOL_FIELD_ROOT:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1849
			if (config == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1850
				(void) strlcpy(buf, "-", sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1851
			else if (zpool_get_root(zhp, buf, sizeof (buf)) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1852
				(void) strlcpy(buf, "-", sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1853
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1854
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1855
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1856
		if (cbp->cb_scripted)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1857
			(void) printf("%s", buf);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1858
		else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1859
			if (col->cd_justify == left_justify)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1860
				fmt = "%-*s";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1861
			else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1862
				fmt = "%*s";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1863
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1864
			(void) printf(fmt, i == cbp->cb_fieldcount - 1 ?
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1865
			    strlen(buf) : col->cd_width, buf);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1866
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1867
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1868
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1869
	(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1870
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1871
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1872
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1873
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1874
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1875
 * zpool list [-H] [-o field[,field]*] [pool] ...
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1876
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1877
 *	-H	Scripted mode.  Don't display headers, and separate fields by
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1878
 *		a single tab.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1879
 *	-o	List of fields to display.  Defaults to all fields, or
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1880
 *		"name,size,used,available,capacity,health,root"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1881
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1882
 * List all pools in the system, whether or not they're healthy.  Output space
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1883
 * statistics for each one, as well as health status summary.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1884
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1885
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1886
zpool_do_list(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1887
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1888
	int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1889
	int ret;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1890
	list_cbdata_t cb = { 0 };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1891
	static char default_fields[] =
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1892
	    "name,size,used,available,capacity,health,root";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1893
	char *fields = default_fields;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1894
	char *value;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1895
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1896
	/* check options */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1897
	while ((c = getopt(argc, argv, ":Ho:")) != -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1898
		switch (c) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1899
		case 'H':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1900
			cb.cb_scripted = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1901
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1902
		case 'o':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1903
			fields = optarg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1904
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1905
		case ':':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1906
			(void) fprintf(stderr, gettext("missing argument for "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1907
			    "'%c' option\n"), optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1908
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1909
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1910
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1911
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1912
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1913
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1914
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1915
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1916
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1917
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1918
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1919
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1920
	while (*fields != '\0') {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1921
		if (cb.cb_fieldcount == MAX_FIELDS) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1922
			(void) fprintf(stderr, gettext("too many "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1923
			    "properties given to -o option\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1924
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1925
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1926
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1927
		if ((cb.cb_fields[cb.cb_fieldcount] = getsubopt(&fields,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1928
		    column_subopts, &value)) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1929
			(void) fprintf(stderr, gettext("invalid property "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1930
			    "'%s'\n"), value);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1931
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1932
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1933
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1934
		cb.cb_fieldcount++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1935
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1936
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1937
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1938
	cb.cb_first = B_TRUE;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1939
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1940
	ret = for_each_pool(argc, argv, B_TRUE, list_callback, &cb);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1941
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1942
	if (argc == 0 && cb.cb_first) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1943
		(void) printf(gettext("no pools available\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1944
		return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1945
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1946
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1947
	return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1948
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1949
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1950
static nvlist_t *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1951
zpool_get_vdev_by_name(nvlist_t *nv, char *name)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1952
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1953
	nvlist_t **child;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1954
	uint_t c, children;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1955
	nvlist_t *match;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1956
	char *path;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1957
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1958
	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1959
	    &child, &children) != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1960
		verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1961
		if (strncmp(name, "/dev/dsk/", 9) == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1962
			name += 9;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1963
		if (strncmp(path, "/dev/dsk/", 9) == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1964
			path += 9;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1965
		if (strcmp(name, path) == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1966
			return (nv);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1967
		return (NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1968
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1969
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1970
	for (c = 0; c < children; c++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1971
		if ((match = zpool_get_vdev_by_name(child[c], name)) != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1972
			return (match);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1973
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1974
	return (NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1975
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1976
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1977
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1978
zpool_do_attach_or_replace(int argc, char **argv, int replacing)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1979
{
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1980
	boolean_t force = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1981
	int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1982
	nvlist_t *nvroot;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1983
	char *poolname, *old_disk, *new_disk;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1984
	zpool_handle_t *zhp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1985
	nvlist_t *config;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1986
	int ret;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1987
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1988
	/* check options */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1989
	while ((c = getopt(argc, argv, "f")) != -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1990
		switch (c) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1991
		case 'f':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1992
			force = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1993
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1994
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1995
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1996
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1997
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1998
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1999
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2000
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2001
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2002
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2003
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2004
	/* get pool name and check number of arguments */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2005
	if (argc < 1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2006
		(void) fprintf(stderr, gettext("missing pool name argument\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2007
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2008
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2009
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2010
	poolname = argv[0];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2011
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2012
	if (argc < 2) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2013
		(void) fprintf(stderr,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2014
		    gettext("missing <device> specification\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2015
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2016
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2017
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2018
	old_disk = argv[1];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2019
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2020
	if (argc < 3) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2021
		if (!replacing) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2022
			(void) fprintf(stderr,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2023
			    gettext("missing <new_device> specification\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2024
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2025
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2026
		new_disk = old_disk;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2027
		argc -= 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2028
		argv += 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2029
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2030
		new_disk = argv[2];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2031
		argc -= 2;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2032
		argv += 2;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2033
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2034
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2035
	if (argc > 1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2036
		(void) fprintf(stderr, gettext("too many arguments\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2037
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2038
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2039
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2040
	if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2041
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2042
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  2043
	if ((config = zpool_get_config(zhp, NULL)) == NULL) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2044
		(void) fprintf(stderr, gettext("pool '%s' is unavailable\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2045
		    poolname);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2046
		zpool_close(zhp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2047
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2048
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2049
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2050
	nvroot = make_root_vdev(config, force, B_FALSE, replacing, argc, argv);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2051
	if (nvroot == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2052
		zpool_close(zhp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2053
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2054
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2055
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2056
	ret = zpool_vdev_attach(zhp, old_disk, new_disk, nvroot, replacing);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2057
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2058
	nvlist_free(nvroot);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2059
	zpool_close(zhp);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2060
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2061
	return (ret);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2062
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2063
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2064
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2065
 * zpool replace [-f] <pool> <device> <new_device>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2066
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2067
 *	-f	Force attach, even if <new_device> appears to be in use.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2068
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2069
 * Replace <device> with <new_device>.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2070
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2071
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2072
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2073
zpool_do_replace(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2074
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2075
	return (zpool_do_attach_or_replace(argc, argv, B_TRUE));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2076
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2077
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2078
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2079
 * zpool attach [-f] <pool> <device> <new_device>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2080
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2081
 *	-f	Force attach, even if <new_device> appears to be in use.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2082
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2083
 * Attach <new_device> to the mirror containing <device>.  If <device> is not
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2084
 * part of a mirror, then <device> will be transformed into a mirror of
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2085
 * <device> and <new_device>.  In either case, <new_device> will begin life
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2086
 * with a DTL of [0, now], and will immediately begin to resilver itself.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2087
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2088
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2089
zpool_do_attach(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2090
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2091
	return (zpool_do_attach_or_replace(argc, argv, B_FALSE));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2092
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2093
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2094
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2095
 * zpool detach [-f] <pool> <device>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2096
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2097
 *	-f	Force detach of <device>, even if DTLs argue against it
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2098
 *		(not supported yet)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2099
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2100
 * Detach a device from a mirror.  The operation will be refused if <device>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2101
 * is the last device in the mirror, or if the DTLs indicate that this device
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2102
 * has the only valid copy of some data.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2103
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2104
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2105
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2106
zpool_do_detach(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2107
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2108
	int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2109
	char *poolname, *path;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2110
	zpool_handle_t *zhp;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2111
	int ret;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2112
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2113
	/* check options */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2114
	while ((c = getopt(argc, argv, "f")) != -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2115
		switch (c) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2116
		case 'f':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2117
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2118
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2119
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2120
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2121
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2122
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2123
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2124
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2125
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2126
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2127
	/* get pool name and check number of arguments */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2128
	if (argc < 1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2129
		(void) fprintf(stderr, gettext("missing pool name argument\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2130
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2131
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2132
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2133
	if (argc < 2) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2134
		(void) fprintf(stderr,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2135
		    gettext("missing <device> specification\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2136
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2137
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2138
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2139
	poolname = argv[0];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2140
	path = argv[1];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2141
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2142
	if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2143
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2144
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2145
	ret = zpool_vdev_detach(zhp, path);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2146
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2147
	zpool_close(zhp);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2148
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2149
	return (ret);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2150
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2151
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2152
/*
1485
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1387
diff changeset
  2153
 * zpool online <pool> <device> ...
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2154
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2155
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2156
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2157
zpool_do_online(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2158
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2159
	int c, i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2160
	char *poolname;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2161
	zpool_handle_t *zhp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2162
	int ret = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2163
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2164
	/* check options */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2165
	while ((c = getopt(argc, argv, "t")) != -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2166
		switch (c) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2167
		case 't':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2168
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2169
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2170
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2171
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2172
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2173
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2174
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2175
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2176
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2177
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2178
	/* get pool name and check number of arguments */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2179
	if (argc < 1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2180
		(void) fprintf(stderr, gettext("missing pool name\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2181
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2182
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2183
	if (argc < 2) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2184
		(void) fprintf(stderr, gettext("missing device name\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2185
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2186
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2187
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2188
	poolname = argv[0];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2189
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2190
	if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2191
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2192
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2193
	for (i = 1; i < argc; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2194
		if (zpool_vdev_online(zhp, argv[i]) == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2195
			(void) printf(gettext("Bringing device %s online\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2196
			    argv[i]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2197
		else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2198
			ret = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2199
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2200
	zpool_close(zhp);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2201
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2202
	return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2203
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2204
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2205
/*
1485
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1387
diff changeset
  2206
 * zpool offline [-ft] <pool> <device> ...
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2207
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2208
 *	-f	Force the device into the offline state, even if doing
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2209
 *		so would appear to compromise pool availability.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2210
 *		(not supported yet)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2211
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2212
 *	-t	Only take the device off-line temporarily.  The offline
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2213
 *		state will not be persistent across reboots.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2214
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2215
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2216
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2217
zpool_do_offline(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2218
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2219
	int c, i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2220
	char *poolname;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2221
	zpool_handle_t *zhp;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2222
	int ret = 0;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2223
	boolean_t istmp = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2224
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2225
	/* check options */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2226
	while ((c = getopt(argc, argv, "ft")) != -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2227
		switch (c) {
1485
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1387
diff changeset
  2228
		case 't':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2229
			istmp = B_TRUE;
1485
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1387
diff changeset
  2230
			break;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2231
		case 'f':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2232
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2233
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2234
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2235
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2236
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2237
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2238
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2239
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2240
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2241
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2242
	/* get pool name and check number of arguments */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2243
	if (argc < 1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2244
		(void) fprintf(stderr, gettext("missing pool name\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2245
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2246
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2247
	if (argc < 2) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2248
		(void) fprintf(stderr, gettext("missing device name\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2249
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2250
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2251
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2252
	poolname = argv[0];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2253
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2254
	if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2255
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2256
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2257
	for (i = 1; i < argc; i++)
1485
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1387
diff changeset
  2258
		if (zpool_vdev_offline(zhp, argv[i], istmp) == 0)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2259
			(void) printf(gettext("Bringing device %s offline\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2260
			    argv[i]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2261
		else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2262
			ret = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2263
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2264
	zpool_close(zhp);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2265
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2266
	return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2267
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2268
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2269
/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2270
 * zpool clear <pool> [device]
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2271
 *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2272
 * Clear all errors associated with a pool or a particular device.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2273
 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2274
int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2275
zpool_do_clear(int argc, char **argv)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2276
{
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2277
	int ret = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2278
	zpool_handle_t *zhp;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2279
	char *pool, *device;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2280
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2281
	if (argc < 2) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2282
		(void) fprintf(stderr, gettext("missing pool name\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2283
		usage(B_FALSE);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2284
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2285
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2286
	if (argc > 3) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2287
		(void) fprintf(stderr, gettext("too many arguments\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2288
		usage(B_FALSE);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2289
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2290
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2291
	pool = argv[1];
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2292
	device = argc == 3 ? argv[2] : NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2293
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2294
	if ((zhp = zpool_open(g_zfs, pool)) == NULL)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2295
		return (1);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2296
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2297
	if (zpool_clear(zhp, device) != 0)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2298
		ret = 1;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2299
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2300
	zpool_close(zhp);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2301
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2302
	return (ret);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2303
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2304
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2305
typedef struct scrub_cbdata {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2306
	int	cb_type;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2307
} scrub_cbdata_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2308
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2309
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2310
scrub_callback(zpool_handle_t *zhp, void *data)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2311
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2312
	scrub_cbdata_t *cb = data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2313
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2314
	/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2315
	 * Ignore faulted pools.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2316
	 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2317
	if (zpool_get_state(zhp) == POOL_STATE_UNAVAIL) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2318
		(void) fprintf(stderr, gettext("cannot scrub '%s': pool is "
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2319
		    "currently unavailable\n"), zpool_get_name(zhp));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2320
		return (1);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2321
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2322
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2323
	return (zpool_scrub(zhp, cb->cb_type) != 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2324
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2325
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2326
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2327
 * zpool scrub [-s] <pool> ...
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2328
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2329
 *	-s	Stop.  Stops any in-progress scrub.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2330
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2331
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2332
zpool_do_scrub(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2333
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2334
	int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2335
	scrub_cbdata_t cb;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2336
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2337
	cb.cb_type = POOL_SCRUB_EVERYTHING;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2338
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2339
	/* check options */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2340
	while ((c = getopt(argc, argv, "s")) != -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2341
		switch (c) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2342
		case 's':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2343
			cb.cb_type = POOL_SCRUB_NONE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2344
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2345
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2346
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2347
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2348
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2349
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2350
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2351
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2352
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2353
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2354
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2355
	if (argc < 1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2356
		(void) fprintf(stderr, gettext("missing pool name argument\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2357
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2358
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2359
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2360
	return (for_each_pool(argc, argv, B_TRUE, scrub_callback, &cb));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2361
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2362
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2363
typedef struct status_cbdata {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2364
	int		cb_count;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2365
	boolean_t	cb_verbose;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2366
	boolean_t	cb_explain;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2367
	boolean_t	cb_first;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2368
} status_cbdata_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2369
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2370
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2371
 * Print out detailed scrub status.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2372
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2373
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2374
print_scrub_status(nvlist_t *nvroot)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2375
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2376
	vdev_stat_t *vs;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2377
	uint_t vsc;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2378
	time_t start, end, now;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2379
	double fraction_done;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2380
	uint64_t examined, total, minutes_left;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2381
	char *scrub_type;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2382
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2383
	verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_STATS,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2384
	    (uint64_t **)&vs, &vsc) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2385
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2386
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2387
	 * If there's never been a scrub, there's not much to say.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2388
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2389
	if (vs->vs_scrub_end == 0 && vs->vs_scrub_type == POOL_SCRUB_NONE) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2390
		(void) printf(gettext("none requested\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2391
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2392
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2393
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2394
	scrub_type = (vs->vs_scrub_type == POOL_SCRUB_RESILVER) ?
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2395
	    "resilver" : "scrub";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2396
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2397
	start = vs->vs_scrub_start;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2398
	end = vs->vs_scrub_end;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2399
	now = time(NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2400
	examined = vs->vs_scrub_examined;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2401
	total = vs->vs_alloc;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2402
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2403
	if (end != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2404
		(void) printf(gettext("%s %s with %llu errors on %s"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2405
		    scrub_type, vs->vs_scrub_complete ? "completed" : "stopped",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2406
		    (u_longlong_t)vs->vs_scrub_errors, ctime(&end));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2407
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2408
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2409
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2410
	if (examined == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2411
		examined = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2412
	if (examined > total)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2413
		total = examined;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2414
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2415
	fraction_done = (double)examined / total;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2416
	minutes_left = (uint64_t)((now - start) *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2417
	    (1 - fraction_done) / fraction_done / 60);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2418
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2419
	(void) printf(gettext("%s in progress, %.2f%% done, %lluh%um to go\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2420
	    scrub_type, 100 * fraction_done,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2421
	    (u_longlong_t)(minutes_left / 60), (uint_t)(minutes_left % 60));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2422
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2423
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2424
typedef struct spare_cbdata {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2425
	uint64_t	cb_guid;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2426
	zpool_handle_t	*cb_zhp;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2427
} spare_cbdata_t;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2428
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2429
static boolean_t
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2430
find_vdev(nvlist_t *nv, uint64_t search)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2431
{
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2432
	uint64_t guid;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2433
	nvlist_t **child;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2434
	uint_t c, children;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2435
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2436
	if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &guid) == 0 &&
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2437
	    search == guid)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2438
		return (B_TRUE);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2439
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2440
	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2441
	    &child, &children) == 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2442
		for (c = 0; c < children; c++)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2443
			if (find_vdev(child[c], search))
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2444
				return (B_TRUE);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2445
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2446
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2447
	return (B_FALSE);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2448
}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2449
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2450
static int
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2451
find_spare(zpool_handle_t *zhp, void *data)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2452
{
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2453
	spare_cbdata_t *cbp = data;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2454
	nvlist_t *config, *nvroot;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2455
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2456
	config = zpool_get_config(zhp, NULL);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2457
	verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2458
	    &nvroot) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2459
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2460
	if (find_vdev(nvroot, cbp->cb_guid)) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2461
		cbp->cb_zhp = zhp;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2462
		return (1);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2463
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2464
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2465
	zpool_close(zhp);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2466
	return (0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2467
}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2468
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2469
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2470
 * Print out configuration state as requested by status_callback.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2471
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2472
void
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
  2473
print_status_config(zpool_handle_t *zhp, const char *name, nvlist_t *nv,
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2474
    int namewidth, int depth, boolean_t isspare)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2475
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2476
	nvlist_t **child;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2477
	uint_t c, children;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2478
	vdev_stat_t *vs;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2479
	char rbuf[6], wbuf[6], cbuf[6], repaired[7];
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
  2480
	char *vname;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2481
	uint64_t notpresent;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2482
	spare_cbdata_t cb;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2483
	const char *state;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2484
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2485
	verify(nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_STATS,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2486
	    (uint64_t **)&vs, &c) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2487
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2488
	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2489
	    &child, &children) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2490
		children = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2491
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2492
	state = state_to_name(vs);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2493
	if (isspare) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2494
		/*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2495
		 * For hot spares, we use the terms 'INUSE' and 'AVAILABLE' for
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2496
		 * online drives.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2497
		 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2498
		if (vs->vs_aux == VDEV_AUX_SPARED)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2499
			state = "INUSE";
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2500
		else if (vs->vs_state == VDEV_STATE_HEALTHY)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2501
			state = "AVAIL";
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2502
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2503
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2504
	(void) printf("\t%*s%-*s  %-8s", depth, "", namewidth - depth,
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2505
	    name, state);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2506
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2507
	if (!isspare) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2508
		zfs_nicenum(vs->vs_read_errors, rbuf, sizeof (rbuf));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2509
		zfs_nicenum(vs->vs_write_errors, wbuf, sizeof (wbuf));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2510
		zfs_nicenum(vs->vs_checksum_errors, cbuf, sizeof (cbuf));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2511
		(void) printf(" %5s %5s %5s", rbuf, wbuf, cbuf);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2512
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2513
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2514
	if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2515
	    &notpresent) == 0) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2516
		char *path;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2517
		verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0);
1613
aca102a242d3 6396628 zpool offline does not recognize c0d0 patten recently
eschrock
parents: 1544
diff changeset
  2518
		(void) printf("  was %s", path);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2519
	} else if (vs->vs_aux != 0) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2520
		(void) printf("  ");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2521
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2522
		switch (vs->vs_aux) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2523
		case VDEV_AUX_OPEN_FAILED:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2524
			(void) printf(gettext("cannot open"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2525
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2526
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2527
		case VDEV_AUX_BAD_GUID_SUM:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2528
			(void) printf(gettext("missing device"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2529
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2530
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2531
		case VDEV_AUX_NO_REPLICAS:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2532
			(void) printf(gettext("insufficient replicas"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2533
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2534
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2535
		case VDEV_AUX_VERSION_NEWER:
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2536
			(void) printf(gettext("newer version"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2537
			break;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2538
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2539
		case VDEV_AUX_SPARED:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2540
			verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2541
			    &cb.cb_guid) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2542
			if (zpool_iter(g_zfs, find_spare, &cb) == 1) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2543
				if (strcmp(zpool_get_name(cb.cb_zhp),
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2544
				    zpool_get_name(zhp)) == 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2545
					(void) printf(gettext("currently in "
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2546
					    "use"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2547
				else
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2548
					(void) printf(gettext("in use by "
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2549
					    "pool '%s'"),
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2550
					    zpool_get_name(cb.cb_zhp));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2551
				zpool_close(cb.cb_zhp);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2552
			} else {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2553
				(void) printf(gettext("currently in use"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2554
			}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2555
			break;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2556
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2557
		default:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2558
			(void) printf(gettext("corrupted data"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2559
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2560
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2561
	} else if (vs->vs_scrub_repaired != 0 && children == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2562
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2563
		 * Report bytes resilvered/repaired on leaf devices.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2564
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2565
		zfs_nicenum(vs->vs_scrub_repaired, repaired, sizeof (repaired));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2566
		(void) printf(gettext("  %s %s"), repaired,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2567
		    (vs->vs_scrub_type == POOL_SCRUB_RESILVER) ?
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2568
		    "resilvered" : "repaired");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2569
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2570
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2571
	(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2572
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
  2573
	for (c = 0; c < children; c++) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2574
		vname = zpool_vdev_name(g_zfs, zhp, child[c]);
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
  2575
		print_status_config(zhp, vname, child[c],
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2576
		    namewidth, depth + 2, isspare);
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
  2577
		free(vname);
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
  2578
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2579
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2580
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2581
static void
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2582
print_error_log(zpool_handle_t *zhp)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2583
{
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2584
	nvlist_t **log;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2585
	size_t nelem;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2586
	size_t maxdsname = sizeof ("DATASET") - 1;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2587
	size_t maxobjname = sizeof ("OBJECT") - 1;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2588
	int i;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2589
	nvlist_t *nv;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2590
	size_t len;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2591
	char *dsname, *objname, *range;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2592
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2593
	if (zpool_get_errlog(zhp, &log, &nelem) != 0) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2594
		(void) printf("errors: List of errors unavailable "
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2595
		    "(insufficient privileges)\n");
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2596
		return;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2597
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2598
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2599
	for (i = 0; i < nelem; i++) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2600
		nv = log[i];
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2601
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2602
		verify(nvlist_lookup_string(nv, ZPOOL_ERR_DATASET,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2603
		    &dsname) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2604
		len = strlen(dsname);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2605
		if (len > maxdsname)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2606
			maxdsname = len;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2607
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2608
		verify(nvlist_lookup_string(nv, ZPOOL_ERR_OBJECT,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2609
		    &objname) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2610
		len = strlen(objname);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2611
		if (len > maxobjname)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2612
			maxobjname = len;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2613
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2614
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2615
	(void) printf("errors: The following persistent errors have been "
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2616
	    "detected:\n\n");
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2617
	(void) printf("%8s  %-*s  %-*s  %s\n", "", maxdsname, "DATASET",
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2618
	    maxobjname, "OBJECT", "RANGE");
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2619
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2620
	for (i = 0; i < nelem; i++) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2621
		nv = log[i];
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2622
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2623
		verify(nvlist_lookup_string(nv, ZPOOL_ERR_DATASET,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2624
		    &dsname) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2625
		verify(nvlist_lookup_string(nv, ZPOOL_ERR_OBJECT,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2626
		    &objname) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2627
		verify(nvlist_lookup_string(nv, ZPOOL_ERR_RANGE,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2628
		    &range) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2629
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2630
		(void) printf("%8s  %-*s  %-*s  %s\n", "", maxdsname,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2631
		    dsname, maxobjname, objname, range);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2632
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2633
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2634
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2635
static void
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2636
print_spares(zpool_handle_t *zhp, nvlist_t **spares, uint_t nspares,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2637
    int namewidth)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2638
{
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2639
	uint_t i;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2640
	char *name;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2641
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2642
	if (nspares == 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2643
		return;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2644
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2645
	(void) printf(gettext("\tspares\n"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2646
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2647
	for (i = 0; i < nspares; i++) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2648
		name = zpool_vdev_name(g_zfs, zhp, spares[i]);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2649
		print_status_config(zhp, name, spares[i],
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2650
		    namewidth, 2, B_TRUE);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2651
		free(name);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2652
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2653
}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2654
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2655
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2656
 * Display a summary of pool status.  Displays a summary such as:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2657
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2658
 *        pool: tank
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2659
 *	status: DEGRADED
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2660
 *	reason: One or more devices ...
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2661
 *         see: http://www.sun.com/msg/ZFS-xxxx-01
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2662
 *	config:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2663
 *		mirror		DEGRADED
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2664
 *                c1t0d0	OK
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2665
 *                c2t0d0	UNAVAIL
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2666
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2667
 * When given the '-v' option, we print out the complete config.  If the '-e'
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2668
 * option is specified, then we print out error rate information as well.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2669
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2670
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2671
status_callback(zpool_handle_t *zhp, void *data)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2672
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2673
	status_cbdata_t *cbp = data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2674
	nvlist_t *config, *nvroot;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2675
	char *msgid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2676
	int reason;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2677
	char *health;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2678
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  2679
	config = zpool_get_config(zhp, NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2680
	reason = zpool_get_status(zhp, &msgid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2681
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2682
	cbp->cb_count++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2683
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2684
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2685
	 * If we were given 'zpool status -x', only report those pools with
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2686
	 * problems.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2687
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2688
	if (reason == ZPOOL_STATUS_OK && cbp->cb_explain)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2689
		return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2690
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2691
	if (cbp->cb_first)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2692
		cbp->cb_first = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2693
	else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2694
		(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2695
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2696
	verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_HEALTH,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2697
	    &health) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2698
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2699
	(void) printf(gettext("  pool: %s\n"), zpool_get_name(zhp));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2700
	(void) printf(gettext(" state: %s\n"), health);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2701
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2702
	switch (reason) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2703
	case ZPOOL_STATUS_MISSING_DEV_R:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2704
		(void) printf(gettext("status: One or more devices could not "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2705
		    "be opened.  Sufficient replicas exist for\n\tthe pool to "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2706
		    "continue functioning in a degraded state.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2707
		(void) printf(gettext("action: Attach the missing device and "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2708
		    "online it using 'zpool online'.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2709
		break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2710
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2711
	case ZPOOL_STATUS_MISSING_DEV_NR:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2712
		(void) printf(gettext("status: One or more devices could not "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2713
		    "be opened.  There are insufficient\n\treplicas for the "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2714
		    "pool to continue functioning.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2715
		(void) printf(gettext("action: Attach the missing device and "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2716
		    "online it using 'zpool online'.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2717
		break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2718
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2719
	case ZPOOL_STATUS_CORRUPT_LABEL_R:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2720
		(void) printf(gettext("status: One or more devices could not "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2721
		    "be used because the label is missing or\n\tinvalid.  "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2722
		    "Sufficient replicas exist for the pool to continue\n\t"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2723
		    "functioning in a degraded state.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2724
		(void) printf(gettext("action: Replace the device using "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2725
		    "'zpool replace'.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2726
		break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2727
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2728
	case ZPOOL_STATUS_CORRUPT_LABEL_NR:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2729
		(void) printf(gettext("status: One or more devices could not "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2730
		    "be used because the the label is missing \n\tor invalid.  "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2731
		    "There are insufficient replicas for the pool to "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2732
		    "continue\n\tfunctioning.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2733
		(void) printf(gettext("action: Destroy and re-create the pool "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2734
		    "from a backup source.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2735
		break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2736
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2737
	case ZPOOL_STATUS_FAILING_DEV:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2738
		(void) printf(gettext("status: One or more devices has "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2739
		    "experienced an unrecoverable error.  An\n\tattempt was "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2740
		    "made to correct the error.  Applications are "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2741
		    "unaffected.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2742
		(void) printf(gettext("action: Determine if the device needs "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2743
		    "to be replaced, and clear the errors\n\tusing "
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2744
		    "'zpool clear' or replace the device with 'zpool "
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2745
		    "replace'.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2746
		break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2747
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2748
	case ZPOOL_STATUS_OFFLINE_DEV:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2749
		(void) printf(gettext("status: One or more devices has "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2750
		    "been taken offline by the adminstrator.\n\tSufficient "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2751
		    "replicas exist for the pool to continue functioning in "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2752
		    "a\n\tdegraded state.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2753
		(void) printf(gettext("action: Online the device using "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2754
		    "'zpool online' or replace the device with\n\t'zpool "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2755
		    "replace'.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2756
		break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2757
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2758
	case ZPOOL_STATUS_RESILVERING:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2759
		(void) printf(gettext("status: One or more devices is "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2760
		    "currently being resilvered.  The pool will\n\tcontinue "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2761
		    "to function, possibly in a degraded state.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2762
		(void) printf(gettext("action: Wait for the resilver to "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2763
		    "complete.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2764
		break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2765
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2766
	case ZPOOL_STATUS_CORRUPT_DATA:
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2767
		(void) printf(gettext("status: One or more devices has "
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2768
		    "experienced an error resulting in data\n\tcorruption.  "
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2769
		    "Applications may be affected.\n"));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2770
		(void) printf(gettext("action: Restore the file in question "
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2771
		    "if possible.  Otherwise restore the\n\tentire pool from "
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2772
		    "backup.\n"));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2773
		break;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2774
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2775
	case ZPOOL_STATUS_CORRUPT_POOL:
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2776
		(void) printf(gettext("status: The pool metadata is corrupted "
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2777
		    "and the pool cannot be opened.\n"));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2778
		(void) printf(gettext("action: Destroy and re-create the pool "
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2779
		    "from a backup source.\n"));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2780
		break;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2781
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2782
	case ZPOOL_STATUS_VERSION_OLDER:
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2783
		(void) printf(gettext("status: The pool is formatted using an "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2784
		    "older on-disk format.  The pool can\n\tstill be used, but "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2785
		    "some features are unavailable.\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2786
		(void) printf(gettext("action: Upgrade the pool using 'zpool "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2787
		    "upgrade'.  Once this is done, the\n\tpool will no longer "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2788
		    "be accessible on older software versions.\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2789
		break;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2790
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2791
	case ZPOOL_STATUS_VERSION_NEWER:
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2792
		(void) printf(gettext("status: The pool has been upgraded to a "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2793
		    "newer, incompatible on-disk version.\n\tThe pool cannot "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2794
		    "be accessed on this system.\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2795
		(void) printf(gettext("action: Access the pool from a system "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2796
		    "running more recent software, or\n\trestore the pool from "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2797
		    "backup.\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2798
		break;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2799
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2800
	default:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2801
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2802
		 * The remaining errors can't actually be generated, yet.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2803
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2804
		assert(reason == ZPOOL_STATUS_OK);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2805
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2806
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2807
	if (msgid != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2808
		(void) printf(gettext("   see: http://www.sun.com/msg/%s\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2809
		    msgid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2810
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2811
	if (config != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2812
		int namewidth;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2813
		uint64_t nerr;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2814
		size_t realerr;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2815
		nvlist_t **spares;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2816
		uint_t nspares;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2817
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2818
		verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2819
		    &nvroot) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2820
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2821
		(void) printf(gettext(" scrub: "));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2822
		print_scrub_status(nvroot);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2823
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
  2824
		namewidth = max_width(zhp, nvroot, 0, 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2825
		if (namewidth < 10)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2826
			namewidth = 10;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2827
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2828
		(void) printf(gettext("config:\n\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2829
		(void) printf(gettext("\t%-*s  %-8s %5s %5s %5s\n"), namewidth,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2830
		    "NAME", "STATE", "READ", "WRITE", "CKSUM");
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
  2831
		print_status_config(zhp, zpool_get_name(zhp), nvroot,
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2832
		    namewidth, 0, B_FALSE);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2833
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2834
		if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2835
		    &spares, &nspares) == 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2836
			print_spares(zhp, spares, nspares, namewidth);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2837
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2838
		if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_ERRCOUNT,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2839
		    &nerr) == 0) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2840
			/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2841
			 * If the approximate error count is small, get a
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2842
			 * precise count by fetching the entire log and
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2843
			 * uniquifying the results.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2844
			 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2845
			if (nerr < 100 && !cbp->cb_verbose &&
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2846
			    zpool_get_errlog(zhp, NULL, &realerr) == 0)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2847
				nerr = realerr;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2848
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2849
			(void) printf("\n");
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2850
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2851
			if (nerr == 0)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2852
				(void) printf(gettext("errors: No known data "
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2853
				    "errors\n"));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2854
			else if (!cbp->cb_verbose)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2855
				(void) printf(gettext("errors: %d data errors, "
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2856
				    "use '-v' for a list\n"), nerr);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2857
			else
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2858
				print_error_log(zhp);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2859
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2860
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2861
		(void) printf(gettext("config: The configuration cannot be "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2862
		    "determined.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2863
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2864
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2865
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2866
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2867
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2868
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2869
 * zpool status [-vx] [pool] ...
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2870
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2871
 *	-v	Display complete error logs
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2872
 *	-x	Display only pools with potential problems
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2873
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2874
 * Describes the health status of all pools or some subset.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2875
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2876
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2877
zpool_do_status(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2878
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2879
	int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2880
	int ret;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2881
	status_cbdata_t cb = { 0 };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2882
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2883
	/* check options */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2884
	while ((c = getopt(argc, argv, "vx")) != -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2885
		switch (c) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2886
		case 'v':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2887
			cb.cb_verbose = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2888
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2889
		case 'x':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2890
			cb.cb_explain = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2891
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2892
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2893
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2894
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2895
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2896
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2897
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2898
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2899
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2900
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2901
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2902
	cb.cb_first = B_TRUE;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2903
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2904
	ret = for_each_pool(argc, argv, B_TRUE, status_callback, &cb);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2905
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2906
	if (argc == 0 && cb.cb_count == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2907
		(void) printf(gettext("no pools available\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2908
	else if (cb.cb_explain && cb.cb_first) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2909
		if (argc == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2910
			(void) printf(gettext("all pools are healthy\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2911
		} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2912
			int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2913
			for (i = 0; i < argc; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2914
				(void) printf(gettext("pool '%s' is healthy\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2915
				    argv[i]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2916
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2917
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2918
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2919
	return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2920
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2921
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2922
typedef struct upgrade_cbdata {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2923
	int	cb_all;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2924
	int	cb_first;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2925
	int	cb_newer;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2926
} upgrade_cbdata_t;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2927
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2928
static int
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2929
upgrade_cb(zpool_handle_t *zhp, void *arg)
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2930
{
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2931
	upgrade_cbdata_t *cbp = arg;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2932
	nvlist_t *config;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2933
	uint64_t version;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2934
	int ret = 0;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2935
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2936
	config = zpool_get_config(zhp, NULL);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2937
	verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION,
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2938
	    &version) == 0);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2939
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2940
	if (!cbp->cb_newer && version < ZFS_VERSION) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2941
		if (!cbp->cb_all) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2942
			if (cbp->cb_first) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2943
				(void) printf(gettext("The following pools are "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2944
				    "out of date, and can be upgraded.  After "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2945
				    "being\nupgraded, these pools will no "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2946
				    "longer be accessible by older software "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2947
				    "versions.\n\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2948
				(void) printf(gettext("VER  POOL\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2949
				(void) printf(gettext("---  ------------\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2950
				cbp->cb_first = B_FALSE;
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2951
			}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2952
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2953
			(void) printf("%2llu   %s\n", version,
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2954
			    zpool_get_name(zhp));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2955
		} else {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2956
			cbp->cb_first = B_FALSE;
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2957
			ret = zpool_upgrade(zhp);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2958
			if (ret == 0)
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2959
				(void) printf(gettext("Successfully upgraded "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2960
				    "'%s'\n"), zpool_get_name(zhp));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2961
		}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2962
	} else if (cbp->cb_newer && version > ZFS_VERSION) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2963
		assert(!cbp->cb_all);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2964
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2965
		if (cbp->cb_first) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2966
			(void) printf(gettext("The following pools are "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2967
			    "formatted using a newer software version and\n"
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2968
			    "cannot be accessed on the current system.\n\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2969
			(void) printf(gettext("VER  POOL\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2970
			(void) printf(gettext("---  ------------\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2971
			cbp->cb_first = B_FALSE;
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2972
		}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2973
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2974
		(void) printf("%2llu   %s\n", version,
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2975
		    zpool_get_name(zhp));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2976
	}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2977
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2978
	zpool_close(zhp);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2979
	return (ret);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2980
}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2981
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2982
/* ARGSUSED */
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2983
static int
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2984
upgrade_one(zpool_handle_t *zhp, void *unused)
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2985
{
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2986
	nvlist_t *config;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2987
	uint64_t version;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2988
	int ret;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2989
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2990
	config = zpool_get_config(zhp, NULL);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2991
	verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION,
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2992
	    &version) == 0);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2993
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2994
	if (version == ZFS_VERSION) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2995
		(void) printf(gettext("Pool '%s' is already formatted "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2996
		    "using the current version.\n"), zpool_get_name(zhp));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2997
		return (0);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2998
	}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2999
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3000
	ret = zpool_upgrade(zhp);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3001
	if (ret == 0)
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
  3002
		(void) printf(gettext("Successfully upgraded '%s' "
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
  3003
		    "from version %llu to version %llu\n"), zpool_get_name(zhp),
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
  3004
		    (u_longlong_t)version, (u_longlong_t)ZFS_VERSION);
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3005
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3006
	return (ret != 0);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3007
}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3008
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3009
/*
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3010
 * zpool upgrade
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3011
 * zpool upgrade -v
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3012
 * zpool upgrade <-a | pool>
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3013
 *
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3014
 * With no arguments, display downrev'd ZFS pool available for upgrade.
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3015
 * Individual pools can be upgraded by specifying the pool, and '-a' will
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3016
 * upgrade all pools.
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3017
 */
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3018
int
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3019
zpool_do_upgrade(int argc, char **argv)
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3020
{
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3021
	int c;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3022
	upgrade_cbdata_t cb = { 0 };
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3023
	int ret = 0;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3024
	boolean_t showversions = B_FALSE;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3025
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3026
	/* check options */
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3027
	while ((c = getopt(argc, argv, "av")) != -1) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3028
		switch (c) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3029
		case 'a':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3030
			cb.cb_all = B_TRUE;
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3031
			break;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3032
		case 'v':
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3033
			showversions = B_TRUE;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3034
			break;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3035
		case '?':
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3036
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3037
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3038
			usage(B_FALSE);
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3039
		}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3040
	}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3041
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3042
	argc -= optind;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3043
	argv += optind;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3044
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3045
	if (showversions) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3046
		if (cb.cb_all || argc != 0) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3047
			(void) fprintf(stderr, gettext("-v option is "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3048
			    "incompatible with other arguments\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3049
			usage(B_FALSE);
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3050
		}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3051
	} else if (cb.cb_all) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3052
		if (argc != 0) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3053
			(void) fprintf(stderr, gettext("-a option is "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3054
			    "incompatible with other arguments\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3055
			usage(B_FALSE);
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3056
		}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3057
	}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3058
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3059
	(void) printf(gettext("This system is currently running ZFS version "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3060
	    "%llu.\n\n"), ZFS_VERSION);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3061
	cb.cb_first = B_TRUE;
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3062
	if (showversions) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3063
		(void) printf(gettext("The following versions are "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3064
		    "suppored:\n\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3065
		(void) printf(gettext("VER  DESCRIPTION\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3066
		(void) printf("---  -----------------------------------------"
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3067
		    "---------------\n");
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3068
		(void) printf(gettext(" 1   Initial ZFS version\n"));
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
  3069
		(void) printf(gettext(" 2   Ditto blocks "
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
  3070
		    "(replicated metadata)\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3071
		(void) printf(gettext(" 3   Hot spares and double parity "
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3072
		    "RAID-Z\n"));
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
  3073
		(void) printf(gettext("\nFor more information on a particular "
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3074
		    "version, including supported releases, see:\n\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3075
		(void) printf("http://www.opensolaris.org/os/community/zfs/"
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3076
		    "version/N\n\n");
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3077
		(void) printf(gettext("Where 'N' is the version number.\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3078
	} else if (argc == 0) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3079
		int notfound;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3080
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3081
		ret = zpool_iter(g_zfs, upgrade_cb, &cb);
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3082
		notfound = cb.cb_first;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3083
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3084
		if (!cb.cb_all && ret == 0) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3085
			if (!cb.cb_first)
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3086
				(void) printf("\n");
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3087
			cb.cb_first = B_TRUE;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3088
			cb.cb_newer = B_TRUE;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3089
			ret = zpool_iter(g_zfs, upgrade_cb, &cb);
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3090
			if (!cb.cb_first) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3091
				notfound = B_FALSE;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3092
				(void) printf("\n");
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3093
			}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3094
		}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3095
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3096
		if (ret == 0) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3097
			if (notfound)
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3098
				(void) printf(gettext("All pools are formatted "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3099
				    "using this version.\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3100
			else if (!cb.cb_all)
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3101
				(void) printf(gettext("Use 'zpool upgrade -v' "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3102
				    "for a list of available versions and "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3103
				    "their associated\nfeatures.\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3104
		}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3105
	} else {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3106
		ret = for_each_pool(argc, argv, B_FALSE, upgrade_one, NULL);
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3107
	}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3108
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3109
	return (ret);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3110
}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3111
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3112
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3113
main(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3114
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3115
	int ret;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3116
	int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3117
	char *cmdname;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3118
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3119
	(void) setlocale(LC_ALL, "");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3120
	(void) textdomain(TEXT_DOMAIN);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3121
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3122
	if ((g_zfs = libzfs_init()) == NULL) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3123
		(void) fprintf(stderr, gettext("internal error: failed to "
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3124
		    "initialize ZFS library"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3125
		return (1);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3126
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3127
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3128
	libzfs_print_on_error(g_zfs, B_TRUE);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3129
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3130
	opterr = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3131
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3132
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3133
	 * Make sure the user has specified some command.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3134
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3135
	if (argc < 2) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3136
		(void) fprintf(stderr, gettext("missing command\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3137
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3138
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3139
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3140
	cmdname = argv[1];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3141
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3142
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3143
	 * Special case '-?'
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3144
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3145
	if (strcmp(cmdname, "-?") == 0)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3146
		usage(B_TRUE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3147
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3148
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3149
	 * Run the appropriate command.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3150
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3151
	for (i = 0; i < NCOMMAND; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3152
		if (command_table[i].name == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3153
			continue;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3154
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3155
		if (strcmp(cmdname, command_table[i].name) == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3156
			current_command = &command_table[i];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3157
			ret = command_table[i].func(argc - 1, argv + 1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3158
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3159
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3160
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3161
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3162
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3163
	 * 'freeze' is a vile debugging abomination, so we treat it as such.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3164
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3165
	if (strcmp(cmdname, "freeze") == 0 && argc == 3) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3166
		char buf[16384];
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3167
		int fd = open(ZFS_DEV, O_RDWR);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3168
		(void) strcpy((void *)buf, argv[2]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3169
		return (!!ioctl(fd, ZFS_IOC_POOL_FREEZE, buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3170
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3171
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3172
	if (i == NCOMMAND) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3173
		(void) fprintf(stderr, gettext("unrecognized "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3174
		    "command '%s'\n"), cmdname);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3175
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3176
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3177
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3178
	libzfs_fini(g_zfs);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3179
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3180
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3181
	 * The 'ZFS_ABORT' environment variable causes us to dump core on exit
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3182
	 * for the purposes of running ::findleaks.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3183
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3184
	if (getenv("ZFS_ABORT") != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3185
		(void) printf("dumping core by request\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3186
		abort();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3187
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3188
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3189
	return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3190
}