usr/src/cmd/fm/schemes/zfs/scheme.c
author Lin Ling <Lin.Ling@Sun.COM>
Mon, 03 May 2010 14:54:08 -0700
changeset 12296 7cf402a7f374
parent 8021 b8fe9660eb2d
child 13251 f1dd13f1ef7d
permissions -rw-r--r--
6675946 'zpool status' should show the progress of resilvering for individual disk. 6683750 scrub -s have to wait until resilver completed? 6841252 Resilvering not restartable - causing an excess reboot delay 6855073 spa scrub stats (eg %done) are reset on reboot 6891824 7410 NAS head "continually resilvering" following HDD replacement 6899970 scrub/resilver percent complete reporting in zpool status can be overly optimistic 6940889 add interval (count) args to zpool list 6944623 dbuf_read_done() locking performance improvement 6946760 mutex problem in bplist_enqueue() 6391915 RFE: provide interval arg to zpool status to monitor resilvering 6946512 want zfs_send() to pass back debug info 6943992 'zpool scrub' should not restart the existing scrub silently 6878281 zpool should store the time of last scrub/resilver and other zpool status info in pool properties. 6935158 Assertion failed: used <= spa_get_dspace(dd->dd_pool->dp_spa) 6944388 dsl_dataset_snapshot_reserve_space() causes dp_write_limit=max
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
 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    24
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    25
#include <fm/fmd_fmri.h>
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    26
#include <strings.h>
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    27
#include <libzfs.h>
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    28
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    29
typedef struct cbdata {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    30
	uint64_t	cb_guid;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    31
	zpool_handle_t	*cb_pool;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    32
} cbdata_t;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    33
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    34
libzfs_handle_t *g_zfs;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    35
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    36
static int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    37
find_pool(zpool_handle_t *zhp, void *data)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    38
{
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    39
	cbdata_t *cbp = data;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    40
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 2082
diff changeset
    41
	if (zpool_get_prop_int(zhp, ZPOOL_PROP_GUID, NULL) == cbp->cb_guid) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    42
		cbp->cb_pool = zhp;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    43
		return (1);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    44
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    45
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    46
	zpool_close(zhp);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    47
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    48
	return (0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    49
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    50
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    51
ssize_t
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    52
fmd_fmri_nvl2str(nvlist_t *nvl, char *buf, size_t buflen)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    53
{
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    54
	uint64_t pool_guid, vdev_guid;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    55
	cbdata_t cb;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    56
	ssize_t len;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    57
	const char *name;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    58
	char guidbuf[64];
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    59
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    60
	(void) nvlist_lookup_uint64(nvl, FM_FMRI_ZFS_POOL, &pool_guid);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    61
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    62
	/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    63
	 * Attempt to convert the pool guid to a name.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    64
	 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    65
	cb.cb_guid = pool_guid;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    66
	cb.cb_pool = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    67
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    68
	if (zpool_iter(g_zfs, find_pool, &cb) == 1) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    69
		name = zpool_get_name(cb.cb_pool);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    70
	} else {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    71
		(void) snprintf(guidbuf, sizeof (guidbuf), "%llx", pool_guid);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    72
		name = guidbuf;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    73
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    74
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    75
	if (nvlist_lookup_uint64(nvl, FM_FMRI_ZFS_VDEV, &vdev_guid) == 0)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    76
		len = snprintf(buf, buflen, "%s://pool=%s/vdev=%llx",
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    77
		    FM_FMRI_SCHEME_ZFS, name, vdev_guid);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    78
	else
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    79
		len = snprintf(buf, buflen, "%s://pool=%s",
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    80
		    FM_FMRI_SCHEME_ZFS, name);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    81
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    82
	if (cb.cb_pool)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    83
		zpool_close(cb.cb_pool);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    84
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    85
	return (len);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    86
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    87
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    88
static nvlist_t *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    89
find_vdev_iter(nvlist_t *nv, uint64_t search)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    90
{
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    91
	uint_t c, children;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    92
	nvlist_t **child;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    93
	uint64_t guid;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    94
	nvlist_t *ret;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    95
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    96
	(void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &guid);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    97
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    98
	if (search == guid)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    99
		return (nv);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   100
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   101
	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   102
	    &child, &children) != 0)
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 5094
diff changeset
   103
		return (NULL);
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 5094
diff changeset
   104
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 5094
diff changeset
   105
	for (c = 0; c < children; c++)
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 5094
diff changeset
   106
		if ((ret = find_vdev_iter(child[c], search)) != 0)
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 5094
diff changeset
   107
			return (ret);
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 5094
diff changeset
   108
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 5094
diff changeset
   109
	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_L2CACHE,
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 5094
diff changeset
   110
	    &child, &children) != 0)
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 5094
diff changeset
   111
		return (NULL);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   112
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   113
	for (c = 0; c < children; c++)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   114
		if ((ret = find_vdev_iter(child[c], search)) != 0)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   115
			return (ret);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   116
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   117
	return (NULL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   118
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   119
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   120
static nvlist_t *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   121
find_vdev(zpool_handle_t *zhp, uint64_t guid)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   122
{
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 5094
diff changeset
   123
	nvlist_t *config, *nvroot;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   124
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   125
	config = zpool_get_config(zhp, NULL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   126
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   127
	(void) nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, &nvroot);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   128
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   129
	return (find_vdev_iter(nvroot, guid));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   130
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   131
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   132
int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   133
fmd_fmri_present(nvlist_t *nvl)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   134
{
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   135
	uint64_t pool_guid, vdev_guid;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   136
	cbdata_t cb;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   137
	int ret;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   138
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   139
	(void) nvlist_lookup_uint64(nvl, FM_FMRI_ZFS_POOL, &pool_guid);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   140
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   141
	cb.cb_guid = pool_guid;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   142
	cb.cb_pool = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   143
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   144
	if (zpool_iter(g_zfs, find_pool, &cb) != 1)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   145
		return (0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   146
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   147
	if (nvlist_lookup_uint64(nvl, FM_FMRI_ZFS_VDEV, &vdev_guid) != 0) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   148
		zpool_close(cb.cb_pool);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   149
		return (1);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   150
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   151
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   152
	ret = (find_vdev(cb.cb_pool, vdev_guid) != NULL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   153
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   154
	zpool_close(cb.cb_pool);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   155
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   156
	return (ret);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   157
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   158
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   159
int
8021
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   160
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
   161
{
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   162
	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
   163
	cbdata_t cb;
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   164
	int ret;
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   165
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   166
	(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
   167
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   168
	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
   169
	cb.cb_pool = NULL;
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   170
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   171
	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
   172
		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
   173
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   174
	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
   175
		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
   176
		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
   177
	}
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
	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
   180
	    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
   181
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   182
	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
   183
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   184
	return (ret);
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   185
}
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   186
b8fe9660eb2d 6767911 zfs scheme needs an fmd_fmri_replaced() interface
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 6643
diff changeset
   187
int
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   188
fmd_fmri_unusable(nvlist_t *nvl)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   189
{
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   190
	uint64_t pool_guid, vdev_guid;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   191
	cbdata_t cb;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   192
	nvlist_t *vd;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   193
	int ret;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   194
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   195
	(void) nvlist_lookup_uint64(nvl, FM_FMRI_ZFS_POOL, &pool_guid);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   196
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   197
	cb.cb_guid = pool_guid;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   198
	cb.cb_pool = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   199
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   200
	if (zpool_iter(g_zfs, find_pool, &cb) != 1)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   201
		return (1);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   202
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   203
	if (nvlist_lookup_uint64(nvl, FM_FMRI_ZFS_VDEV, &vdev_guid) != 0) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   204
		ret = (zpool_get_state(cb.cb_pool) == POOL_STATE_UNAVAIL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   205
		zpool_close(cb.cb_pool);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   206
		return (ret);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   207
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   208
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   209
	vd = find_vdev(cb.cb_pool, vdev_guid);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   210
	if (vd == NULL) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   211
		ret = 1;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   212
	} else {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   213
		vdev_stat_t *vs;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   214
		uint_t c;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   215
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 8021
diff changeset
   216
		(void) nvlist_lookup_uint64_array(vd, ZPOOL_CONFIG_VDEV_STATS,
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   217
		    (uint64_t **)&vs, &c);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   218
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   219
		ret = (vs->vs_state < VDEV_STATE_DEGRADED);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   220
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   221
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   222
	zpool_close(cb.cb_pool);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   223
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   224
	return (ret);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   225
}
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   226
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   227
int
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   228
fmd_fmri_init(void)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   229
{
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   230
	g_zfs = libzfs_init();
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   231
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   232
	if (g_zfs == NULL)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   233
		return (-1);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   234
	else
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   235
		return (0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   236
}
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
void
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   239
fmd_fmri_fini(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
	if (g_zfs)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   242
		libzfs_fini(g_zfs);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   243
}