usr/src/cmd/fm/schemes/zfs/scheme.c
author Garrett D'Amore <garrett@nexenta.com>
Sun, 05 Dec 2010 19:54:51 -0800
changeset 13251 f1dd13f1ef7d
parent 12296 7cf402a7f374
permissions -rw-r--r--
440 fma ZFS scheme fails to consider hot-spares properly Reviewed by: [email protected] Reviewed by: [email protected] Reviewed by: [email protected] Approved by: [email protected]
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
     1
/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
     2
 * CDDL HEADER START
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
     3
 *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
     7
 *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    11
 * and limitations under the License.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    12
 *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    18
 *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    19
 * CDDL HEADER END
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    20
 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    21
/*
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 8021
diff changeset
    22
 * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    23
 */
13251
f1dd13f1ef7d 440 fma ZFS scheme fails to consider hot-spares properly
Garrett D'Amore <garrett@nexenta.com>
parents: 12296
diff changeset
    24
/*
f1dd13f1ef7d 440 fma ZFS scheme fails to consider hot-spares properly
Garrett D'Amore <garrett@nexenta.com>
parents: 12296
diff changeset
    25
 * Copyright 2010 Nexenta Systems, Inc.  All rights reserved.
f1dd13f1ef7d 440 fma ZFS scheme fails to consider hot-spares properly
Garrett D'Amore <garrett@nexenta.com>
parents: 12296
diff changeset
    26
 */
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    27
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    28
#include <fm/fmd_fmri.h>
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    29
#include <strings.h>
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    30
#include <libzfs.h>
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    31
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    32
typedef struct cbdata {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    33
	uint64_t	cb_guid;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    34
	zpool_handle_t	*cb_pool;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    35
} cbdata_t;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    36
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    37
libzfs_handle_t *g_zfs;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    38
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    39
static int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    40
find_pool(zpool_handle_t *zhp, void *data)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    41
{
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    42
	cbdata_t *cbp = data;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    43
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 2082
diff changeset
    44
	if (zpool_get_prop_int(zhp, ZPOOL_PROP_GUID, NULL) == cbp->cb_guid) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    45
		cbp->cb_pool = zhp;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    46
		return (1);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    47
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    48
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    49
	zpool_close(zhp);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    50
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    51
	return (0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    52
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    53
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    54
ssize_t
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    55
fmd_fmri_nvl2str(nvlist_t *nvl, char *buf, size_t buflen)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    56
{
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    57
	uint64_t pool_guid, vdev_guid;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    58
	cbdata_t cb;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    59
	ssize_t len;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    60
	const char *name;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    61
	char guidbuf[64];
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    62
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    63
	(void) nvlist_lookup_uint64(nvl, FM_FMRI_ZFS_POOL, &pool_guid);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    64
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    65
	/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    66
	 * Attempt to convert the pool guid to a name.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    67
	 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    68
	cb.cb_guid = pool_guid;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    69
	cb.cb_pool = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    70
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    71
	if (zpool_iter(g_zfs, find_pool, &cb) == 1) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    72
		name = zpool_get_name(cb.cb_pool);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    73
	} else {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    74
		(void) snprintf(guidbuf, sizeof (guidbuf), "%llx", pool_guid);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    75
		name = guidbuf;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    76
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    77
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    78
	if (nvlist_lookup_uint64(nvl, FM_FMRI_ZFS_VDEV, &vdev_guid) == 0)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    79
		len = snprintf(buf, buflen, "%s://pool=%s/vdev=%llx",
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    80
		    FM_FMRI_SCHEME_ZFS, name, vdev_guid);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    81
	else
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    82
		len = snprintf(buf, buflen, "%s://pool=%s",
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    83
		    FM_FMRI_SCHEME_ZFS, name);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    84
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    85
	if (cb.cb_pool)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    86
		zpool_close(cb.cb_pool);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    87
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    88
	return (len);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    89
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    90
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    91
static nvlist_t *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    92
find_vdev_iter(nvlist_t *nv, uint64_t search)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    93
{
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    94
	uint_t c, children;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    95
	nvlist_t **child;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    96
	uint64_t guid;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    97
	nvlist_t *ret;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    98
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    99
	(void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &guid);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   100
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   101
	if (search == guid)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   102
		return (nv);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   103
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   104
	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
13251
f1dd13f1ef7d 440 fma ZFS scheme fails to consider hot-spares properly
Garrett D'Amore <garrett@nexenta.com>
parents: 12296
diff changeset
   105
	    &child, &children) == 0) {
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 5094
diff changeset
   106
13251
f1dd13f1ef7d 440 fma ZFS scheme fails to consider hot-spares properly
Garrett D'Amore <garrett@nexenta.com>
parents: 12296
diff changeset
   107
		for (c = 0; c < children; c++)
f1dd13f1ef7d 440 fma ZFS scheme fails to consider hot-spares properly
Garrett D'Amore <garrett@nexenta.com>
parents: 12296
diff changeset
   108
			if ((ret = find_vdev_iter(child[c], search)) != 0)
f1dd13f1ef7d 440 fma ZFS scheme fails to consider hot-spares properly
Garrett D'Amore <garrett@nexenta.com>
parents: 12296
diff changeset
   109
				return (ret);
f1dd13f1ef7d 440 fma ZFS scheme fails to consider hot-spares properly
Garrett D'Amore <garrett@nexenta.com>
parents: 12296
diff changeset
   110
	}
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 5094
diff changeset
   111
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 5094
diff changeset
   112
	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_L2CACHE,
13251
f1dd13f1ef7d 440 fma ZFS scheme fails to consider hot-spares properly
Garrett D'Amore <garrett@nexenta.com>
parents: 12296
diff changeset
   113
	    &child, &children) == 0) {
f1dd13f1ef7d 440 fma ZFS scheme fails to consider hot-spares properly
Garrett D'Amore <garrett@nexenta.com>
parents: 12296
diff changeset
   114
f1dd13f1ef7d 440 fma ZFS scheme fails to consider hot-spares properly
Garrett D'Amore <garrett@nexenta.com>
parents: 12296
diff changeset
   115
		for (c = 0; c < children; c++)
f1dd13f1ef7d 440 fma ZFS scheme fails to consider hot-spares properly
Garrett D'Amore <garrett@nexenta.com>
parents: 12296
diff changeset
   116
			if ((ret = find_vdev_iter(child[c], search)) != 0)
f1dd13f1ef7d 440 fma ZFS scheme fails to consider hot-spares properly
Garrett D'Amore <garrett@nexenta.com>
parents: 12296
diff changeset
   117
				return (ret);
f1dd13f1ef7d 440 fma ZFS scheme fails to consider hot-spares properly
Garrett D'Amore <garrett@nexenta.com>
parents: 12296
diff changeset
   118
	}
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   119
13251
f1dd13f1ef7d 440 fma ZFS scheme fails to consider hot-spares properly
Garrett D'Amore <garrett@nexenta.com>
parents: 12296
diff changeset
   120
	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_SPARES,
