usr/src/cmd/zpool/zpool_main.c
author marks
Tue, 26 Jun 2007 07:44:24 -0700
changeset 4543 12bb2876a62e
parent 4527 5d5b6ba91b17
child 4577 ed36b0e652bc
permissions -rw-r--r--
PSARC/2006/465 ZFS Delegated Administration PSARC/2006/577 zpool property to disable delegation PSARC/2006/625 Enhancements to zpool history PSARC/2007/228 ZFS delegation amendments PSARC/2007/295 ZFS Delegated Administration Addendum 6280676 restore "owner" property 6349470 investigate non-root restore/backup 6572465 'zpool set bootfs=...' records history as 'zfs set bootfs=...'
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
/*
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3126
diff changeset
    23
 * Copyright 2007 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>
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
    44
#include <pwd.h>
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
    45
#include <zone.h>
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
    46
#include <sys/fs/zfs.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    47
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    48
#include <sys/stat.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    49
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    50
#include <libzfs.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    51
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    52
#include "zpool_util.h"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    53
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    54
static int zpool_do_create(int, char **);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    55
static int zpool_do_destroy(int, char **);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    56
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    57
static int zpool_do_add(int, char **);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
    58
static int zpool_do_remove(int, char **);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    59
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    60
static int zpool_do_list(int, char **);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    61
static int zpool_do_iostat(int, char **);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    62
static int zpool_do_status(int, char **);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    63
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    64
static int zpool_do_online(int, char **);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    65
static int zpool_do_offline(int, char **);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
    66
static int zpool_do_clear(int, char **);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    67
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    68
static int zpool_do_attach(int, char **);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    69
static int zpool_do_detach(int, char **);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    70
static int zpool_do_replace(int, char **);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    71
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    72
static int zpool_do_scrub(int, char **);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    73
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    74
static int zpool_do_import(int, char **);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    75
static int zpool_do_export(int, char **);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    76
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
    77
static int zpool_do_upgrade(int, char **);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
    78
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
    79
static int zpool_do_history(int, char **);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
    80
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
    81
static int zpool_do_get(int, char **);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
    82
static int zpool_do_set(int, char **);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
    83
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    84
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    85
 * These libumem hooks provide a reasonable set of defaults for the allocator's
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    86
 * debugging facilities.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    87
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    88
const char *
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
    89
_umem_debug_init(void)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    90
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    91
	return ("default,verbose"); /* $UMEM_DEBUG setting */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    92
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    93
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    94
const char *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    95
_umem_logging_init(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    96
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    97
	return ("fail,contents"); /* $UMEM_LOGGING setting */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    98
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    99
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   100
typedef enum {
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   101
	HELP_ADD,
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   102
	HELP_ATTACH,
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   103
	HELP_CLEAR,
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   104
	HELP_CREATE,
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   105
	HELP_DESTROY,
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   106
	HELP_DETACH,
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   107
	HELP_EXPORT,
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
   108
	HELP_HISTORY,
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   109
	HELP_IMPORT,
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   110
	HELP_IOSTAT,
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   111
	HELP_LIST,
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   112
	HELP_OFFLINE,
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   113
	HELP_ONLINE,
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   114
	HELP_REPLACE,
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   115
	HELP_REMOVE,
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   116
	HELP_SCRUB,
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   117
	HELP_STATUS,
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   118
	HELP_UPGRADE,
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   119
	HELP_GET,
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   120
	HELP_SET
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   121
} zpool_help_t;
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   122
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   123
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   124
typedef struct zpool_command {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   125
	const char	*name;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   126
	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
   127
	zpool_help_t	usage;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   128
} zpool_command_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   129
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   130
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   131
 * Master command table.  Each ZFS command has a name, associated function, and
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   132
 * usage message.  The usage messages need to be internationalized, so we have
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   133
 * 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
   134
 *
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   135
 * 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
   136
 * 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
   137
 * the generic usage message.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   138
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   139
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
   140
	{ "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
   141
	{ "destroy",	zpool_do_destroy,	HELP_DESTROY		},
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
	{ "add",	zpool_do_add,		HELP_ADD		},
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   144
	{ "remove",	zpool_do_remove,	HELP_REMOVE		},
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   145
	{ NULL },
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   146
	{ "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
   147
	{ "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
   148
	{ "status",	zpool_do_status,	HELP_STATUS		},
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   149
	{ NULL },
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   150
	{ "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
   151
	{ "offline",	zpool_do_offline,	HELP_OFFLINE		},
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   152
	{ "clear",	zpool_do_clear,		HELP_CLEAR		},
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   153
	{ NULL },
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   154
	{ "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
   155
	{ "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
   156
	{ "replace",	zpool_do_replace,	HELP_REPLACE		},
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   157
	{ NULL },
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   158
	{ "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
   159
	{ NULL },
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   160
	{ "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
   161
	{ "export",	zpool_do_export,	HELP_EXPORT		},
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
   162
	{ "upgrade",	zpool_do_upgrade,	HELP_UPGRADE		},
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
   163
	{ NULL },
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   164
	{ "history",	zpool_do_history,	HELP_HISTORY		},
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   165
	{ "get",	zpool_do_get,		HELP_GET		},
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   166
	{ "set",	zpool_do_set,		HELP_SET		},
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   167
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   168
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   169
#define	NCOMMAND	(sizeof (command_table) / sizeof (command_table[0]))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   170
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   171
zpool_command_t *current_command;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   172
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   173
static const char *
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   174
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
   175
	switch (idx) {
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   176
	case HELP_ADD:
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   177
		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
   178
	case HELP_ATTACH:
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   179
		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
   180
		    "<new_device>\n"));
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   181
	case HELP_CLEAR:
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   182
		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
   183
	case HELP_CREATE:
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   184
		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
   185
		    "<pool> <vdev> ...\n"));
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   186
	case HELP_DESTROY:
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   187
		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
   188
	case HELP_DETACH:
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   189
		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
   190
	case HELP_EXPORT:
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   191
		return (gettext("\texport [-f] <pool> ...\n"));
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
   192
	case HELP_HISTORY:
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
   193
		return (gettext("\thistory [-il] [<pool>] ...\n"));
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   194
	case HELP_IMPORT:
1631
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
   195
		return (gettext("\timport [-d dir] [-D]\n"
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
   196
		    "\timport [-p property=value] [-d dir] [-D] [-f] "
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
   197
		    "[-o opts] [-R root] -a\n"
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
   198
		    "\timport [-p property=value] [-d dir] [-D] [-f] \n"
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
   199
		    "\t    [-o opts] [-R root ] <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
   200
	case HELP_IOSTAT:
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   201
		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
   202
		    "[count]]\n"));
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   203
	case HELP_LIST:
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   204
		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
   205
		    "[pool] ...\n"));
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   206
	case HELP_OFFLINE:
1485
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1387
diff changeset
   207
		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
   208
	case HELP_ONLINE:
1485
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1387
diff changeset
   209
		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
   210
	case HELP_REPLACE:
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   211
		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
   212
		    "[new_device]\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   213
	case HELP_REMOVE:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   214
		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
   215
	case HELP_SCRUB:
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   216
		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
   217
	case HELP_STATUS:
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   218
		return (gettext("\tstatus [-vx] [pool] ...\n"));
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   219
	case HELP_UPGRADE:
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   220
		return (gettext("\tupgrade\n"
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   221
		    "\tupgrade -v\n"
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   222
		    "\tupgrade <-a | pool>\n"));
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   223
	case HELP_GET:
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   224
		return (gettext("\tget <all | property[,property]...> "
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   225
		    "<pool> ...\n"));
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   226
	case HELP_SET:
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   227
		return (gettext("\tset <property=value> <pool> \n"));
1387
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   228
	}
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   229
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   230
	abort();
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   231
	/* NOTREACHED */
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   232
}
7dc47b4865df 6340747 i18n : zfs command line tools don't have correctly i18n'd usage messages
eschrock
parents: 1354
diff changeset
   233
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   234
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   235
 * Fields available for 'zpool list'.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   236
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   237
typedef enum {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   238
	ZPOOL_FIELD_NAME,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   239
	ZPOOL_FIELD_SIZE,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   240
	ZPOOL_FIELD_USED,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   241
	ZPOOL_FIELD_AVAILABLE,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   242
	ZPOOL_FIELD_CAPACITY,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   243
	ZPOOL_FIELD_HEALTH,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   244
	ZPOOL_FIELD_ROOT
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   245
} zpool_field_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   246
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   247
#define	MAX_FIELDS	10
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   248
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   249
typedef struct column_def {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   250
	const char	*cd_title;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   251
	size_t		cd_width;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   252
	enum {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   253
		left_justify,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   254
		right_justify
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   255
	}		cd_justify;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   256
} column_def_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   257
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   258
static column_def_t column_table[] = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   259
	{ "NAME",	20,	left_justify	},
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   260
	{ "SIZE",	6,	right_justify	},
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   261
	{ "USED",	6,	right_justify	},
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   262
	{ "AVAIL",	6,	right_justify	},
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   263
	{ "CAP",	5,	right_justify	},
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   264
	{ "HEALTH",	9,	left_justify	},
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   265
	{ "ALTROOT",	15,	left_justify	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   266
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   267
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   268
static char *column_subopts[] = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   269
	"name",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   270
	"size",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   271
	"used",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   272
	"available",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   273
	"capacity",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   274
	"health",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   275
	"root",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   276
	NULL
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   277
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   278
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   279
/*
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   280
 * Callback routine that will print out a pool property value.
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   281
 */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   282
static zpool_prop_t
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   283
print_prop_cb(zpool_prop_t prop, void *cb)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   284
{
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   285
	FILE *fp = cb;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   286
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   287
	(void) fprintf(fp, "\t%-13s  ", zpool_prop_to_name(prop));
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   288
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   289
	if (zpool_prop_values(prop) == NULL)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   290
		(void) fprintf(fp, "-\n");
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   291
	else
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   292
		(void) fprintf(fp, "%s\n", zpool_prop_values(prop));
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   293
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   294
	return (ZFS_PROP_CONT);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   295
}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   296
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   297
/*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   298
 * Display usage message.  If we're inside a command, display only the usage for
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   299
 * that command.  Otherwise, iterate over the entire command table and display
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   300
 * a complete usage message.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   301
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   302
void
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   303
usage(boolean_t requested)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   304
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   305
	int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   306
	FILE *fp = requested ? stdout : stderr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   307
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   308
	if (current_command == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   309
		int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   310
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   311
		(void) fprintf(fp, gettext("usage: zpool command args ...\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   312
		(void) fprintf(fp,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   313
		    gettext("where 'command' is one of the following:\n\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   314
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   315
		for (i = 0; i < NCOMMAND; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   316
			if (command_table[i].name == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   317
				(void) fprintf(fp, "\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   318
			else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   319
				(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
   320
				    get_usage(command_table[i].usage));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   321
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   322
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   323
		(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
   324
		(void) fprintf(fp, "%s", get_usage(current_command->usage));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   325
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   326
		if (strcmp(current_command->name, "list") == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   327
			(void) fprintf(fp, gettext("\nwhere 'field' is one "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   328
			    "of the following:\n\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   329
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   330
			for (i = 0; column_subopts[i] != NULL; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   331
				(void) fprintf(fp, "\t%s\n", column_subopts[i]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   332
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   333
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   334
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   335
	if (current_command != NULL &&
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   336
	    ((strcmp(current_command->name, "set") == 0) ||
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   337
	    (strcmp(current_command->name, "get") == 0))) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   338
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   339
		(void) fprintf(fp,
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   340
		    gettext("\nthe following properties are supported:\n"));
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   341
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   342
		(void) fprintf(fp, "\n\t%-13s  %s\n\n",
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   343
		    "PROPERTY", "VALUES");
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   344
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   345
		/* Iterate over all properties */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   346
		(void) zpool_prop_iter(print_prop_cb, fp, B_FALSE);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   347
	}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   348
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   349
	/*
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   350
	 * See comments at end of main().
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   351
	 */
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   352
	if (getenv("ZFS_ABORT") != NULL) {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   353
		(void) printf("dumping core by request\n");
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   354
		abort();
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   355
	}
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   356
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   357
	exit(requested ? 0 : 2);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   358
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   359
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   360
const char *
3741
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
   361
state_to_health(int vs_state)
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
   362
{
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
   363
	switch (vs_state) {
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
   364
	case VDEV_STATE_CLOSED:
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
   365
	case VDEV_STATE_CANT_OPEN:
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
   366
	case VDEV_STATE_OFFLINE:
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
   367
		return (dgettext(TEXT_DOMAIN, "FAULTED"));
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
   368
	case VDEV_STATE_DEGRADED:
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
   369
		return (dgettext(TEXT_DOMAIN, "DEGRADED"));
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
   370
	case VDEV_STATE_HEALTHY:
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
   371
		return (dgettext(TEXT_DOMAIN, "ONLINE"));
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
   372
	}
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
   373
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
   374
	return (dgettext(TEXT_DOMAIN, "UNKNOWN"));
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
   375
}
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
   376
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
   377
const char *
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   378
state_to_name(vdev_stat_t *vs)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   379
{
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   380
	switch (vs->vs_state) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   381
	case VDEV_STATE_CLOSED:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   382
	case VDEV_STATE_CANT_OPEN:
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   383
		if (vs->vs_aux == VDEV_AUX_CORRUPT_DATA)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   384
			return (gettext("FAULTED"));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   385
		else
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   386
			return (gettext("UNAVAIL"));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   387
	case VDEV_STATE_OFFLINE:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   388
		return (gettext("OFFLINE"));
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
   389
	case VDEV_STATE_REMOVED:
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
   390
		return (gettext("REMOVED"));
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
   391
	case VDEV_STATE_FAULTED:
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
   392
		return (gettext("FAULTED"));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   393
	case VDEV_STATE_DEGRADED:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   394
		return (gettext("DEGRADED"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   395
	case VDEV_STATE_HEALTHY:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   396
		return (gettext("ONLINE"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   397
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   398
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   399
	return (gettext("UNKNOWN"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   400
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   401
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   402
void
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   403
print_vdev_tree(zpool_handle_t *zhp, const char *name, nvlist_t *nv, int indent,
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   404
    boolean_t print_logs)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   405
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   406
	nvlist_t **child;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   407
	uint_t c, children;
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
   408
	char *vname;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   409
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   410
	if (name != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   411
		(void) printf("\t%*s%s\n", indent, "", name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   412
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   413
	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   414
	    &child, &children) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   415
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   416
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
   417
	for (c = 0; c < children; c++) {
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   418
		uint64_t is_log = B_FALSE;
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   419
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   420
		(void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG,
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   421
		    &is_log);
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   422
		if ((is_log && !print_logs) || (!is_log && print_logs))
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   423
			continue;
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   424
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   425
		vname = zpool_vdev_name(g_zfs, zhp, child[c]);
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   426
		print_vdev_tree(zhp, vname, child[c], indent + 2,
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   427
		    B_FALSE);
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
   428
		free(vname);
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
   429
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   430
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   431
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   432
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   433
 * zpool add [-fn] <pool> <vdev> ...
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   434
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   435
 *	-f	Force addition of devices, even if they appear in use
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   436
 *	-n	Do not add the devices, but display the resulting layout if
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   437
 *		they were to be added.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   438
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   439
 * Adds the given vdevs to 'pool'.  As with create, the bulk of this work is
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   440
 * handled by get_vdev_spec(), which constructs the nvlist needed to pass to
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   441
 * libzfs.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   442
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   443
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   444
zpool_do_add(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   445
{
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   446
	boolean_t force = B_FALSE;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   447
	boolean_t dryrun = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   448
	int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   449
	nvlist_t *nvroot;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   450
	char *poolname;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   451
	int ret;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   452
	zpool_handle_t *zhp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   453
	nvlist_t *config;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   454
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   455
	/* check options */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   456
	while ((c = getopt(argc, argv, "fn")) != -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   457
		switch (c) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   458
		case 'f':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   459
			force = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   460
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   461
		case 'n':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   462
			dryrun = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   463
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   464
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   465
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   466
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   467
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   468
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   469
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   470
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   471
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   472
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   473
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   474
	/* get pool name and check number of arguments */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   475
	if (argc < 1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   476
		(void) fprintf(stderr, gettext("missing pool name argument\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   477
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   478
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   479
	if (argc < 2) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   480
		(void) fprintf(stderr, gettext("missing vdev specification\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   481
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   482
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   483
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   484
	poolname = argv[0];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   485
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   486
	argc--;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   487
	argv++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   488
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   489
	if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   490
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   491
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
   492
	if ((config = zpool_get_config(zhp, NULL)) == NULL) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   493
		(void) fprintf(stderr, gettext("pool '%s' is unavailable\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   494
		    poolname);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   495
		zpool_close(zhp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   496
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   497
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   498
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   499
	/* pass off to get_vdev_spec for processing */
4276
c42d49ffb16f 6385547 zpool create of a mirror using a device and a slice of a device (of same size) reports an error
taylor
parents: 4221
diff changeset
   500
	nvroot = make_root_vdev(zhp, force, !force, B_FALSE, argc, argv);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   501
	if (nvroot == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   502
		zpool_close(zhp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   503
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   504
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   505
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   506
	if (dryrun) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   507
		nvlist_t *poolnvroot;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   508
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   509
		verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   510
		    &poolnvroot) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   511
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   512
		(void) printf(gettext("would update '%s' to the following "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   513
		    "configuration:\n"), zpool_get_name(zhp));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   514
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   515
		/* print original main pool and new tree */
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   516
		print_vdev_tree(zhp, poolname, poolnvroot, 0, B_FALSE);
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   517
		print_vdev_tree(zhp, NULL, nvroot, 0, B_FALSE);
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   518
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   519
		/* Do the same for the logs */
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   520
		if (num_logs(poolnvroot) > 0) {
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   521
			print_vdev_tree(zhp, "logs", poolnvroot, 0, B_TRUE);
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   522
			print_vdev_tree(zhp, NULL, nvroot, 0, B_TRUE);
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   523
		} else if (num_logs(nvroot) > 0) {
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   524
			print_vdev_tree(zhp, "logs", nvroot, 0, B_TRUE);
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   525
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   526
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   527
		ret = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   528
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   529
		ret = (zpool_add(zhp, nvroot) != 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   530
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   531
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   532
	nvlist_free(nvroot);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   533
	zpool_close(zhp);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   534
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   535
	return (ret);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   536
}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   537
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   538
/*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   539
 * zpool remove <pool> <vdev>
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   540
 *
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   541
 * Removes the given vdev from the pool.  Currently, this only supports removing
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   542
 * 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
   543
 * (as an alias for 'detach') as well as toplevel vdevs.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   544
 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   545
int
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   546
zpool_do_remove(int argc, char **argv)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   547
{
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   548
	char *poolname;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   549
	int ret;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   550
	zpool_handle_t *zhp;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   551
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   552
	argc--;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   553
	argv++;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   554
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   555
	/* get pool name and check number of arguments */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   556
	if (argc < 1) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   557
		(void) fprintf(stderr, gettext("missing pool name argument\n"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   558
		usage(B_FALSE);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   559
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   560
	if (argc < 2) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   561
		(void) fprintf(stderr, gettext("missing device\n"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   562
		usage(B_FALSE);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   563
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   564
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   565
	poolname = argv[0];
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   566
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   567
	if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   568
		return (1);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   569
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   570
	ret = (zpool_vdev_remove(zhp, argv[1]) != 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   571
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   572
	return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   573
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   574
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   575
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   576
 * zpool create [-fn] [-R root] [-m mountpoint] <pool> <dev> ...
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   577
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   578
 *	-f	Force creation, even if devices appear in use
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   579
 *	-n	Do not create the pool, but display the resulting layout if it
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   580
 *		were to be created.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   581
 *      -R	Create a pool under an alternate root
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   582
 *      -m	Set default mountpoint for the root dataset.  By default it's
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   583
 *      	'/<pool>'
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   584
 *
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   585
 * Creates the named pool according to the given vdev specification.  The
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   586
 * 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
   587
 * we get the nvlist back from get_vdev_spec(), we either print out the contents
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   588
 * (if '-n' was specified), or pass it to libzfs to do the creation.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   589
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   590
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   591
zpool_do_create(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   592
{
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   593
	boolean_t force = B_FALSE;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   594
	boolean_t dryrun = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   595
	int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   596
	nvlist_t *nvroot;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   597
	char *poolname;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   598
	int ret;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   599
	char *altroot = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   600
	char *mountpoint = NULL;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   601
	nvlist_t **child;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   602
	uint_t children;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   603
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   604
	/* check options */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   605
	while ((c = getopt(argc, argv, ":fnR:m:")) != -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   606
		switch (c) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   607
		case 'f':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   608
			force = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   609
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   610
		case 'n':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   611
			dryrun = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   612
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   613
		case 'R':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   614
			altroot = optarg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   615
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   616
		case 'm':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   617
			mountpoint = optarg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   618
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   619
		case ':':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   620
			(void) fprintf(stderr, gettext("missing argument for "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   621
			    "'%c' option\n"), optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   622
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   623
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   624
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   625
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   626
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   627
			usage(B_FALSE);
789
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
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   632
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   633
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   634
	/* get pool name and check number of arguments */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   635
	if (argc < 1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   636
		(void) fprintf(stderr, gettext("missing pool name argument\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   637
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   638
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   639
	if (argc < 2) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   640
		(void) fprintf(stderr, gettext("missing vdev specification\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   641
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   642
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   643
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   644
	poolname = argv[0];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   645
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   646
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   647
	 * As a special case, check for use of '/' in the name, and direct the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   648
	 * user to use 'zfs create' instead.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   649
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   650
	if (strchr(poolname, '/') != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   651
		(void) fprintf(stderr, gettext("cannot create '%s': invalid "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   652
		    "character '/' in pool name\n"), poolname);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   653
		(void) fprintf(stderr, gettext("use 'zfs create' to "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   654
		    "create a dataset\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   655
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   656
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   657
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   658
	/* pass off to get_vdev_spec for bulk processing */
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   659
	nvroot = make_root_vdev(NULL, force, !force, B_FALSE, argc - 1,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   660
	    argv + 1);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   661
	if (nvroot == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   662
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   663
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   664
	/* make_root_vdev() allows 0 toplevel children if there are spares */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   665
	verify(nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_CHILDREN,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   666
	    &child, &children) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   667
	if (children == 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   668
		(void) fprintf(stderr, gettext("invalid vdev "
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   669
		    "specification: at least one toplevel vdev must be "
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   670
		    "specified\n"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   671
		return (1);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   672
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   673
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   674
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   675
	if (altroot != NULL && altroot[0] != '/') {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   676
		(void) fprintf(stderr, gettext("invalid alternate root '%s': "
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   677
		    "must be an absolute path\n"), altroot);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   678
		nvlist_free(nvroot);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   679
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   680
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   681
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   682
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   683
	 * Check the validity of the mountpoint and direct the user to use the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   684
	 * '-m' mountpoint option if it looks like its in use.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   685
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   686
	if (mountpoint == NULL ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   687
	    (strcmp(mountpoint, ZFS_MOUNTPOINT_LEGACY) != 0 &&
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   688
	    strcmp(mountpoint, ZFS_MOUNTPOINT_NONE) != 0)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   689
		char buf[MAXPATHLEN];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   690
		struct stat64 statbuf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   691
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   692
		if (mountpoint && mountpoint[0] != '/') {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   693
			(void) fprintf(stderr, gettext("invalid mountpoint "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   694
			    "'%s': must be an absolute path, 'legacy', or "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   695
			    "'none'\n"), mountpoint);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   696
			nvlist_free(nvroot);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   697
			return (1);
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
		if (mountpoint == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   701
			if (altroot != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   702
				(void) snprintf(buf, sizeof (buf), "%s/%s",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   703
				    altroot, poolname);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   704
			else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   705
				(void) snprintf(buf, sizeof (buf), "/%s",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   706
				    poolname);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   707
		} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   708
			if (altroot != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   709
				(void) snprintf(buf, sizeof (buf), "%s%s",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   710
				    altroot, mountpoint);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   711
			else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   712
				(void) snprintf(buf, sizeof (buf), "%s",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   713
				    mountpoint);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   714
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   715
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   716
		if (stat64(buf, &statbuf) == 0 &&
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   717
		    statbuf.st_nlink != 2) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   718
			if (mountpoint == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   719
				(void) fprintf(stderr, gettext("default "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   720
				    "mountpoint '%s' exists and is not "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   721
				    "empty\n"), buf);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   722
			else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   723
				(void) fprintf(stderr, gettext("mountpoint "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   724
				    "'%s' exists and is not empty\n"), buf);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   725
			(void) fprintf(stderr, gettext("use '-m' "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   726
			    "option to provide a different default\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   727
			nvlist_free(nvroot);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   728
			return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   729
		}
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
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   733
	if (dryrun) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   734
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   735
		 * For a dry run invocation, print out a basic message and run
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   736
		 * through all the vdevs in the list and print out in an
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   737
		 * appropriate hierarchy.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   738
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   739
		(void) printf(gettext("would create '%s' with the "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   740
		    "following layout:\n\n"), poolname);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   741
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   742
		print_vdev_tree(NULL, poolname, nvroot, 0, B_FALSE);
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   743
		if (num_logs(nvroot) > 0)
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   744
			print_vdev_tree(NULL, "logs", nvroot, 0, B_TRUE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   745
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   746
		ret = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   747
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   748
		ret = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   749
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   750
		 * Hand off to libzfs.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   751
		 */
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   752
		if (zpool_create(g_zfs, poolname, nvroot, altroot) == 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   753
			zfs_handle_t *pool = zfs_open(g_zfs, poolname,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   754
			    ZFS_TYPE_FILESYSTEM);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   755
			if (pool != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   756
				if (mountpoint != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   757
					verify(zfs_prop_set(pool,
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   758
					    zfs_prop_to_name(
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
   759
					    ZFS_PROP_MOUNTPOINT),
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   760
					    mountpoint) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   761
				if (zfs_mount(pool, NULL, 0) == 0)
3126
4f4fb617fdd0 PSARC 2006/622 iSCSI/ZFS Integration
ahl
parents: 2926
diff changeset
   762
					ret = zfs_share_nfs(pool);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   763
				zfs_close(pool);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   764
			}
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   765
		} else if (libzfs_errno(g_zfs) == EZFS_INVALIDNAME) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   766
			(void) fprintf(stderr, gettext("pool name may have "
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   767
			    "been omitted\n"));
789
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
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   771
	nvlist_free(nvroot);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   772
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   773
	return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   774
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   775
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   776
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   777
 * zpool destroy <pool>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   778
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   779
 * 	-f	Forcefully unmount any datasets
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   780
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   781
 * Destroy the given pool.  Automatically unmounts any datasets in the pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   782
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   783
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   784
zpool_do_destroy(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   785
{
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   786
	boolean_t force = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   787
	int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   788
	char *pool;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   789
	zpool_handle_t *zhp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   790
	int ret;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   791
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   792
	/* check options */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   793
	while ((c = getopt(argc, argv, "f")) != -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   794
		switch (c) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   795
		case 'f':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   796
			force = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   797
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   798
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   799
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   800
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   801
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   802
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   803
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   804
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   805
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   806
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   807
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   808
	/* check arguments */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   809
	if (argc < 1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   810
		(void) fprintf(stderr, gettext("missing pool argument\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   811
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   812
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   813
	if (argc > 1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   814
		(void) fprintf(stderr, gettext("too many arguments\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   815
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   816
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   817
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   818
	pool = argv[0];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   819
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   820
	if ((zhp = zpool_open_canfail(g_zfs, pool)) == NULL) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   821
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   822
		 * As a special case, check for use of '/' in the name, and
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   823
		 * direct the user to use 'zfs destroy' instead.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   824
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   825
		if (strchr(pool, '/') != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   826
			(void) fprintf(stderr, gettext("use 'zfs destroy' to "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   827
			    "destroy a dataset\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   828
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   829
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   830
3126
4f4fb617fdd0 PSARC 2006/622 iSCSI/ZFS Integration
ahl
parents: 2926
diff changeset
   831
	if (zpool_disable_datasets(zhp, force) != 0) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   832
		(void) fprintf(stderr, gettext("could not destroy '%s': "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   833
		    "could not unmount datasets\n"), zpool_get_name(zhp));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   834
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   835
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   836
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   837
	ret = (zpool_destroy(zhp) != 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   838
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   839
	zpool_close(zhp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   840
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   841
	return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   842
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   843
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   844
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   845
 * zpool export [-f] <pool> ...
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   846
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   847
 *	-f	Forcefully unmount datasets
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   848
 *
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
   849
 * Export the given pools.  By default, the command will attempt to cleanly
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   850
 * unmount any active datasets within the pool.  If the '-f' flag is specified,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   851
 * then the datasets will be forcefully unmounted.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   852
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   853
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   854
zpool_do_export(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   855
{
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   856
	boolean_t force = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   857
	int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   858
	zpool_handle_t *zhp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   859
	int ret;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   860
	int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   861
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   862
	/* check options */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   863
	while ((c = getopt(argc, argv, "f")) != -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   864
		switch (c) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   865
		case 'f':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   866
			force = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   867
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   868
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   869
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   870
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   871
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   872
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   873
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   874
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   875
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   876
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   877
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   878
	/* check arguments */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   879
	if (argc < 1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   880
		(void) fprintf(stderr, gettext("missing pool argument\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   881
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   882
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   883
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   884
	ret = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   885
	for (i = 0; i < argc; i++) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   886
		if ((zhp = zpool_open_canfail(g_zfs, argv[i])) == NULL) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   887
			ret = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   888
			continue;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   889
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   890
3126
4f4fb617fdd0 PSARC 2006/622 iSCSI/ZFS Integration
ahl
parents: 2926
diff changeset
   891
		if (zpool_disable_datasets(zhp, force) != 0) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   892
			ret = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   893
			zpool_close(zhp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   894
			continue;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   895
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   896
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   897
		if (zpool_export(zhp) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   898
			ret = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   899
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   900
		zpool_close(zhp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   901
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   902
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   903
	return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   904
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   905
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   906
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   907
 * Given a vdev configuration, determine the maximum width needed for the device
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   908
 * name column.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   909
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   910
static int
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
   911
max_width(zpool_handle_t *zhp, nvlist_t *nv, int depth, int max)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   912
{
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   913
	char *name = zpool_vdev_name(g_zfs, zhp, nv);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   914
	nvlist_t **child;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   915
	uint_t c, children;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   916
	int ret;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   917
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   918
	if (strlen(name) + depth > max)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   919
		max = strlen(name) + depth;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   920
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
   921
	free(name);
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
   922
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   923
	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_SPARES,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   924
	    &child, &children) == 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   925
		for (c = 0; c < children; c++)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   926
			if ((ret = max_width(zhp, child[c], depth + 2,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   927
			    max)) > max)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   928
				max = ret;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   929
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   930
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   931
	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   932
	    &child, &children) == 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   933
		for (c = 0; c < children; c++)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   934
			if ((ret = max_width(zhp, child[c], depth + 2,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   935
			    max)) > max)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   936
				max = ret;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   937
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
   938
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   939
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   940
	return (max);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   941
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   942
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   943
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   944
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   945
 * Print the configuration of an exported pool.  Iterate over all vdevs in the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   946
 * pool, printing out the name and status for each one.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   947
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   948
void
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   949
print_import_config(const char *name, nvlist_t *nv, int namewidth, int depth,
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   950
    boolean_t print_logs)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   951
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   952
	nvlist_t **child;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   953
	uint_t c, children;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   954
	vdev_stat_t *vs;
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
   955
	char *type, *vname;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   956
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   957
	verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &type) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   958
	if (strcmp(type, VDEV_TYPE_MISSING) == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   959
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   960
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   961
	verify(nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_STATS,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   962
	    (uint64_t **)&vs, &c) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   963
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   964
	(void) printf("\t%*s%-*s", depth, "", namewidth - depth, name);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
   965
	(void) printf("  %s", state_to_name(vs));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   966
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   967
	if (vs->vs_aux != 0) {
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
   968
		(void) printf("  ");
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   969
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   970
		switch (vs->vs_aux) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   971
		case VDEV_AUX_OPEN_FAILED:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   972
			(void) printf(gettext("cannot open"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   973
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   974
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   975
		case VDEV_AUX_BAD_GUID_SUM:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   976
			(void) printf(gettext("missing device"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   977
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   978
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   979
		case VDEV_AUX_NO_REPLICAS:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   980
			(void) printf(gettext("insufficient replicas"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   981
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   982
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   983
		case VDEV_AUX_VERSION_NEWER:
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   984
			(void) printf(gettext("newer version"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   985
			break;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
   986
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
   987
		case VDEV_AUX_ERR_EXCEEDED:
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
   988
			(void) printf(gettext("too many errors"));
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
   989
			break;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
   990
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   991
		default:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   992
			(void) printf(gettext("corrupted data"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   993
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   994
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   995
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   996
	(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   997
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   998
	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   999
	    &child, &children) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1000
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1001
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
  1002
	for (c = 0; c < children; c++) {
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  1003
		uint64_t is_log = B_FALSE;
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  1004
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  1005
		(void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG,
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  1006
		    &is_log);
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  1007
		if ((is_log && !print_logs) || (!is_log && print_logs))
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  1008
			continue;
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  1009
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1010
		vname = zpool_vdev_name(g_zfs, NULL, child[c]);
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
  1011
		print_import_config(vname, child[c],
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  1012
		    namewidth, depth + 2, B_FALSE);
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
  1013
		free(vname);
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
  1014
	}
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1015
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1016
	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_SPARES,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1017
	    &child, &children) != 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1018
		return;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1019
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1020
	(void) printf(gettext("\tspares\n"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1021
	for (c = 0; c < children; c++) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1022
		vname = zpool_vdev_name(g_zfs, NULL, child[c]);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1023
		(void) printf("\t  %s\n", vname);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1024
		free(vname);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1025
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1026
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1027
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1028
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1029
 * Display the status for the given pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1030
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1031
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1032
show_import(nvlist_t *config)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1033
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1034
	uint64_t pool_state;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1035
	vdev_stat_t *vs;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1036
	char *name;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1037
	uint64_t guid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1038
	char *msgid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1039
	nvlist_t *nvroot;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1040
	int reason;
3741
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
  1041
	const char *health;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1042
	uint_t vsc;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1043
	int namewidth;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1044
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1045
	verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1046
	    &name) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1047
	verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1048
	    &guid) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1049
	verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_STATE,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1050
	    &pool_state) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1051
	verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1052
	    &nvroot) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1053
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1054
	verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_STATS,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1055
	    (uint64_t **)&vs, &vsc) == 0);
3741
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
  1056
	health = state_to_health(vs->vs_state);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1057
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1058
	reason = zpool_import_status(config, &msgid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1059
3741
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
  1060
	(void) printf(gettext("  pool: %s\n"), name);
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
  1061
	(void) printf(gettext("    id: %llu\n"), (u_longlong_t)guid);
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
  1062
	(void) printf(gettext(" state: %s"), health);
1631
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1063
	if (pool_state == POOL_STATE_DESTROYED)
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  1064
		(void) printf(gettext(" (DESTROYED)"));
1631
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1065
	(void) printf("\n");
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1066
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1067
	switch (reason) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1068
	case ZPOOL_STATUS_MISSING_DEV_R:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1069
	case ZPOOL_STATUS_MISSING_DEV_NR:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1070
	case ZPOOL_STATUS_BAD_GUID_SUM:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1071
		(void) printf(gettext("status: One or more devices are missing "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1072
		    "from the system.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1073
		break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1074
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1075
	case ZPOOL_STATUS_CORRUPT_LABEL_R:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1076
	case ZPOOL_STATUS_CORRUPT_LABEL_NR:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1077
		(void) printf(gettext("status: One or more devices contains "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1078
		    "corrupted data.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1079
		break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1080
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1081
	case ZPOOL_STATUS_CORRUPT_DATA:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1082
		(void) printf(gettext("status: The pool data is corrupted.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1083
		break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1084
1485
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1387
diff changeset
  1085
	case ZPOOL_STATUS_OFFLINE_DEV:
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1387
diff changeset
  1086
		(void) printf(gettext("status: One or more devices "
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1387
diff changeset
  1087
		    "are offlined.\n"));
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1387
diff changeset
  1088
		break;
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1387
diff changeset
  1089
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1090
	case ZPOOL_STATUS_CORRUPT_POOL:
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1091
		(void) printf(gettext("status: The pool metadata is "
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1092
		    "corrupted.\n"));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1093
		break;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1094
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1095
	case ZPOOL_STATUS_VERSION_OLDER:
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1096
		(void) printf(gettext("status: The pool is formatted using an "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1097
		    "older on-disk version.\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1098
		break;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1099
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1100
	case ZPOOL_STATUS_VERSION_NEWER:
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1101
		(void) printf(gettext("status: The pool is formatted using an "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1102
		    "incompatible version.\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1103
		break;
3975
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1104
	case ZPOOL_STATUS_HOSTID_MISMATCH:
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1105
		(void) printf(gettext("status: The pool was last accessed by "
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1106
		    "another system.\n"));
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1107
		break;
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  1108
	case ZPOOL_STATUS_FAULTED_DEV_R:
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  1109
	case ZPOOL_STATUS_FAULTED_DEV_NR:
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  1110
		(void) printf(gettext("status: One or more devices are "
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  1111
		    "faulted.\n"));
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  1112
		break;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  1113
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1114
	default:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1115
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1116
		 * No other status can be seen when importing pools.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1117
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1118
		assert(reason == ZPOOL_STATUS_OK);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1119
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1120
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1121
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1122
	 * Print out an action according to the overall state of the pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1123
	 */
3741
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
  1124
	if (vs->vs_state == VDEV_STATE_HEALTHY) {
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1125
		if (reason == ZPOOL_STATUS_VERSION_OLDER)
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1126
			(void) printf(gettext("action: The pool can be "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1127
			    "imported using its name or numeric identifier, "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1128
			    "though\n\tsome features will not be available "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1129
			    "without an explicit 'zpool upgrade'.\n"));
3975
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1130
		else if (reason == ZPOOL_STATUS_HOSTID_MISMATCH)
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1131
			(void) printf(gettext("action: The pool can be "
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1132
			    "imported using its name or numeric "
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1133
			    "identifier and\n\tthe '-f' flag.\n"));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1134
		else
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1135
			(void) printf(gettext("action: The pool can be "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1136
			    "imported using its name or numeric "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1137
			    "identifier.\n"));
3741
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
  1138
	} else if (vs->vs_state == VDEV_STATE_DEGRADED) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1139
		(void) printf(gettext("action: The pool can be imported "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1140
		    "despite missing or damaged devices.  The\n\tfault "
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1141
		    "tolerance of the pool may be compromised if imported.\n"));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1142
	} else {
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1143
		switch (reason) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1144
		case ZPOOL_STATUS_VERSION_NEWER:
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1145
			(void) printf(gettext("action: The pool cannot be "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1146
			    "imported.  Access the pool on a system running "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1147
			    "newer\n\tsoftware, or recreate the pool from "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1148
			    "backup.\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1149
			break;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1150
		case ZPOOL_STATUS_MISSING_DEV_R:
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1151
		case ZPOOL_STATUS_MISSING_DEV_NR:
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1152
		case ZPOOL_STATUS_BAD_GUID_SUM:
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1153
			(void) printf(gettext("action: The pool cannot be "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1154
			    "imported. Attach the missing\n\tdevices and try "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1155
			    "again.\n"));
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1156
			break;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1157
		default:
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1158
			(void) printf(gettext("action: The pool cannot be "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1159
			    "imported due to damaged devices or data.\n"));
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1160
		}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1161
	}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1162
3741
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
  1163
	/*
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
  1164
	 * If the state is "closed" or "can't open", and the aux state
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
  1165
	 * is "corrupt data":
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
  1166
	 */
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
  1167
	if (((vs->vs_state == VDEV_STATE_CLOSED) ||
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
  1168
	    (vs->vs_state == VDEV_STATE_CANT_OPEN)) &&
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
  1169
	    (vs->vs_aux == VDEV_AUX_CORRUPT_DATA)) {
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1170
		if (pool_state == POOL_STATE_DESTROYED)
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1171
			(void) printf(gettext("\tThe pool was destroyed, "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1172
			    "but can be imported using the '-Df' flags.\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1173
		else if (pool_state != POOL_STATE_EXPORTED)
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1174
			(void) printf(gettext("\tThe pool may be active on "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1175
			    "on another system, but can be imported using\n\t"
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1176
			    "the '-f' flag.\n"));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1177
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1178
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1179
	if (msgid != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1180
		(void) printf(gettext("   see: http://www.sun.com/msg/%s\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1181
		    msgid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1182
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1183
	(void) printf(gettext("config:\n\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1184
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
  1185
	namewidth = max_width(NULL, nvroot, 0, 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1186
	if (namewidth < 10)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1187
		namewidth = 10;
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  1188
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  1189
	print_import_config(name, nvroot, namewidth, 0, B_FALSE);
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  1190
	if (num_logs(nvroot) > 0) {
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  1191
		(void) printf(gettext("\tlogs\n"));
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  1192
		print_import_config(name, nvroot, namewidth, 0, B_TRUE);
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  1193
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1194
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1195
	if (reason == ZPOOL_STATUS_BAD_GUID_SUM) {
3741
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
  1196
		(void) printf(gettext("\n\tAdditional devices are known to "
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1197
		    "be part of this pool, though their\n\texact "
3741
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
  1198
		    "configuration cannot be determined.\n"));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1199
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1200
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1201
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1202
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1203
 * Perform the import for the given configuration.  This passes the heavy
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1204
 * lifting off to zpool_import(), and then mounts the datasets contained within
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1205
 * the pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1206
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1207
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1208
do_import(nvlist_t *config, const char *newname, const char *mntopts,
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1209
    const char *altroot, int force, nvlist_t *props)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1210
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1211
	zpool_handle_t *zhp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1212
	char *name;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1213
	uint64_t state;
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1214
	uint64_t version;
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1215
	int error = 0;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1216
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1217
	verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1218
	    &name) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1219
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1220
	verify(nvlist_lookup_uint64(config,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1221
	    ZPOOL_CONFIG_POOL_STATE, &state) == 0);
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1222
	verify(nvlist_lookup_uint64(config,
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1223
	    ZPOOL_CONFIG_VERSION, &version) == 0);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1224
	if (version > ZFS_VERSION) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1225
		(void) fprintf(stderr, gettext("cannot import '%s': pool "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1226
		    "is formatted using a newer ZFS version\n"), name);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1227
		return (1);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  1228
	} else if (state != POOL_STATE_EXPORTED && !force) {
3975
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1229
		uint64_t hostid;
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1230
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1231
		if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_HOSTID,
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1232
		    &hostid) == 0) {
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1233
			if ((unsigned long)hostid != gethostid()) {
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1234
				char *hostname;
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1235
				uint64_t timestamp;
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1236
				time_t t;
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1237
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1238
				verify(nvlist_lookup_string(config,
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1239
				    ZPOOL_CONFIG_HOSTNAME, &hostname) == 0);
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1240
				verify(nvlist_lookup_uint64(config,
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1241
				    ZPOOL_CONFIG_TIMESTAMP, &timestamp) == 0);
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1242
				t = timestamp;
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1243
				(void) fprintf(stderr, gettext("cannot import "
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1244
				    "'%s': pool may be in use from other "
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1245
				    "system, it was last accessed by %s "
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1246
				    "(hostid: 0x%lx) on %s"), name, hostname,
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1247
				    (unsigned long)hostid,
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1248
				    asctime(localtime(&t)));
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1249
				(void) fprintf(stderr, gettext("use '-f' to "
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1250
				    "import anyway\n"));
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1251
				return (1);
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1252
			}
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1253
		} else {
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1254
			(void) fprintf(stderr, gettext("cannot import '%s': "
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1255
			    "pool may be in use from other system\n"), name);
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1256
			(void) fprintf(stderr, gettext("use '-f' to import "
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1257
			    "anyway\n"));
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1258
			return (1);
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
  1259
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1260
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1261
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1262
	if (zpool_import(g_zfs, config, newname, altroot) != 0)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1263
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1264
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1265
	if (newname != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1266
		name = (char *)newname;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1267
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1268
	verify((zhp = zpool_open(g_zfs, name)) != NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1269
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1270
	if (props) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1271
		nvpair_t *pair = nvlist_next_nvpair(props, NULL);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1272
		char *value;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1273
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1274
		if (pair != NULL) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1275
			do {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1276
				verify((nvpair_value_string(pair,
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1277
				    &value)) == 0);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1278
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1279
				if ((error = zpool_set_prop(zhp,
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1280
				    nvpair_name(pair), value)) != 0)
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1281
					break;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1282
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1283
			} while (pair = nvlist_next_nvpair(props, pair));
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1284
		}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1285
	}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1286
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1287
3126
4f4fb617fdd0 PSARC 2006/622 iSCSI/ZFS Integration
ahl
parents: 2926
diff changeset
  1288
	if (zpool_enable_datasets(zhp, mntopts, 0) != 0) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1289
		zpool_close(zhp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1290
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1291
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1292
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1293
	zpool_close(zhp);
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1294
	return (error);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1295
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1296
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1297
/*
1631
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1298
 * zpool import [-d dir] [-D]
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1299
 *       import [-R root] [-D] [-d dir] [-f] -a
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1300
 *       import [-R root] [-D] [-d dir] [-f] <pool | id> [newpool]
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1301
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1302
 *       -d	Scan in a specific directory, other than /dev/dsk.  More than
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1303
 *		one directory can be specified using multiple '-d' options.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1304
 *
1631
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1305
 *       -D     Scan for previously destroyed pools or import all or only
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1306
 *              specified destroyed pools.
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1307
 *
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1308
 *       -R	Temporarily import the pool, with all mountpoints relative to
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1309
 *		the given root.  The pool will remain exported when the machine
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1310
 *		is rebooted.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1311
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1312
 *       -f	Force import, even if it appears that the pool is active.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1313
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1314
 *       -a	Import all pools found.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1315
 *
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1316
 *       -o	temporary mount options.
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1317
 *
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1318
 *       -p	property=value
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1319
 *
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1320
 * The import command scans for pools to import, and import pools based on pool
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1321
 * name and GUID.  The pool can also be renamed as part of the import process.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1322
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1323
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1324
zpool_do_import(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1325
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1326
	char **searchdirs = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1327
	int nsearch = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1328
	int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1329
	int err;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1330
	nvlist_t *pools;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1331
	boolean_t do_all = B_FALSE;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1332
	boolean_t do_destroyed = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1333
	char *altroot = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1334
	char *mntopts = NULL;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1335
	boolean_t do_force = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1336
	nvpair_t *elem;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1337
	nvlist_t *config;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1338
	uint64_t searchguid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1339
	char *searchname;
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1340
	char *propname;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1341
	char *propval, *strval;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1342
	nvlist_t *found_config;
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1343
	nvlist_t *props = NULL;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1344
	boolean_t first;
1631
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1345
	uint64_t pool_state;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1346
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1347
	/* check options */
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1348
	while ((c = getopt(argc, argv, ":Dfd:R:ao:p:")) != -1) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1349
		switch (c) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1350
		case 'a':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1351
			do_all = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1352
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1353
		case 'd':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1354
			if (searchdirs == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1355
				searchdirs = safe_malloc(sizeof (char *));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1356
			} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1357
				char **tmp = safe_malloc((nsearch + 1) *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1358
				    sizeof (char *));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1359
				bcopy(searchdirs, tmp, nsearch *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1360
				    sizeof (char *));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1361
				free(searchdirs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1362
				searchdirs = tmp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1363
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1364
			searchdirs[nsearch++] = optarg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1365
			break;
1631
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1366
		case 'D':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1367
			do_destroyed = B_TRUE;
1631
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1368
			break;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1369
		case 'f':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1370
			do_force = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1371
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1372
		case 'o':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1373
			mntopts = optarg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1374
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1375
		case 'R':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1376
			altroot = optarg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1377
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1378
		case ':':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1379
			(void) fprintf(stderr, gettext("missing argument for "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1380
			    "'%c' option\n"), optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1381
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1382
			break;
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1383
		case 'p':
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1384
			if (props == NULL &&
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1385
			    nvlist_alloc(&props, NV_UNIQUE_NAME, 0) != 0) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1386
				(void) fprintf(stderr,
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1387
				    gettext("internal error: "
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1388
				    "out of memory\n"));
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1389
				err = B_TRUE;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1390
				goto error;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1391
			}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1392
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1393
			propname = optarg;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1394
			if ((propval = strchr(propname, '=')) == NULL) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1395
				(void) fprintf(stderr, gettext("missing "
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1396
				    "'=' for -o option\n"));
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1397
				err = B_TRUE;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1398
				goto error;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1399
			}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1400
			*propval = '\0';
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1401
			propval++;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1402
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1403
			if (zpool_name_to_prop(propname) == ZFS_PROP_INVAL) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1404
				(void) fprintf(stderr,
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1405
				    gettext("property '%s' is "
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1406
				    "not a valid pool property\n"), propname);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1407
				err = B_TRUE;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1408
				goto error;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1409
			}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1410
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1411
			if (nvlist_lookup_string(props, propname,
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1412
			    &strval) == 0) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1413
				(void) fprintf(stderr, gettext("property '%s' "
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1414
				    "specified multiple times\n"), propname);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1415
				err = B_TRUE;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1416
				goto error;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1417
			}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1418
			if (nvlist_add_string(props, propname, propval) != 0) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1419
				(void) fprintf(stderr, gettext("internal "
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1420
				    "error: out of memory\n"));
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1421
				err = B_TRUE;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1422
				goto error;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1423
			}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1424
			break;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1425
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1426
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1427
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1428
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1429
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1430
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1431
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1432
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1433
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1434
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1435
	if (searchdirs == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1436
		searchdirs = safe_malloc(sizeof (char *));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1437
		searchdirs[0] = "/dev/dsk";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1438
		nsearch = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1439
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1440
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1441
	/* check argument count */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1442
	if (do_all) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1443
		if (argc != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1444
			(void) fprintf(stderr, gettext("too many arguments\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1445
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1446
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1447
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1448
		if (argc > 2) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1449
			(void) fprintf(stderr, gettext("too many arguments\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1450
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1451
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1452
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1453
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1454
		 * Check for the SYS_CONFIG privilege.  We do this explicitly
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1455
		 * here because otherwise any attempt to discover pools will
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1456
		 * silently fail.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1457
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1458
		if (argc == 0 && !priv_ineffect(PRIV_SYS_CONFIG)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1459
			(void) fprintf(stderr, gettext("cannot "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1460
			    "discover pools: permission denied\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1461
			free(searchdirs);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1462
			return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1463
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1464
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1465
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1466
	if ((pools = zpool_find_import(g_zfs, nsearch, searchdirs)) == NULL) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1467
		free(searchdirs);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1468
		return (1);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1469
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1470
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1471
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1472
	 * We now have a list of all available pools in the given directories.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1473
	 * Depending on the arguments given, we do one of the following:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1474
	 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1475
	 *	<none>	Iterate through all pools and display information about
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1476
	 *		each one.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1477
	 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1478
	 *	-a	Iterate through all pools and try to import each one.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1479
	 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1480
	 *	<id>	Find the pool that corresponds to the given GUID/pool
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1481
	 *		name and import that one.
1631
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1482
	 *
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1483
	 *	-D	Above options applies only to destroyed pools.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1484
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1485
	if (argc != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1486
		char *endptr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1487
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1488
		errno = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1489
		searchguid = strtoull(argv[0], &endptr, 10);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1490
		if (errno != 0 || *endptr != '\0')
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1491
			searchname = argv[0];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1492
		else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1493
			searchname = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1494
		found_config = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1495
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1496
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1497
	err = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1498
	elem = NULL;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1499
	first = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1500
	while ((elem = nvlist_next_nvpair(pools, elem)) != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1501
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1502
		verify(nvpair_value_nvlist(elem, &config) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1503
1631
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1504
		verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_STATE,
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1505
		    &pool_state) == 0);
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1506
		if (!do_destroyed && pool_state == POOL_STATE_DESTROYED)
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1507
			continue;
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1508
		if (do_destroyed && pool_state != POOL_STATE_DESTROYED)
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1509
			continue;
39011550a5d7 PSARC/2006/082 zpool import destroyed pools
darrenm
parents: 1613
diff changeset
  1510
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1511
		if (argc == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1512
			if (first)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1513
				first = B_FALSE;
2474
c001ad7e0c25 6368751 libzfs interface for mount/umounting all the file systems for a given pool
eschrock
parents: 2142
diff changeset
  1514
			else if (!do_all)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1515
				(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1516
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1517
			if (do_all)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1518
				err |= do_import(config, NULL, mntopts,
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1519
				    altroot, do_force, props);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1520
			else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1521
				show_import(config);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1522
		} else if (searchname != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1523
			char *name;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1524
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1525
			/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1526
			 * We are searching for a pool based on name.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1527
			 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1528
			verify(nvlist_lookup_string(config,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1529
			    ZPOOL_CONFIG_POOL_NAME, &name) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1530
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1531
			if (strcmp(name, searchname) == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1532
				if (found_config != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1533
					(void) fprintf(stderr, gettext(
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1534
					    "cannot import '%s': more than "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1535
					    "one matching pool\n"), searchname);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1536
					(void) fprintf(stderr, gettext(
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1537
					    "import by numeric ID instead\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1538
					err = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1539
				}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1540
				found_config = config;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1541
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1542
		} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1543
			uint64_t guid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1544
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1545
			/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1546
			 * Search for a pool by guid.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1547
			 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1548
			verify(nvlist_lookup_uint64(config,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1549
			    ZPOOL_CONFIG_POOL_GUID, &guid) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1550
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1551
			if (guid == searchguid)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1552
				found_config = config;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1553
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1554
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1555
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1556
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1557
	 * If we were searching for a specific pool, verify that we found a
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1558
	 * pool, and then do the import.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1559
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1560
	if (argc != 0 && err == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1561
		if (found_config == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1562
			(void) fprintf(stderr, gettext("cannot import '%s': "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1563
			    "no such pool available\n"), argv[0]);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1564
			err = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1565
		} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1566
			err |= do_import(found_config, argc == 1 ? NULL :
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1567
			    argv[1], mntopts, altroot, do_force, props);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1568
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1569
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1570
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1571
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1572
	 * If we were just looking for pools, report an error if none were
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1573
	 * found.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1574
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1575
	if (argc == 0 && first)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1576
		(void) fprintf(stderr,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1577
		    gettext("no pools available to import\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1578
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1579
error:
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1580
	if (props)
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  1581
		nvlist_free(props);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1582
	nvlist_free(pools);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1583
	free(searchdirs);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1584
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1585
	return (err ? 1 : 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1586
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1587
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1588
typedef struct iostat_cbdata {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1589
	zpool_list_t *cb_list;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1590
	int cb_verbose;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1591
	int cb_iteration;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1592
	int cb_namewidth;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1593
} iostat_cbdata_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1594
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1595
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1596
print_iostat_separator(iostat_cbdata_t *cb)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1597
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1598
	int i = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1599
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1600
	for (i = 0; i < cb->cb_namewidth; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1601
		(void) printf("-");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1602
	(void) printf("  -----  -----  -----  -----  -----  -----\n");
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
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1606
print_iostat_header(iostat_cbdata_t *cb)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1607
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1608
	(void) printf("%*s     capacity     operations    bandwidth\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1609
	    cb->cb_namewidth, "");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1610
	(void) printf("%-*s   used  avail   read  write   read  write\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1611
	    cb->cb_namewidth, "pool");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1612
	print_iostat_separator(cb);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1613
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1614
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1615
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1616
 * Display a single statistic.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1617
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1618
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1619
print_one_stat(uint64_t value)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1620
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1621
	char buf[64];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1622
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1623
	zfs_nicenum(value, buf, sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1624
	(void) printf("  %5s", buf);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1625
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1626
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1627
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1628
 * Print out all the statistics for the given vdev.  This can either be the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1629
 * toplevel configuration, or called recursively.  If 'name' is NULL, then this
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1630
 * is a verbose output, and we don't want to display the toplevel pool stats.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1631
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1632
void
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
  1633
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
  1634
    nvlist_t *newnv, iostat_cbdata_t *cb, int depth)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1635
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1636
	nvlist_t **oldchild, **newchild;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1637
	uint_t c, children;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1638
	vdev_stat_t *oldvs, *newvs;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1639
	vdev_stat_t zerovs = { 0 };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1640
	uint64_t tdelta;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1641
	double scale;
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
  1642
	char *vname;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1643
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1644
	if (oldnv != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1645
		verify(nvlist_lookup_uint64_array(oldnv, ZPOOL_CONFIG_STATS,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1646
		    (uint64_t **)&oldvs, &c) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1647
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1648
		oldvs = &zerovs;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1649
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1650
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1651
	verify(nvlist_lookup_uint64_array(newnv, ZPOOL_CONFIG_STATS,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1652
	    (uint64_t **)&newvs, &c) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1653
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1654
	if (strlen(name) + depth > cb->cb_namewidth)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1655
		(void) printf("%*s%s", depth, "", name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1656
	else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1657
		(void) printf("%*s%s%*s", depth, "", name,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1658
		    (int)(cb->cb_namewidth - strlen(name) - depth), "");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1659
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1660
	tdelta = newvs->vs_timestamp - oldvs->vs_timestamp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1661
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1662
	if (tdelta == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1663
		scale = 1.0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1664
	else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1665
		scale = (double)NANOSEC / tdelta;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1666
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1667
	/* only toplevel vdevs have capacity stats */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1668
	if (newvs->vs_space == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1669
		(void) printf("      -      -");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1670
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1671
		print_one_stat(newvs->vs_alloc);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1672
		print_one_stat(newvs->vs_space - newvs->vs_alloc);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1673
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1674
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1675
	print_one_stat((uint64_t)(scale * (newvs->vs_ops[ZIO_TYPE_READ] -
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1676
	    oldvs->vs_ops[ZIO_TYPE_READ])));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1677
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1678
	print_one_stat((uint64_t)(scale * (newvs->vs_ops[ZIO_TYPE_WRITE] -
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1679
	    oldvs->vs_ops[ZIO_TYPE_WRITE])));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1680
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1681
	print_one_stat((uint64_t)(scale * (newvs->vs_bytes[ZIO_TYPE_READ] -
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1682
	    oldvs->vs_bytes[ZIO_TYPE_READ])));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1683
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1684
	print_one_stat((uint64_t)(scale * (newvs->vs_bytes[ZIO_TYPE_WRITE] -
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1685
	    oldvs->vs_bytes[ZIO_TYPE_WRITE])));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1686
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1687
	(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1688
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1689
	if (!cb->cb_verbose)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1690
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1691
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1692
	if (nvlist_lookup_nvlist_array(newnv, ZPOOL_CONFIG_CHILDREN,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1693
	    &newchild, &children) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1694
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1695
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1696
	if (oldnv && nvlist_lookup_nvlist_array(oldnv, ZPOOL_CONFIG_CHILDREN,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1697
	    &oldchild, &c) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1698
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1699
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
  1700
	for (c = 0; c < children; c++) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1701
		vname = zpool_vdev_name(g_zfs, zhp, newchild[c]);
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
  1702
		print_vdev_stats(zhp, vname, oldnv ? oldchild[c] : NULL,
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
  1703
		    newchild[c], cb, depth + 2);
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
  1704
		free(vname);
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
  1705
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1706
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1707
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1708
static int
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1709
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
  1710
{
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1711
	iostat_cbdata_t *cb = data;
2142
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
  1712
	boolean_t missing;
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1713
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1714
	/*
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1715
	 * 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
  1716
	 */
2142
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
  1717
	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
  1718
		return (-1);
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
  1719
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
  1720
	if (missing)
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1721
		pool_list_remove(cb->cb_list, zhp);
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1722
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1723
	return (0);
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1724
}
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1725
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1726
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1727
 * Callback to print out the iostats for the given pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1728
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1729
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1730
print_iostat(zpool_handle_t *zhp, void *data)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1731
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1732
	iostat_cbdata_t *cb = data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1733
	nvlist_t *oldconfig, *newconfig;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1734
	nvlist_t *oldnvroot, *newnvroot;
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1735
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1736
	newconfig = zpool_get_config(zhp, &oldconfig);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1737
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1738
	if (cb->cb_iteration == 1)
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1739
		oldconfig = NULL;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1740
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1741
	verify(nvlist_lookup_nvlist(newconfig, ZPOOL_CONFIG_VDEV_TREE,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1742
	    &newnvroot) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1743
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1744
	if (oldconfig == NULL)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1745
		oldnvroot = NULL;
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1746
	else
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1747
		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
  1748
		    &oldnvroot) == 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1749
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1750
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1751
	 * Print out the statistics for the pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1752
	 */
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
  1753
	print_vdev_stats(zhp, zpool_get_name(zhp), oldnvroot, newnvroot, cb, 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1754
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1755
	if (cb->cb_verbose)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1756
		print_iostat_separator(cb);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1757
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1758
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1759
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1760
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1761
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1762
get_namewidth(zpool_handle_t *zhp, void *data)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1763
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1764
	iostat_cbdata_t *cb = data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1765
	nvlist_t *config, *nvroot;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1766
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1767
	if ((config = zpool_get_config(zhp, NULL)) != NULL) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1768
		verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1769
		    &nvroot) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1770
		if (!cb->cb_verbose)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1771
			cb->cb_namewidth = strlen(zpool_get_name(zhp));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1772
		else
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
  1773
			cb->cb_namewidth = max_width(zhp, nvroot, 0, 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1774
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1775
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1776
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1777
	 * The width must fall into the range [10,38].  The upper limit is the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1778
	 * maximum we can have and still fit in 80 columns.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1779
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1780
	if (cb->cb_namewidth < 10)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1781
		cb->cb_namewidth = 10;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1782
	if (cb->cb_namewidth > 38)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1783
		cb->cb_namewidth = 38;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1784
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1785
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1786
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1787
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1788
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1789
 * zpool iostat [-v] [pool] ... [interval [count]]
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1790
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1791
 *	-v	Display statistics for individual vdevs
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1792
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1793
 * This command can be tricky because we want to be able to deal with pool
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1794
 * creation/destruction as well as vdev configuration changes.  The bulk of this
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1795
 * processing is handled by the pool_list_* routines in zpool_iter.c.  We rely
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1796
 * on pool_list_update() to detect the addition of new pools.  Configuration
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1797
 * changes are all handled within libzfs.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1798
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1799
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1800
zpool_do_iostat(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1801
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1802
	int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1803
	int ret;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1804
	int npools;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1805
	unsigned long interval = 0, count = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1806
	zpool_list_t *list;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1807
	boolean_t verbose = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1808
	iostat_cbdata_t cb;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1809
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1810
	/* check options */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1811
	while ((c = getopt(argc, argv, "v")) != -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1812
		switch (c) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1813
		case 'v':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1814
			verbose = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1815
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1816
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1817
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1818
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1819
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1820
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1821
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1822
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1823
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1824
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1825
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1826
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1827
	 * Determine if the last argument is an integer or a pool name
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1828
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1829
	if (argc > 0 && isdigit(argv[argc - 1][0])) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1830
		char *end;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1831
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1832
		errno = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1833
		interval = strtoul(argv[argc - 1], &end, 10);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1834
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1835
		if (*end == '\0' && errno == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1836
			if (interval == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1837
				(void) fprintf(stderr, gettext("interval "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1838
				    "cannot be zero\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1839
				usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1840
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1841
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1842
			/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1843
			 * Ignore the last parameter
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1844
			 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1845
			argc--;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1846
		} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1847
			/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1848
			 * If this is not a valid number, just plow on.  The
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1849
			 * user will get a more informative error message later
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1850
			 * on.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1851
			 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1852
			interval = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1853
		}
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
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1857
	 * If the last argument is also an integer, then we have both a count
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1858
	 * and an integer.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1859
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1860
	if (argc > 0 && isdigit(argv[argc - 1][0])) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1861
		char *end;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1862
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1863
		errno = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1864
		count = interval;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1865
		interval = strtoul(argv[argc - 1], &end, 10);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1866
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1867
		if (*end == '\0' && errno == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1868
			if (interval == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1869
				(void) fprintf(stderr, gettext("interval "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1870
				    "cannot be zero\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1871
				usage(B_FALSE);
789
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
			 * Ignore the last parameter
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1876
			 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1877
			argc--;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1878
		} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1879
			interval = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1880
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1881
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1882
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1883
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1884
	 * Construct the list of all interesting pools.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1885
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1886
	ret = 0;
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  1887
	if ((list = pool_list_get(argc, argv, NULL, &ret)) == NULL)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1888
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1889
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1890
	if (pool_list_count(list) == 0 && argc != 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1891
		pool_list_free(list);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1892
		return (1);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1893
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1894
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1895
	if (pool_list_count(list) == 0 && interval == 0) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1896
		pool_list_free(list);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1897
		(void) fprintf(stderr, gettext("no pools available\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1898
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1899
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1900
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1901
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1902
	 * Enter the main iostat loop.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1903
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1904
	cb.cb_list = list;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1905
	cb.cb_verbose = verbose;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1906
	cb.cb_iteration = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1907
	cb.cb_namewidth = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1908
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1909
	for (;;) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1910
		pool_list_update(list);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1911
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1912
		if ((npools = pool_list_count(list)) == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1913
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1914
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1915
		/*
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1916
		 * 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
  1917
		 * 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
  1918
		 * configuration changes are properly accounted for.
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1919
		 */
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1920
		(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
  1921
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  1922
		/*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1923
		 * Iterate over all pools to determine the maximum width
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1924
		 * for the pool / device name column across all pools.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1925
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1926
		cb.cb_namewidth = 0;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1927
		(void) pool_list_iter(list, B_FALSE, get_namewidth, &cb);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1928
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1929
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1930
		 * If it's the first time, or verbose mode, print the header.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1931
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1932
		if (++cb.cb_iteration == 1 || verbose)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1933
			print_iostat_header(&cb);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1934
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1935
		(void) pool_list_iter(list, B_FALSE, print_iostat, &cb);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1936
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1937
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1938
		 * If there's more than one pool, and we're not in verbose mode
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1939
		 * (which prints a separator for us), then print a separator.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1940
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1941
		if (npools > 1 && !verbose)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1942
			print_iostat_separator(&cb);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1943
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1944
		if (verbose)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1945
			(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1946
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3126
diff changeset
  1947
		/*
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3126
diff changeset
  1948
		 * Flush the output so that redirection to a file isn't buffered
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3126
diff changeset
  1949
		 * indefinitely.
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3126
diff changeset
  1950
		 */
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3126
diff changeset
  1951
		(void) fflush(stdout);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3126
diff changeset
  1952
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1953
		if (interval == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1954
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1955
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1956
		if (count != 0 && --count == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1957
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1958
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1959
		(void) sleep(interval);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1960
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1961
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1962
	pool_list_free(list);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1963
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1964
	return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1965
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1966
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1967
typedef struct list_cbdata {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1968
	boolean_t	cb_scripted;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1969
	boolean_t	cb_first;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1970
	int		cb_fields[MAX_FIELDS];
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  1971
	int		cb_fieldcount;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1972
} list_cbdata_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1973
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1974
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1975
 * Given a list of columns to display, output appropriate headers for each one.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1976
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1977
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1978
print_header(int *fields, size_t count)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1979
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1980
	int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1981
	column_def_t *col;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1982
	const char *fmt;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1983
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1984
	for (i = 0; i < count; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1985
		col = &column_table[fields[i]];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1986
		if (i != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1987
			(void) printf("  ");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1988
		if (col->cd_justify == left_justify)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1989
			fmt = "%-*s";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1990
		else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1991
			fmt = "%*s";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1992
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1993
		(void) printf(fmt, i == count - 1 ? strlen(col->cd_title) :
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1994
		    col->cd_width, col->cd_title);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1995
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1996
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1997
	(void) printf("\n");
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
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2001
list_callback(zpool_handle_t *zhp, void *data)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2002
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2003
	list_cbdata_t *cbp = data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2004
	nvlist_t *config;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2005
	int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2006
	char buf[ZPOOL_MAXNAMELEN];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2007
	uint64_t total;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2008
	uint64_t used;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2009
	const char *fmt;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2010
	column_def_t *col;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2011
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2012
	if (cbp->cb_first) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2013
		if (!cbp->cb_scripted)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2014
			print_header(cbp->cb_fields, cbp->cb_fieldcount);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2015
		cbp->cb_first = 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
	if (zpool_get_state(zhp) == POOL_STATE_UNAVAIL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2019
		config = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2020
	} else {
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  2021
		config = zpool_get_config(zhp, NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2022
		total = zpool_get_space_total(zhp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2023
		used = zpool_get_space_used(zhp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2024
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2025
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2026
	for (i = 0; i < cbp->cb_fieldcount; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2027
		if (i != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2028
			if (cbp->cb_scripted)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2029
				(void) printf("\t");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2030
			else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2031
				(void) printf("  ");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2032
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2033
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2034
		col = &column_table[cbp->cb_fields[i]];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2035
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2036
		switch (cbp->cb_fields[i]) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2037
		case ZPOOL_FIELD_NAME:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2038
			(void) strlcpy(buf, zpool_get_name(zhp), sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2039
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2040
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2041
		case ZPOOL_FIELD_SIZE:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2042
			if (config == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2043
				(void) strlcpy(buf, "-", sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2044
			else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2045
				zfs_nicenum(total, buf, sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2046
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2047
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2048
		case ZPOOL_FIELD_USED:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2049
			if (config == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2050
				(void) strlcpy(buf, "-", sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2051
			else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2052
				zfs_nicenum(used, buf, sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2053
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2054
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2055
		case ZPOOL_FIELD_AVAILABLE:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2056
			if (config == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2057
				(void) strlcpy(buf, "-", sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2058
			else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2059
				zfs_nicenum(total - used, buf, sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2060
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2061
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2062
		case ZPOOL_FIELD_CAPACITY:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2063
			if (config == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2064
				(void) strlcpy(buf, "-", sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2065
			} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2066
				uint64_t capacity = (total == 0 ? 0 :
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2067
				    (used * 100 / total));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2068
				(void) snprintf(buf, sizeof (buf), "%llu%%",
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2731
diff changeset
  2069
				    (u_longlong_t)capacity);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2070
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2071
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2072
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2073
		case ZPOOL_FIELD_HEALTH:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2074
			if (config == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2075
				(void) strlcpy(buf, "FAULTED", sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2076
			} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2077
				nvlist_t *nvroot;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2078
				vdev_stat_t *vs;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2079
				uint_t vsc;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2080
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2081
				verify(nvlist_lookup_nvlist(config,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2082
				    ZPOOL_CONFIG_VDEV_TREE, &nvroot) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2083
				verify(nvlist_lookup_uint64_array(nvroot,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2084
				    ZPOOL_CONFIG_STATS, (uint64_t **)&vs,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2085
				    &vsc) == 0);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2086
				(void) strlcpy(buf, state_to_name(vs),
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2087
				    sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2088
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2089
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2090
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2091
		case ZPOOL_FIELD_ROOT:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2092
			if (config == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2093
				(void) strlcpy(buf, "-", sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2094
			else if (zpool_get_root(zhp, buf, sizeof (buf)) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2095
				(void) strlcpy(buf, "-", sizeof (buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2096
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2097
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2098
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2099
		if (cbp->cb_scripted)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2100
			(void) printf("%s", buf);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2101
		else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2102
			if (col->cd_justify == left_justify)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2103
				fmt = "%-*s";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2104
			else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2105
				fmt = "%*s";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2106
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2107
			(void) printf(fmt, i == cbp->cb_fieldcount - 1 ?
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2108
			    strlen(buf) : col->cd_width, buf);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2109
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2110
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2111
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2112
	(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2113
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2114
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2115
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2116
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2117
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2118
 * zpool list [-H] [-o field[,field]*] [pool] ...
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2119
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2120
 *	-H	Scripted mode.  Don't display headers, and separate fields by
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2121
 *		a single tab.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2122
 *	-o	List of fields to display.  Defaults to all fields, or
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2123
 *		"name,size,used,available,capacity,health,root"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2124
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2125
 * List all pools in the system, whether or not they're healthy.  Output space
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2126
 * statistics for each one, as well as health status summary.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2127
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2128
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2129
zpool_do_list(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2130
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2131
	int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2132
	int ret;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2133
	list_cbdata_t cb = { 0 };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2134
	static char default_fields[] =
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2135
	    "name,size,used,available,capacity,health,root";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2136
	char *fields = default_fields;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2137
	char *value;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2138
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2139
	/* check options */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2140
	while ((c = getopt(argc, argv, ":Ho:")) != -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2141
		switch (c) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2142
		case 'H':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2143
			cb.cb_scripted = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2144
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2145
		case 'o':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2146
			fields = optarg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2147
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2148
		case ':':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2149
			(void) fprintf(stderr, gettext("missing argument for "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2150
			    "'%c' option\n"), optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2151
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2152
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2153
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2154
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2155
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2156
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2157
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2158
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2159
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2160
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2161
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2162
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2163
	while (*fields != '\0') {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2164
		if (cb.cb_fieldcount == MAX_FIELDS) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2165
			(void) fprintf(stderr, gettext("too many "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2166
			    "properties given to -o option\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2167
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2168
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2169
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2170
		if ((cb.cb_fields[cb.cb_fieldcount] = getsubopt(&fields,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2171
		    column_subopts, &value)) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2172
			(void) fprintf(stderr, gettext("invalid property "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2173
			    "'%s'\n"), value);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2174
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2175
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2176
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2177
		cb.cb_fieldcount++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2178
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2179
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2180
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2181
	cb.cb_first = B_TRUE;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2182
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  2183
	ret = for_each_pool(argc, argv, B_TRUE, NULL, list_callback, &cb);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2184
4221
50b4bab9766b 6540584 zfs list command should not produce "no datasets available" message in script mode
mmusante
parents: 3975
diff changeset
  2185
	if (argc == 0 && cb.cb_first && !cb.cb_scripted) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2186
		(void) printf(gettext("no pools available\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2187
		return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2188
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2189
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2190
	return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2191
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2192
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2193
static nvlist_t *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2194
zpool_get_vdev_by_name(nvlist_t *nv, char *name)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2195
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2196
	nvlist_t **child;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2197
	uint_t c, children;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2198
	nvlist_t *match;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2199
	char *path;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2200
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2201
	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2202
	    &child, &children) != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2203
		verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2204
		if (strncmp(name, "/dev/dsk/", 9) == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2205
			name += 9;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2206
		if (strncmp(path, "/dev/dsk/", 9) == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2207
			path += 9;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2208
		if (strcmp(name, path) == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2209
			return (nv);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2210
		return (NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2211
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2212
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2213
	for (c = 0; c < children; c++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2214
		if ((match = zpool_get_vdev_by_name(child[c], name)) != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2215
			return (match);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2216
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2217
	return (NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2218
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2219
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2220
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2221
zpool_do_attach_or_replace(int argc, char **argv, int replacing)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2222
{
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2223
	boolean_t force = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2224
	int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2225
	nvlist_t *nvroot;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2226
	char *poolname, *old_disk, *new_disk;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2227
	zpool_handle_t *zhp;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2228
	int ret;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2229
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2230
	/* check options */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2231
	while ((c = getopt(argc, argv, "f")) != -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2232
		switch (c) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2233
		case 'f':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2234
			force = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2235
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2236
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2237
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2238
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2239
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2240
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2241
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2242
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2243
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2244
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2245
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2246
	/* get pool name and check number of arguments */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2247
	if (argc < 1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2248
		(void) fprintf(stderr, gettext("missing pool name argument\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
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2254
	if (argc < 2) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2255
		(void) fprintf(stderr,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2256
		    gettext("missing <device> specification\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2257
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2258
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2259
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2260
	old_disk = argv[1];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2261
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2262
	if (argc < 3) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2263
		if (!replacing) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2264
			(void) fprintf(stderr,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2265
			    gettext("missing <new_device> specification\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2266
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2267
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2268
		new_disk = old_disk;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2269
		argc -= 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2270
		argv += 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2271
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2272
		new_disk = argv[2];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2273
		argc -= 2;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2274
		argv += 2;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2275
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2276
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2277
	if (argc > 1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2278
		(void) fprintf(stderr, gettext("too many arguments\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2279
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2280
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2281
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2282
	if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2283
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2284
4276
c42d49ffb16f 6385547 zpool create of a mirror using a device and a slice of a device (of same size) reports an error
taylor
parents: 4221
diff changeset
  2285
	if (zpool_get_config(zhp, NULL) == NULL) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2286
		(void) fprintf(stderr, gettext("pool '%s' is unavailable\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2287
		    poolname);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2288
		zpool_close(zhp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2289
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2290
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2291
4276
c42d49ffb16f 6385547 zpool create of a mirror using a device and a slice of a device (of same size) reports an error
taylor
parents: 4221
diff changeset
  2292
	nvroot = make_root_vdev(zhp, force, B_FALSE, replacing, argc, argv);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2293
	if (nvroot == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2294
		zpool_close(zhp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2295
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2296
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2297
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2298
	ret = zpool_vdev_attach(zhp, old_disk, new_disk, nvroot, replacing);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2299
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2300
	nvlist_free(nvroot);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2301
	zpool_close(zhp);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2302
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2303
	return (ret);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2304
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2305
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2306
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2307
 * zpool replace [-f] <pool> <device> <new_device>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2308
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2309
 *	-f	Force attach, even if <new_device> appears to be in use.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2310
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2311
 * Replace <device> with <new_device>.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2312
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2313
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2314
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2315
zpool_do_replace(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2316
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2317
	return (zpool_do_attach_or_replace(argc, argv, B_TRUE));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2318
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2319
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2320
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2321
 * zpool attach [-f] <pool> <device> <new_device>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2322
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2323
 *	-f	Force attach, even if <new_device> appears to be in use.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2324
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2325
 * Attach <new_device> to the mirror containing <device>.  If <device> is not
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2326
 * part of a mirror, then <device> will be transformed into a mirror of
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2327
 * <device> and <new_device>.  In either case, <new_device> will begin life
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2328
 * with a DTL of [0, now], and will immediately begin to resilver itself.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2329
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2330
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2331
zpool_do_attach(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2332
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2333
	return (zpool_do_attach_or_replace(argc, argv, B_FALSE));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2334
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2335
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2336
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2337
 * zpool detach [-f] <pool> <device>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2338
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2339
 *	-f	Force detach of <device>, even if DTLs argue against it
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2340
 *		(not supported yet)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2341
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2342
 * Detach a device from a mirror.  The operation will be refused if <device>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2343
 * is the last device in the mirror, or if the DTLs indicate that this device
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2344
 * has the only valid copy of some data.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2345
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2346
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2347
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2348
zpool_do_detach(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2349
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2350
	int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2351
	char *poolname, *path;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2352
	zpool_handle_t *zhp;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2353
	int ret;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2354
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2355
	/* check options */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2356
	while ((c = getopt(argc, argv, "f")) != -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2357
		switch (c) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2358
		case 'f':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2359
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2360
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2361
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2362
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2363
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2364
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2365
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2366
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2367
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2368
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2369
	/* get pool name and check number of arguments */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2370
	if (argc < 1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2371
		(void) fprintf(stderr, gettext("missing pool name argument\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2372
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2373
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2374
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2375
	if (argc < 2) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2376
		(void) fprintf(stderr,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2377
		    gettext("missing <device> specification\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2378
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2379
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2380
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2381
	poolname = argv[0];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2382
	path = argv[1];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2383
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2384
	if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2385
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2386
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2387
	ret = zpool_vdev_detach(zhp, path);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2388
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2389
	zpool_close(zhp);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2390
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2391
	return (ret);
789
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
/*
1485
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1387
diff changeset
  2395
 * zpool online <pool> <device> ...
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2396
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2397
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2398
zpool_do_online(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2399
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2400
	int c, i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2401
	char *poolname;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2402
	zpool_handle_t *zhp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2403
	int ret = 0;
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2404
	vdev_state_t newstate;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2405
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2406
	/* check options */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2407
	while ((c = getopt(argc, argv, "t")) != -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2408
		switch (c) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2409
		case 't':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2410
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2411
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2412
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2413
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2414
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2415
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2416
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2417
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2418
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2419
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2420
	/* get pool name and check number of arguments */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2421
	if (argc < 1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2422
		(void) fprintf(stderr, gettext("missing pool name\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2423
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2424
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2425
	if (argc < 2) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2426
		(void) fprintf(stderr, gettext("missing device name\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2427
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2428
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2429
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2430
	poolname = argv[0];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2431
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2432
	if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2433
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2434
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2435
	for (i = 1; i < argc; i++) {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2436
		if (zpool_vdev_online(zhp, argv[i], 0, &newstate) == 0) {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2437
			if (newstate != VDEV_STATE_HEALTHY) {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2438
				(void) printf(gettext("warning: device '%s' "
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2439
				    "onlined, but remains in faulted state\n"),
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2440
				    argv[i]);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2441
				if (newstate == VDEV_STATE_FAULTED)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2442
					(void) printf(gettext("use 'zpool "
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2443
					    "clear' to restore a faulted "
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2444
					    "device\n"));
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2445
				else
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2446
					(void) printf(gettext("use 'zpool "
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2447
					    "replace' to replace devices "
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2448
					    "that are no longer present\n"));
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2449
			}
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2450
		} else {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2451
			ret = 1;
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2452
		}
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2453
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2454
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2455
	zpool_close(zhp);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2456
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2457
	return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2458
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2459
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2460
/*
1485
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1387
diff changeset
  2461
 * zpool offline [-ft] <pool> <device> ...
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2462
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2463
 *	-f	Force the device into the offline state, even if doing
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2464
 *		so would appear to compromise pool availability.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2465
 *		(not supported yet)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2466
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2467
 *	-t	Only take the device off-line temporarily.  The offline
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2468
 *		state will not be persistent across reboots.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2469
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2470
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2471
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2472
zpool_do_offline(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2473
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2474
	int c, i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2475
	char *poolname;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2476
	zpool_handle_t *zhp;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2477
	int ret = 0;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2478
	boolean_t istmp = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2479
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2480
	/* check options */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2481
	while ((c = getopt(argc, argv, "ft")) != -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2482
		switch (c) {
1485
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1387
diff changeset
  2483
		case 't':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2484
			istmp = B_TRUE;
1485
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1387
diff changeset
  2485
			break;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2486
		case 'f':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2487
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2488
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2489
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2490
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2491
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2492
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2493
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2494
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2495
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2496
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2497
	/* get pool name and check number of arguments */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2498
	if (argc < 1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2499
		(void) fprintf(stderr, gettext("missing pool name\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2500
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2501
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2502
	if (argc < 2) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2503
		(void) fprintf(stderr, gettext("missing device name\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2504
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2505
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2506
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2507
	poolname = argv[0];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2508
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2509
	if ((zhp = zpool_open(g_zfs, poolname)) == NULL)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2510
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2511
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2512
	for (i = 1; i < argc; i++) {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2513
		if (zpool_vdev_offline(zhp, argv[i], istmp) != 0)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2514
			ret = 1;
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2515
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2516
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2517
	zpool_close(zhp);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2518
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2519
	return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2520
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2521
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2522
/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2523
 * zpool clear <pool> [device]
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2524
 *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2525
 * Clear all errors associated with a pool or a particular device.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2526
 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2527
int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2528
zpool_do_clear(int argc, char **argv)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2529
{
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2530
	int ret = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2531
	zpool_handle_t *zhp;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2532
	char *pool, *device;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2533
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2534
	if (argc < 2) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2535
		(void) fprintf(stderr, gettext("missing pool name\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2536
		usage(B_FALSE);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2537
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2538
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2539
	if (argc > 3) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2540
		(void) fprintf(stderr, gettext("too many arguments\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2541
		usage(B_FALSE);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2542
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2543
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2544
	pool = argv[1];
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2545
	device = argc == 3 ? argv[2] : NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2546
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2547
	if ((zhp = zpool_open(g_zfs, pool)) == NULL)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2548
		return (1);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2549
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2550
	if (zpool_clear(zhp, device) != 0)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2551
		ret = 1;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2552
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2553
	zpool_close(zhp);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2554
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2555
	return (ret);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2556
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2557
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2558
typedef struct scrub_cbdata {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2559
	int	cb_type;
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  2560
	int	cb_argc;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  2561
	char	**cb_argv;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2562
} scrub_cbdata_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2563
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2564
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2565
scrub_callback(zpool_handle_t *zhp, void *data)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2566
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2567
	scrub_cbdata_t *cb = data;
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  2568
	int err;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2569
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2570
	/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2571
	 * Ignore faulted pools.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2572
	 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2573
	if (zpool_get_state(zhp) == POOL_STATE_UNAVAIL) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2574
		(void) fprintf(stderr, gettext("cannot scrub '%s': pool is "
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2575
		    "currently unavailable\n"), zpool_get_name(zhp));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2576
		return (1);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2577
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2578
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  2579
	err = zpool_scrub(zhp, cb->cb_type);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  2580
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  2581
	return (err != 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2582
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2583
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2584
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2585
 * zpool scrub [-s] <pool> ...
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2586
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2587
 *	-s	Stop.  Stops any in-progress scrub.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2588
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2589
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2590
zpool_do_scrub(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2591
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2592
	int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2593
	scrub_cbdata_t cb;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2594
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2595
	cb.cb_type = POOL_SCRUB_EVERYTHING;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2596
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2597
	/* check options */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2598
	while ((c = getopt(argc, argv, "s")) != -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2599
		switch (c) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2600
		case 's':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2601
			cb.cb_type = POOL_SCRUB_NONE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2602
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2603
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2604
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2605
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2606
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2607
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2608
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2609
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  2610
	cb.cb_argc = argc;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  2611
	cb.cb_argv = argv;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2612
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2613
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2614
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2615
	if (argc < 1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2616
		(void) fprintf(stderr, gettext("missing pool name argument\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2617
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2618
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2619
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  2620
	return (for_each_pool(argc, argv, B_TRUE, NULL, scrub_callback, &cb));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2621
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2622
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2623
typedef struct status_cbdata {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2624
	int		cb_count;
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
  2625
	boolean_t	cb_allpools;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2626
	boolean_t	cb_verbose;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2627
	boolean_t	cb_explain;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2628
	boolean_t	cb_first;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2629
} status_cbdata_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2630
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2631
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2632
 * Print out detailed scrub status.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2633
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2634
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2635
print_scrub_status(nvlist_t *nvroot)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2636
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2637
	vdev_stat_t *vs;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2638
	uint_t vsc;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2639
	time_t start, end, now;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2640
	double fraction_done;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2641
	uint64_t examined, total, minutes_left;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2642
	char *scrub_type;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2643
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2644
	verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_STATS,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2645
	    (uint64_t **)&vs, &vsc) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2646
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2647
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2648
	 * If there's never been a scrub, there's not much to say.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2649
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2650
	if (vs->vs_scrub_end == 0 && vs->vs_scrub_type == POOL_SCRUB_NONE) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2651
		(void) printf(gettext("none requested\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2652
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2653
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2654
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2655
	scrub_type = (vs->vs_scrub_type == POOL_SCRUB_RESILVER) ?
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2656
	    "resilver" : "scrub";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2657
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2658
	start = vs->vs_scrub_start;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2659
	end = vs->vs_scrub_end;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2660
	now = time(NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2661
	examined = vs->vs_scrub_examined;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2662
	total = vs->vs_alloc;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2663
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2664
	if (end != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2665
		(void) printf(gettext("%s %s with %llu errors on %s"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2666
		    scrub_type, vs->vs_scrub_complete ? "completed" : "stopped",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2667
		    (u_longlong_t)vs->vs_scrub_errors, ctime(&end));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2668
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2669
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2670
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2671
	if (examined == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2672
		examined = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2673
	if (examined > total)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2674
		total = examined;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2675
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2676
	fraction_done = (double)examined / total;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2677
	minutes_left = (uint64_t)((now - start) *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2678
	    (1 - fraction_done) / fraction_done / 60);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2679
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2680
	(void) printf(gettext("%s in progress, %.2f%% done, %lluh%um to go\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2681
	    scrub_type, 100 * fraction_done,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2682
	    (u_longlong_t)(minutes_left / 60), (uint_t)(minutes_left % 60));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2683
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2684
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2685
typedef struct spare_cbdata {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2686
	uint64_t	cb_guid;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2687
	zpool_handle_t	*cb_zhp;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2688
} spare_cbdata_t;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2689
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2690
static boolean_t
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2691
find_vdev(nvlist_t *nv, uint64_t search)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2692
{
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2693
	uint64_t guid;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2694
	nvlist_t **child;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2695
	uint_t c, children;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2696
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2697
	if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &guid) == 0 &&
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2698
	    search == guid)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2699
		return (B_TRUE);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2700
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2701
	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2702
	    &child, &children) == 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2703
		for (c = 0; c < children; c++)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2704
			if (find_vdev(child[c], search))
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2705
				return (B_TRUE);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2706
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2707
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2708
	return (B_FALSE);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2709
}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2710
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2711
static int
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2712
find_spare(zpool_handle_t *zhp, void *data)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2713
{
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2714
	spare_cbdata_t *cbp = data;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2715
	nvlist_t *config, *nvroot;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2716
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2717
	config = zpool_get_config(zhp, NULL);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2718
	verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2719
	    &nvroot) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2720
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2721
	if (find_vdev(nvroot, cbp->cb_guid)) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2722
		cbp->cb_zhp = zhp;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2723
		return (1);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2724
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2725
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2726
	zpool_close(zhp);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2727
	return (0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2728
}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2729
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2730
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2731
 * Print out configuration state as requested by status_callback.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2732
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2733
void
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
  2734
print_status_config(zpool_handle_t *zhp, const char *name, nvlist_t *nv,
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2735
    int namewidth, int depth, boolean_t isspare, boolean_t print_logs)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2736
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2737
	nvlist_t **child;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2738
	uint_t c, children;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2739
	vdev_stat_t *vs;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2740
	char rbuf[6], wbuf[6], cbuf[6], repaired[7];
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
  2741
	char *vname;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2742
	uint64_t notpresent;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2743
	spare_cbdata_t cb;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2744
	const char *state;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2745
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2746
	verify(nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_STATS,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2747
	    (uint64_t **)&vs, &c) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2748
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2749
	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2750
	    &child, &children) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2751
		children = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2752
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2753
	state = state_to_name(vs);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2754
	if (isspare) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2755
		/*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2756
		 * For hot spares, we use the terms 'INUSE' and 'AVAILABLE' for
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2757
		 * online drives.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2758
		 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2759
		if (vs->vs_aux == VDEV_AUX_SPARED)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2760
			state = "INUSE";
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2761
		else if (vs->vs_state == VDEV_STATE_HEALTHY)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2762
			state = "AVAIL";
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2763
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2764
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2765
	(void) printf("\t%*s%-*s  %-8s", depth, "", namewidth - depth,
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2766
	    name, state);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2767
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2768
	if (!isspare) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2769
		zfs_nicenum(vs->vs_read_errors, rbuf, sizeof (rbuf));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2770
		zfs_nicenum(vs->vs_write_errors, wbuf, sizeof (wbuf));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2771
		zfs_nicenum(vs->vs_checksum_errors, cbuf, sizeof (cbuf));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2772
		(void) printf(" %5s %5s %5s", rbuf, wbuf, cbuf);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2773
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2774
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2775
	if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2776
	    &notpresent) == 0) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2777
		char *path;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2778
		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
  2779
		(void) printf("  was %s", path);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2780
	} else if (vs->vs_aux != 0) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2781
		(void) printf("  ");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2782
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2783
		switch (vs->vs_aux) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2784
		case VDEV_AUX_OPEN_FAILED:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2785
			(void) printf(gettext("cannot open"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2786
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2787
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2788
		case VDEV_AUX_BAD_GUID_SUM:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2789
			(void) printf(gettext("missing device"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2790
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2791
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2792
		case VDEV_AUX_NO_REPLICAS:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2793
			(void) printf(gettext("insufficient replicas"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2794
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2795
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2796
		case VDEV_AUX_VERSION_NEWER:
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  2797
			(void) printf(gettext("newer version"));
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
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2800
		case VDEV_AUX_SPARED:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2801
			verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2802
			    &cb.cb_guid) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2803
			if (zpool_iter(g_zfs, find_spare, &cb) == 1) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2804
				if (strcmp(zpool_get_name(cb.cb_zhp),
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2805
				    zpool_get_name(zhp)) == 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2806
					(void) printf(gettext("currently in "
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2807
					    "use"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2808
				else
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2809
					(void) printf(gettext("in use by "
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2810
					    "pool '%s'"),
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2811
					    zpool_get_name(cb.cb_zhp));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2812
				zpool_close(cb.cb_zhp);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2813
			} else {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2814
				(void) printf(gettext("currently in use"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2815
			}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2816
			break;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2817
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2818
		case VDEV_AUX_ERR_EXCEEDED:
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2819
			(void) printf(gettext("too many errors"));
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2820
			break;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  2821
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2822
		default:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2823
			(void) printf(gettext("corrupted data"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2824
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2825
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2826
	} else if (vs->vs_scrub_repaired != 0 && children == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2827
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2828
		 * Report bytes resilvered/repaired on leaf devices.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2829
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2830
		zfs_nicenum(vs->vs_scrub_repaired, repaired, sizeof (repaired));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2831
		(void) printf(gettext("  %s %s"), repaired,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2832
		    (vs->vs_scrub_type == POOL_SCRUB_RESILVER) ?
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2833
		    "resilvered" : "repaired");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2834
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2835
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2836
	(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2837
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
  2838
	for (c = 0; c < children; c++) {
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2839
		uint64_t is_log = B_FALSE;
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2840
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2841
		(void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG,
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2842
		    &is_log);
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2843
		if ((is_log && !print_logs) || (!is_log && print_logs))
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2844
			continue;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2845
		vname = zpool_vdev_name(g_zfs, zhp, child[c]);
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
  2846
		print_status_config(zhp, vname, child[c],
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2847
		    namewidth, depth + 2, isspare, B_FALSE);
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
  2848
		free(vname);
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 952
diff changeset
  2849
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2850
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2851
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2852
static void
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2853
print_error_log(zpool_handle_t *zhp)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2854
{
3444
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  2855
	nvlist_t *nverrlist;
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  2856
	nvpair_t *elem;
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  2857
	char *pathname;
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  2858
	size_t len = MAXPATHLEN * 2;
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  2859
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  2860
	if (zpool_get_errlog(zhp, &nverrlist) != 0) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2861
		(void) printf("errors: List of errors unavailable "
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2862
		    "(insufficient privileges)\n");
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2863
		return;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2864
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2865
3444
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  2866
	(void) printf("errors: Permanent errors have been "
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  2867
	    "detected in the following files:\n\n");
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  2868
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  2869
	pathname = safe_malloc(len);
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  2870
	elem = NULL;
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  2871
	while ((elem = nvlist_next_nvpair(nverrlist, elem)) != NULL) {
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  2872
		nvlist_t *nv;
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  2873
		uint64_t dsobj, obj;
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  2874
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  2875
		verify(nvpair_value_nvlist(elem, &nv) == 0);
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  2876
		verify(nvlist_lookup_uint64(nv, ZPOOL_ERR_DATASET,
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  2877
		    &dsobj) == 0);
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  2878
		verify(nvlist_lookup_uint64(nv, ZPOOL_ERR_OBJECT,
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  2879
		    &obj) == 0);
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  2880
		zpool_obj_to_path(zhp, dsobj, obj, pathname, len);
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  2881
		(void) printf("%7s %s\n", "", pathname);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2882
	}
3444
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  2883
	free(pathname);
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  2884
	nvlist_free(nverrlist);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2885
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2886
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2887
static void
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2888
print_spares(zpool_handle_t *zhp, nvlist_t **spares, uint_t nspares,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2889
    int namewidth)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2890
{
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2891
	uint_t i;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2892
	char *name;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2893
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2894
	if (nspares == 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2895
		return;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2896
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2897
	(void) printf(gettext("\tspares\n"));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2898
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2899
	for (i = 0; i < nspares; i++) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2900
		name = zpool_vdev_name(g_zfs, zhp, spares[i]);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2901
		print_status_config(zhp, name, spares[i],
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2902
		    namewidth, 2, B_TRUE, B_FALSE);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2903
		free(name);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2904
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2905
}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2906
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2907
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2908
 * Display a summary of pool status.  Displays a summary such as:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2909
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2910
 *        pool: tank
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2911
 *	status: DEGRADED
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2912
 *	reason: One or more devices ...
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2913
 *         see: http://www.sun.com/msg/ZFS-xxxx-01
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2914
 *	config:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2915
 *		mirror		DEGRADED
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2916
 *                c1t0d0	OK
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2917
 *                c2t0d0	UNAVAIL
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2918
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2919
 * When given the '-v' option, we print out the complete config.  If the '-e'
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2920
 * option is specified, then we print out error rate information as well.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2921
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2922
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2923
status_callback(zpool_handle_t *zhp, void *data)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2924
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2925
	status_cbdata_t *cbp = data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2926
	nvlist_t *config, *nvroot;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2927
	char *msgid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2928
	int reason;
3741
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
  2929
	const char *health;
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
  2930
	uint_t c;
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
  2931
	vdev_stat_t *vs;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2932
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 884
diff changeset
  2933
	config = zpool_get_config(zhp, NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2934
	reason = zpool_get_status(zhp, &msgid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2935
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2936
	cbp->cb_count++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2937
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2938
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2939
	 * If we were given 'zpool status -x', only report those pools with
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2940
	 * problems.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2941
	 */
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
  2942
	if (reason == ZPOOL_STATUS_OK && cbp->cb_explain) {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
  2943
		if (!cbp->cb_allpools) {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
  2944
			(void) printf(gettext("pool '%s' is healthy\n"),
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
  2945
			    zpool_get_name(zhp));
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
  2946
			if (cbp->cb_first)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
  2947
				cbp->cb_first = B_FALSE;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
  2948
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2949
		return (0);
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
  2950
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2951
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2952
	if (cbp->cb_first)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  2953
		cbp->cb_first = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2954
	else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2955
		(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2956
3741
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
  2957
	verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
  2958
	    &nvroot) == 0);
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
  2959
	verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_STATS,
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
  2960
	    (uint64_t **)&vs, &c) == 0);
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 3444
diff changeset
  2961
	health = state_to_name(vs);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2962
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2963
	(void) printf(gettext("  pool: %s\n"), zpool_get_name(zhp));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2964
	(void) printf(gettext(" state: %s\n"), health);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2965
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2966
	switch (reason) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2967
	case ZPOOL_STATUS_MISSING_DEV_R:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2968
		(void) printf(gettext("status: One or more devices could not "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2969
		    "be opened.  Sufficient replicas exist for\n\tthe pool to "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2970
		    "continue functioning in a degraded state.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2971
		(void) printf(gettext("action: Attach the missing device and "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2972
		    "online it using 'zpool online'.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2973
		break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2974
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2975
	case ZPOOL_STATUS_MISSING_DEV_NR:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2976
		(void) printf(gettext("status: One or more devices could not "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2977
		    "be opened.  There are insufficient\n\treplicas for the "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2978
		    "pool to continue functioning.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2979
		(void) printf(gettext("action: Attach the missing device and "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2980
		    "online it using 'zpool online'.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2981
		break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2982
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2983
	case ZPOOL_STATUS_CORRUPT_LABEL_R:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2984
		(void) printf(gettext("status: One or more devices could not "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2985
		    "be used because the label is missing or\n\tinvalid.  "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2986
		    "Sufficient replicas exist for the pool to continue\n\t"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2987
		    "functioning in a degraded state.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2988
		(void) printf(gettext("action: Replace the device using "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2989
		    "'zpool replace'.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2990
		break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2991
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2992
	case ZPOOL_STATUS_CORRUPT_LABEL_NR:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2993
		(void) printf(gettext("status: One or more devices could not "
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  2994
		    "be used because the label is missing \n\tor invalid.  "
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2995
		    "There are insufficient replicas for the pool to "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2996
		    "continue\n\tfunctioning.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2997
		(void) printf(gettext("action: Destroy and re-create the pool "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2998
		    "from a backup source.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2999
		break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3000
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3001
	case ZPOOL_STATUS_FAILING_DEV:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3002
		(void) printf(gettext("status: One or more devices has "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3003
		    "experienced an unrecoverable error.  An\n\tattempt was "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3004
		    "made to correct the error.  Applications are "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3005
		    "unaffected.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3006
		(void) printf(gettext("action: Determine if the device needs "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3007
		    "to be replaced, and clear the errors\n\tusing "
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3008
		    "'zpool clear' or replace the device with 'zpool "
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3009
		    "replace'.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3010
		break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3011
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3012
	case ZPOOL_STATUS_OFFLINE_DEV:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3013
		(void) printf(gettext("status: One or more devices has "
3413
f4cbe0204ab7 6471255 Some ZFS error messages contain spelling errors
mmusante
parents: 3377
diff changeset
  3014
		    "been taken offline by the administrator.\n\tSufficient "
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3015
		    "replicas exist for the pool to continue functioning in "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3016
		    "a\n\tdegraded state.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3017
		(void) printf(gettext("action: Online the device using "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3018
		    "'zpool online' or replace the device with\n\t'zpool "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3019
		    "replace'.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3020
		break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3021
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3022
	case ZPOOL_STATUS_RESILVERING:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3023
		(void) printf(gettext("status: One or more devices is "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3024
		    "currently being resilvered.  The pool will\n\tcontinue "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3025
		    "to function, possibly in a degraded state.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3026
		(void) printf(gettext("action: Wait for the resilver to "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3027
		    "complete.\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3028
		break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3029
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3030
	case ZPOOL_STATUS_CORRUPT_DATA:
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3031
		(void) printf(gettext("status: One or more devices has "
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3032
		    "experienced an error resulting in data\n\tcorruption.  "
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3033
		    "Applications may be affected.\n"));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3034
		(void) printf(gettext("action: Restore the file in question "
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3035
		    "if possible.  Otherwise restore the\n\tentire pool from "
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3036
		    "backup.\n"));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3037
		break;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3038
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3039
	case ZPOOL_STATUS_CORRUPT_POOL:
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3040
		(void) printf(gettext("status: The pool metadata is corrupted "
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3041
		    "and the pool cannot be opened.\n"));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3042
		(void) printf(gettext("action: Destroy and re-create the pool "
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3043
		    "from a backup source.\n"));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3044
		break;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3045
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3046
	case ZPOOL_STATUS_VERSION_OLDER:
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3047
		(void) printf(gettext("status: The pool is formatted using an "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3048
		    "older on-disk format.  The pool can\n\tstill be used, but "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3049
		    "some features are unavailable.\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3050
		(void) printf(gettext("action: Upgrade the pool using 'zpool "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3051
		    "upgrade'.  Once this is done, the\n\tpool will no longer "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3052
		    "be accessible on older software versions.\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3053
		break;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3054
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3055
	case ZPOOL_STATUS_VERSION_NEWER:
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3056
		(void) printf(gettext("status: The pool has been upgraded to a "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3057
		    "newer, incompatible on-disk version.\n\tThe pool cannot "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3058
		    "be accessed on this system.\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3059
		(void) printf(gettext("action: Access the pool from a system "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3060
		    "running more recent software, or\n\trestore the pool from "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3061
		    "backup.\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3062
		break;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3063
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  3064
	case ZPOOL_STATUS_FAULTED_DEV_R:
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  3065
		(void) printf(gettext("status: One or more devices are "
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  3066
		    "faulted in response to persistent errors.\n\tSufficient "
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  3067
		    "replicas exist for the pool to continue functioning "
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  3068
		    "in a\n\tdegraded state.\n"));
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  3069
		(void) printf(gettext("action: Replace the faulted device, "
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  3070
		    "or use 'zpool clear' to mark the device\n\trepaired.\n"));
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  3071
		break;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  3072
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  3073
	case ZPOOL_STATUS_FAULTED_DEV_NR:
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  3074
		(void) printf(gettext("status: One or more devices are "
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  3075
		    "faulted in response to persistent errors.  There are "
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  3076
		    "insufficient replicas for the pool to\n\tcontinue "
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  3077
		    "functioning.\n"));
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  3078
		(void) printf(gettext("action: Destroy and re-create the pool "
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  3079
		    "from a backup source.  Manually marking the device\n"
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  3080
		    "\trepaired using 'zpool clear' may allow some data "
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  3081
		    "to be recovered.\n"));
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  3082
		break;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4276
diff changeset
  3083
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3084
	default:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3085
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3086
		 * The remaining errors can't actually be generated, yet.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3087
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3088
		assert(reason == ZPOOL_STATUS_OK);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3089
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3090
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3091
	if (msgid != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3092
		(void) printf(gettext("   see: http://www.sun.com/msg/%s\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3093
		    msgid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3094
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3095
	if (config != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3096
		int namewidth;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3097
		uint64_t nerr;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3098
		nvlist_t **spares;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3099
		uint_t nspares;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3100
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3101
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3102
		(void) printf(gettext(" scrub: "));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3103
		print_scrub_status(nvroot);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3104
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
  3105
		namewidth = max_width(zhp, nvroot, 0, 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3106
		if (namewidth < 10)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3107
			namewidth = 10;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3108
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3109
		(void) printf(gettext("config:\n\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3110
		(void) printf(gettext("\t%-*s  %-8s %5s %5s %5s\n"), namewidth,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3111
		    "NAME", "STATE", "READ", "WRITE", "CKSUM");
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1171
diff changeset
  3112
		print_status_config(zhp, zpool_get_name(zhp), nvroot,
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  3113
		    namewidth, 0, B_FALSE, B_FALSE);
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  3114
		if (num_logs(nvroot) > 0)
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  3115
			print_status_config(zhp, "logs", nvroot, namewidth, 0,
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  3116
			    B_FALSE, B_TRUE);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3117
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3118
		if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3119
		    &spares, &nspares) == 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3120
			print_spares(zhp, spares, nspares, namewidth);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3121
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3122
		if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_ERRCOUNT,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3123
		    &nerr) == 0) {
3444
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  3124
			nvlist_t *nverrlist = NULL;
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  3125
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3126
			/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3127
			 * If the approximate error count is small, get a
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3128
			 * precise count by fetching the entire log and
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3129
			 * uniquifying the results.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3130
			 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3131
			if (nerr < 100 && !cbp->cb_verbose &&
3444
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  3132
			    zpool_get_errlog(zhp, &nverrlist) == 0) {
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  3133
				nvpair_t *elem;
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  3134
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  3135
				elem = NULL;
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  3136
				nerr = 0;
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  3137
				while ((elem = nvlist_next_nvpair(nverrlist,
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  3138
				    elem)) != NULL) {
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  3139
					nerr++;
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  3140
				}
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  3141
			}
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3413
diff changeset
  3142
			nvlist_free(nverrlist);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3143
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3144
			(void) printf("\n");
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3145
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3146
			if (nerr == 0)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3147
				(void) printf(gettext("errors: No known data "
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3148
				    "errors\n"));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3149
			else if (!cbp->cb_verbose)
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
  3150
				(void) printf(gettext("errors: %llu data "
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2731
diff changeset
  3151
				    "errors, use '-v' for a list\n"),
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2731
diff changeset
  3152
				    (u_longlong_t)nerr);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3153
			else
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3154
				print_error_log(zhp);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3155
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3156
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3157
		(void) printf(gettext("config: The configuration cannot be "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3158
		    "determined.\n"));
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
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3162
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3163
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3164
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3165
 * zpool status [-vx] [pool] ...
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3166
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3167
 *	-v	Display complete error logs
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3168
 *	-x	Display only pools with potential problems
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3169
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3170
 * Describes the health status of all pools or some subset.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3171
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3172
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3173
zpool_do_status(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3174
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3175
	int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3176
	int ret;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3177
	status_cbdata_t cb = { 0 };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3178
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3179
	/* check options */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3180
	while ((c = getopt(argc, argv, "vx")) != -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3181
		switch (c) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3182
		case 'v':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3183
			cb.cb_verbose = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3184
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3185
		case 'x':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3186
			cb.cb_explain = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3187
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3188
		case '?':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3189
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3190
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3191
			usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3192
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3193
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3194
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3195
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3196
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3197
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3198
	cb.cb_first = B_TRUE;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3199
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
  3200
	if (argc == 0)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
  3201
		cb.cb_allpools = B_TRUE;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
  3202
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3203
	ret = for_each_pool(argc, argv, B_TRUE, NULL, status_callback, &cb);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3204
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3205
	if (argc == 0 && cb.cb_count == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3206
		(void) printf(gettext("no pools available\n"));
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
  3207
	else if (cb.cb_explain && cb.cb_first && cb.cb_allpools)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2500
diff changeset
  3208
		(void) printf(gettext("all pools are healthy\n"));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3209
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3210
	return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3211
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3212
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3213
typedef struct upgrade_cbdata {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3214
	int	cb_all;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3215
	int	cb_first;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3216
	int	cb_newer;
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3217
	int	cb_argc;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3218
	char	**cb_argv;
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3219
} upgrade_cbdata_t;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3220
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3221
static int
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3222
upgrade_cb(zpool_handle_t *zhp, void *arg)
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3223
{
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3224
	upgrade_cbdata_t *cbp = arg;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3225
	nvlist_t *config;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3226
	uint64_t version;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3227
	int ret = 0;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3228
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3229
	config = zpool_get_config(zhp, NULL);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3230
	verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION,
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3231
	    &version) == 0);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3232
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3233
	if (!cbp->cb_newer && version < ZFS_VERSION) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3234
		if (!cbp->cb_all) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3235
			if (cbp->cb_first) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3236
				(void) printf(gettext("The following pools are "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3237
				    "out of date, and can be upgraded.  After "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3238
				    "being\nupgraded, these pools will no "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3239
				    "longer be accessible by older software "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3240
				    "versions.\n\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3241
				(void) printf(gettext("VER  POOL\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3242
				(void) printf(gettext("---  ------------\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3243
				cbp->cb_first = B_FALSE;
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3244
			}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3245
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2731
diff changeset
  3246
			(void) printf("%2llu   %s\n", (u_longlong_t)version,
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3247
			    zpool_get_name(zhp));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3248
		} else {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3249
			cbp->cb_first = B_FALSE;
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3250
			ret = zpool_upgrade(zhp);
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3251
			if (!ret) {
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3252
				(void) printf(gettext("Successfully upgraded "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3253
				    "'%s'\n"), zpool_get_name(zhp));
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3254
			}
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3255
		}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3256
	} else if (cbp->cb_newer && version > ZFS_VERSION) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3257
		assert(!cbp->cb_all);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3258
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3259
		if (cbp->cb_first) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3260
			(void) printf(gettext("The following pools are "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3261
			    "formatted using a newer software version and\n"
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3262
			    "cannot be accessed on the current system.\n\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3263
			(void) printf(gettext("VER  POOL\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3264
			(void) printf(gettext("---  ------------\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3265
			cbp->cb_first = B_FALSE;
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3266
		}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3267
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2731
diff changeset
  3268
		(void) printf("%2llu   %s\n", (u_longlong_t)version,
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3269
		    zpool_get_name(zhp));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3270
	}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3271
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3272
	zpool_close(zhp);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3273
	return (ret);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3274
}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3275
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3276
/* ARGSUSED */
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3277
static int
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3278
upgrade_one(zpool_handle_t *zhp, void *data)
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3279
{
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3280
	nvlist_t *config;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3281
	uint64_t version;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3282
	int ret;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3283
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3284
	config = zpool_get_config(zhp, NULL);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3285
	verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION,
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3286
	    &version) == 0);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3287
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  3288
	if (strcmp("log", zpool_get_name(zhp)) == 0) {
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  3289
		(void) printf(gettext("'log' is now a reserved word\n"
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  3290
		    "Pool 'log' must be renamed using export and import"
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  3291
		    " to upgrade.\n"));
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  3292
		return (1);
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  3293
	}
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3294
	if (version == ZFS_VERSION) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3295
		(void) printf(gettext("Pool '%s' is already formatted "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3296
		    "using the current version.\n"), zpool_get_name(zhp));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3297
		return (0);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3298
	}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3299
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3300
	ret = zpool_upgrade(zhp);
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3301
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3302
	if (!ret) {
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
  3303
		(void) printf(gettext("Successfully upgraded '%s' "
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
  3304
		    "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
  3305
		    (u_longlong_t)version, (u_longlong_t)ZFS_VERSION);
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3306
	}
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3307
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3308
	return (ret != 0);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3309
}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3310
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3311
/*
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3312
 * zpool upgrade
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3313
 * zpool upgrade -v
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3314
 * zpool upgrade <-a | pool>
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3315
 *
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3316
 * With no arguments, display downrev'd ZFS pool available for upgrade.
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3317
 * Individual pools can be upgraded by specifying the pool, and '-a' will
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3318
 * upgrade all pools.
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3319
 */
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3320
int
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3321
zpool_do_upgrade(int argc, char **argv)
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3322
{
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3323
	int c;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3324
	upgrade_cbdata_t cb = { 0 };
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3325
	int ret = 0;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3326
	boolean_t showversions = B_FALSE;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3327
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3328
	/* check options */
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3329
	while ((c = getopt(argc, argv, "av")) != -1) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3330
		switch (c) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3331
		case 'a':
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3332
			cb.cb_all = B_TRUE;
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3333
			break;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3334
		case 'v':
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3335
			showversions = B_TRUE;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3336
			break;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3337
		case '?':
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3338
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3339
			    optopt);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3340
			usage(B_FALSE);
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3341
		}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3342
	}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3343
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3344
	cb.cb_argc = argc;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3345
	cb.cb_argv = argv;
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3346
	argc -= optind;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3347
	argv += optind;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3348
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3349
	if (showversions) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3350
		if (cb.cb_all || argc != 0) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3351
			(void) fprintf(stderr, gettext("-v option is "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3352
			    "incompatible with other arguments\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3353
			usage(B_FALSE);
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3354
		}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3355
	} else if (cb.cb_all) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3356
		if (argc != 0) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3357
			(void) fprintf(stderr, gettext("-a option is "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3358
			    "incompatible with other arguments\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3359
			usage(B_FALSE);
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3360
		}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3361
	}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3362
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3363
	(void) printf(gettext("This system is currently running ZFS version "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3364
	    "%llu.\n\n"), ZFS_VERSION);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3365
	cb.cb_first = B_TRUE;
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3366
	if (showversions) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3367
		(void) printf(gettext("The following versions are "
3413
f4cbe0204ab7 6471255 Some ZFS error messages contain spelling errors
mmusante
parents: 3377
diff changeset
  3368
		    "supported:\n\n"));
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3369
		(void) printf(gettext("VER  DESCRIPTION\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3370
		(void) printf("---  -----------------------------------------"
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3371
		    "---------------\n");
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3372
		(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
  3373
		(void) printf(gettext(" 2   Ditto blocks "
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
  3374
		    "(replicated metadata)\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3375
		(void) printf(gettext(" 3   Hot spares and double parity "
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3376
		    "RAID-Z\n"));
3863
d56571426115 6529406 zpool history needs to bump the on-disk version
ek110237
parents: 3741
diff changeset
  3377
		(void) printf(gettext(" 4   zpool history\n"));
3886
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3863
diff changeset
  3378
		(void) printf(gettext(" 5   Compression using the gzip "
3291401d66a6 6536602 add zlib compression support and upgrade to version 1.2.3
ahl
parents: 3863
diff changeset
  3379
		    "algorithm\n"));
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3380
		(void) printf(gettext(" 6   pool properties\n"));
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  3381
		(void) printf(gettext(" 7   Separate intent log devices\n"));
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3382
		(void) printf(gettext(" 8   Delegated administration\n"));
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  3383
		(void) printf(gettext("For more information on a particular "
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3384
		    "version, including supported releases, see:\n\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3385
		(void) printf("http://www.opensolaris.org/os/community/zfs/"
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3386
		    "version/N\n\n");
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3387
		(void) printf(gettext("Where 'N' is the version number.\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3388
	} else if (argc == 0) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3389
		int notfound;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3390
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3391
		ret = zpool_iter(g_zfs, upgrade_cb, &cb);
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3392
		notfound = cb.cb_first;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3393
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3394
		if (!cb.cb_all && ret == 0) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3395
			if (!cb.cb_first)
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3396
				(void) printf("\n");
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3397
			cb.cb_first = B_TRUE;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3398
			cb.cb_newer = B_TRUE;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3399
			ret = zpool_iter(g_zfs, upgrade_cb, &cb);
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3400
			if (!cb.cb_first) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3401
				notfound = B_FALSE;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3402
				(void) printf("\n");
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3403
			}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3404
		}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3405
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3406
		if (ret == 0) {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3407
			if (notfound)
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3408
				(void) printf(gettext("All pools are formatted "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3409
				    "using this version.\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3410
			else if (!cb.cb_all)
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3411
				(void) printf(gettext("Use 'zpool upgrade -v' "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3412
				    "for a list of available versions and "
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3413
				    "their associated\nfeatures.\n"));
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3414
		}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3415
	} else {
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3416
		ret = for_each_pool(argc, argv, B_FALSE, NULL,
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3417
		    upgrade_one, &cb);
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3418
	}
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3419
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3420
	return (ret);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3421
}
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3422
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3423
typedef struct hist_cbdata {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3424
	boolean_t first;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3425
	int longfmt;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3426
	int internal;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3427
} hist_cbdata_t;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3428
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3429
char *hist_event_table[LOG_END] = {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3430
	"invalid event",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3431
	"pool create",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3432
	"vdev add",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3433
	"pool remove",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3434
	"pool destroy",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3435
	"pool export",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3436
	"pool import",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3437
	"vdev attach",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3438
	"vdev replace",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3439
	"vdev detach",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3440
	"vdev online",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3441
	"vdev offline",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3442
	"vdev upgrade",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3443
	"pool clear",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3444
	"pool scrub",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3445
	"pool property set",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3446
	"create",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3447
	"clone",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3448
	"destroy",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3449
	"destroy_begin_sync",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3450
	"inherit",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3451
	"property set",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3452
	"quota set",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3453
	"permission update",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3454
	"permission remove",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3455
	"permission who remove",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3456
	"promote",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3457
	"receive",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3458
	"rename",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3459
	"reservation set",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3460
	"replay_inc_sync",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3461
	"replay_full_sync",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3462
	"rollback",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3463
	"snapshot",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3464
};
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3465
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3466
/*
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3467
 * Print out the command history for a specific pool.
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3468
 */
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3469
static int
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3470
get_history_one(zpool_handle_t *zhp, void *data)
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3471
{
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3472
	nvlist_t *nvhis;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3473
	nvlist_t **records;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3474
	uint_t numrecords;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3475
	char *cmdstr;
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3476
	char *pathstr;
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3477
	uint64_t dst_time;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3478
	time_t tsec;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3479
	struct tm t;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3480
	char tbuf[30];
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3481
	int ret, i;
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3482
	uint64_t who;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3483
	struct passwd *pwd;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3484
	char *hostname;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3485
	char *zonename;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3486
	char internalstr[MAXPATHLEN];
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3487
	hist_cbdata_t *cb = (hist_cbdata_t *)data;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3488
	uint64_t txg;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3489
	uint64_t ievent;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3490
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3491
	cb->first = B_FALSE;
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3492
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3493
	(void) printf(gettext("History for '%s':\n"), zpool_get_name(zhp));
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3494
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3495
	if ((ret = zpool_get_history(zhp, &nvhis)) != 0)
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3496
		return (ret);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3497
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3498
	verify(nvlist_lookup_nvlist_array(nvhis, ZPOOL_HIST_RECORD,
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3499
	    &records, &numrecords) == 0);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3500
	for (i = 0; i < numrecords; i++) {
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3501
		if (nvlist_lookup_uint64(records[i], ZPOOL_HIST_TIME,
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3502
		    &dst_time) != 0)
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3503
			continue;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3504
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3505
		/* is it an internal event or a standard event? */
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3506
		if (nvlist_lookup_string(records[i], ZPOOL_HIST_CMD,
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3507
		    &cmdstr) != 0) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3508
			if (cb->internal == 0)
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3509
				continue;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3510
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3511
			if (nvlist_lookup_uint64(records[i],
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3512
			    ZPOOL_HIST_INT_EVENT, &ievent) != 0)
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3513
				continue;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3514
			verify(nvlist_lookup_uint64(records[i],
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3515
			    ZPOOL_HIST_TXG, &txg) == 0);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3516
			verify(nvlist_lookup_string(records[i],
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3517
			    ZPOOL_HIST_INT_STR, &pathstr) == 0);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3518
			if (ievent > LOG_END)
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3519
				continue;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3520
			(void) snprintf(internalstr,
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3521
			    sizeof (internalstr),
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3522
			    "[internal %s txg:%lld] %s",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3523
			    hist_event_table[ievent], txg,
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3524
			    pathstr);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3525
			cmdstr = internalstr;
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3526
		}
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3527
		tsec = dst_time;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3528
		(void) localtime_r(&tsec, &t);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3529
		(void) strftime(tbuf, sizeof (tbuf), "%F.%T", &t);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3530
		(void) printf("%s %s", tbuf, cmdstr);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3531
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3532
		if (!cb->longfmt) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3533
			(void) printf("\n");
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3534
			continue;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3535
		}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3536
		(void) printf(" [");
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3537
		if (nvlist_lookup_uint64(records[i],
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3538
		    ZPOOL_HIST_WHO, &who) == 0) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3539
			pwd = getpwuid((uid_t)who);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3540
			if (pwd)
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3541
				(void) printf("user %s on",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3542
				    pwd->pw_name);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3543
			else
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3544
				(void) printf("user %d on",
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3545
				    (int)who);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3546
		} else {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3547
			(void) printf(gettext("no info]\n"));
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3548
			continue;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3549
		}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3550
		if (nvlist_lookup_string(records[i],
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3551
		    ZPOOL_HIST_HOST, &hostname) == 0) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3552
			(void) printf(" %s", hostname);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3553
		}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3554
		if (nvlist_lookup_string(records[i],
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3555
		    ZPOOL_HIST_ZONE, &zonename) == 0) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3556
			(void) printf(":%s", zonename);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3557
		}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3558
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3559
		(void) printf("]");
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3560
		(void) printf("\n");
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3561
	}
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3562
	(void) printf("\n");
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3563
	nvlist_free(nvhis);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3564
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3565
	return (ret);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3566
}
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3567
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3568
/*
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3569
 * zpool history <pool>
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3570
 *
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3571
 * Displays the history of commands that modified pools.
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3572
 */
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3573
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3574
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3575
int
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3576
zpool_do_history(int argc, char **argv)
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3577
{
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3578
	hist_cbdata_t cbdata = { 0 };
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3579
	int ret;
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3580
	int c;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3581
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3582
	cbdata.first = B_TRUE;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3583
	/* check options */
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3584
	while ((c = getopt(argc, argv, "li")) != -1) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3585
		switch (c) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3586
		case 'l':
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3587
			cbdata.longfmt = 1;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3588
			break;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3589
		case 'i':
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3590
			cbdata.internal = 1;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3591
			break;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3592
		case '?':
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3593
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3594
			    optopt);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3595
			usage(B_FALSE);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3596
		}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3597
	}
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3598
	argc -= optind;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3599
	argv += optind;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3600
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3601
	ret = for_each_pool(argc, argv, B_FALSE,  NULL, get_history_one,
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3602
	    &cbdata);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3603
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3604
	if (argc == 0 && cbdata.first == B_TRUE) {
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3605
		(void) printf(gettext("no pools available\n"));
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
  3606
		return (0);
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3607
	}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3608
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3609
	return (ret);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3610
}
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1631
diff changeset
  3611
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3612
static int
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3613
get_callback(zpool_handle_t *zhp, void *data)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3614
{
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3615
	libzfs_get_cbdata_t *cbp = (libzfs_get_cbdata_t *)data;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3616
	char value[MAXNAMELEN];
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3617
	zfs_source_t srctype;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3618
	zpool_proplist_t *pl;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3619
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3620
	for (pl = cbp->cb_proplist; pl != NULL; pl = pl->pl_next) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3621
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3622
		/*
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3623
		 * Skip the special fake placeholder.
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3624
		 */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3625
		if (pl->pl_prop == ZFS_PROP_NAME &&
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3626
		    pl == cbp->cb_proplist)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3627
			continue;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3628
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3629
		if (zpool_get_prop(zhp, pl->pl_prop,
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3630
		    value, sizeof (value), &srctype) != 0)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3631
			continue;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3632
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3633
		libzfs_print_one_property(zpool_get_name(zhp), cbp,
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3634
		    zpool_prop_to_name(pl->pl_prop), value, srctype, NULL);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3635
	}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3636
	return (0);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3637
}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3638
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3639
int
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3640
zpool_do_get(int argc, char **argv)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3641
{
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3642
	libzfs_get_cbdata_t cb = { 0 };
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3643
	zpool_proplist_t fake_name = { 0 };
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3644
	int ret;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3645
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3646
	if (argc < 3)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3647
		usage(B_FALSE);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3648
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3649
	cb.cb_first = B_TRUE;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3650
	cb.cb_sources = ZFS_SRC_ALL;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3651
	cb.cb_columns[0] = GET_COL_NAME;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3652
	cb.cb_columns[1] = GET_COL_PROPERTY;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3653
	cb.cb_columns[2] = GET_COL_VALUE;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3654
	cb.cb_columns[3] = GET_COL_SOURCE;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3655
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3656
	if (zpool_get_proplist(g_zfs, argv[1],  &cb.cb_proplist) != 0)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3657
		usage(B_FALSE);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3658
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3659
	if (cb.cb_proplist != NULL) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3660
		fake_name.pl_prop = ZFS_PROP_NAME;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3661
		fake_name.pl_width = strlen(gettext("NAME"));
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3662
		fake_name.pl_next = cb.cb_proplist;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3663
		cb.cb_proplist = &fake_name;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3664
	}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3665
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3666
	ret = for_each_pool(argc - 2, argv + 2, B_TRUE, &cb.cb_proplist,
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3667
	    get_callback, &cb);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3668
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3669
	if (cb.cb_proplist == &fake_name)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3670
		zfs_free_proplist(fake_name.pl_next);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3671
	else
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3672
		zfs_free_proplist(cb.cb_proplist);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3673
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3674
	return (ret);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3675
}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3676
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3677
typedef struct set_cbdata {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3678
	char *cb_propname;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3679
	char *cb_value;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3680
	boolean_t cb_any_successful;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3681
} set_cbdata_t;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3682
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3683
int
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3684
set_callback(zpool_handle_t *zhp, void *data)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3685
{
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3686
	int error;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3687
	set_cbdata_t *cb = (set_cbdata_t *)data;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3688
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3689
	error = zpool_set_prop(zhp, cb->cb_propname, cb->cb_value);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3690
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3691
	if (!error)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3692
		cb->cb_any_successful = B_TRUE;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3693
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3694
	return (error);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3695
}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3696
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3697
int
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3698
zpool_do_set(int argc, char **argv)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3699
{
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3700
	set_cbdata_t cb = { 0 };
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3701
	int error;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3702
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3703
	if (argc > 1 && argv[1][0] == '-') {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3704
		(void) fprintf(stderr, gettext("invalid option '%c'\n"),
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3705
		    argv[1][1]);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3706
		usage(B_FALSE);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3707
	}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3708
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3709
	if (argc < 2) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3710
		(void) fprintf(stderr, gettext("missing property=value "
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3711
		    "argument\n"));
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3712
		usage(B_FALSE);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3713
	}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3714
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3715
	if (argc < 3) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3716
		(void) fprintf(stderr, gettext("missing pool name\n"));
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3717
		usage(B_FALSE);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3718
	}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3719
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3720
	if (argc > 3) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3721
		(void) fprintf(stderr, gettext("too many pool names\n"));
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3722
		usage(B_FALSE);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3723
	}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3724
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3725
	cb.cb_propname = argv[1];
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3726
	cb.cb_value = strchr(cb.cb_propname, '=');
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3727
	if (cb.cb_value == NULL) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3728
		(void) fprintf(stderr, gettext("missing value in "
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3729
		    "property=value argument\n"));
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3730
		usage(B_FALSE);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3731
	}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3732
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3733
	*(cb.cb_value) = '\0';
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3734
	cb.cb_value++;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3735
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3736
	error = for_each_pool(argc - 2, argv + 2, B_TRUE, NULL,
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3737
	    set_callback, &cb);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3738
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3739
	return (error);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3740
}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3741
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3742
static int
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3743
find_command_idx(char *command, int *idx)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3744
{
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3745
	int i;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3746
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3747
	for (i = 0; i < NCOMMAND; i++) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3748
		if (command_table[i].name == NULL)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3749
			continue;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3750
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3751
		if (strcmp(command, command_table[i].name) == 0) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3752
			*idx = i;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3753
			return (0);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3754
		}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3755
	}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3756
	return (1);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3757
}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3758
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3759
zpool_prop_t
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3760
propset_cb(zpool_prop_t prop, void *data)
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3761
{
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3762
	char *cmdname = (char *)data;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3763
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3764
	if (strcmp(cmdname, zpool_prop_to_name(prop)) == 0)
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3765
		return (prop);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3766
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3767
	return (ZFS_PROP_CONT);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3768
}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3769
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3770
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3771
main(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3772
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3773
	int ret;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3774
	int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3775
	char *cmdname;
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3776
	boolean_t found = B_FALSE;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3777
	char *str;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3778
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3779
	(void) setlocale(LC_ALL, "");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3780
	(void) textdomain(TEXT_DOMAIN);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3781
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3782
	if ((g_zfs = libzfs_init()) == NULL) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3783
		(void) fprintf(stderr, gettext("internal error: failed to "
2731
2dd6e16860b6 6463349 error message from zpool(1M) is missing a newline
nd150628
parents: 2676
diff changeset
  3784
		    "initialize ZFS library\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3785
		return (1);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3786
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3787
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3788
	libzfs_print_on_error(g_zfs, B_TRUE);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3789
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3790
	opterr = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3791
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3792
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3793
	 * Make sure the user has specified some command.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3794
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3795
	if (argc < 2) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3796
		(void) fprintf(stderr, gettext("missing command\n"));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3797
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3798
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3799
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3800
	cmdname = argv[1];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3801
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3802
	/* Handle special case of pool create for staging history */
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3803
	if (strcmp(cmdname, "create") != 0)
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3804
		zpool_stage_history(g_zfs, argc, argv, B_FALSE, B_FALSE);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3805
	else
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3806
		zpool_stage_history(g_zfs, argc, argv, B_FALSE, B_TRUE);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3807
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3808
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3809
	 * Special case '-?'
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3810
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3811
	if (strcmp(cmdname, "-?") == 0)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3812
		usage(B_TRUE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3813
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3814
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3815
	 * Run the appropriate command.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3816
	 */
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3817
	if (find_command_idx(cmdname, &i) == 0) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3818
		current_command = &command_table[i];
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3886
diff changeset
  3819
		ret = command_table[i].func(argc - 1, argv + 1);
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3820
		found = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3821
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3822
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3823
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3824
	 * 'freeze' is a vile debugging abomination, so we treat it as such.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3825
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3826
	if (strcmp(cmdname, "freeze") == 0 && argc == 3) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3827
		char buf[16384];
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3828
		int fd = open(ZFS_DEV, O_RDWR);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3829
		(void) strcpy((void *)buf, argv[2]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3830
		return (!!ioctl(fd, ZFS_IOC_POOL_FREEZE, buf));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3831
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3832
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3833
	/* is this a zpool property=value */
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3834
	if (found == B_FALSE && ((str = strchr(cmdname, '=')) != NULL)) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3835
		*str = '\0';
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3836
		if (zpool_prop_iter(propset_cb, cmdname,
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3837
		    B_FALSE) != ZFS_PROP_INVAL) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3838
			if (find_command_idx("set", &i) == 0) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3839
				*str = '=';
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3840
				current_command = &command_table[i];
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3841
				ret = command_table[i].func(argc, argv);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3842
				found = B_TRUE;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3843
			}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3844
		}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3845
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3846
		if (found == B_FALSE) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3847
			*str = '=';
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3848
			(void) fprintf(stderr,
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3849
			    gettext("invalid property '%s'\n"), cmdname);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3850
			found = B_TRUE;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3851
		}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3852
	}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3853
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
  3854
	if (found == B_FALSE) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3855
		(void) fprintf(stderr, gettext("unrecognized "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3856
		    "command '%s'\n"), cmdname);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3857
		usage(B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3858
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3859
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3860
	libzfs_fini(g_zfs);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
  3861
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3862
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3863
	 * The 'ZFS_ABORT' environment variable causes us to dump core on exit
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3864
	 * for the purposes of running ::findleaks.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3865
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3866
	if (getenv("ZFS_ABORT") != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3867
		(void) printf("dumping core by request\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3868
		abort();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3869
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3870
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3871
	return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3872
}