usr/src/lib/libzfs/common/libzfs_config.c
author mmusante
Thu, 01 Mar 2007 06:09:49 -0800
changeset 3741 806e933bf124
parent 2676 5cee47eddab6
child 4074 58874e1ba2ef
permissions -rw-r--r--
6441384 zpool import action message is not correctly localized 6473418 setting user defined property on full filesystem should report error 6513953 Unable to create global hotspare in ja locale
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
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 952
diff changeset
     5
 * Common Development and Distribution License (the "License").
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 952
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
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    21
/*
3741
806e933bf124 6441384 zpool import action message is not correctly localized
mmusante
parents: 2676
diff changeset
    22
 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    23
 * Use is subject to license terms.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    24
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    25
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    26
#pragma ident	"%Z%%M%	%I%	%E% SMI"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    27
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    28
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    29
 * The pool configuration repository is stored in /etc/zfs/zpool.cache as a
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    30
 * single packed nvlist.  While it would be nice to just read in this
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    31
 * file from userland, this wouldn't work from a local zone.  So we have to have
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    32
 * a zpool ioctl to return the complete configuration for all pools.  In the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    33
 * global zone, this will be identical to reading the file and unpacking it in
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    34
 * userland.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    35
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    36
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    37
#include <errno.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    38
#include <sys/stat.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    39
#include <fcntl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    40
#include <stddef.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    41
#include <string.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 <libintl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    44
#include <libuutil.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    45
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    46
#include "libzfs_impl.h"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    47
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    48
typedef struct config_node {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    49
	char		*cn_name;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    50
	nvlist_t	*cn_config;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    51
	uu_avl_node_t	cn_avl;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    52
} config_node_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    53
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    54
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    55
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    56
config_node_compare(const void *a, const void *b, void *unused)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    57
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    58
	int ret;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    59
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    60
	const config_node_t *ca = (config_node_t *)a;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    61
	const config_node_t *cb = (config_node_t *)b;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    62
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    63
	ret = strcmp(ca->cn_name, cb->cn_name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    64
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    65
	if (ret < 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    66
		return (-1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    67
	else if (ret > 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    68
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    69
	else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    70
		return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    71
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    72
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    73
void
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    74
namespace_clear(libzfs_handle_t *hdl)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    75
{
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    76
	if (hdl->libzfs_ns_avl) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    77
		uu_avl_walk_t *walk;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    78
		config_node_t *cn;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    79
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    80
		if ((walk = uu_avl_walk_start(hdl->libzfs_ns_avl,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    81
		    UU_WALK_ROBUST)) == NULL)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    82
			return;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    83
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    84
		while ((cn = uu_avl_walk_next(walk)) != NULL) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    85
			uu_avl_remove(hdl->libzfs_ns_avl, cn);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    86
			nvlist_free(cn->cn_config);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    87
			free(cn->cn_name);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    88
			free(cn);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    89
		}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    90
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    91
		uu_avl_walk_end(walk);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    92
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    93
		uu_avl_destroy(hdl->libzfs_ns_avl);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    94
		hdl->libzfs_ns_avl = NULL;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    95
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    96
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    97
	if (hdl->libzfs_ns_avlpool) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    98
		uu_avl_pool_destroy(hdl->libzfs_ns_avlpool);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    99
		hdl->libzfs_ns_avlpool = NULL;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   100
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   101
}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   102
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   103
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   104
 * Loads the pool namespace, or re-loads it if the cache has changed.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   105
 */
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   106
static int
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   107
namespace_reload(libzfs_handle_t *hdl)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   108
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   109
	nvlist_t *config;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   110
	config_node_t *cn;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   111
	nvpair_t *elem;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   112
	zfs_cmd_t zc = { 0 };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   113
	uu_avl_walk_t *walk;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   114
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   115
	if (hdl->libzfs_ns_gen == 0) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   116
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   117
		 * This is the first time we've accessed the configuration
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   118
		 * cache.  Initialize the AVL tree and then fall through to the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   119
		 * common code.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   120
		 */
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   121
		if ((hdl->libzfs_ns_avlpool = uu_avl_pool_create("config_pool",
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   122
		    sizeof (config_node_t),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   123
		    offsetof(config_node_t, cn_avl),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   124
		    config_node_compare, UU_DEFAULT)) == NULL)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   125
			return (no_memory(hdl));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   126
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   127
		if ((hdl->libzfs_ns_avl = uu_avl_create(hdl->libzfs_ns_avlpool,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   128
		    NULL, UU_DEFAULT)) == NULL)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   129
			return (no_memory(hdl));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   130
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   131
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2474
diff changeset
   132
	if (zcmd_alloc_dst_nvlist(hdl, &zc, 0) != 0)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   133
		return (-1);
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2474
diff changeset
   134
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   135
	for (;;) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   136
		zc.zc_cookie = hdl->libzfs_ns_gen;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   137
		if (ioctl(hdl->libzfs_fd, ZFS_IOC_POOL_CONFIGS, &zc) != 0) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   138
			switch (errno) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   139
			case EEXIST:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   140
				/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   141
				 * The namespace hasn't changed.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   142
				 */
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2474
diff changeset
   143
				zcmd_free_nvlists(&zc);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   144
				return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   145
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   146
			case ENOMEM:
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2474
diff changeset
   147
				if (zcmd_expand_dst_nvlist(hdl, &zc) != 0) {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2474
diff changeset
   148
					zcmd_free_nvlists(&zc);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   149
					return (-1);
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2474
diff changeset
   150
				}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   151
				break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   152
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   153
			default:
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2474
diff changeset
   154
				zcmd_free_nvlists(&zc);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   155
				return (zfs_standard_error(hdl, errno,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   156
				    dgettext(TEXT_DOMAIN, "failed to read "
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   157
				    "pool configuration")));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   158
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   159
		} else {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   160
			hdl->libzfs_ns_gen = zc.zc_cookie;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   161
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   162
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   163
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   164
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2474
diff changeset
   165
	if (zcmd_read_dst_nvlist(hdl, &zc, &config) != 0) {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2474
diff changeset
   166
		zcmd_free_nvlists(&zc);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2474
diff changeset
   167
		return (-1);
2142
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
   168
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   169
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2474
diff changeset
   170
	zcmd_free_nvlists(&zc);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   171
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   172
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   173
	 * Clear out any existing configuration information.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   174
	 */
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   175
	if ((walk = uu_avl_walk_start(hdl->libzfs_ns_avl,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   176
	    UU_WALK_ROBUST)) == NULL) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   177
		nvlist_free(config);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   178
		return (no_memory(hdl));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   179
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   180
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   181
	while ((cn = uu_avl_walk_next(walk)) != NULL) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   182
		uu_avl_remove(hdl->libzfs_ns_avl, cn);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   183
		nvlist_free(cn->cn_config);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   184
		free(cn->cn_name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   185
		free(cn);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   186
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   187
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   188
	uu_avl_walk_end(walk);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   189
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   190
	elem = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   191
	while ((elem = nvlist_next_nvpair(config, elem)) != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   192
		nvlist_t *child;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   193
		uu_avl_index_t where;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   194
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   195
		if ((cn = zfs_alloc(hdl, sizeof (config_node_t))) == NULL) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   196
			nvlist_free(config);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   197
			return (-1);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   198
		}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   199
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   200
		if ((cn->cn_name = zfs_strdup(hdl,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   201
		    nvpair_name(elem))) == NULL) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   202
			free(cn);
2474
c001ad7e0c25 6368751 libzfs interface for mount/umounting all the file systems for a given pool
eschrock
parents: 2142
diff changeset
   203
			nvlist_free(config);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   204
			return (-1);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   205
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   206
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   207
		verify(nvpair_value_nvlist(elem, &child) == 0);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   208
		if (nvlist_dup(child, &cn->cn_config, 0) != 0) {
2474
c001ad7e0c25 6368751 libzfs interface for mount/umounting all the file systems for a given pool
eschrock
parents: 2142
diff changeset
   209
			free(cn->cn_name);
c001ad7e0c25 6368751 libzfs interface for mount/umounting all the file systems for a given pool
eschrock
parents: 2142
diff changeset
   210
			free(cn);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   211
			nvlist_free(config);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   212
			return (no_memory(hdl));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   213
		}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   214
		verify(uu_avl_find(hdl->libzfs_ns_avl, cn, NULL, &where)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   215
		    == NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   216
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   217
		uu_avl_insert(hdl->libzfs_ns_avl, cn, where);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   218
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   219
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   220
	nvlist_free(config);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   221
	return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   222
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   223
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   224
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   225
 * Retrive the configuration for the given pool.  The configuration is a nvlist
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   226
 * describing the vdevs, as well as the statistics associated with each one.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   227
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   228
nvlist_t *
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
   229
zpool_get_config(zpool_handle_t *zhp, nvlist_t **oldconfig)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   230
{
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
   231
	if (oldconfig)
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
   232
		*oldconfig = zhp->zpool_old_config;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   233
	return (zhp->zpool_config);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   234
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   235
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   236
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   237
 * Refresh the vdev statistics associated with the given pool.  This is used in
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   238
 * iostat to show configuration changes and determine the delta from the last
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   239
 * time the function was called.  This function can fail, in case the pool has
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   240
 * been destroyed.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   241
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   242
int
2142
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
   243
zpool_refresh_stats(zpool_handle_t *zhp, boolean_t *missing)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   244
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   245
	zfs_cmd_t zc = { 0 };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   246
	int error;
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
   247
	nvlist_t *config;
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2474
diff changeset
   248
	libzfs_handle_t *hdl = zhp->zpool_hdl;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   249
2142
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
   250
	*missing = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   251
	(void) strcpy(zc.zc_name, zhp->zpool_name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   252
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   253
	if (zhp->zpool_config_size == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   254
		zhp->zpool_config_size = 1 << 16;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   255
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2474
diff changeset
   256
	if (zcmd_alloc_dst_nvlist(hdl, &zc, zhp->zpool_config_size) != 0)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   257
		return (-1);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   258
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 952
diff changeset
   259
	for (;;) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   260
		if (ioctl(zhp->zpool_hdl->libzfs_fd, ZFS_IOC_POOL_STATS,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   261
		    &zc) == 0) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   262
			/*
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 952
diff changeset
   263
			 * The real error is returned in the zc_cookie field.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   264
			 */
2142
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
   265
			error = zc.zc_cookie;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   266
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   267
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   268
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 952
diff changeset
   269
		if (errno == ENOMEM) {
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2474
diff changeset
   270
			if (zcmd_expand_dst_nvlist(hdl, &zc) != 0) {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2474
diff changeset
   271
				zcmd_free_nvlists(&zc);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   272
				return (-1);
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2474
diff changeset
   273
			}
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 952
diff changeset
   274
		} else {
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2474
diff changeset
   275
			zcmd_free_nvlists(&zc);
2142
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
   276
			if (errno == ENOENT || errno == EINVAL)
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
   277
				*missing = B_TRUE;
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
   278
			zhp->zpool_state = POOL_STATE_UNAVAIL;
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
   279
			return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   280
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   281
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   282
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2474
diff changeset
   283
	if (zcmd_read_dst_nvlist(hdl, &zc, &config) != 0) {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2474
diff changeset
   284
		zcmd_free_nvlists(&zc);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2474
diff changeset
   285
		return (-1);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   286
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   287
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2474
diff changeset
   288
	zcmd_free_nvlists(&zc);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2474
diff changeset
   289
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2474
diff changeset
   290
	zhp->zpool_config_size = zc.zc_nvlist_dst_size;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   291
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
   292
	if (zhp->zpool_config != NULL) {
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
   293
		uint64_t oldtxg, newtxg;
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
   294
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
   295
		verify(nvlist_lookup_uint64(zhp->zpool_config,
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
   296
		    ZPOOL_CONFIG_POOL_TXG, &oldtxg) == 0);
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
   297
		verify(nvlist_lookup_uint64(config,
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
   298
		    ZPOOL_CONFIG_POOL_TXG, &newtxg) == 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   299
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
   300
		if (zhp->zpool_old_config != NULL)
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
   301
			nvlist_free(zhp->zpool_old_config);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   302
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
   303
		if (oldtxg != newtxg) {
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
   304
			nvlist_free(zhp->zpool_config);
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
   305
			zhp->zpool_old_config = NULL;
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
   306
		} else {
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
   307
			zhp->zpool_old_config = zhp->zpool_config;
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
   308
		}
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
   309
	}
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
   310
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
   311
	zhp->zpool_config = config;
2142
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
   312
	if (error)
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
   313
		zhp->zpool_state = POOL_STATE_UNAVAIL;
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
   314
	else
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
   315
		zhp->zpool_state = POOL_STATE_ACTIVE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   316
2142
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
   317
	return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   318
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   319
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   320
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   321
 * Iterate over all pools in the system.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   322
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   323
int
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   324
zpool_iter(libzfs_handle_t *hdl, zpool_iter_f func, void *data)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   325
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   326
	config_node_t *cn;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   327
	zpool_handle_t *zhp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   328
	int ret;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   329
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   330
	if (namespace_reload(hdl) != 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   331
		return (-1);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   332
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   333
	for (cn = uu_avl_first(hdl->libzfs_ns_avl); cn != NULL;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   334
	    cn = uu_avl_next(hdl->libzfs_ns_avl, cn)) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   335
2142
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
   336
		if (zpool_open_silent(hdl, cn->cn_name, &zhp) != 0)
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
   337
			return (-1);
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
   338
f6e0487aa9a3 6433264 crash when adding spare: nvlist_lookup_string(cnv, "path", &path) == 0
eschrock
parents: 2082
diff changeset
   339
		if (zhp == NULL)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   340
			continue;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   341
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   342
		if ((ret = func(zhp, data)) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   343
			return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   344
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   345
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   346
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   347
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   348
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   349
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   350
 * Iterate over root datasets, calling the given function for each.  The zfs
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   351
 * handle passed each time must be explicitly closed by the callback.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   352
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   353
int
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   354
zfs_iter_root(libzfs_handle_t *hdl, zfs_iter_f func, void *data)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   355
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   356
	config_node_t *cn;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   357
	zfs_handle_t *zhp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   358
	int ret;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   359
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   360
	if (namespace_reload(hdl) != 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   361
		return (-1);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   362
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   363
	for (cn = uu_avl_first(hdl->libzfs_ns_avl); cn != NULL;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   364
	    cn = uu_avl_next(hdl->libzfs_ns_avl, cn)) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   365
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   366
		if ((zhp = make_dataset_handle(hdl, cn->cn_name)) == NULL)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   367
			continue;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   368
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   369
		if ((ret = func(zhp, data)) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   370
			return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   371
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   372
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   373
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   374
}