f1dd13f1ef7d 440 fma ZFS scheme fails to consider hot-spares properly
Garrett D'Amore <garrett@nexenta.com>
parents: 12296
diff changeset
   121
	    &child, &children) == 0) {
f1dd13f1ef7d 440 fma ZFS scheme fails to consider hot-spares properly
Garrett D'Amore <garrett@nexenta.com>
parents: 12296
diff changeset
   122
f1dd13f1ef7d 440 fma ZFS scheme fails to consider hot-spares properly
Garrett D'Amore <garrett@nexenta.com>
parents: 12296
diff changeset
   123
		for (c = 0; c < children; c++)
f1dd13f1ef7d 440 fma ZFS scheme fails to consider hot-spares properly
Garrett D'Amore <garrett@nexenta.com>
parents: 12296
diff changeset
   124
			if ((ret = find_vdev_iter(child[c], search)) != 0)
f1dd13f1ef7d 440 fma ZFS scheme fails to consider hot-spares properly
Garrett D'Amore <garrett@nexenta.com>
parents: 12296
diff changeset
   125
				return (ret);
f1dd13f1ef7d 440 fma ZFS scheme fails to consider hot-spares properly
Garrett D'Amore <garrett@nexenta.com>
parents: 12296
diff changeset
   126
	}
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   127
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   128
	return (NULL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   129
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   130
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   131
static nvlist_t *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   132
find_vdev(zpool_handle_t *zhp, uint64_t guid)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   133
{
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 5094
diff changeset
   134
	nvlist_t *config, *nvroot;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   135
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   136
	config = zpool_get_config(zhp, NULL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   137
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   138
	(void) nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, &nvroot);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   139
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   140
	return (find_vdev_iter(nvroot, guid));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   141
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   142
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   143
int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   144
fmd_fmri_present(nvlist_t *nvl)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   145
{
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   146
	uint64_t pool_guid, vdev_guid;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   147
	cbdata_t cb;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   148
	int ret;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   149
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   150
	(void) nvlist_lookup_uint64(nvl, FM_FMRI_ZFS_POOL, &pool_guid);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   151
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   152
	cb.cb_guid = pool_guid;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   153
	cb.cb_pool = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   154
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   155
	if (zpool_iter(g_zfs, find_pool, &cb) != 1)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   156
		return (0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   157
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   158
	if (nvlist_lookup_uint64(nvl, FM_FMRI_ZFS_VDEV, &vdev_guid) != 0) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   159
		zpool_close(cb.cb_pool);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   160
		return (1);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   161
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   162
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   163
	ret = (find_vdev(cb.cb_pool, vdev_guid) != NULL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   164
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   165
	zpool_close(cb.cb_pool);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   166
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   167
	return (ret);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   168
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   169
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   170
int
8021
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   171
fmd_fmri_replaced(nvlist_t *nvl)
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   172
{
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   173
	uint64_t pool_guid, vdev_guid;
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   174
	cbdata_t cb;
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   175
	int ret;
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   176
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   177
	(void) nvlist_lookup_uint64(nvl, FM_FMRI_ZFS_POOL, &pool_guid);
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   178
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   179
	cb.cb_guid = pool_guid;
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   180
	cb.cb_pool = NULL;
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   181
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   182
	if (zpool_iter(g_zfs, find_pool, &cb) != 1)
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   183
		return (FMD_OBJ_STATE_NOT_PRESENT);
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   184
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   185
	if (nvlist_lookup_uint64(nvl, FM_FMRI_ZFS_VDEV, &vdev_guid) != 0) {
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   186
		zpool_close(cb.cb_pool);
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   187
		return (FMD_OBJ_STATE_STILL_PRESENT);
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   188
	}
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   189
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   190
	ret = (find_vdev(cb.cb_pool, vdev_guid) != NULL) ?
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   191
	    FMD_OBJ_STATE_STILL_PRESENT : FMD_OBJ_STATE_NOT_PRESENT;
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   192
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   193
	zpool_close(cb.cb_pool);
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   194
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   195
	return (ret);
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   196
}
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   197
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   198
int
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   199
fmd_fmri_unusable(nvlist_t *nvl)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   200
{
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   201
	uint64_t pool_guid, vdev_guid;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   202
	cbdata_t cb;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   203
	nvlist_t *vd;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   204
	int ret;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   205
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   206
	(void) nvlist_lookup_uint64(nvl, FM_FMRI_ZFS_POOL, &pool_guid);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   207
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   208
	cb.cb_guid = pool_guid;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   209
	cb.cb_pool = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   210
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   211
	if (zpool_iter(g_zfs, find_pool, &cb) != 1)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   212
		return (1);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   213
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   214
	if (nvlist_lookup_uint64(nvl, FM_FMRI_ZFS_VDEV, &vdev_guid) != 0) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   215
		ret = (zpool_get_state(cb.cb_pool) == POOL_STATE_UNAVAIL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   216
		zpool_close(cb.cb_pool);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   217
		return (ret);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   218
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   219
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   220
	vd = find_vdev(cb.cb_pool, vdev_guid);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   221
	if (vd == NULL) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   222
		ret = 1;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   223
	} else {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   224
		vdev_stat_t *vs;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   225
		uint_t c;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   226
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 8021
diff changeset
   227
		(void) nvlist_lookup_uint64_array(vd, ZPOOL_CONFIG_VDEV_STATS,
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   228
		    (uint64_t **)&vs, &c);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   229
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   230
		ret = (vs->vs_state < VDEV_STATE_DEGRADED);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   231
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   232
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   233
	zpool_close(cb.cb_pool);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   234
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   235
	return (ret);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   236
}
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   237
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   238
int
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   239
fmd_fmri_init(void)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   240
{
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   241
	g_zfs = libzfs_init();
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   242
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   243
	if (g_zfs == NULL)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   244
		return (-1);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   245
	else
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   246
		return (0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   247
}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   248
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   249
void
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   250
fmd_fmri_fini(void)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   251
{
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   252
	if (g_zfs)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   253
		libzfs_fini(g_zfs);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   254
}