annotate usr/src/uts/common/fs/zfs/spa.c @ 5094:71a3e95fb9e2

PSARC 2007/342 Enhanced ZFS Pool Properties PSARC 2007/482 zpool upgrade -V 6565437 zpool property extensions 6561384 want 'zpool upgrade -V <version>' to upgrade to specific version number 6582755 zfs.h has some incorrect version macros 6595601 libzfs headers declare functions which don't exist 6603938 libzfs is using VERIFY() again 6538984 duplicated messages when get pool properties from an unsupported pool version
author lling
date Wed, 19 Sep 2007 10:32:40 -0700
parents 41ec732c6d9f
children 33cb98223b2d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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: 1354
diff changeset
5 * Common Development and Distribution License (the "License").
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
6 * You may not use this file except in compliance with the License.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
7 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
9 * or http://www.opensolaris.org/os/licensing.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
10 * See the License for the specific language governing permissions
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
11 * and limitations under the License.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
12 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
13 * When distributing Covered Code, include this CDDL HEADER in each
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
15 * If applicable, add the following below this CDDL HEADER, with the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
16 * fields enclosed by brackets "[]" replaced with your own identifying
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
17 * information: Portions Copyright [yyyy] [name of copyright owner]
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
18 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
19 * CDDL HEADER END
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
20 */
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
21
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
22 /*
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
23 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
24 * Use is subject to license terms.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
25 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
26
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
27 #pragma ident "%Z%%M% %I% %E% SMI"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
28
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
29 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
30 * This file contains all the routines used when modifying on-disk SPA state.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
31 * This includes opening, importing, destroying, exporting a pool, and syncing a
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
32 * pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
33 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
34
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
35 #include <sys/zfs_context.h>
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
36 #include <sys/fm/fs/zfs.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
37 #include <sys/spa_impl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
38 #include <sys/zio.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
39 #include <sys/zio_checksum.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
40 #include <sys/zio_compress.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
41 #include <sys/dmu.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
42 #include <sys/dmu_tx.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
43 #include <sys/zap.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
44 #include <sys/zil.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
45 #include <sys/vdev_impl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
46 #include <sys/metaslab.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
47 #include <sys/uberblock_impl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
48 #include <sys/txg.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
49 #include <sys/avl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
50 #include <sys/dmu_traverse.h>
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
51 #include <sys/dmu_objset.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
52 #include <sys/unique.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
53 #include <sys/dsl_pool.h>
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
54 #include <sys/dsl_dataset.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
55 #include <sys/dsl_dir.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
56 #include <sys/dsl_prop.h>
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
57 #include <sys/dsl_synctask.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
58 #include <sys/fs/zfs.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
59 #include <sys/callb.h>
3975
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
60 #include <sys/systeminfo.h>
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
61 #include <sys/sunddi.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
62
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
63 #include "zfs_prop.h"
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
64
2986
c782fcf7a319 6485204 more tuneable tweakin
ek110237
parents: 2926
diff changeset
65 int zio_taskq_threads = 8;
c782fcf7a319 6485204 more tuneable tweakin
ek110237
parents: 2926
diff changeset
66
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
67 static void spa_sync_props(void *arg1, void *arg2, cred_t *cr, dmu_tx_t *tx);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
68
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
69 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
70 * ==========================================================================
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
71 * SPA properties routines
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
72 * ==========================================================================
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
73 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
74
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
75 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
76 * Add a (source=src, propname=propval) list to an nvlist.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
77 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
78 static int
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
79 spa_prop_add_list(nvlist_t *nvl, zpool_prop_t prop, char *strval,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
80 uint64_t intval, zprop_source_t src)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
81 {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
82 const char *propname = zpool_prop_to_name(prop);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
83 nvlist_t *propval;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
84 int err = 0;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
85
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
86 if (err = nvlist_alloc(&propval, NV_UNIQUE_NAME, KM_SLEEP))
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
87 return (err);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
88
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
89 if (err = nvlist_add_uint64(propval, ZPROP_SOURCE, src))
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
90 goto out;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
91
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
92 if (strval != NULL) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
93 if (err = nvlist_add_string(propval, ZPROP_VALUE, strval))
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
94 goto out;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
95 } else {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
96 if (err = nvlist_add_uint64(propval, ZPROP_VALUE, intval))
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
97 goto out;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
98 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
99
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
100 err = nvlist_add_nvlist(nvl, propname, propval);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
101 out:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
102 nvlist_free(propval);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
103 return (err);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
104 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
105
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
106 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
107 * Get property values from the spa configuration.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
108 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
109 static int
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
110 spa_prop_get_config(spa_t *spa, nvlist_t **nvp)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
111 {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
112 uint64_t size = spa_get_space(spa);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
113 uint64_t used = spa_get_alloc(spa);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
114 uint64_t cap, version;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
115 zprop_source_t src = ZPROP_SRC_NONE;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
116 int err;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
117
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
118 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
119 * readonly properties
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
120 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
121 if (err = spa_prop_add_list(*nvp, ZPOOL_PROP_NAME, spa->spa_name,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
122 0, src))
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
123 return (err);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
124
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
125 if (err = spa_prop_add_list(*nvp, ZPOOL_PROP_SIZE, NULL, size, src))
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
126 return (err);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
127
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
128 if (err = spa_prop_add_list(*nvp, ZPOOL_PROP_USED, NULL, used, src))
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
129 return (err);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
130
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
131 if (err = spa_prop_add_list(*nvp, ZPOOL_PROP_AVAILABLE, NULL,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
132 size - used, src))
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
133 return (err);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
134
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
135 cap = (size == 0) ? 0 : (used * 100 / size);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
136 if (err = spa_prop_add_list(*nvp, ZPOOL_PROP_CAPACITY, NULL, cap, src))
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
137 return (err);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
138
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
139 if (err = spa_prop_add_list(*nvp, ZPOOL_PROP_GUID, NULL,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
140 spa_guid(spa), src))
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
141 return (err);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
142
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
143 if (err = spa_prop_add_list(*nvp, ZPOOL_PROP_HEALTH, NULL,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
144 spa->spa_root_vdev->vdev_state, src))
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
145 return (err);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
146
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
147 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
148 * settable properties that are not stored in the pool property object.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
149 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
150 version = spa_version(spa);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
151 if (version == zpool_prop_default_numeric(ZPOOL_PROP_VERSION))
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
152 src = ZPROP_SRC_DEFAULT;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
153 else
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
154 src = ZPROP_SRC_LOCAL;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
155 if (err = spa_prop_add_list(*nvp, ZPOOL_PROP_VERSION, NULL,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
156 version, src))
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
157 return (err);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
158
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
159 if (spa->spa_root != NULL) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
160 src = ZPROP_SRC_LOCAL;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
161 if (err = spa_prop_add_list(*nvp, ZPOOL_PROP_ALTROOT,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
162 spa->spa_root, 0, src))
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
163 return (err);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
164 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
165
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
166 if (spa->spa_temporary ==
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
167 zpool_prop_default_numeric(ZPOOL_PROP_TEMPORARY))
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
168 src = ZPROP_SRC_DEFAULT;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
169 else
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
170 src = ZPROP_SRC_LOCAL;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
171 if (err = spa_prop_add_list(*nvp, ZPOOL_PROP_TEMPORARY, NULL,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
172 spa->spa_temporary, src))
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
173 return (err);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
174
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
175 return (0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
176 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
177
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
178 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
179 * Get zpool property values.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
180 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
181 int
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
182 spa_prop_get(spa_t *spa, nvlist_t **nvp)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
183 {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
184 zap_cursor_t zc;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
185 zap_attribute_t za;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
186 objset_t *mos = spa->spa_meta_objset;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
187 int err;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
188
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
189 if (err = nvlist_alloc(nvp, NV_UNIQUE_NAME, KM_SLEEP))
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
190 return (err);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
191
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
192 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
193 * Get properties from the spa config.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
194 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
195 if (err = spa_prop_get_config(spa, nvp))
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
196 goto out;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
197
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
198 mutex_enter(&spa->spa_props_lock);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
199 /* If no pool property object, no more prop to get. */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
200 if (spa->spa_pool_props_object == 0) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
201 mutex_exit(&spa->spa_props_lock);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
202 return (0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
203 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
204
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
205 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
206 * Get properties from the MOS pool property object.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
207 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
208 for (zap_cursor_init(&zc, mos, spa->spa_pool_props_object);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
209 (err = zap_cursor_retrieve(&zc, &za)) == 0;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
210 zap_cursor_advance(&zc)) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
211 uint64_t intval = 0;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
212 char *strval = NULL;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
213 zprop_source_t src = ZPROP_SRC_DEFAULT;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
214 zpool_prop_t prop;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
215
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
216 if ((prop = zpool_name_to_prop(za.za_name)) == ZPROP_INVAL)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
217 continue;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
218
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
219 switch (za.za_integer_length) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
220 case 8:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
221 /* integer property */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
222 if (za.za_first_integer !=
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
223 zpool_prop_default_numeric(prop))
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
224 src = ZPROP_SRC_LOCAL;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
225
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
226 if (prop == ZPOOL_PROP_BOOTFS) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
227 dsl_pool_t *dp;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
228 dsl_dataset_t *ds = NULL;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
229
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
230 dp = spa_get_dsl(spa);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
231 rw_enter(&dp->dp_config_rwlock, RW_READER);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
232 if (err = dsl_dataset_open_obj(dp,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
233 za.za_first_integer, NULL, DS_MODE_NONE,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
234 FTAG, &ds)) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
235 rw_exit(&dp->dp_config_rwlock);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
236 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
237 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
238
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
239 strval = kmem_alloc(
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
240 MAXNAMELEN + strlen(MOS_DIR_NAME) + 1,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
241 KM_SLEEP);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
242 dsl_dataset_name(ds, strval);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
243 dsl_dataset_close(ds, DS_MODE_NONE, FTAG);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
244 rw_exit(&dp->dp_config_rwlock);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
245 } else {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
246 strval = NULL;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
247 intval = za.za_first_integer;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
248 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
249
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
250 err = spa_prop_add_list(*nvp, prop, strval,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
251 intval, src);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
252
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
253 if (strval != NULL)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
254 kmem_free(strval,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
255 MAXNAMELEN + strlen(MOS_DIR_NAME) + 1);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
256
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
257 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
258
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
259 case 1:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
260 /* string property */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
261 strval = kmem_alloc(za.za_num_integers, KM_SLEEP);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
262 err = zap_lookup(mos, spa->spa_pool_props_object,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
263 za.za_name, 1, za.za_num_integers, strval);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
264 if (err) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
265 kmem_free(strval, za.za_num_integers);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
266 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
267 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
268 err = spa_prop_add_list(*nvp, prop, strval, 0, src);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
269 kmem_free(strval, za.za_num_integers);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
270 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
271
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
272 default:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
273 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
274 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
275 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
276 zap_cursor_fini(&zc);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
277 mutex_exit(&spa->spa_props_lock);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
278 out:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
279 if (err && err != ENOENT) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
280 nvlist_free(*nvp);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
281 return (err);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
282 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
283
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
284 return (0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
285 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
286
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
287 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
288 * Validate the given pool properties nvlist and modify the list
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
289 * for the property values to be set.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
290 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
291 static int
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
292 spa_prop_validate(spa_t *spa, nvlist_t *props)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
293 {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
294 nvpair_t *elem;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
295 int error = 0, reset_bootfs = 0;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
296 uint64_t objnum;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
297
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
298 elem = NULL;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
299 while ((elem = nvlist_next_nvpair(props, elem)) != NULL) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
300 zpool_prop_t prop;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
301 char *propname, *strval;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
302 uint64_t intval;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
303 vdev_t *rvdev;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
304 char *vdev_type;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
305 objset_t *os;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
306
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
307 propname = nvpair_name(elem);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
308
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
309 if ((prop = zpool_name_to_prop(propname)) == ZPROP_INVAL)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
310 return (EINVAL);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
311
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
312 switch (prop) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
313 case ZPOOL_PROP_VERSION:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
314 error = nvpair_value_uint64(elem, &intval);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
315 if (!error &&
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
316 (intval < spa_version(spa) || intval > SPA_VERSION))
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
317 error = EINVAL;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
318 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
319
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
320 case ZPOOL_PROP_DELEGATION:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
321 case ZPOOL_PROP_AUTOREPLACE:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
322 error = nvpair_value_uint64(elem, &intval);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
323 if (!error && intval > 1)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
324 error = EINVAL;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
325 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
326
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
327 case ZPOOL_PROP_BOOTFS:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
328 if (spa_version(spa) < SPA_VERSION_BOOTFS) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
329 error = ENOTSUP;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
330 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
331 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
332
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
333 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
334 * A bootable filesystem can not be on a RAIDZ pool
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
335 * nor a striped pool with more than 1 device.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
336 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
337 rvdev = spa->spa_root_vdev;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
338 vdev_type =
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
339 rvdev->vdev_child[0]->vdev_ops->vdev_op_type;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
340 if (rvdev->vdev_children > 1 ||
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
341 strcmp(vdev_type, VDEV_TYPE_RAIDZ) == 0 ||
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
342 strcmp(vdev_type, VDEV_TYPE_MISSING) == 0) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
343 error = ENOTSUP;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
344 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
345 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
346
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
347 reset_bootfs = 1;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
348
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
349 error = nvpair_value_string(elem, &strval);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
350
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
351 if (!error) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
352 if (strval == NULL || strval[0] == '\0') {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
353 objnum = zpool_prop_default_numeric(
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
354 ZPOOL_PROP_BOOTFS);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
355 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
356 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
357
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
358 if (error = dmu_objset_open(strval, DMU_OST_ZFS,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
359 DS_MODE_STANDARD | DS_MODE_READONLY, &os))
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
360 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
361 objnum = dmu_objset_id(os);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
362 dmu_objset_close(os);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
363 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
364 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
365 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
366
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
367 if (error)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
368 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
369 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
370
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
371 if (!error && reset_bootfs) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
372 error = nvlist_remove(props,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
373 zpool_prop_to_name(ZPOOL_PROP_BOOTFS), DATA_TYPE_STRING);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
374
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
375 if (!error) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
376 error = nvlist_add_uint64(props,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
377 zpool_prop_to_name(ZPOOL_PROP_BOOTFS), objnum);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
378 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
379 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
380
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
381 return (error);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
382 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
383
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
384 int
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
385 spa_prop_set(spa_t *spa, nvlist_t *nvp)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
386 {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
387 int error;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
388
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
389 if ((error = spa_prop_validate(spa, nvp)) != 0)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
390 return (error);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
391
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
392 return (dsl_sync_task_do(spa_get_dsl(spa), NULL, spa_sync_props,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
393 spa, nvp, 3));
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
394 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
395
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
396 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
397 * If the bootfs property value is dsobj, clear it.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
398 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
399 void
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
400 spa_prop_clear_bootfs(spa_t *spa, uint64_t dsobj, dmu_tx_t *tx)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
401 {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
402 if (spa->spa_bootfs == dsobj && spa->spa_pool_props_object != 0) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
403 VERIFY(zap_remove(spa->spa_meta_objset,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
404 spa->spa_pool_props_object,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
405 zpool_prop_to_name(ZPOOL_PROP_BOOTFS), tx) == 0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
406 spa->spa_bootfs = 0;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
407 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
408 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
409
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
410 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
411 * ==========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
412 * SPA state manipulation (open/create/destroy/import/export)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
413 * ==========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
414 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
415
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
416 static int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
417 spa_error_entry_compare(const void *a, const void *b)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
418 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
419 spa_error_entry_t *sa = (spa_error_entry_t *)a;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
420 spa_error_entry_t *sb = (spa_error_entry_t *)b;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
421 int ret;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
422
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
423 ret = bcmp(&sa->se_bookmark, &sb->se_bookmark,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
424 sizeof (zbookmark_t));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
425
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
426 if (ret < 0)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
427 return (-1);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
428 else if (ret > 0)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
429 return (1);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
430 else
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
431 return (0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
432 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
433
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
434 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
435 * Utility function which retrieves copies of the current logs and
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
436 * re-initializes them in the process.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
437 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
438 void
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
439 spa_get_errlists(spa_t *spa, avl_tree_t *last, avl_tree_t *scrub)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
440 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
441 ASSERT(MUTEX_HELD(&spa->spa_errlist_lock));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
442
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
443 bcopy(&spa->spa_errlist_last, last, sizeof (avl_tree_t));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
444 bcopy(&spa->spa_errlist_scrub, scrub, sizeof (avl_tree_t));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
445
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
446 avl_create(&spa->spa_errlist_scrub,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
447 spa_error_entry_compare, sizeof (spa_error_entry_t),
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
448 offsetof(spa_error_entry_t, se_avl));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
449 avl_create(&spa->spa_errlist_last,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
450 spa_error_entry_compare, sizeof (spa_error_entry_t),
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
451 offsetof(spa_error_entry_t, se_avl));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
452 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
453
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
454 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
455 * Activate an uninitialized pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
456 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
457 static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
458 spa_activate(spa_t *spa)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
459 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
460 int t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
461
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
462 ASSERT(spa->spa_state == POOL_STATE_UNINITIALIZED);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
463
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
464 spa->spa_state = POOL_STATE_ACTIVE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
465
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
466 spa->spa_normal_class = metaslab_class_create();
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
467 spa->spa_log_class = metaslab_class_create();
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
468
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
469 for (t = 0; t < ZIO_TYPES; t++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
470 spa->spa_zio_issue_taskq[t] = taskq_create("spa_zio_issue",
2986
c782fcf7a319 6485204 more tuneable tweakin
ek110237
parents: 2926
diff changeset
471 zio_taskq_threads, maxclsyspri, 50, INT_MAX,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
472 TASKQ_PREPOPULATE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
473 spa->spa_zio_intr_taskq[t] = taskq_create("spa_zio_intr",
2986
c782fcf7a319 6485204 more tuneable tweakin
ek110237
parents: 2926
diff changeset
474 zio_taskq_threads, maxclsyspri, 50, INT_MAX,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
475 TASKQ_PREPOPULATE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
476 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
477
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
478 list_create(&spa->spa_dirty_list, sizeof (vdev_t),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
479 offsetof(vdev_t, vdev_dirty_node));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
480
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
481 txg_list_create(&spa->spa_vdev_txg_list,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
482 offsetof(struct vdev, vdev_txg_node));
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
483
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
484 avl_create(&spa->spa_errlist_scrub,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
485 spa_error_entry_compare, sizeof (spa_error_entry_t),
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
486 offsetof(spa_error_entry_t, se_avl));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
487 avl_create(&spa->spa_errlist_last,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
488 spa_error_entry_compare, sizeof (spa_error_entry_t),
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
489 offsetof(spa_error_entry_t, se_avl));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
490 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
491
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
492 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
493 * Opposite of spa_activate().
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
494 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
495 static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
496 spa_deactivate(spa_t *spa)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
497 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
498 int t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
499
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
500 ASSERT(spa->spa_sync_on == B_FALSE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
501 ASSERT(spa->spa_dsl_pool == NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
502 ASSERT(spa->spa_root_vdev == NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
503
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
504 ASSERT(spa->spa_state != POOL_STATE_UNINITIALIZED);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
505
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
506 txg_list_destroy(&spa->spa_vdev_txg_list);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
507
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
508 list_destroy(&spa->spa_dirty_list);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
509
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
510 for (t = 0; t < ZIO_TYPES; t++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
511 taskq_destroy(spa->spa_zio_issue_taskq[t]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
512 taskq_destroy(spa->spa_zio_intr_taskq[t]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
513 spa->spa_zio_issue_taskq[t] = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
514 spa->spa_zio_intr_taskq[t] = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
515 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
516
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
517 metaslab_class_destroy(spa->spa_normal_class);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
518 spa->spa_normal_class = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
519
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
520 metaslab_class_destroy(spa->spa_log_class);
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
521 spa->spa_log_class = NULL;
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
522
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
523 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
524 * If this was part of an import or the open otherwise failed, we may
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
525 * still have errors left in the queues. Empty them just in case.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
526 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
527 spa_errlog_drain(spa);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
528
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
529 avl_destroy(&spa->spa_errlist_scrub);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
530 avl_destroy(&spa->spa_errlist_last);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
531
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
532 spa->spa_state = POOL_STATE_UNINITIALIZED;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
533 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
534
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
535 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
536 * Verify a pool configuration, and construct the vdev tree appropriately. This
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
537 * will create all the necessary vdevs in the appropriate layout, with each vdev
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
538 * in the CLOSED state. This will prep the pool before open/creation/import.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
539 * All vdev validation is done by the vdev_alloc() routine.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
540 */
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
541 static int
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
542 spa_config_parse(spa_t *spa, vdev_t **vdp, nvlist_t *nv, vdev_t *parent,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
543 uint_t id, int atype)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
544 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
545 nvlist_t **child;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
546 uint_t c, children;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
547 int error;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
548
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
549 if ((error = vdev_alloc(spa, vdp, nv, parent, id, atype)) != 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
550 return (error);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
551
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
552 if ((*vdp)->vdev_ops->vdev_op_leaf)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
553 return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
554
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
555 if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
556 &child, &children) != 0) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
557 vdev_free(*vdp);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
558 *vdp = NULL;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
559 return (EINVAL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
560 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
561
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
562 for (c = 0; c < children; c++) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
563 vdev_t *vd;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
564 if ((error = spa_config_parse(spa, &vd, child[c], *vdp, c,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
565 atype)) != 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
566 vdev_free(*vdp);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
567 *vdp = NULL;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
568 return (error);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
569 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
570 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
571
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
572 ASSERT(*vdp != NULL);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
573
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
574 return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
575 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
576
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
577 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
578 * Opposite of spa_load().
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
579 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
580 static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
581 spa_unload(spa_t *spa)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
582 {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
583 int i;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
584
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
585 /*
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
586 * Stop async tasks.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
587 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
588 spa_async_suspend(spa);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
589
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
590 /*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
591 * Stop syncing.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
592 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
593 if (spa->spa_sync_on) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
594 txg_sync_stop(spa->spa_dsl_pool);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
595 spa->spa_sync_on = B_FALSE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
596 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
597
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
598 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
599 * Wait for any outstanding prefetch I/O to complete.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
600 */
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
601 spa_config_enter(spa, RW_WRITER, FTAG);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
602 spa_config_exit(spa, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
603
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
604 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
605 * Close the dsl pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
606 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
607 if (spa->spa_dsl_pool) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
608 dsl_pool_close(spa->spa_dsl_pool);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
609 spa->spa_dsl_pool = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
610 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
611
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
612 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
613 * Close all vdevs.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
614 */
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
615 if (spa->spa_root_vdev)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
616 vdev_free(spa->spa_root_vdev);
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
617 ASSERT(spa->spa_root_vdev == NULL);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
618
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
619 for (i = 0; i < spa->spa_nspares; i++)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
620 vdev_free(spa->spa_spares[i]);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
621 if (spa->spa_spares) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
622 kmem_free(spa->spa_spares, spa->spa_nspares * sizeof (void *));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
623 spa->spa_spares = NULL;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
624 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
625 if (spa->spa_sparelist) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
626 nvlist_free(spa->spa_sparelist);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
627 spa->spa_sparelist = NULL;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
628 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
629
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
630 spa->spa_async_suspended = 0;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
631 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
632
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
633 /*
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
634 * Load (or re-load) the current list of vdevs describing the active spares for
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
635 * this pool. When this is called, we have some form of basic information in
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
636 * 'spa_sparelist'. We parse this into vdevs, try to open them, and then
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
637 * re-generate a more complete list including status information.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
638 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
639 static void
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
640 spa_load_spares(spa_t *spa)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
641 {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
642 nvlist_t **spares;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
643 uint_t nspares;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
644 int i;
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
645 vdev_t *vd, *tvd;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
646
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
647 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
648 * First, close and free any existing spare vdevs.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
649 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
650 for (i = 0; i < spa->spa_nspares; i++) {
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
651 vd = spa->spa_spares[i];
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
652
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
653 /* Undo the call to spa_activate() below */
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
654 if ((tvd = spa_lookup_by_guid(spa, vd->vdev_guid)) != NULL &&
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
655 tvd->vdev_isspare)
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
656 spa_spare_remove(tvd);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
657 vdev_close(vd);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
658 vdev_free(vd);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
659 }
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
660
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
661 if (spa->spa_spares)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
662 kmem_free(spa->spa_spares, spa->spa_nspares * sizeof (void *));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
663
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
664 if (spa->spa_sparelist == NULL)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
665 nspares = 0;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
666 else
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
667 VERIFY(nvlist_lookup_nvlist_array(spa->spa_sparelist,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
668 ZPOOL_CONFIG_SPARES, &spares, &nspares) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
669
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
670 spa->spa_nspares = (int)nspares;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
671 spa->spa_spares = NULL;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
672
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
673 if (nspares == 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
674 return;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
675
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
676 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
677 * Construct the array of vdevs, opening them to get status in the
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
678 * process. For each spare, there is potentially two different vdev_t
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
679 * structures associated with it: one in the list of spares (used only
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
680 * for basic validation purposes) and one in the active vdev
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
681 * configuration (if it's spared in). During this phase we open and
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
682 * validate each vdev on the spare list. If the vdev also exists in the
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
683 * active configuration, then we also mark this vdev as an active spare.
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
684 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
685 spa->spa_spares = kmem_alloc(nspares * sizeof (void *), KM_SLEEP);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
686 for (i = 0; i < spa->spa_nspares; i++) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
687 VERIFY(spa_config_parse(spa, &vd, spares[i], NULL, 0,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
688 VDEV_ALLOC_SPARE) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
689 ASSERT(vd != NULL);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
690
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
691 spa->spa_spares[i] = vd;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
692
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
693 if ((tvd = spa_lookup_by_guid(spa, vd->vdev_guid)) != NULL) {
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
694 if (!tvd->vdev_isspare)
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
695 spa_spare_add(tvd);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
696
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
697 /*
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
698 * We only mark the spare active if we were successfully
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
699 * able to load the vdev. Otherwise, importing a pool
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
700 * with a bad active spare would result in strange
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
701 * behavior, because multiple pool would think the spare
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
702 * is actively in use.
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
703 *
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
704 * There is a vulnerability here to an equally bizarre
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
705 * circumstance, where a dead active spare is later
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
706 * brought back to life (onlined or otherwise). Given
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
707 * the rarity of this scenario, and the extra complexity
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
708 * it adds, we ignore the possibility.
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
709 */
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
710 if (!vdev_is_dead(tvd))
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
711 spa_spare_activate(tvd);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
712 }
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
713
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
714 if (vdev_open(vd) != 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
715 continue;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
716
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
717 vd->vdev_top = vd;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
718 (void) vdev_validate_spare(vd);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
719 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
720
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
721 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
722 * Recompute the stashed list of spares, with status information
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
723 * this time.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
724 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
725 VERIFY(nvlist_remove(spa->spa_sparelist, ZPOOL_CONFIG_SPARES,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
726 DATA_TYPE_NVLIST_ARRAY) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
727
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
728 spares = kmem_alloc(spa->spa_nspares * sizeof (void *), KM_SLEEP);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
729 for (i = 0; i < spa->spa_nspares; i++)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
730 spares[i] = vdev_config_generate(spa, spa->spa_spares[i],
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
731 B_TRUE, B_TRUE);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
732 VERIFY(nvlist_add_nvlist_array(spa->spa_sparelist, ZPOOL_CONFIG_SPARES,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
733 spares, spa->spa_nspares) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
734 for (i = 0; i < spa->spa_nspares; i++)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
735 nvlist_free(spares[i]);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
736 kmem_free(spares, spa->spa_nspares * sizeof (void *));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
737 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
738
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
739 static int
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
740 load_nvlist(spa_t *spa, uint64_t obj, nvlist_t **value)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
741 {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
742 dmu_buf_t *db;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
743 char *packed = NULL;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
744 size_t nvsize = 0;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
745 int error;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
746 *value = NULL;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
747
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
748 VERIFY(0 == dmu_bonus_hold(spa->spa_meta_objset, obj, FTAG, &db));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
749 nvsize = *(uint64_t *)db->db_data;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
750 dmu_buf_rele(db, FTAG);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
751
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
752 packed = kmem_alloc(nvsize, KM_SLEEP);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
753 error = dmu_read(spa->spa_meta_objset, obj, 0, nvsize, packed);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
754 if (error == 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
755 error = nvlist_unpack(packed, nvsize, value, 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
756 kmem_free(packed, nvsize);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
757
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
758 return (error);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
759 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
760
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
761 /*
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
762 * Checks to see if the given vdev could not be opened, in which case we post a
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
763 * sysevent to notify the autoreplace code that the device has been removed.
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
764 */
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
765 static void
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
766 spa_check_removed(vdev_t *vd)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
767 {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
768 int c;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
769
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
770 for (c = 0; c < vd->vdev_children; c++)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
771 spa_check_removed(vd->vdev_child[c]);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
772
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
773 if (vd->vdev_ops->vdev_op_leaf && vdev_is_dead(vd)) {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
774 zfs_post_autoreplace(vd->vdev_spa, vd);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
775 spa_event_notify(vd->vdev_spa, vd, ESC_ZFS_VDEV_CHECK);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
776 }
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
777 }
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
778
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
779 /*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
780 * Load an existing storage pool, using the pool's builtin spa_config as a
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
781 * source of configuration information.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
782 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
783 static int
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
784 spa_load(spa_t *spa, nvlist_t *config, spa_load_state_t state, int mosconfig)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
785 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
786 int error = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
787 nvlist_t *nvroot = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
788 vdev_t *rvd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
789 uberblock_t *ub = &spa->spa_uberblock;
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
790 uint64_t config_cache_txg = spa->spa_config_txg;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
791 uint64_t pool_guid;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
792 uint64_t version;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
793 zio_t *zio;
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
794 uint64_t autoreplace = 0;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
795
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
796 spa->spa_load_state = state;
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
797
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
798 if (nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, &nvroot) ||
1733
a7c3bc84e012 6407377 spa_tryimport() is broken
bonwick
parents: 1732
diff changeset
799 nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID, &pool_guid)) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
800 error = EINVAL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
801 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
802 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
803
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
804 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
805 * Versioning wasn't explicitly added to the label until later, so if
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
806 * it's not present treat it as the initial version.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
807 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
808 if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION, &version) != 0)
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
809 version = SPA_VERSION_INITIAL;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
810
1733
a7c3bc84e012 6407377 spa_tryimport() is broken
bonwick
parents: 1732
diff changeset
811 (void) nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_TXG,
a7c3bc84e012 6407377 spa_tryimport() is broken
bonwick
parents: 1732
diff changeset
812 &spa->spa_config_txg);
a7c3bc84e012 6407377 spa_tryimport() is broken
bonwick
parents: 1732
diff changeset
813
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
814 if ((state == SPA_LOAD_IMPORT || state == SPA_LOAD_TRYIMPORT) &&
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
815 spa_guid_exists(pool_guid, 0)) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
816 error = EEXIST;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
817 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
818 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
819
2174
73de7a781492 6433717 offline devices should not be marked persistently unavailble
eschrock
parents: 2082
diff changeset
820 spa->spa_load_guid = pool_guid;
73de7a781492 6433717 offline devices should not be marked persistently unavailble
eschrock
parents: 2082
diff changeset
821
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
822 /*
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
823 * Parse the configuration into a vdev tree. We explicitly set the
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
824 * value that will be returned by spa_version() since parsing the
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
825 * configuration requires knowing the version number.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
826 */
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
827 spa_config_enter(spa, RW_WRITER, FTAG);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
828 spa->spa_ubsync.ub_version = version;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
829 error = spa_config_parse(spa, &rvd, nvroot, NULL, 0, VDEV_ALLOC_LOAD);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
830 spa_config_exit(spa, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
831
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
832 if (error != 0)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
833 goto out;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
834
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
835 ASSERT(spa->spa_root_vdev == rvd);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
836 ASSERT(spa_guid(spa) == pool_guid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
837
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
838 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
839 * Try to open all vdevs, loading each label in the process.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
840 */
4070
4390ea390a1e 6386594 zdb message should be clearer when failing for lack of permissions
mc142369
parents: 3975
diff changeset
841 error = vdev_open(rvd);
4390ea390a1e 6386594 zdb message should be clearer when failing for lack of permissions
mc142369
parents: 3975
diff changeset
842 if (error != 0)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
843 goto out;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
844
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
845 /*
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
846 * Validate the labels for all leaf vdevs. We need to grab the config
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
847 * lock because all label I/O is done with the ZIO_FLAG_CONFIG_HELD
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
848 * flag.
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
849 */
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
850 spa_config_enter(spa, RW_READER, FTAG);
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
851 error = vdev_validate(rvd);
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
852 spa_config_exit(spa, FTAG);
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
853
4070
4390ea390a1e 6386594 zdb message should be clearer when failing for lack of permissions
mc142369
parents: 3975
diff changeset
854 if (error != 0)
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
855 goto out;
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
856
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
857 if (rvd->vdev_state <= VDEV_STATE_CANT_OPEN) {
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
858 error = ENXIO;
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
859 goto out;
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
860 }
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
861
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
862 /*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
863 * Find the best uberblock.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
864 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
865 bzero(ub, sizeof (uberblock_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
866
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
867 zio = zio_root(spa, NULL, NULL,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
868 ZIO_FLAG_CANFAIL | ZIO_FLAG_SPECULATIVE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
869 vdev_uberblock_load(zio, rvd, ub);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
870 error = zio_wait(zio);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
871
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
872 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
873 * If we weren't able to find a single valid uberblock, return failure.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
874 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
875 if (ub->ub_txg == 0) {
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
876 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
877 VDEV_AUX_CORRUPT_DATA);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
878 error = ENXIO;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
879 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
880 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
881
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
882 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
883 * If the pool is newer than the code, we can't open it.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
884 */
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
885 if (ub->ub_version > SPA_VERSION) {
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
886 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
887 VDEV_AUX_VERSION_NEWER);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
888 error = ENOTSUP;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
889 goto out;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
890 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
891
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
892 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
893 * If the vdev guid sum doesn't match the uberblock, we have an
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
894 * incomplete configuration.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
895 */
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
896 if (rvd->vdev_guid_sum != ub->ub_guid_sum && mosconfig) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
897 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
898 VDEV_AUX_BAD_GUID_SUM);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
899 error = ENXIO;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
900 goto out;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
901 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
902
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
903 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
904 * Initialize internal SPA structures.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
905 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
906 spa->spa_state = POOL_STATE_ACTIVE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
907 spa->spa_ubsync = spa->spa_uberblock;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
908 spa->spa_first_txg = spa_last_synced_txg(spa) + 1;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
909 error = dsl_pool_open(spa, spa->spa_first_txg, &spa->spa_dsl_pool);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
910 if (error) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
911 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
912 VDEV_AUX_CORRUPT_DATA);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
913 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
914 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
915 spa->spa_meta_objset = spa->spa_dsl_pool->dp_meta_objset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
916
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
917 if (zap_lookup(spa->spa_meta_objset,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
918 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_CONFIG,
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
919 sizeof (uint64_t), 1, &spa->spa_config_object) != 0) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
920 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
921 VDEV_AUX_CORRUPT_DATA);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
922 error = EIO;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
923 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
924 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
925
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
926 if (!mosconfig) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
927 nvlist_t *newconfig;
3975
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
928 uint64_t hostid;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
929
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
930 if (load_nvlist(spa, spa->spa_config_object, &newconfig) != 0) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
931 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
932 VDEV_AUX_CORRUPT_DATA);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
933 error = EIO;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
934 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
935 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
936
3975
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
937 if (nvlist_lookup_uint64(newconfig, ZPOOL_CONFIG_HOSTID,
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
938 &hostid) == 0) {
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
939 char *hostname;
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
940 unsigned long myhostid = 0;
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
941
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
942 VERIFY(nvlist_lookup_string(newconfig,
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
943 ZPOOL_CONFIG_HOSTNAME, &hostname) == 0);
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
944
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
945 (void) ddi_strtoul(hw_serial, NULL, 10, &myhostid);
4178
ad95fd86760b 6553537 zfs root fails to boot from a snv_63+zfsboot-pfinstall netinstall image
lling
parents: 4070
diff changeset
946 if (hostid != 0 && myhostid != 0 &&
ad95fd86760b 6553537 zfs root fails to boot from a snv_63+zfsboot-pfinstall netinstall image
lling
parents: 4070
diff changeset
947 (unsigned long)hostid != myhostid) {
3975
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
948 cmn_err(CE_WARN, "pool '%s' could not be "
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
949 "loaded as it was last accessed by "
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
950 "another system (host: %s hostid: 0x%lx). "
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
951 "See: http://www.sun.com/msg/ZFS-8000-EY",
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
952 spa->spa_name, hostname,
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
953 (unsigned long)hostid);
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
954 error = EBADF;
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
955 goto out;
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
956 }
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
957 }
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
958
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
959 spa_config_set(spa, newconfig);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
960 spa_unload(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
961 spa_deactivate(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
962 spa_activate(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
963
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
964 return (spa_load(spa, newconfig, state, B_TRUE));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
965 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
966
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
967 if (zap_lookup(spa->spa_meta_objset,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
968 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_SYNC_BPLIST,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
969 sizeof (uint64_t), 1, &spa->spa_sync_bplist_obj) != 0) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
970 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
971 VDEV_AUX_CORRUPT_DATA);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
972 error = EIO;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
973 goto out;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
974 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
975
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
976 /*
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
977 * Load the bit that tells us to use the new accounting function
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
978 * (raid-z deflation). If we have an older pool, this will not
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
979 * be present.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
980 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
981 error = zap_lookup(spa->spa_meta_objset,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
982 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_DEFLATE,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
983 sizeof (uint64_t), 1, &spa->spa_deflate);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
984 if (error != 0 && error != ENOENT) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
985 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
986 VDEV_AUX_CORRUPT_DATA);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
987 error = EIO;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
988 goto out;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
989 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
990
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
991 /*
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
992 * Load the persistent error log. If we have an older pool, this will
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
993 * not be present.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
994 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
995 error = zap_lookup(spa->spa_meta_objset,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
996 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_ERRLOG_LAST,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
997 sizeof (uint64_t), 1, &spa->spa_errlog_last);
1807
35c8b566d7af 6410711 intent log blocks don't get invited to pool parties
bonwick
parents: 1775
diff changeset
998 if (error != 0 && error != ENOENT) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
999 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1000 VDEV_AUX_CORRUPT_DATA);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1001 error = EIO;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1002 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1003 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1004
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1005 error = zap_lookup(spa->spa_meta_objset,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1006 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_ERRLOG_SCRUB,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1007 sizeof (uint64_t), 1, &spa->spa_errlog_scrub);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1008 if (error != 0 && error != ENOENT) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1009 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1010 VDEV_AUX_CORRUPT_DATA);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1011 error = EIO;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1012 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1013 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1014
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1015 /*
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1016 * Load the history object. If we have an older pool, this
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1017 * will not be present.
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1018 */
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1019 error = zap_lookup(spa->spa_meta_objset,
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1020 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_HISTORY,
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1021 sizeof (uint64_t), 1, &spa->spa_history);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1022 if (error != 0 && error != ENOENT) {
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1023 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1024 VDEV_AUX_CORRUPT_DATA);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1025 error = EIO;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1026 goto out;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1027 }
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1028
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1029 /*
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1030 * Load any hot spares for this pool.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1031 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1032 error = zap_lookup(spa->spa_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1033 DMU_POOL_SPARES, sizeof (uint64_t), 1, &spa->spa_spares_object);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1034 if (error != 0 && error != ENOENT) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1035 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1036 VDEV_AUX_CORRUPT_DATA);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1037 error = EIO;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1038 goto out;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1039 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1040 if (error == 0) {
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
1041 ASSERT(spa_version(spa) >= SPA_VERSION_SPARES);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1042 if (load_nvlist(spa, spa->spa_spares_object,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1043 &spa->spa_sparelist) != 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1044 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1045 VDEV_AUX_CORRUPT_DATA);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1046 error = EIO;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1047 goto out;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1048 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1049
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1050 spa_config_enter(spa, RW_WRITER, FTAG);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1051 spa_load_spares(spa);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1052 spa_config_exit(spa, FTAG);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1053 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1054
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1055 spa->spa_delegation = zpool_prop_default_numeric(ZPOOL_PROP_DELEGATION);
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
1056
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1057 error = zap_lookup(spa->spa_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1058 DMU_POOL_PROPS, sizeof (uint64_t), 1, &spa->spa_pool_props_object);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1059
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1060 if (error && error != ENOENT) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1061 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1062 VDEV_AUX_CORRUPT_DATA);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1063 error = EIO;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1064 goto out;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1065 }
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1066
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1067 if (error == 0) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1068 (void) zap_lookup(spa->spa_meta_objset,
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1069 spa->spa_pool_props_object,
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1070 zpool_prop_to_name(ZPOOL_PROP_BOOTFS),
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1071 sizeof (uint64_t), 1, &spa->spa_bootfs);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1072 (void) zap_lookup(spa->spa_meta_objset,
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1073 spa->spa_pool_props_object,
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1074 zpool_prop_to_name(ZPOOL_PROP_AUTOREPLACE),
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1075 sizeof (uint64_t), 1, &autoreplace);
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
1076 (void) zap_lookup(spa->spa_meta_objset,
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
1077 spa->spa_pool_props_object,
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
1078 zpool_prop_to_name(ZPOOL_PROP_DELEGATION),
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
1079 sizeof (uint64_t), 1, &spa->spa_delegation);
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1080 }
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1081
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1082 /*
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1083 * If the 'autoreplace' property is set, then post a resource notifying
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1084 * the ZFS DE that it should not issue any faults for unopenable
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1085 * devices. We also iterate over the vdevs, and post a sysevent for any
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1086 * unopenable vdevs so that the normal autoreplace handler can take
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1087 * over.
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1088 */
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1089 if (autoreplace)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1090 spa_check_removed(spa->spa_root_vdev);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1091
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1092 /*
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
1093 * Load the vdev state for all toplevel vdevs.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1094 */
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
1095 vdev_load(rvd);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1096
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1097 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1098 * Propagate the leaf DTLs we just loaded all the way up the tree.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1099 */
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1100 spa_config_enter(spa, RW_WRITER, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1101 vdev_dtl_reassess(rvd, 0, 0, B_FALSE);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1102 spa_config_exit(spa, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1103
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1104 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1105 * Check the state of the root vdev. If it can't be opened, it
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1106 * indicates one or more toplevel vdevs are faulted.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1107 */
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1108 if (rvd->vdev_state <= VDEV_STATE_CANT_OPEN) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1109 error = ENXIO;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1110 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1111 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1112
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1113 if ((spa_mode & FWRITE) && state != SPA_LOAD_TRYIMPORT) {
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1114 dmu_tx_t *tx;
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1115 int need_update = B_FALSE;
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
1116 int c;
1601
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
1117
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1118 /*
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1119 * Claim log blocks that haven't been committed yet.
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1120 * This must all happen in a single txg.
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1121 */
1601
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
1122 tx = dmu_tx_create_assigned(spa_get_dsl(spa),
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1123 spa_first_txg(spa));
2417
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 2329
diff changeset
1124 (void) dmu_objset_find(spa->spa_name,
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 2329
diff changeset
1125 zil_claim, tx, DS_FIND_CHILDREN);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1126 dmu_tx_commit(tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1127
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1128 spa->spa_sync_on = B_TRUE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1129 txg_sync_start(spa->spa_dsl_pool);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1130
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1131 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1132 * Wait for all claims to sync.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1133 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1134 txg_wait_synced(spa->spa_dsl_pool, 0);
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
1135
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
1136 /*
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1137 * If the config cache is stale, or we have uninitialized
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1138 * metaslabs (see spa_vdev_add()), then update the config.
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
1139 */
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1140 if (config_cache_txg != spa->spa_config_txg ||
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1141 state == SPA_LOAD_IMPORT)
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1142 need_update = B_TRUE;
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1143
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1144 for (c = 0; c < rvd->vdev_children; c++)
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1145 if (rvd->vdev_child[c]->vdev_ms_array == 0)
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1146 need_update = B_TRUE;
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
1147
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
1148 /*
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1149 * Update the config cache asychronously in case we're the
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1150 * root pool, in which case the config cache isn't writable yet.
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
1151 */
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1152 if (need_update)
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1153 spa_async_request(spa, SPA_ASYNC_CONFIG_UPDATE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1154 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1155
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1156 error = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1157 out:
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1158 if (error && error != EBADF)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1159 zfs_ereport_post(FM_EREPORT_ZFS_POOL, spa, NULL, NULL, 0, 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1160 spa->spa_load_state = SPA_LOAD_NONE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1161 spa->spa_ena = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1162
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1163 return (error);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1164 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1165
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1166 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1167 * Pool Open/Import
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1168 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1169 * The import case is identical to an open except that the configuration is sent
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1170 * down from userland, instead of grabbed from the configuration cache. For the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1171 * case of an open, the pool configuration will exist in the
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1172 * POOL_STATE_UNINITIALIZED state.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1173 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1174 * The stats information (gen/count/ustats) is used to gather vdev statistics at
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1175 * the same time open the pool, without having to keep around the spa_t in some
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1176 * ambiguous state.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1177 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1178 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1179 spa_open_common(const char *pool, spa_t **spapp, void *tag, nvlist_t **config)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1180 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1181 spa_t *spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1182 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1183 int loaded = B_FALSE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1184 int locked = B_FALSE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1185
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1186 *spapp = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1187
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1188 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1189 * As disgusting as this is, we need to support recursive calls to this
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1190 * function because dsl_dir_open() is called during spa_load(), and ends
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1191 * up calling spa_open() again. The real fix is to figure out how to
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1192 * avoid dsl_dir_open() calling this in the first place.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1193 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1194 if (mutex_owner(&spa_namespace_lock) != curthread) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1195 mutex_enter(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1196 locked = B_TRUE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1197 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1198
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1199 if ((spa = spa_lookup(pool)) == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1200 if (locked)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1201 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1202 return (ENOENT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1203 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1204 if (spa->spa_state == POOL_STATE_UNINITIALIZED) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1205
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1206 spa_activate(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1207
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1208 error = spa_load(spa, spa->spa_config, SPA_LOAD_OPEN, B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1209
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1210 if (error == EBADF) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1211 /*
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
1212 * If vdev_validate() returns failure (indicated by
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
1213 * EBADF), it indicates that one of the vdevs indicates
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
1214 * that the pool has been exported or destroyed. If
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
1215 * this is the case, the config cache is out of sync and
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
1216 * we should remove the pool from the namespace.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1217 */
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1218 zfs_post_ok(spa, NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1219 spa_unload(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1220 spa_deactivate(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1221 spa_remove(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1222 spa_config_sync();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1223 if (locked)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1224 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1225 return (ENOENT);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1226 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1227
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1228 if (error) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1229 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1230 * We can't open the pool, but we still have useful
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1231 * information: the state of each vdev after the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1232 * attempted vdev_open(). Return this to the user.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1233 */
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1234 if (config != NULL && spa->spa_root_vdev != NULL) {
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1235 spa_config_enter(spa, RW_READER, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1236 *config = spa_config_generate(spa, NULL, -1ULL,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1237 B_TRUE);
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1238 spa_config_exit(spa, FTAG);
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1239 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1240 spa_unload(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1241 spa_deactivate(spa);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1242 spa->spa_last_open_failed = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1243 if (locked)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1244 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1245 *spapp = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1246 return (error);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1247 } else {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1248 zfs_post_ok(spa, NULL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1249 spa->spa_last_open_failed = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1250 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1251
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1252 loaded = B_TRUE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1253 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1254
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1255 spa_open_ref(spa, tag);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1256
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1257 /*
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1258 * If we just loaded the pool, resilver anything that's out of date.
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1259 */
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1260 if (loaded && (spa_mode & FWRITE))
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1261 VERIFY(spa_scrub(spa, POOL_SCRUB_RESILVER, B_TRUE) == 0);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1262
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1263 if (locked)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1264 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1265
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1266 *spapp = spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1267
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1268 if (config != NULL) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1269 spa_config_enter(spa, RW_READER, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1270 *config = spa_config_generate(spa, NULL, -1ULL, B_TRUE);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1271 spa_config_exit(spa, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1272 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1273
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1274 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1275 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1276
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1277 int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1278 spa_open(const char *name, spa_t **spapp, void *tag)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1279 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1280 return (spa_open_common(name, spapp, tag, NULL));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1281 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1282
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1283 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1284 * Lookup the given spa_t, incrementing the inject count in the process,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1285 * preventing it from being exported or destroyed.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1286 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1287 spa_t *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1288 spa_inject_addref(char *name)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1289 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1290 spa_t *spa;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1291
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1292 mutex_enter(&spa_namespace_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1293 if ((spa = spa_lookup(name)) == NULL) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1294 mutex_exit(&spa_namespace_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1295 return (NULL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1296 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1297 spa->spa_inject_ref++;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1298 mutex_exit(&spa_namespace_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1299
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1300 return (spa);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1301 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1302
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1303 void
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1304 spa_inject_delref(spa_t *spa)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1305 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1306 mutex_enter(&spa_namespace_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1307 spa->spa_inject_ref--;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1308 mutex_exit(&spa_namespace_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1309 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1310
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1311 static void
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1312 spa_add_spares(spa_t *spa, nvlist_t *config)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1313 {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1314 nvlist_t **spares;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1315 uint_t i, nspares;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1316 nvlist_t *nvroot;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1317 uint64_t guid;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1318 vdev_stat_t *vs;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1319 uint_t vsc;
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1320 uint64_t pool;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1321
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1322 if (spa->spa_nspares == 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1323 return;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1324
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1325 VERIFY(nvlist_lookup_nvlist(config,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1326 ZPOOL_CONFIG_VDEV_TREE, &nvroot) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1327 VERIFY(nvlist_lookup_nvlist_array(spa->spa_sparelist,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1328 ZPOOL_CONFIG_SPARES, &spares, &nspares) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1329 if (nspares != 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1330 VERIFY(nvlist_add_nvlist_array(nvroot,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1331 ZPOOL_CONFIG_SPARES, spares, nspares) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1332 VERIFY(nvlist_lookup_nvlist_array(nvroot,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1333 ZPOOL_CONFIG_SPARES, &spares, &nspares) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1334
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1335 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1336 * Go through and find any spares which have since been
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1337 * repurposed as an active spare. If this is the case, update
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1338 * their status appropriately.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1339 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1340 for (i = 0; i < nspares; i++) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1341 VERIFY(nvlist_lookup_uint64(spares[i],
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1342 ZPOOL_CONFIG_GUID, &guid) == 0);
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1343 if (spa_spare_exists(guid, &pool) && pool != 0ULL) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1344 VERIFY(nvlist_lookup_uint64_array(
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1345 spares[i], ZPOOL_CONFIG_STATS,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1346 (uint64_t **)&vs, &vsc) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1347 vs->vs_state = VDEV_STATE_CANT_OPEN;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1348 vs->vs_aux = VDEV_AUX_SPARED;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1349 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1350 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1351 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1352 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1353
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1354 int
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1355 spa_get_stats(const char *name, nvlist_t **config, char *altroot, size_t buflen)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1356 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1357 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1358 spa_t *spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1359
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1360 *config = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1361 error = spa_open_common(name, &spa, FTAG, config);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1362
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1363 if (spa && *config != NULL) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1364 VERIFY(nvlist_add_uint64(*config, ZPOOL_CONFIG_ERRCOUNT,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1365 spa_get_errlog_size(spa)) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1366
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1367 spa_add_spares(spa, *config);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1368 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1369
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1370 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1371 * We want to get the alternate root even for faulted pools, so we cheat
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1372 * and call spa_lookup() directly.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1373 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1374 if (altroot) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1375 if (spa == NULL) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1376 mutex_enter(&spa_namespace_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1377 spa = spa_lookup(name);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1378 if (spa)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1379 spa_altroot(spa, altroot, buflen);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1380 else
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1381 altroot[0] = '\0';
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1382 spa = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1383 mutex_exit(&spa_namespace_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1384 } else {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1385 spa_altroot(spa, altroot, buflen);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1386 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1387 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1388
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1389 if (spa != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1390 spa_close(spa, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1391
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1392 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1393 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1394
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1395 /*
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1396 * Validate that the 'spares' array is well formed. We must have an array of
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1397 * nvlists, each which describes a valid leaf vdev. If this is an import (mode
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1398 * is VDEV_ALLOC_SPARE), then we allow corrupted spares to be specified, as long
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1399 * as they are well-formed.
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1400 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1401 static int
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1402 spa_validate_spares(spa_t *spa, nvlist_t *nvroot, uint64_t crtxg, int mode)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1403 {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1404 nvlist_t **spares;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1405 uint_t i, nspares;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1406 vdev_t *vd;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1407 int error;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1408
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1409 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1410 * It's acceptable to have no spares specified.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1411 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1412 if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1413 &spares, &nspares) != 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1414 return (0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1415
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1416 if (nspares == 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1417 return (EINVAL);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1418
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1419 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1420 * Make sure the pool is formatted with a version that supports hot
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1421 * spares.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1422 */
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
1423 if (spa_version(spa) < SPA_VERSION_SPARES)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1424 return (ENOTSUP);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1425
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1426 /*
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1427 * Set the pending spare list so we correctly handle device in-use
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1428 * checking.
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1429 */
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1430 spa->spa_pending_spares = spares;
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1431 spa->spa_pending_nspares = nspares;
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1432
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1433 for (i = 0; i < nspares; i++) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1434 if ((error = spa_config_parse(spa, &vd, spares[i], NULL, 0,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1435 mode)) != 0)
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1436 goto out;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1437
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1438 if (!vd->vdev_ops->vdev_op_leaf) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1439 vdev_free(vd);
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1440 error = EINVAL;
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1441 goto out;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1442 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1443
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1444 vd->vdev_top = vd;
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1445
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1446 if ((error = vdev_open(vd)) == 0 &&
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1447 (error = vdev_label_init(vd, crtxg,
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1448 VDEV_LABEL_SPARE)) == 0) {
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1449 VERIFY(nvlist_add_uint64(spares[i], ZPOOL_CONFIG_GUID,
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1450 vd->vdev_guid) == 0);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1451 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1452
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1453 vdev_free(vd);
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1454
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1455 if (error && mode != VDEV_ALLOC_SPARE)
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1456 goto out;
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1457 else
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1458 error = 0;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1459 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1460
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1461 out:
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1462 spa->spa_pending_spares = NULL;
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1463 spa->spa_pending_nspares = 0;
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1464 return (error);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1465 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1466
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1467 /*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1468 * Pool Creation
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1469 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1470 int
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1471 spa_create(const char *pool, nvlist_t *nvroot, nvlist_t *props,
4715
e8d212dda064 6535695 Panic: shpp->sh_eof == shpp->sh_pool_create_len, file: ../../common/fs/zfs/spa_history.c, line: 235
ek110237
parents: 4627
diff changeset
1472 const char *history_str)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1473 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1474 spa_t *spa;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1475 char *altroot = NULL;
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1476 vdev_t *rvd;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1477 dsl_pool_t *dp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1478 dmu_tx_t *tx;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1479 int c, error = 0;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1480 uint64_t txg = TXG_INITIAL;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1481 nvlist_t **spares;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1482 uint_t nspares;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1483 uint64_t version;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1484
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1485 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1486 * If this pool already exists, return failure.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1487 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1488 mutex_enter(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1489 if (spa_lookup(pool) != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1490 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1491 return (EEXIST);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1492 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1493
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1494 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1495 * Allocate a new spa_t structure.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1496 */
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1497 (void) nvlist_lookup_string(props,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1498 zpool_prop_to_name(ZPOOL_PROP_ALTROOT), &altroot);
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1499 spa = spa_add(pool, altroot);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1500 spa_activate(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1501
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1502 spa->spa_uberblock.ub_txg = txg - 1;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1503
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1504 if (props && (error = spa_prop_validate(spa, props))) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1505 spa_unload(spa);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1506 spa_deactivate(spa);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1507 spa_remove(spa);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1508 return (error);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1509 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1510
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1511 if (nvlist_lookup_uint64(props, zpool_prop_to_name(ZPOOL_PROP_VERSION),
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1512 &version) != 0)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1513 version = SPA_VERSION;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1514 ASSERT(version <= SPA_VERSION);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1515 spa->spa_uberblock.ub_version = version;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1516 spa->spa_ubsync = spa->spa_uberblock;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1517
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1518 /*
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1519 * Create the root vdev.
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1520 */
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1521 spa_config_enter(spa, RW_WRITER, FTAG);
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1522
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1523 error = spa_config_parse(spa, &rvd, nvroot, NULL, 0, VDEV_ALLOC_ADD);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1524
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1525 ASSERT(error != 0 || rvd != NULL);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1526 ASSERT(error != 0 || spa->spa_root_vdev == rvd);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1527
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1528 if (error == 0 && rvd->vdev_children == 0)
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1529 error = EINVAL;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1530
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1531 if (error == 0 &&
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1532 (error = vdev_create(rvd, txg, B_FALSE)) == 0 &&
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1533 (error = spa_validate_spares(spa, nvroot, txg,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1534 VDEV_ALLOC_ADD)) == 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1535 for (c = 0; c < rvd->vdev_children; c++)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1536 vdev_init(rvd->vdev_child[c], txg);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1537 vdev_config_dirty(rvd);
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1538 }
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1539
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1540 spa_config_exit(spa, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1541
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1542 if (error != 0) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1543 spa_unload(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1544 spa_deactivate(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1545 spa_remove(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1546 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1547 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1548 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1549
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1550 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1551 * Get the list of spares, if specified.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1552 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1553 if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1554 &spares, &nspares) == 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1555 VERIFY(nvlist_alloc(&spa->spa_sparelist, NV_UNIQUE_NAME,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1556 KM_SLEEP) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1557 VERIFY(nvlist_add_nvlist_array(spa->spa_sparelist,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1558 ZPOOL_CONFIG_SPARES, spares, nspares) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1559 spa_config_enter(spa, RW_WRITER, FTAG);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1560 spa_load_spares(spa);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1561 spa_config_exit(spa, FTAG);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1562 spa->spa_sync_spares = B_TRUE;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1563 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1564
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1565 spa->spa_dsl_pool = dp = dsl_pool_create(spa, txg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1566 spa->spa_meta_objset = dp->dp_meta_objset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1567
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1568 tx = dmu_tx_create_assigned(dp, txg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1569
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1570 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1571 * Create the pool config object.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1572 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1573 spa->spa_config_object = dmu_object_alloc(spa->spa_meta_objset,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1574 DMU_OT_PACKED_NVLIST, 1 << 14,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1575 DMU_OT_PACKED_NVLIST_SIZE, sizeof (uint64_t), tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1576
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1577 if (zap_add(spa->spa_meta_objset,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1578 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_CONFIG,
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1579 sizeof (uint64_t), 1, &spa->spa_config_object, tx) != 0) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1580 cmn_err(CE_PANIC, "failed to add pool config");
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1581 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1582
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1583 /* Newly created pools with the right version are always deflated. */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1584 if (version >= SPA_VERSION_RAIDZ_DEFLATE) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1585 spa->spa_deflate = TRUE;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1586 if (zap_add(spa->spa_meta_objset,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1587 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_DEFLATE,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1588 sizeof (uint64_t), 1, &spa->spa_deflate, tx) != 0) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1589 cmn_err(CE_PANIC, "failed to add deflate");
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1590 }
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1591 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1592
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1593 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1594 * Create the deferred-free bplist object. Turn off compression
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1595 * because sync-to-convergence takes longer if the blocksize
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1596 * keeps changing.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1597 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1598 spa->spa_sync_bplist_obj = bplist_create(spa->spa_meta_objset,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1599 1 << 14, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1600 dmu_object_set_compress(spa->spa_meta_objset, spa->spa_sync_bplist_obj,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1601 ZIO_COMPRESS_OFF, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1602
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1603 if (zap_add(spa->spa_meta_objset,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1604 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_SYNC_BPLIST,
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1605 sizeof (uint64_t), 1, &spa->spa_sync_bplist_obj, tx) != 0) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1606 cmn_err(CE_PANIC, "failed to add bplist");
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1607 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1608
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1609 /*
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1610 * Create the pool's history object.
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1611 */
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1612 if (version >= SPA_VERSION_ZPOOL_HISTORY)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1613 spa_history_create_obj(spa, tx);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1614
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1615 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1616 * Set pool properties.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1617 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1618 spa->spa_bootfs = zpool_prop_default_numeric(ZPOOL_PROP_BOOTFS);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1619 spa->spa_delegation = zpool_prop_default_numeric(ZPOOL_PROP_DELEGATION);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1620 spa->spa_temporary = zpool_prop_default_numeric(ZPOOL_PROP_TEMPORARY);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1621 if (props)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1622 spa_sync_props(spa, props, CRED(), tx);
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1623
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1624 dmu_tx_commit(tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1625
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1626 spa->spa_sync_on = B_TRUE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1627 txg_sync_start(spa->spa_dsl_pool);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1628
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1629 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1630 * We explicitly wait for the first transaction to complete so that our
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1631 * bean counters are appropriately updated.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1632 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1633 txg_wait_synced(spa->spa_dsl_pool, txg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1634
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1635 spa_config_sync();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1636
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1637 if (version >= SPA_VERSION_ZPOOL_HISTORY && history_str != NULL)
4715
e8d212dda064 6535695 Panic: shpp->sh_eof == shpp->sh_pool_create_len, file: ../../common/fs/zfs/spa_history.c, line: 235
ek110237
parents: 4627
diff changeset
1638 (void) spa_history_log(spa, history_str, LOG_CMD_POOL_CREATE);
e8d212dda064 6535695 Panic: shpp->sh_eof == shpp->sh_pool_create_len, file: ../../common/fs/zfs/spa_history.c, line: 235
ek110237
parents: 4627
diff changeset
1639
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1640 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1641
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1642 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1643 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1644
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1645 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1646 * Import the given pool into the system. We set up the necessary spa_t and
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1647 * then call spa_load() to do the dirty work.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1648 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1649 int
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1650 spa_import(const char *pool, nvlist_t *config, nvlist_t *props)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1651 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1652 spa_t *spa;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1653 char *altroot = NULL;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1654 int error;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1655 nvlist_t *nvroot;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1656 nvlist_t **spares;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1657 uint_t nspares;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1658
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1659 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1660 * If a pool with this name exists, return failure.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1661 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1662 mutex_enter(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1663 if (spa_lookup(pool) != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1664 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1665 return (EEXIST);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1666 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1667
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1668 /*
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1669 * Create and initialize the spa structure.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1670 */
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1671 (void) nvlist_lookup_string(props,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1672 zpool_prop_to_name(ZPOOL_PROP_ALTROOT), &altroot);
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1673 spa = spa_add(pool, altroot);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1674 spa_activate(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1675
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1676 /*
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1677 * Pass off the heavy lifting to spa_load().
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
1678 * Pass TRUE for mosconfig because the user-supplied config
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
1679 * is actually the one to trust when doing an import.
1601
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
1680 */
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
1681 error = spa_load(spa, config, SPA_LOAD_IMPORT, B_TRUE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1682
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1683 spa_config_enter(spa, RW_WRITER, FTAG);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1684 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1685 * Toss any existing sparelist, as it doesn't have any validity anymore,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1686 * and conflicts with spa_has_spare().
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1687 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1688 if (spa->spa_sparelist) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1689 nvlist_free(spa->spa_sparelist);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1690 spa->spa_sparelist = NULL;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1691 spa_load_spares(spa);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1692 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1693
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1694 VERIFY(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1695 &nvroot) == 0);
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1696 if (error == 0) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1697 error = spa_validate_spares(spa, nvroot, -1ULL,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1698 VDEV_ALLOC_SPARE);
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1699 }
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1700 spa_config_exit(spa, FTAG);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1701
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1702 if (error != 0 || (props && (error = spa_prop_set(spa, props)))) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1703 spa_unload(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1704 spa_deactivate(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1705 spa_remove(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1706 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1707 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1708 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1709
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1710 /*
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1711 * Override any spares as specified by the user, as these may have
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1712 * correct device names/devids, etc.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1713 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1714 if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1715 &spares, &nspares) == 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1716 if (spa->spa_sparelist)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1717 VERIFY(nvlist_remove(spa->spa_sparelist,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1718 ZPOOL_CONFIG_SPARES, DATA_TYPE_NVLIST_ARRAY) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1719 else
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1720 VERIFY(nvlist_alloc(&spa->spa_sparelist,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1721 NV_UNIQUE_NAME, KM_SLEEP) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1722 VERIFY(nvlist_add_nvlist_array(spa->spa_sparelist,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1723 ZPOOL_CONFIG_SPARES, spares, nspares) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1724 spa_config_enter(spa, RW_WRITER, FTAG);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1725 spa_load_spares(spa);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1726 spa_config_exit(spa, FTAG);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1727 spa->spa_sync_spares = B_TRUE;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1728 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1729
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1730 /*
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1731 * Update the config cache to include the newly-imported pool.
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1732 */
4627
c85631613c19 6509812 it would be useful if zdb(1M) could run on exported pools
ck153898
parents: 4577
diff changeset
1733 if (spa_mode & FWRITE)
c85631613c19 6509812 it would be useful if zdb(1M) could run on exported pools
ck153898
parents: 4577
diff changeset
1734 spa_config_update(spa, SPA_CONFIG_UPDATE_POOL);
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1735
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1736 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1737 * Resilver anything that's out of date.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1738 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1739 if (spa_mode & FWRITE)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1740 VERIFY(spa_scrub(spa, POOL_SCRUB_RESILVER, B_TRUE) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1741
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1742 mutex_exit(&spa_namespace_lock);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1743
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1744 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1745 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1746
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1747 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1748 * This (illegal) pool name is used when temporarily importing a spa_t in order
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1749 * to get the vdev stats associated with the imported devices.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1750 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1751 #define TRYIMPORT_NAME "$import"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1752
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1753 nvlist_t *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1754 spa_tryimport(nvlist_t *tryconfig)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1755 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1756 nvlist_t *config = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1757 char *poolname;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1758 spa_t *spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1759 uint64_t state;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1760
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1761 if (nvlist_lookup_string(tryconfig, ZPOOL_CONFIG_POOL_NAME, &poolname))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1762 return (NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1763
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1764 if (nvlist_lookup_uint64(tryconfig, ZPOOL_CONFIG_POOL_STATE, &state))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1765 return (NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1766
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1767 /*
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1768 * Create and initialize the spa structure.
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1769 */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1770 mutex_enter(&spa_namespace_lock);
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1771 spa = spa_add(TRYIMPORT_NAME, NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1772 spa_activate(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1773
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1774 /*
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1775 * Pass off the heavy lifting to spa_load().
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
1776 * Pass TRUE for mosconfig because the user-supplied config
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
1777 * is actually the one to trust when doing an import.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1778 */
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
1779 (void) spa_load(spa, tryconfig, SPA_LOAD_TRYIMPORT, B_TRUE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1780
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1781 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1782 * If 'tryconfig' was at least parsable, return the current config.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1783 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1784 if (spa->spa_root_vdev != NULL) {
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1785 spa_config_enter(spa, RW_READER, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1786 config = spa_config_generate(spa, NULL, -1ULL, B_TRUE);
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1787 spa_config_exit(spa, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1788 VERIFY(nvlist_add_string(config, ZPOOL_CONFIG_POOL_NAME,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1789 poolname) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1790 VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_POOL_STATE,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1791 state) == 0);
3975
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
1792 VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_TIMESTAMP,
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
1793 spa->spa_uberblock.ub_timestamp) == 0);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1794
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1795 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1796 * Add the list of hot spares.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1797 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1798 spa_add_spares(spa, config);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1799 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1800
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1801 spa_unload(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1802 spa_deactivate(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1803 spa_remove(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1804 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1805
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1806 return (config);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1807 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1808
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1809 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1810 * Pool export/destroy
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1811 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1812 * The act of destroying or exporting a pool is very simple. We make sure there
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1813 * is no more pending I/O and any references to the pool are gone. Then, we
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1814 * update the pool state and sync all the labels to disk, removing the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1815 * configuration from the cache afterwards.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1816 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1817 static int
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
1818 spa_export_common(char *pool, int new_state, nvlist_t **oldconfig)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1819 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1820 spa_t *spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1821
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
1822 if (oldconfig)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
1823 *oldconfig = NULL;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
1824
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1825 if (!(spa_mode & FWRITE))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1826 return (EROFS);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1827
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1828 mutex_enter(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1829 if ((spa = spa_lookup(pool)) == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1830 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1831 return (ENOENT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1832 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1833
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1834 /*
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1835 * Put a hold on the pool, drop the namespace lock, stop async tasks,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1836 * reacquire the namespace lock, and see if we can export.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1837 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1838 spa_open_ref(spa, FTAG);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1839 mutex_exit(&spa_namespace_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1840 spa_async_suspend(spa);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1841 mutex_enter(&spa_namespace_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1842 spa_close(spa, FTAG);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1843
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1844 /*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1845 * The pool will be in core if it's openable,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1846 * in which case we can modify its state.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1847 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1848 if (spa->spa_state != POOL_STATE_UNINITIALIZED && spa->spa_sync_on) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1849 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1850 * Objsets may be open only because they're dirty, so we
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1851 * have to force it to sync before checking spa_refcnt.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1852 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1853 spa_scrub_suspend(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1854 txg_wait_synced(spa->spa_dsl_pool, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1855
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1856 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1857 * A pool cannot be exported or destroyed if there are active
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1858 * references. If we are resetting a pool, allow references by
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1859 * fault injection handlers.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1860 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1861 if (!spa_refcount_zero(spa) ||
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1862 (spa->spa_inject_ref != 0 &&
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1863 new_state != POOL_STATE_UNINITIALIZED)) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1864 spa_scrub_resume(spa);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1865 spa_async_resume(spa);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1866 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1867 return (EBUSY);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1868 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1869
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1870 spa_scrub_resume(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1871 VERIFY(spa_scrub(spa, POOL_SCRUB_NONE, B_TRUE) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1872
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1873 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1874 * We want this to be reflected on every label,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1875 * so mark them all dirty. spa_unload() will do the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1876 * final sync that pushes these changes out.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1877 */
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1878 if (new_state != POOL_STATE_UNINITIALIZED) {
1601
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
1879 spa_config_enter(spa, RW_WRITER, FTAG);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1880 spa->spa_state = new_state;
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1881 spa->spa_final_txg = spa_last_synced_txg(spa) + 1;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1882 vdev_config_dirty(spa->spa_root_vdev);
1601
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
1883 spa_config_exit(spa, FTAG);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1884 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1885 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1886
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1887 spa_event_notify(spa, NULL, ESC_ZFS_POOL_DESTROY);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1888
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1889 if (spa->spa_state != POOL_STATE_UNINITIALIZED) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1890 spa_unload(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1891 spa_deactivate(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1892 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1893
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
1894 if (oldconfig && spa->spa_config)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
1895 VERIFY(nvlist_dup(spa->spa_config, oldconfig, 0) == 0);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
1896
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1897 if (new_state != POOL_STATE_UNINITIALIZED) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1898 spa_remove(spa);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1899 spa_config_sync();
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1900 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1901 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1902
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1903 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1904 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1905
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1906 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1907 * Destroy a storage pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1908 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1909 int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1910 spa_destroy(char *pool)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1911 {
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
1912 return (spa_export_common(pool, POOL_STATE_DESTROYED, NULL));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1913 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1914
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1915 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1916 * Export a storage pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1917 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1918 int
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
1919 spa_export(char *pool, nvlist_t **oldconfig)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1920 {
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
1921 return (spa_export_common(pool, POOL_STATE_EXPORTED, oldconfig));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1922 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1923
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1924 /*
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1925 * Similar to spa_export(), this unloads the spa_t without actually removing it
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1926 * from the namespace in any way.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1927 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1928 int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1929 spa_reset(char *pool)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1930 {
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
1931 return (spa_export_common(pool, POOL_STATE_UNINITIALIZED, NULL));
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1932 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1933
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1934
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1935 /*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1936 * ==========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1937 * Device manipulation
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1938 * ==========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1939 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1940
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1941 /*
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
1942 * Add a device to a storage pool.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1943 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1944 int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1945 spa_vdev_add(spa_t *spa, nvlist_t *nvroot)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1946 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1947 uint64_t txg;
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1948 int c, error;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1949 vdev_t *rvd = spa->spa_root_vdev;
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
1950 vdev_t *vd, *tvd;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1951 nvlist_t **spares;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1952 uint_t i, nspares;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1953
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1954 txg = spa_vdev_enter(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1955
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1956 if ((error = spa_config_parse(spa, &vd, nvroot, NULL, 0,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1957 VDEV_ALLOC_ADD)) != 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1958 return (spa_vdev_exit(spa, NULL, txg, error));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1959
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1960 spa->spa_pending_vdev = vd;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1961
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1962 if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1963 &spares, &nspares) != 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1964 nspares = 0;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1965
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1966 if (vd->vdev_children == 0 && nspares == 0) {
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1967 spa->spa_pending_vdev = NULL;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1968 return (spa_vdev_exit(spa, vd, txg, EINVAL));
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1969 }
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1970
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1971 if (vd->vdev_children != 0) {
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1972 if ((error = vdev_create(vd, txg, B_FALSE)) != 0) {
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1973 spa->spa_pending_vdev = NULL;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1974 return (spa_vdev_exit(spa, vd, txg, error));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1975 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1976 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1977
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1978 /*
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1979 * We must validate the spares after checking the children. Otherwise,
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1980 * vdev_inuse() will blindly overwrite the spare.
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1981 */
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1982 if ((error = spa_validate_spares(spa, nvroot, txg,
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1983 VDEV_ALLOC_ADD)) != 0) {
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1984 spa->spa_pending_vdev = NULL;
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1985 return (spa_vdev_exit(spa, vd, txg, error));
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1986 }
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1987
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1988 spa->spa_pending_vdev = NULL;
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1989
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1990 /*
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1991 * Transfer each new top-level vdev from vd to rvd.
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1992 */
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1993 for (c = 0; c < vd->vdev_children; c++) {
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1994 tvd = vd->vdev_child[c];
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1995 vdev_remove_child(vd, tvd);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1996 tvd->vdev_id = rvd->vdev_children;
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1997 vdev_add_child(rvd, tvd);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1998 vdev_config_dirty(tvd);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1999 }
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2000
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2001 if (nspares != 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2002 if (spa->spa_sparelist != NULL) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2003 nvlist_t **oldspares;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2004 uint_t oldnspares;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2005 nvlist_t **newspares;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2006
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2007 VERIFY(nvlist_lookup_nvlist_array(spa->spa_sparelist,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2008 ZPOOL_CONFIG_SPARES, &oldspares, &oldnspares) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2009
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2010 newspares = kmem_alloc(sizeof (void *) *
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2011 (nspares + oldnspares), KM_SLEEP);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2012 for (i = 0; i < oldnspares; i++)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2013 VERIFY(nvlist_dup(oldspares[i],
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2014 &newspares[i], KM_SLEEP) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2015 for (i = 0; i < nspares; i++)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2016 VERIFY(nvlist_dup(spares[i],
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2017 &newspares[i + oldnspares],
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2018 KM_SLEEP) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2019
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2020 VERIFY(nvlist_remove(spa->spa_sparelist,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2021 ZPOOL_CONFIG_SPARES, DATA_TYPE_NVLIST_ARRAY) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2022
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2023 VERIFY(nvlist_add_nvlist_array(spa->spa_sparelist,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2024 ZPOOL_CONFIG_SPARES, newspares,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2025 nspares + oldnspares) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2026 for (i = 0; i < oldnspares + nspares; i++)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2027 nvlist_free(newspares[i]);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2028 kmem_free(newspares, (oldnspares + nspares) *
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2029 sizeof (void *));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2030 } else {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2031 VERIFY(nvlist_alloc(&spa->spa_sparelist,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2032 NV_UNIQUE_NAME, KM_SLEEP) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2033 VERIFY(nvlist_add_nvlist_array(spa->spa_sparelist,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2034 ZPOOL_CONFIG_SPARES, spares, nspares) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2035 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2036
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2037 spa_load_spares(spa);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2038 spa->spa_sync_spares = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2039 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2040
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2041 /*
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
2042 * We have to be careful when adding new vdevs to an existing pool.
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
2043 * If other threads start allocating from these vdevs before we
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
2044 * sync the config cache, and we lose power, then upon reboot we may
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
2045 * fail to open the pool because there are DVAs that the config cache
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
2046 * can't translate. Therefore, we first add the vdevs without
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
2047 * initializing metaslabs; sync the config cache (via spa_vdev_exit());
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
2048 * and then let spa_config_update() initialize the new metaslabs.
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
2049 *
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
2050 * spa_load() checks for added-but-not-initialized vdevs, so that
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
2051 * if we lose power at any point in this sequence, the remaining
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
2052 * steps will be completed the next time we load the pool.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2053 */
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
2054 (void) spa_vdev_exit(spa, vd, txg, 0);
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
2055
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
2056 mutex_enter(&spa_namespace_lock);
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
2057 spa_config_update(spa, SPA_CONFIG_UPDATE_POOL);
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
2058 mutex_exit(&spa_namespace_lock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2059
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
2060 return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2061 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2062
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2063 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2064 * Attach a device to a mirror. The arguments are the path to any device
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2065 * in the mirror, and the nvroot for the new device. If the path specifies
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2066 * a device that is not mirrored, we automatically insert the mirror vdev.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2067 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2068 * If 'replacing' is specified, the new device is intended to replace the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2069 * existing device; in this case the two devices are made into their own
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2070 * mirror using the 'replacing' vdev, which is functionally identical to
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2071 * the mirror vdev (it actually reuses all the same ops) but has a few
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2072 * extra rules: you can't attach to it after it's been created, and upon
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2073 * completion of resilvering, the first disk (the one being replaced)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2074 * is automatically detached.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2075 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2076 int
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2077 spa_vdev_attach(spa_t *spa, uint64_t guid, nvlist_t *nvroot, int replacing)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2078 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2079 uint64_t txg, open_txg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2080 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2081 vdev_t *rvd = spa->spa_root_vdev;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2082 vdev_t *oldvd, *newvd, *newrootvd, *pvd, *tvd;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2083 vdev_ops_t *pvops;
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
2084 int is_log;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2085
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2086 txg = spa_vdev_enter(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2087
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2088 oldvd = vdev_lookup_by_guid(rvd, guid);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2089
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2090 if (oldvd == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2091 return (spa_vdev_exit(spa, NULL, txg, ENODEV));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2092
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
2093 if (!oldvd->vdev_ops->vdev_op_leaf)
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
2094 return (spa_vdev_exit(spa, NULL, txg, ENOTSUP));
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
2095
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2096 pvd = oldvd->vdev_parent;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2097
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2098 if ((error = spa_config_parse(spa, &newrootvd, nvroot, NULL, 0,
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2099 VDEV_ALLOC_ADD)) != 0)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2100 return (spa_vdev_exit(spa, NULL, txg, EINVAL));
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2101
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2102 if (newrootvd->vdev_children != 1)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2103 return (spa_vdev_exit(spa, newrootvd, txg, EINVAL));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2104
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2105 newvd = newrootvd->vdev_child[0];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2106
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2107 if (!newvd->vdev_ops->vdev_op_leaf)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2108 return (spa_vdev_exit(spa, newrootvd, txg, EINVAL));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2109
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2110 if ((error = vdev_create(newrootvd, txg, replacing)) != 0)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2111 return (spa_vdev_exit(spa, newrootvd, txg, error));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2112
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
2113 /*
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
2114 * Spares can't replace logs
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
2115 */
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
2116 is_log = oldvd->vdev_islog;
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
2117 if (is_log && newvd->vdev_isspare)
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
2118 return (spa_vdev_exit(spa, newrootvd, txg, ENOTSUP));
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
2119
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2120 if (!replacing) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2121 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2122 * For attach, the only allowable parent is a mirror or the root
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2123 * vdev.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2124 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2125 if (pvd->vdev_ops != &vdev_mirror_ops &&
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2126 pvd->vdev_ops != &vdev_root_ops)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2127 return (spa_vdev_exit(spa, newrootvd, txg, ENOTSUP));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2128
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2129 pvops = &vdev_mirror_ops;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2130 } else {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2131 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2132 * Active hot spares can only be replaced by inactive hot
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2133 * spares.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2134 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2135 if (pvd->vdev_ops == &vdev_spare_ops &&
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2136 pvd->vdev_child[1] == oldvd &&
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2137 !spa_has_spare(spa, newvd->vdev_guid))
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2138 return (spa_vdev_exit(spa, newrootvd, txg, ENOTSUP));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2139
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2140 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2141 * If the source is a hot spare, and the parent isn't already a
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2142 * spare, then we want to create a new hot spare. Otherwise, we
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2143 * want to create a replacing vdev. The user is not allowed to
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2144 * attach to a spared vdev child unless the 'isspare' state is
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2145 * the same (spare replaces spare, non-spare replaces
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2146 * non-spare).
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2147 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2148 if (pvd->vdev_ops == &vdev_replacing_ops)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2149 return (spa_vdev_exit(spa, newrootvd, txg, ENOTSUP));
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2150 else if (pvd->vdev_ops == &vdev_spare_ops &&
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2151 newvd->vdev_isspare != oldvd->vdev_isspare)
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2152 return (spa_vdev_exit(spa, newrootvd, txg, ENOTSUP));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2153 else if (pvd->vdev_ops != &vdev_spare_ops &&
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2154 newvd->vdev_isspare)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2155 pvops = &vdev_spare_ops;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2156 else
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2157 pvops = &vdev_replacing_ops;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2158 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2159
1175
759d20c7e57b 6366265 attach/replace should allow a new device size at least the min of all devs in a mirror/raidz
lling
parents: 797
diff changeset
2160 /*
759d20c7e57b 6366265 attach/replace should allow a new device size at least the min of all devs in a mirror/raidz
lling
parents: 797
diff changeset
2161 * Compare the new device size with the replaceable/attachable
759d20c7e57b 6366265 attach/replace should allow a new device size at least the min of all devs in a mirror/raidz
lling
parents: 797
diff changeset
2162 * device size.
759d20c7e57b 6366265 attach/replace should allow a new device size at least the min of all devs in a mirror/raidz
lling
parents: 797
diff changeset
2163 */
759d20c7e57b 6366265 attach/replace should allow a new device size at least the min of all devs in a mirror/raidz
lling
parents: 797
diff changeset
2164 if (newvd->vdev_psize < vdev_get_rsize(oldvd))
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2165 return (spa_vdev_exit(spa, newrootvd, txg, EOVERFLOW));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2166
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
2167 /*
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
2168 * The new device cannot have a higher alignment requirement
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
2169 * than the top-level vdev.
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
2170 */
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
2171 if (newvd->vdev_ashift > oldvd->vdev_top->vdev_ashift)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2172 return (spa_vdev_exit(spa, newrootvd, txg, EDOM));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2173
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2174 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2175 * If this is an in-place replacement, update oldvd's path and devid
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2176 * to make it distinguishable from newvd, and unopenable from now on.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2177 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2178 if (strcmp(oldvd->vdev_path, newvd->vdev_path) == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2179 spa_strfree(oldvd->vdev_path);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2180 oldvd->vdev_path = kmem_alloc(strlen(newvd->vdev_path) + 5,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2181 KM_SLEEP);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2182 (void) sprintf(oldvd->vdev_path, "%s/%s",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2183 newvd->vdev_path, "old");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2184 if (oldvd->vdev_devid != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2185 spa_strfree(oldvd->vdev_devid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2186 oldvd->vdev_devid = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2187 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2188 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2189
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2190 /*
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2191 * If the parent is not a mirror, or if we're replacing, insert the new
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2192 * mirror/replacing/spare vdev above oldvd.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2193 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2194 if (pvd->vdev_ops != pvops)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2195 pvd = vdev_add_parent(oldvd, pvops);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2196
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2197 ASSERT(pvd->vdev_top->vdev_parent == rvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2198 ASSERT(pvd->vdev_ops == pvops);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2199 ASSERT(oldvd->vdev_parent == pvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2200
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2201 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2202 * Extract the new device from its root and add it to pvd.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2203 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2204 vdev_remove_child(newrootvd, newvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2205 newvd->vdev_id = pvd->vdev_children;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2206 vdev_add_child(pvd, newvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2207
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2208 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2209 * If newvd is smaller than oldvd, but larger than its rsize,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2210 * the addition of newvd may have decreased our parent's asize.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2211 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2212 pvd->vdev_asize = MIN(pvd->vdev_asize, newvd->vdev_asize);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2213
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2214 tvd = newvd->vdev_top;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2215 ASSERT(pvd->vdev_top == tvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2216 ASSERT(tvd->vdev_parent == rvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2217
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2218 vdev_config_dirty(tvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2219
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2220 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2221 * Set newvd's DTL to [TXG_INITIAL, open_txg]. It will propagate
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2222 * upward when spa_vdev_exit() calls vdev_dtl_reassess().
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2223 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2224 open_txg = txg + TXG_CONCURRENT_STATES - 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2225
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2226 mutex_enter(&newvd->vdev_dtl_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2227 space_map_add(&newvd->vdev_dtl_map, TXG_INITIAL,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2228 open_txg - TXG_INITIAL + 1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2229 mutex_exit(&newvd->vdev_dtl_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2230
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2231 if (newvd->vdev_isspare)
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2232 spa_spare_activate(newvd);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2233
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2234 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2235 * Mark newvd's DTL dirty in this txg.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2236 */
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
2237 vdev_dirty(tvd, VDD_DTL, newvd, txg);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2238
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2239 (void) spa_vdev_exit(spa, newrootvd, open_txg, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2240
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2241 /*
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2242 * Kick off a resilver to update newvd. We need to grab the namespace
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2243 * lock because spa_scrub() needs to post a sysevent with the pool name.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2244 */
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2245 mutex_enter(&spa_namespace_lock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2246 VERIFY(spa_scrub(spa, POOL_SCRUB_RESILVER, B_TRUE) == 0);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2247 mutex_exit(&spa_namespace_lock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2248
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2249 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2250 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2251
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2252 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2253 * Detach a device from a mirror or replacing vdev.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2254 * If 'replace_done' is specified, only detach if the parent
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2255 * is a replacing vdev.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2256 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2257 int
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2258 spa_vdev_detach(spa_t *spa, uint64_t guid, int replace_done)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2259 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2260 uint64_t txg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2261 int c, t, error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2262 vdev_t *rvd = spa->spa_root_vdev;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2263 vdev_t *vd, *pvd, *cvd, *tvd;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2264 boolean_t unspare = B_FALSE;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2265 uint64_t unspare_guid;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2266
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2267 txg = spa_vdev_enter(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2268
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2269 vd = vdev_lookup_by_guid(rvd, guid);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2270
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2271 if (vd == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2272 return (spa_vdev_exit(spa, NULL, txg, ENODEV));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2273
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
2274 if (!vd->vdev_ops->vdev_op_leaf)
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
2275 return (spa_vdev_exit(spa, NULL, txg, ENOTSUP));
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
2276
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2277 pvd = vd->vdev_parent;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2278
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2279 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2280 * If replace_done is specified, only remove this device if it's
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2281 * the first child of a replacing vdev. For the 'spare' vdev, either
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2282 * disk can be removed.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2283 */
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2284 if (replace_done) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2285 if (pvd->vdev_ops == &vdev_replacing_ops) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2286 if (vd->vdev_id != 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2287 return (spa_vdev_exit(spa, NULL, txg, ENOTSUP));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2288 } else if (pvd->vdev_ops != &vdev_spare_ops) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2289 return (spa_vdev_exit(spa, NULL, txg, ENOTSUP));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2290 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2291 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2292
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2293 ASSERT(pvd->vdev_ops != &vdev_spare_ops ||
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
2294 spa_version(spa) >= SPA_VERSION_SPARES);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2295
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2296 /*
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2297 * Only mirror, replacing, and spare vdevs support detach.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2298 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2299 if (pvd->vdev_ops != &vdev_replacing_ops &&
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2300 pvd->vdev_ops != &vdev_mirror_ops &&
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2301 pvd->vdev_ops != &vdev_spare_ops)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2302 return (spa_vdev_exit(spa, NULL, txg, ENOTSUP));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2303
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2304 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2305 * If there's only one replica, you can't detach it.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2306 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2307 if (pvd->vdev_children <= 1)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2308 return (spa_vdev_exit(spa, NULL, txg, EBUSY));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2309
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2310 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2311 * If all siblings have non-empty DTLs, this device may have the only
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2312 * valid copy of the data, which means we cannot safely detach it.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2313 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2314 * XXX -- as in the vdev_offline() case, we really want a more
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2315 * precise DTL check.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2316 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2317 for (c = 0; c < pvd->vdev_children; c++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2318 uint64_t dirty;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2319
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2320 cvd = pvd->vdev_child[c];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2321 if (cvd == vd)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2322 continue;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2323 if (vdev_is_dead(cvd))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2324 continue;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2325 mutex_enter(&cvd->vdev_dtl_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2326 dirty = cvd->vdev_dtl_map.sm_space |
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2327 cvd->vdev_dtl_scrub.sm_space;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2328 mutex_exit(&cvd->vdev_dtl_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2329 if (!dirty)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2330 break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2331 }
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2332
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2333 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2334 * If we are a replacing or spare vdev, then we can always detach the
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2335 * latter child, as that is how one cancels the operation.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2336 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2337 if ((pvd->vdev_ops == &vdev_mirror_ops || vd->vdev_id != 1) &&
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2338 c == pvd->vdev_children)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2339 return (spa_vdev_exit(spa, NULL, txg, EBUSY));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2340
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2341 /*
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2342 * If we are detaching the original disk from a spare, then it implies
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2343 * that the spare should become a real disk, and be removed from the
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2344 * active spare list for the pool.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2345 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2346 if (pvd->vdev_ops == &vdev_spare_ops &&
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2347 vd->vdev_id == 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2348 unspare = B_TRUE;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2349
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2350 /*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2351 * Erase the disk labels so the disk can be used for other things.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2352 * This must be done after all other error cases are handled,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2353 * but before we disembowel vd (so we can still do I/O to it).
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2354 * But if we can't do it, don't treat the error as fatal --
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2355 * it may be that the unwritability of the disk is the reason
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2356 * it's being detached!
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2357 */
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2358 error = vdev_label_init(vd, 0, VDEV_LABEL_REMOVE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2359
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2360 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2361 * Remove vd from its parent and compact the parent's children.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2362 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2363 vdev_remove_child(pvd, vd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2364 vdev_compact_children(pvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2365
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2366 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2367 * Remember one of the remaining children so we can get tvd below.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2368 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2369 cvd = pvd->vdev_child[0];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2370
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2371 /*
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2372 * If we need to remove the remaining child from the list of hot spares,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2373 * do it now, marking the vdev as no longer a spare in the process. We
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2374 * must do this before vdev_remove_parent(), because that can change the
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2375 * GUID if it creates a new toplevel GUID.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2376 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2377 if (unspare) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2378 ASSERT(cvd->vdev_isspare);
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2379 spa_spare_remove(cvd);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2380 unspare_guid = cvd->vdev_guid;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2381 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2382
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2383 /*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2384 * If the parent mirror/replacing vdev only has one child,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2385 * the parent is no longer needed. Remove it from the tree.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2386 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2387 if (pvd->vdev_children == 1)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2388 vdev_remove_parent(cvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2389
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2390 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2391 * We don't set tvd until now because the parent we just removed
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2392 * may have been the previous top-level vdev.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2393 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2394 tvd = cvd->vdev_top;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2395 ASSERT(tvd->vdev_parent == rvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2396
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2397 /*
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2398 * Reevaluate the parent vdev state.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2399 */
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2400 vdev_propagate_state(cvd);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2401
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2402 /*
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2403 * If the device we just detached was smaller than the others, it may be
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2404 * possible to add metaslabs (i.e. grow the pool). vdev_metaslab_init()
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2405 * can't fail because the existing metaslabs are already in core, so
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2406 * there's nothing to read from disk.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2407 */
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
2408 VERIFY(vdev_metaslab_init(tvd, txg) == 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2409
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2410 vdev_config_dirty(tvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2411
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2412 /*
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2413 * Mark vd's DTL as dirty in this txg. vdev_dtl_sync() will see that
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2414 * vd->vdev_detached is set and free vd's DTL object in syncing context.
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2415 * But first make sure we're not on any *other* txg's DTL list, to
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2416 * prevent vd from being accessed after it's freed.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2417 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2418 for (t = 0; t < TXG_SIZE; t++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2419 (void) txg_list_remove_this(&tvd->vdev_dtl_list, vd, t);
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
2420 vd->vdev_detached = B_TRUE;
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
2421 vdev_dirty(tvd, VDD_DTL, vd, txg);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2422
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2423 spa_event_notify(spa, vd, ESC_ZFS_VDEV_REMOVE);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2424
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2425 error = spa_vdev_exit(spa, vd, txg, 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2426
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2427 /*
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2428 * If this was the removal of the original device in a hot spare vdev,
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2429 * then we want to go through and remove the device from the hot spare
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2430 * list of every other pool.
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2431 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2432 if (unspare) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2433 spa = NULL;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2434 mutex_enter(&spa_namespace_lock);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2435 while ((spa = spa_next(spa)) != NULL) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2436 if (spa->spa_state != POOL_STATE_ACTIVE)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2437 continue;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2438
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2439 (void) spa_vdev_remove(spa, unspare_guid, B_TRUE);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2440 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2441 mutex_exit(&spa_namespace_lock);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2442 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2443
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2444 return (error);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2445 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2446
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2447 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2448 * Remove a device from the pool. Currently, this supports removing only hot
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2449 * spares.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2450 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2451 int
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2452 spa_vdev_remove(spa_t *spa, uint64_t guid, boolean_t unspare)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2453 {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2454 vdev_t *vd;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2455 nvlist_t **spares, *nv, **newspares;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2456 uint_t i, j, nspares;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2457 int ret = 0;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2458
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2459 spa_config_enter(spa, RW_WRITER, FTAG);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2460
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2461 vd = spa_lookup_by_guid(spa, guid);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2462
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2463 nv = NULL;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2464 if (spa->spa_spares != NULL &&
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2465 nvlist_lookup_nvlist_array(spa->spa_sparelist, ZPOOL_CONFIG_SPARES,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2466 &spares, &nspares) == 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2467 for (i = 0; i < nspares; i++) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2468 uint64_t theguid;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2469
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2470 VERIFY(nvlist_lookup_uint64(spares[i],
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2471 ZPOOL_CONFIG_GUID, &theguid) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2472 if (theguid == guid) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2473 nv = spares[i];
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2474 break;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2475 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2476 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2477 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2478
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2479 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2480 * We only support removing a hot spare, and only if it's not currently
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2481 * in use in this pool.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2482 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2483 if (nv == NULL && vd == NULL) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2484 ret = ENOENT;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2485 goto out;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2486 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2487
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2488 if (nv == NULL && vd != NULL) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2489 ret = ENOTSUP;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2490 goto out;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2491 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2492
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2493 if (!unspare && nv != NULL && vd != NULL) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2494 ret = EBUSY;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2495 goto out;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2496 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2497
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2498 if (nspares == 1) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2499 newspares = NULL;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2500 } else {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2501 newspares = kmem_alloc((nspares - 1) * sizeof (void *),
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2502 KM_SLEEP);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2503 for (i = 0, j = 0; i < nspares; i++) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2504 if (spares[i] != nv)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2505 VERIFY(nvlist_dup(spares[i],
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2506 &newspares[j++], KM_SLEEP) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2507 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2508 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2509
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2510 VERIFY(nvlist_remove(spa->spa_sparelist, ZPOOL_CONFIG_SPARES,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2511 DATA_TYPE_NVLIST_ARRAY) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2512 VERIFY(nvlist_add_nvlist_array(spa->spa_sparelist, ZPOOL_CONFIG_SPARES,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2513 newspares, nspares - 1) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2514 for (i = 0; i < nspares - 1; i++)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2515 nvlist_free(newspares[i]);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2516 kmem_free(newspares, (nspares - 1) * sizeof (void *));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2517 spa_load_spares(spa);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2518 spa->spa_sync_spares = B_TRUE;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2519
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2520 out:
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2521 spa_config_exit(spa, FTAG);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2522
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2523 return (ret);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2524 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2525
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2526 /*
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2527 * Find any device that's done replacing, or a vdev marked 'unspare' that's
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2528 * current spared, so we can detach it.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2529 */
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2530 static vdev_t *
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2531 spa_vdev_resilver_done_hunt(vdev_t *vd)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2532 {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2533 vdev_t *newvd, *oldvd;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2534 int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2535
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2536 for (c = 0; c < vd->vdev_children; c++) {
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2537 oldvd = spa_vdev_resilver_done_hunt(vd->vdev_child[c]);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2538 if (oldvd != NULL)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2539 return (oldvd);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2540 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2541
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2542 /*
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2543 * Check for a completed replacement.
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2544 */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2545 if (vd->vdev_ops == &vdev_replacing_ops && vd->vdev_children == 2) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2546 oldvd = vd->vdev_child[0];
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2547 newvd = vd->vdev_child[1];
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2548
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2549 mutex_enter(&newvd->vdev_dtl_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2550 if (newvd->vdev_dtl_map.sm_space == 0 &&
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2551 newvd->vdev_dtl_scrub.sm_space == 0) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2552 mutex_exit(&newvd->vdev_dtl_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2553 return (oldvd);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2554 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2555 mutex_exit(&newvd->vdev_dtl_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2556 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2557
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2558 /*
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2559 * Check for a completed resilver with the 'unspare' flag set.
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2560 */
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2561 if (vd->vdev_ops == &vdev_spare_ops && vd->vdev_children == 2) {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2562 newvd = vd->vdev_child[0];
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2563 oldvd = vd->vdev_child[1];
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2564
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2565 mutex_enter(&newvd->vdev_dtl_lock);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2566 if (newvd->vdev_unspare &&
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2567 newvd->vdev_dtl_map.sm_space == 0 &&
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2568 newvd->vdev_dtl_scrub.sm_space == 0) {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2569 newvd->vdev_unspare = 0;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2570 mutex_exit(&newvd->vdev_dtl_lock);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2571 return (oldvd);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2572 }
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2573 mutex_exit(&newvd->vdev_dtl_lock);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2574 }
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2575
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2576 return (NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2577 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2578
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2579 static void
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2580 spa_vdev_resilver_done(spa_t *spa)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2581 {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2582 vdev_t *vd;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2583 vdev_t *pvd;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2584 uint64_t guid;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2585 uint64_t pguid = 0;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2586
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2587 spa_config_enter(spa, RW_READER, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2588
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2589 while ((vd = spa_vdev_resilver_done_hunt(spa->spa_root_vdev)) != NULL) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2590 guid = vd->vdev_guid;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2591 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2592 * If we have just finished replacing a hot spared device, then
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2593 * we need to detach the parent's first child (the original hot
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2594 * spare) as well.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2595 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2596 pvd = vd->vdev_parent;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2597 if (pvd->vdev_parent->vdev_ops == &vdev_spare_ops &&
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2598 pvd->vdev_id == 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2599 ASSERT(pvd->vdev_ops == &vdev_replacing_ops);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2600 ASSERT(pvd->vdev_parent->vdev_children == 2);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2601 pguid = pvd->vdev_parent->vdev_child[1]->vdev_guid;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2602 }
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2603 spa_config_exit(spa, FTAG);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2604 if (spa_vdev_detach(spa, guid, B_TRUE) != 0)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2605 return;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2606 if (pguid != 0 && spa_vdev_detach(spa, pguid, B_TRUE) != 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2607 return;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2608 spa_config_enter(spa, RW_READER, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2609 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2610
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2611 spa_config_exit(spa, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2612 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2613
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2614 /*
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
2615 * Update the stored path for this vdev. Dirty the vdev configuration, relying
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
2616 * on spa_vdev_enter/exit() to synchronize the labels and cache.
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
2617 */
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
2618 int
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
2619 spa_vdev_setpath(spa_t *spa, uint64_t guid, const char *newpath)
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
2620 {
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
2621 vdev_t *rvd, *vd;
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
2622 uint64_t txg;
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
2623
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
2624 rvd = spa->spa_root_vdev;
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
2625
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
2626 txg = spa_vdev_enter(spa);
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
2627
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2628 if ((vd = vdev_lookup_by_guid(rvd, guid)) == NULL) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2629 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2630 * Determine if this is a reference to a hot spare. In that
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2631 * case, update the path as stored in the spare list.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2632 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2633 nvlist_t **spares;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2634 uint_t i, nspares;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2635 if (spa->spa_sparelist != NULL) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2636 VERIFY(nvlist_lookup_nvlist_array(spa->spa_sparelist,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2637 ZPOOL_CONFIG_SPARES, &spares, &nspares) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2638 for (i = 0; i < nspares; i++) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2639 uint64_t theguid;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2640 VERIFY(nvlist_lookup_uint64(spares[i],
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2641 ZPOOL_CONFIG_GUID, &theguid) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2642 if (theguid == guid)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2643 break;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2644 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2645
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2646 if (i == nspares)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2647 return (spa_vdev_exit(spa, NULL, txg, ENOENT));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2648
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2649 VERIFY(nvlist_add_string(spares[i],
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2650 ZPOOL_CONFIG_PATH, newpath) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2651 spa_load_spares(spa);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2652 spa->spa_sync_spares = B_TRUE;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2653 return (spa_vdev_exit(spa, NULL, txg, 0));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2654 } else {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2655 return (spa_vdev_exit(spa, NULL, txg, ENOENT));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2656 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2657 }
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
2658
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
2659 if (!vd->vdev_ops->vdev_op_leaf)
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
2660 return (spa_vdev_exit(spa, NULL, txg, ENOTSUP));
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
2661
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
2662 spa_strfree(vd->vdev_path);
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
2663 vd->vdev_path = spa_strdup(newpath);
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
2664
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
2665 vdev_config_dirty(vd->vdev_top);
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
2666
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
2667 return (spa_vdev_exit(spa, NULL, txg, 0));
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
2668 }
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
2669
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
2670 /*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2671 * ==========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2672 * SPA Scrubbing
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2673 * ==========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2674 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2675
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2676 static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2677 spa_scrub_io_done(zio_t *zio)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2678 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2679 spa_t *spa = zio->io_spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2680
4309
3dfde0f4662d 6542676 ARC needs to track meta-data memory overhead
maybee
parents: 4178
diff changeset
2681 arc_data_buf_free(zio->io_data, zio->io_size);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2682
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2683 mutex_enter(&spa->spa_scrub_lock);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2684 if (zio->io_error && !(zio->io_flags & ZIO_FLAG_SPECULATIVE)) {
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2685 vdev_t *vd = zio->io_vd ? zio->io_vd : spa->spa_root_vdev;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2686 spa->spa_scrub_errors++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2687 mutex_enter(&vd->vdev_stat_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2688 vd->vdev_stat.vs_scrub_errors++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2689 mutex_exit(&vd->vdev_stat_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2690 }
3697
5340a4d98e0b 6456888 zpool scrubbing leads to memory exhaustion and system hang
mishra
parents: 3377
diff changeset
2691
5340a4d98e0b 6456888 zpool scrubbing leads to memory exhaustion and system hang
mishra
parents: 3377
diff changeset
2692 if (--spa->spa_scrub_inflight < spa->spa_scrub_maxinflight)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2693 cv_broadcast(&spa->spa_scrub_io_cv);
3697
5340a4d98e0b 6456888 zpool scrubbing leads to memory exhaustion and system hang
mishra
parents: 3377
diff changeset
2694
5340a4d98e0b 6456888 zpool scrubbing leads to memory exhaustion and system hang
mishra
parents: 3377
diff changeset
2695 ASSERT(spa->spa_scrub_inflight >= 0);
5340a4d98e0b 6456888 zpool scrubbing leads to memory exhaustion and system hang
mishra
parents: 3377
diff changeset
2696
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2697 mutex_exit(&spa->spa_scrub_lock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2698 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2699
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2700 static void
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2701 spa_scrub_io_start(spa_t *spa, blkptr_t *bp, int priority, int flags,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2702 zbookmark_t *zb)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2703 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2704 size_t size = BP_GET_LSIZE(bp);
3697
5340a4d98e0b 6456888 zpool scrubbing leads to memory exhaustion and system hang
mishra
parents: 3377
diff changeset
2705 void *data;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2706
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2707 mutex_enter(&spa->spa_scrub_lock);
3697
5340a4d98e0b 6456888 zpool scrubbing leads to memory exhaustion and system hang
mishra
parents: 3377
diff changeset
2708 /*
5340a4d98e0b 6456888 zpool scrubbing leads to memory exhaustion and system hang
mishra
parents: 3377
diff changeset
2709 * Do not give too much work to vdev(s).
5340a4d98e0b 6456888 zpool scrubbing leads to memory exhaustion and system hang
mishra
parents: 3377
diff changeset
2710 */
5340a4d98e0b 6456888 zpool scrubbing leads to memory exhaustion and system hang
mishra
parents: 3377
diff changeset
2711 while (spa->spa_scrub_inflight >= spa->spa_scrub_maxinflight) {
5340a4d98e0b 6456888 zpool scrubbing leads to memory exhaustion and system hang
mishra
parents: 3377
diff changeset
2712 cv_wait(&spa->spa_scrub_io_cv, &spa->spa_scrub_lock);
5340a4d98e0b 6456888 zpool scrubbing leads to memory exhaustion and system hang
mishra
parents: 3377
diff changeset
2713 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2714 spa->spa_scrub_inflight++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2715 mutex_exit(&spa->spa_scrub_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2716
4309
3dfde0f4662d 6542676 ARC needs to track meta-data memory overhead
maybee
parents: 4178
diff changeset
2717 data = arc_data_buf_alloc(size);
3697
5340a4d98e0b 6456888 zpool scrubbing leads to memory exhaustion and system hang
mishra
parents: 3377
diff changeset
2718
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2719 if (zb->zb_level == -1 && BP_GET_TYPE(bp) != DMU_OT_OBJSET)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2720 flags |= ZIO_FLAG_SPECULATIVE; /* intent log block */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2721
1807
35c8b566d7af 6410711 intent log blocks don't get invited to pool parties
bonwick
parents: 1775
diff changeset
2722 flags |= ZIO_FLAG_SCRUB_THREAD | ZIO_FLAG_CANFAIL;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2723
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2724 zio_nowait(zio_read(NULL, spa, bp, data, size,
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2725 spa_scrub_io_done, NULL, priority, flags, zb));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2726 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2727
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2728 /* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2729 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2730 spa_scrub_cb(traverse_blk_cache_t *bc, spa_t *spa, void *a)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2731 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2732 blkptr_t *bp = &bc->bc_blkptr;
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2733 vdev_t *vd = spa->spa_root_vdev;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2734 dva_t *dva = bp->blk_dva;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2735 int needs_resilver = B_FALSE;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2736 int d;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2737
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2738 if (bc->bc_errno) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2739 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2740 * We can't scrub this block, but we can continue to scrub
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2741 * the rest of the pool. Note the error and move along.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2742 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2743 mutex_enter(&spa->spa_scrub_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2744 spa->spa_scrub_errors++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2745 mutex_exit(&spa->spa_scrub_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2746
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2747 mutex_enter(&vd->vdev_stat_lock);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2748 vd->vdev_stat.vs_scrub_errors++;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2749 mutex_exit(&vd->vdev_stat_lock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2750
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2751 return (ERESTART);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2752 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2753
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2754 ASSERT(bp->blk_birth < spa->spa_scrub_maxtxg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2755
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2756 for (d = 0; d < BP_GET_NDVAS(bp); d++) {
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2757 vd = vdev_lookup_top(spa, DVA_GET_VDEV(&dva[d]));
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2758
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2759 ASSERT(vd != NULL);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2760
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2761 /*
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2762 * Keep track of how much data we've examined so that
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2763 * zpool(1M) status can make useful progress reports.
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2764 */
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2765 mutex_enter(&vd->vdev_stat_lock);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2766 vd->vdev_stat.vs_scrub_examined += DVA_GET_ASIZE(&dva[d]);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2767 mutex_exit(&vd->vdev_stat_lock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2768
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2769 if (spa->spa_scrub_type == POOL_SCRUB_RESILVER) {
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2770 if (DVA_GET_GANG(&dva[d])) {
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2771 /*
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2772 * Gang members may be spread across multiple
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2773 * vdevs, so the best we can do is look at the
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2774 * pool-wide DTL.
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2775 * XXX -- it would be better to change our
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2776 * allocation policy to ensure that this can't
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2777 * happen.
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2778 */
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2779 vd = spa->spa_root_vdev;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2780 }
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2781 if (vdev_dtl_contains(&vd->vdev_dtl_map,
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2782 bp->blk_birth, 1))
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2783 needs_resilver = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2784 }
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2785 }
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2786
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2787 if (spa->spa_scrub_type == POOL_SCRUB_EVERYTHING)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2788 spa_scrub_io_start(spa, bp, ZIO_PRIORITY_SCRUB,
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2789 ZIO_FLAG_SCRUB, &bc->bc_bookmark);
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2790 else if (needs_resilver)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2791 spa_scrub_io_start(spa, bp, ZIO_PRIORITY_RESILVER,
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2792 ZIO_FLAG_RESILVER, &bc->bc_bookmark);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2793
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2794 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2795 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2796
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2797 static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2798 spa_scrub_thread(spa_t *spa)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2799 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2800 callb_cpr_t cprinfo;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2801 traverse_handle_t *th = spa->spa_scrub_th;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2802 vdev_t *rvd = spa->spa_root_vdev;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2803 pool_scrub_type_t scrub_type = spa->spa_scrub_type;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2804 int error = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2805 boolean_t complete;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2806
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2807 CALLB_CPR_INIT(&cprinfo, &spa->spa_scrub_lock, callb_generic_cpr, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2808
797
af56ba8b7e41 6344108 snapshot create/delete interlock with scrub/resilver must sync txg
bonwick
parents: 789
diff changeset
2809 /*
af56ba8b7e41 6344108 snapshot create/delete interlock with scrub/resilver must sync txg
bonwick
parents: 789
diff changeset
2810 * If we're restarting due to a snapshot create/delete,
af56ba8b7e41 6344108 snapshot create/delete interlock with scrub/resilver must sync txg
bonwick
parents: 789
diff changeset
2811 * wait for that to complete.
af56ba8b7e41 6344108 snapshot create/delete interlock with scrub/resilver must sync txg
bonwick
parents: 789
diff changeset
2812 */
af56ba8b7e41 6344108 snapshot create/delete interlock with scrub/resilver must sync txg
bonwick
parents: 789
diff changeset
2813 txg_wait_synced(spa_get_dsl(spa), 0);
af56ba8b7e41 6344108 snapshot create/delete interlock with scrub/resilver must sync txg
bonwick
parents: 789
diff changeset
2814
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2815 dprintf("start %s mintxg=%llu maxtxg=%llu\n",
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2816 scrub_type == POOL_SCRUB_RESILVER ? "resilver" : "scrub",
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2817 spa->spa_scrub_mintxg, spa->spa_scrub_maxtxg);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2818
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2819 spa_config_enter(spa, RW_WRITER, FTAG);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2820 vdev_reopen(rvd); /* purge all vdev caches */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2821 vdev_config_dirty(rvd); /* rewrite all disk labels */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2822 vdev_scrub_stat_update(rvd, scrub_type, B_FALSE);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2823 spa_config_exit(spa, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2824
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2825 mutex_enter(&spa->spa_scrub_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2826 spa->spa_scrub_errors = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2827 spa->spa_scrub_active = 1;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2828 ASSERT(spa->spa_scrub_inflight == 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2829
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2830 while (!spa->spa_scrub_stop) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2831 CALLB_CPR_SAFE_BEGIN(&cprinfo);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2832 while (spa->spa_scrub_suspended) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2833 spa->spa_scrub_active = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2834 cv_broadcast(&spa->spa_scrub_cv);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2835 cv_wait(&spa->spa_scrub_cv, &spa->spa_scrub_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2836 spa->spa_scrub_active = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2837 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2838 CALLB_CPR_SAFE_END(&cprinfo, &spa->spa_scrub_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2839
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2840 if (spa->spa_scrub_restart_txg != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2841 break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2842
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2843 mutex_exit(&spa->spa_scrub_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2844 error = traverse_more(th);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2845 mutex_enter(&spa->spa_scrub_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2846 if (error != EAGAIN)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2847 break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2848 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2849
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2850 while (spa->spa_scrub_inflight)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2851 cv_wait(&spa->spa_scrub_io_cv, &spa->spa_scrub_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2852
1601
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
2853 spa->spa_scrub_active = 0;
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
2854 cv_broadcast(&spa->spa_scrub_cv);
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
2855
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
2856 mutex_exit(&spa->spa_scrub_lock);
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
2857
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
2858 spa_config_enter(spa, RW_WRITER, FTAG);
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
2859
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
2860 mutex_enter(&spa->spa_scrub_lock);
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
2861
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
2862 /*
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
2863 * Note: we check spa_scrub_restart_txg under both spa_scrub_lock
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
2864 * AND the spa config lock to synchronize with any config changes
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
2865 * that revise the DTLs under spa_vdev_enter() / spa_vdev_exit().
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
2866 */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2867 if (spa->spa_scrub_restart_txg != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2868 error = ERESTART;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2869
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2870 if (spa->spa_scrub_stop)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2871 error = EINTR;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2872
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2873 /*
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2874 * Even if there were uncorrectable errors, we consider the scrub
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2875 * completed. The downside is that if there is a transient error during
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2876 * a resilver, we won't resilver the data properly to the target. But
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2877 * if the damage is permanent (more likely) we will resilver forever,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2878 * which isn't really acceptable. Since there is enough information for
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2879 * the user to know what has failed and why, this seems like a more
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2880 * tractable approach.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2881 */
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2882 complete = (error == 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2883
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2884 dprintf("end %s to maxtxg=%llu %s, traverse=%d, %llu errors, stop=%u\n",
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2885 scrub_type == POOL_SCRUB_RESILVER ? "resilver" : "scrub",
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2886 spa->spa_scrub_maxtxg, complete ? "done" : "FAILED",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2887 error, spa->spa_scrub_errors, spa->spa_scrub_stop);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2888
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2889 mutex_exit(&spa->spa_scrub_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2890
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2891 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2892 * If the scrub/resilver completed, update all DTLs to reflect this.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2893 * Whether it succeeded or not, vacate all temporary scrub DTLs.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2894 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2895 vdev_dtl_reassess(rvd, spa_last_synced_txg(spa) + 1,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2896 complete ? spa->spa_scrub_maxtxg : 0, B_TRUE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2897 vdev_scrub_stat_update(rvd, POOL_SCRUB_NONE, complete);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2898 spa_errlog_rotate(spa);
1601
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
2899
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2900 if (scrub_type == POOL_SCRUB_RESILVER && complete)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2901 spa_event_notify(spa, NULL, ESC_ZFS_RESILVER_FINISH);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2902
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2903 spa_config_exit(spa, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2904
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2905 mutex_enter(&spa->spa_scrub_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2906
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2907 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2908 * We may have finished replacing a device.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2909 * Let the async thread assess this and handle the detach.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2910 */
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2911 spa_async_request(spa, SPA_ASYNC_RESILVER_DONE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2912
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2913 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2914 * If we were told to restart, our final act is to start a new scrub.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2915 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2916 if (error == ERESTART)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2917 spa_async_request(spa, scrub_type == POOL_SCRUB_RESILVER ?
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2918 SPA_ASYNC_RESILVER : SPA_ASYNC_SCRUB);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2919
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2920 spa->spa_scrub_type = POOL_SCRUB_NONE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2921 spa->spa_scrub_active = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2922 spa->spa_scrub_thread = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2923 cv_broadcast(&spa->spa_scrub_cv);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2924 CALLB_CPR_EXIT(&cprinfo); /* drops &spa->spa_scrub_lock */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2925 thread_exit();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2926 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2927
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2928 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2929 spa_scrub_suspend(spa_t *spa)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2930 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2931 mutex_enter(&spa->spa_scrub_lock);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2932 spa->spa_scrub_suspended++;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2933 while (spa->spa_scrub_active) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2934 cv_broadcast(&spa->spa_scrub_cv);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2935 cv_wait(&spa->spa_scrub_cv, &spa->spa_scrub_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2936 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2937 while (spa->spa_scrub_inflight)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2938 cv_wait(&spa->spa_scrub_io_cv, &spa->spa_scrub_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2939 mutex_exit(&spa->spa_scrub_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2940 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2941
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2942 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2943 spa_scrub_resume(spa_t *spa)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2944 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2945 mutex_enter(&spa->spa_scrub_lock);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2946 ASSERT(spa->spa_scrub_suspended != 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2947 if (--spa->spa_scrub_suspended == 0)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2948 cv_broadcast(&spa->spa_scrub_cv);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2949 mutex_exit(&spa->spa_scrub_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2950 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2951
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2952 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2953 spa_scrub_restart(spa_t *spa, uint64_t txg)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2954 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2955 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2956 * Something happened (e.g. snapshot create/delete) that means
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2957 * we must restart any in-progress scrubs. The itinerary will
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2958 * fix this properly.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2959 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2960 mutex_enter(&spa->spa_scrub_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2961 spa->spa_scrub_restart_txg = txg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2962 mutex_exit(&spa->spa_scrub_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2963 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2964
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2965 int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2966 spa_scrub(spa_t *spa, pool_scrub_type_t type, boolean_t force)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2967 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2968 space_seg_t *ss;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2969 uint64_t mintxg, maxtxg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2970 vdev_t *rvd = spa->spa_root_vdev;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2971
4808
63629eaeb41a 6498144 ::kmastat could be even easier to read
ek110237
parents: 4787
diff changeset
2972 ASSERT(MUTEX_HELD(&spa_namespace_lock));
63629eaeb41a 6498144 ::kmastat could be even easier to read
ek110237
parents: 4787
diff changeset
2973 ASSERT(!spa_config_held(spa, RW_WRITER));
63629eaeb41a 6498144 ::kmastat could be even easier to read
ek110237
parents: 4787
diff changeset
2974
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2975 if ((uint_t)type >= POOL_SCRUB_TYPES)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2976 return (ENOTSUP);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2977
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2978 mutex_enter(&spa->spa_scrub_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2979
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2980 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2981 * If there's a scrub or resilver already in progress, stop it.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2982 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2983 while (spa->spa_scrub_thread != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2984 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2985 * Don't stop a resilver unless forced.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2986 */
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2987 if (spa->spa_scrub_type == POOL_SCRUB_RESILVER && !force) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2988 mutex_exit(&spa->spa_scrub_lock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2989 return (EBUSY);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2990 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2991 spa->spa_scrub_stop = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2992 cv_broadcast(&spa->spa_scrub_cv);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2993 cv_wait(&spa->spa_scrub_cv, &spa->spa_scrub_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2994 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2995
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2996 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2997 * Terminate the previous traverse.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2998 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2999 if (spa->spa_scrub_th != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3000 traverse_fini(spa->spa_scrub_th);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3001 spa->spa_scrub_th = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3002 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3003
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3004 if (rvd == NULL) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3005 ASSERT(spa->spa_scrub_stop == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3006 ASSERT(spa->spa_scrub_type == type);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3007 ASSERT(spa->spa_scrub_restart_txg == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3008 mutex_exit(&spa->spa_scrub_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3009 return (0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3010 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3011
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3012 mintxg = TXG_INITIAL - 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3013 maxtxg = spa_last_synced_txg(spa) + 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3014
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3015 mutex_enter(&rvd->vdev_dtl_lock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3016
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3017 if (rvd->vdev_dtl_map.sm_space == 0) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3018 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3019 * The pool-wide DTL is empty.
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
3020 * If this is a resilver, there's nothing to do except
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
3021 * check whether any in-progress replacements have completed.
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3022 */
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
3023 if (type == POOL_SCRUB_RESILVER) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3024 type = POOL_SCRUB_NONE;
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3025 spa_async_request(spa, SPA_ASYNC_RESILVER_DONE);
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
3026 }
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3027 } else {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3028 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3029 * The pool-wide DTL is non-empty.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3030 * If this is a normal scrub, upgrade to a resilver instead.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3031 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3032 if (type == POOL_SCRUB_EVERYTHING)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3033 type = POOL_SCRUB_RESILVER;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3034 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3035
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3036 if (type == POOL_SCRUB_RESILVER) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3037 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3038 * Determine the resilvering boundaries.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3039 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3040 * Note: (mintxg, maxtxg) is an open interval,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3041 * i.e. mintxg and maxtxg themselves are not included.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3042 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3043 * Note: for maxtxg, we MIN with spa_last_synced_txg(spa) + 1
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3044 * so we don't claim to resilver a txg that's still changing.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3045 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3046 ss = avl_first(&rvd->vdev_dtl_map.sm_root);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3047 mintxg = ss->ss_start - 1;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3048 ss = avl_last(&rvd->vdev_dtl_map.sm_root);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3049 maxtxg = MIN(ss->ss_end, maxtxg);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3050
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3051 spa_event_notify(spa, NULL, ESC_ZFS_RESILVER_START);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3052 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3053
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3054 mutex_exit(&rvd->vdev_dtl_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3055
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3056 spa->spa_scrub_stop = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3057 spa->spa_scrub_type = type;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3058 spa->spa_scrub_restart_txg = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3059
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3060 if (type != POOL_SCRUB_NONE) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3061 spa->spa_scrub_mintxg = mintxg;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3062 spa->spa_scrub_maxtxg = maxtxg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3063 spa->spa_scrub_th = traverse_init(spa, spa_scrub_cb, NULL,
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3064 ADVANCE_PRE | ADVANCE_PRUNE | ADVANCE_ZIL,
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3065 ZIO_FLAG_CANFAIL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3066 traverse_add_pool(spa->spa_scrub_th, mintxg, maxtxg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3067 spa->spa_scrub_thread = thread_create(NULL, 0,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3068 spa_scrub_thread, spa, 0, &p0, TS_RUN, minclsyspri);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3069 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3070
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3071 mutex_exit(&spa->spa_scrub_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3072
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3073 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3074 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3075
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3076 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3077 * ==========================================================================
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3078 * SPA async task processing
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3079 * ==========================================================================
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3080 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3081
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3082 static void
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3083 spa_async_remove(spa_t *spa, vdev_t *vd)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3084 {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3085 vdev_t *tvd;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3086 int c;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3087
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3088 for (c = 0; c < vd->vdev_children; c++) {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3089 tvd = vd->vdev_child[c];
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3090 if (tvd->vdev_remove_wanted) {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3091 tvd->vdev_remove_wanted = 0;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3092 vdev_set_state(tvd, B_FALSE, VDEV_STATE_REMOVED,
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3093 VDEV_AUX_NONE);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3094 vdev_clear(spa, tvd);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3095 vdev_config_dirty(tvd->vdev_top);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3096 }
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3097 spa_async_remove(spa, tvd);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3098 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3099 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3100
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3101 static void
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3102 spa_async_thread(spa_t *spa)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3103 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3104 int tasks;
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3105 uint64_t txg;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3106
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3107 ASSERT(spa->spa_sync_on);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3108
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3109 mutex_enter(&spa->spa_async_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3110 tasks = spa->spa_async_tasks;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3111 spa->spa_async_tasks = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3112 mutex_exit(&spa->spa_async_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3113
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3114 /*
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3115 * See if the config needs to be updated.
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3116 */
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3117 if (tasks & SPA_ASYNC_CONFIG_UPDATE) {
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3118 mutex_enter(&spa_namespace_lock);
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3119 spa_config_update(spa, SPA_CONFIG_UPDATE_POOL);
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3120 mutex_exit(&spa_namespace_lock);
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3121 }
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3122
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3123 /*
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3124 * See if any devices need to be marked REMOVED.
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3125 */
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3126 if (tasks & SPA_ASYNC_REMOVE) {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3127 txg = spa_vdev_enter(spa);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3128 spa_async_remove(spa, spa->spa_root_vdev);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3129 (void) spa_vdev_exit(spa, NULL, txg, 0);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3130 }
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3131
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3132 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3133 * If any devices are done replacing, detach them.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3134 */
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3135 if (tasks & SPA_ASYNC_RESILVER_DONE)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3136 spa_vdev_resilver_done(spa);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3137
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3138 /*
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3139 * Kick off a scrub. When starting a RESILVER scrub (or an EVERYTHING
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3140 * scrub which can become a resilver), we need to hold
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3141 * spa_namespace_lock() because the sysevent we post via
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3142 * spa_event_notify() needs to get the name of the pool.
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3143 */
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3144 if (tasks & SPA_ASYNC_SCRUB) {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3145 mutex_enter(&spa_namespace_lock);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3146 VERIFY(spa_scrub(spa, POOL_SCRUB_EVERYTHING, B_TRUE) == 0);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3147 mutex_exit(&spa_namespace_lock);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3148 }
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3149
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3150 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3151 * Kick off a resilver.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3152 */
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3153 if (tasks & SPA_ASYNC_RESILVER) {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3154 mutex_enter(&spa_namespace_lock);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3155 VERIFY(spa_scrub(spa, POOL_SCRUB_RESILVER, B_TRUE) == 0);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3156 mutex_exit(&spa_namespace_lock);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3157 }
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3158
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3159 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3160 * Let the world know that we're done.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3161 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3162 mutex_enter(&spa->spa_async_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3163 spa->spa_async_thread = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3164 cv_broadcast(&spa->spa_async_cv);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3165 mutex_exit(&spa->spa_async_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3166 thread_exit();
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3167 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3168
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3169 void
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3170 spa_async_suspend(spa_t *spa)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3171 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3172 mutex_enter(&spa->spa_async_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3173 spa->spa_async_suspended++;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3174 while (spa->spa_async_thread != NULL)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3175 cv_wait(&spa->spa_async_cv, &spa->spa_async_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3176 mutex_exit(&spa->spa_async_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3177 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3178
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3179 void
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3180 spa_async_resume(spa_t *spa)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3181 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3182 mutex_enter(&spa->spa_async_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3183 ASSERT(spa->spa_async_suspended != 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3184 spa->spa_async_suspended--;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3185 mutex_exit(&spa->spa_async_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3186 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3187
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3188 static void
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3189 spa_async_dispatch(spa_t *spa)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3190 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3191 mutex_enter(&spa->spa_async_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3192 if (spa->spa_async_tasks && !spa->spa_async_suspended &&
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3193 spa->spa_async_thread == NULL &&
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3194 rootdir != NULL && !vn_is_readonly(rootdir))
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3195 spa->spa_async_thread = thread_create(NULL, 0,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3196 spa_async_thread, spa, 0, &p0, TS_RUN, maxclsyspri);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3197 mutex_exit(&spa->spa_async_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3198 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3199
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3200 void
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3201 spa_async_request(spa_t *spa, int task)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3202 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3203 mutex_enter(&spa->spa_async_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3204 spa->spa_async_tasks |= task;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3205 mutex_exit(&spa->spa_async_lock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3206 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3207
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3208 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3209 * ==========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3210 * SPA syncing routines
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3211 * ==========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3212 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3213
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3214 static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3215 spa_sync_deferred_frees(spa_t *spa, uint64_t txg)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3216 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3217 bplist_t *bpl = &spa->spa_sync_bplist;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3218 dmu_tx_t *tx;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3219 blkptr_t blk;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3220 uint64_t itor = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3221 zio_t *zio;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3222 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3223 uint8_t c = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3224
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3225 zio = zio_root(spa, NULL, NULL, ZIO_FLAG_CONFIG_HELD);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3226
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3227 while (bplist_iterate(bpl, &itor, &blk) == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3228 zio_nowait(zio_free(zio, spa, txg, &blk, NULL, NULL));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3229
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3230 error = zio_wait(zio);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3231 ASSERT3U(error, ==, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3232
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3233 tx = dmu_tx_create_assigned(spa->spa_dsl_pool, txg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3234 bplist_vacate(bpl, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3235
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3236 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3237 * Pre-dirty the first block so we sync to convergence faster.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3238 * (Usually only the first block is needed.)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3239 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3240 dmu_write(spa->spa_meta_objset, spa->spa_sync_bplist_obj, 0, 1, &c, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3241 dmu_tx_commit(tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3242 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3243
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3244 static void
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3245 spa_sync_nvlist(spa_t *spa, uint64_t obj, nvlist_t *nv, dmu_tx_t *tx)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3246 {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3247 char *packed = NULL;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3248 size_t nvsize = 0;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3249 dmu_buf_t *db;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3250
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3251 VERIFY(nvlist_size(nv, &nvsize, NV_ENCODE_XDR) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3252
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3253 packed = kmem_alloc(nvsize, KM_SLEEP);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3254
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3255 VERIFY(nvlist_pack(nv, &packed, &nvsize, NV_ENCODE_XDR,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3256 KM_SLEEP) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3257
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3258 dmu_write(spa->spa_meta_objset, obj, 0, nvsize, packed, tx);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3259
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3260 kmem_free(packed, nvsize);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3261
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3262 VERIFY(0 == dmu_bonus_hold(spa->spa_meta_objset, obj, FTAG, &db));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3263 dmu_buf_will_dirty(db, tx);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3264 *(uint64_t *)db->db_data = nvsize;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3265 dmu_buf_rele(db, FTAG);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3266 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3267
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3268 static void
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3269 spa_sync_spares(spa_t *spa, dmu_tx_t *tx)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3270 {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3271 nvlist_t *nvroot;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3272 nvlist_t **spares;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3273 int i;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3274
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3275 if (!spa->spa_sync_spares)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3276 return;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3277
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3278 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3279 * Update the MOS nvlist describing the list of available spares.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3280 * spa_validate_spares() will have already made sure this nvlist is
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3281 * valid and the vdevs are labeled appropriately.
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3282 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3283 if (spa->spa_spares_object == 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3284 spa->spa_spares_object = dmu_object_alloc(spa->spa_meta_objset,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3285 DMU_OT_PACKED_NVLIST, 1 << 14,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3286 DMU_OT_PACKED_NVLIST_SIZE, sizeof (uint64_t), tx);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3287 VERIFY(zap_update(spa->spa_meta_objset,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3288 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_SPARES,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3289 sizeof (uint64_t), 1, &spa->spa_spares_object, tx) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3290 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3291
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3292 VERIFY(nvlist_alloc(&nvroot, NV_UNIQUE_NAME, KM_SLEEP) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3293 if (spa->spa_nspares == 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3294 VERIFY(nvlist_add_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3295 NULL, 0) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3296 } else {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3297 spares = kmem_alloc(spa->spa_nspares * sizeof (void *),
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3298 KM_SLEEP);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3299 for (i = 0; i < spa->spa_nspares; i++)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3300 spares[i] = vdev_config_generate(spa,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3301 spa->spa_spares[i], B_FALSE, B_TRUE);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3302 VERIFY(nvlist_add_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3303 spares, spa->spa_nspares) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3304 for (i = 0; i < spa->spa_nspares; i++)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3305 nvlist_free(spares[i]);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3306 kmem_free(spares, spa->spa_nspares * sizeof (void *));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3307 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3308
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3309 spa_sync_nvlist(spa, spa->spa_spares_object, nvroot, tx);
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
3310 nvlist_free(nvroot);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3311
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3312 spa->spa_sync_spares = B_FALSE;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3313 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3314
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3315 static void
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3316 spa_sync_config_object(spa_t *spa, dmu_tx_t *tx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3317 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3318 nvlist_t *config;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3319
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3320 if (list_is_empty(&spa->spa_dirty_list))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3321 return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3322
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3323 config = spa_config_generate(spa, NULL, dmu_tx_get_txg(tx), B_FALSE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3324
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3325 if (spa->spa_config_syncing)
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3326 nvlist_free(spa->spa_config_syncing);
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3327 spa->spa_config_syncing = config;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3328
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3329 spa_sync_nvlist(spa, spa->spa_config_object, config, tx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3330 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3331
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3332 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3333 * Set zpool properties.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3334 */
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
3335 static void
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
3336 spa_sync_props(void *arg1, void *arg2, cred_t *cr, dmu_tx_t *tx)
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
3337 {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
3338 spa_t *spa = arg1;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3339 objset_t *mos = spa->spa_meta_objset;
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
3340 nvlist_t *nvp = arg2;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3341 nvpair_t *elem;
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3342 uint64_t intval;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3343 char *strval;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3344 zpool_prop_t prop;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3345 const char *propname;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3346 zprop_type_t proptype;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3347
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3348 elem = NULL;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3349 while ((elem = nvlist_next_nvpair(nvp, elem))) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3350 switch (prop = zpool_name_to_prop(nvpair_name(elem))) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3351 case ZPOOL_PROP_VERSION:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3352 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3353 * Only set version for non-zpool-creation cases
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3354 * (set/import). spa_create() needs special care
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3355 * for version setting.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3356 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3357 if (tx->tx_txg != TXG_INITIAL) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3358 VERIFY(nvpair_value_uint64(elem,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3359 &intval) == 0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3360 ASSERT(intval <= SPA_VERSION);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3361 ASSERT(intval >= spa_version(spa));
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3362 spa->spa_uberblock.ub_version = intval;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3363 vdev_config_dirty(spa->spa_root_vdev);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3364 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3365 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3366
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3367 case ZPOOL_PROP_ALTROOT:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3368 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3369 * 'altroot' is a non-persistent property. It should
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3370 * have been set temporarily at creation or import time.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3371 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3372 ASSERT(spa->spa_root != NULL);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3373 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3374
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3375 case ZPOOL_PROP_TEMPORARY:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3376 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3377 * 'temporary' is a non-persistant property.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3378 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3379 VERIFY(nvpair_value_uint64(elem, &intval) == 0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3380 spa->spa_temporary = intval;
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
3381 break;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3382
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3383 default:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3384 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3385 * Set pool property values in the poolprops mos object.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3386 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3387 mutex_enter(&spa->spa_props_lock);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3388 if (spa->spa_pool_props_object == 0) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3389 objset_t *mos = spa->spa_meta_objset;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3390
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3391 VERIFY((spa->spa_pool_props_object =
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3392 zap_create(mos, DMU_OT_POOL_PROPS,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3393 DMU_OT_NONE, 0, tx)) > 0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3394
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3395 VERIFY(zap_update(mos,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3396 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_PROPS,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3397 8, 1, &spa->spa_pool_props_object, tx)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3398 == 0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3399 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3400 mutex_exit(&spa->spa_props_lock);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3401
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3402 /* normalize the property name */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3403 propname = zpool_prop_to_name(prop);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3404 proptype = zpool_prop_get_type(prop);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3405
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3406 if (nvpair_type(elem) == DATA_TYPE_STRING) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3407 ASSERT(proptype == PROP_TYPE_STRING);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3408 VERIFY(nvpair_value_string(elem, &strval) == 0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3409 VERIFY(zap_update(mos,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3410 spa->spa_pool_props_object, propname,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3411 1, strlen(strval) + 1, strval, tx) == 0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3412
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3413 } else if (nvpair_type(elem) == DATA_TYPE_UINT64) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3414 VERIFY(nvpair_value_uint64(elem, &intval) == 0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3415
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3416 if (proptype == PROP_TYPE_INDEX) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3417 const char *unused;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3418 VERIFY(zpool_prop_index_to_string(
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3419 prop, intval, &unused) == 0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3420 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3421 VERIFY(zap_update(mos,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3422 spa->spa_pool_props_object, propname,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3423 8, 1, &intval, tx) == 0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3424 } else {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3425 ASSERT(0); /* not allowed */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3426 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3427
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3428 if (prop == ZPOOL_PROP_DELEGATION)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3429 spa->spa_delegation = intval;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3430
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3431 if (prop == ZPOOL_PROP_BOOTFS)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3432 spa->spa_bootfs = intval;
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
3433 }
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3434
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3435 /* log internal history if this is not a zpool create */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3436 if (spa_version(spa) >= SPA_VERSION_ZPOOL_HISTORY &&
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3437 tx->tx_txg != TXG_INITIAL) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3438 spa_history_internal_log(LOG_POOL_PROPSET,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3439 spa, tx, cr, "%s %lld %s",
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3440 nvpair_name(elem), intval, spa->spa_name);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3441 }
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
3442 }
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
3443 }
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
3444
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3445 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3446 * Sync the specified transaction group. New blocks may be dirtied as
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3447 * part of the process, so we iterate until it converges.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3448 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3449 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3450 spa_sync(spa_t *spa, uint64_t txg)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3451 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3452 dsl_pool_t *dp = spa->spa_dsl_pool;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3453 objset_t *mos = spa->spa_meta_objset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3454 bplist_t *bpl = &spa->spa_sync_bplist;
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3455 vdev_t *rvd = spa->spa_root_vdev;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3456 vdev_t *vd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3457 dmu_tx_t *tx;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3458 int dirty_vdevs;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3459
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3460 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3461 * Lock out configuration changes.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3462 */
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3463 spa_config_enter(spa, RW_READER, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3464
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3465 spa->spa_syncing_txg = txg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3466 spa->spa_sync_pass = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3467
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3468 VERIFY(0 == bplist_open(bpl, mos, spa->spa_sync_bplist_obj));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3469
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3470 tx = dmu_tx_create_assigned(dp, txg);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3471
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3472 /*
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
3473 * If we are upgrading to SPA_VERSION_RAIDZ_DEFLATE this txg,
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3474 * set spa_deflate if we have no raid-z vdevs.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3475 */
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
3476 if (spa->spa_ubsync.ub_version < SPA_VERSION_RAIDZ_DEFLATE &&
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
3477 spa->spa_uberblock.ub_version >= SPA_VERSION_RAIDZ_DEFLATE) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3478 int i;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3479
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3480 for (i = 0; i < rvd->vdev_children; i++) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3481 vd = rvd->vdev_child[i];
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3482 if (vd->vdev_deflate_ratio != SPA_MINBLOCKSIZE)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3483 break;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3484 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3485 if (i == rvd->vdev_children) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3486 spa->spa_deflate = TRUE;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3487 VERIFY(0 == zap_add(spa->spa_meta_objset,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3488 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_DEFLATE,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3489 sizeof (uint64_t), 1, &spa->spa_deflate, tx));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3490 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3491 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3492
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3493 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3494 * If anything has changed in this txg, push the deferred frees
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3495 * from the previous txg. If not, leave them alone so that we
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3496 * don't generate work on an otherwise idle system.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3497 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3498 if (!txg_list_empty(&dp->dp_dirty_datasets, txg) ||
2329
e640bebc73b3 6446569 deferred list is hooked on flintstone vitamins
ek110237
parents: 2199
diff changeset
3499 !txg_list_empty(&dp->dp_dirty_dirs, txg) ||
e640bebc73b3 6446569 deferred list is hooked on flintstone vitamins
ek110237
parents: 2199
diff changeset
3500 !txg_list_empty(&dp->dp_sync_tasks, txg))
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3501 spa_sync_deferred_frees(spa, txg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3502
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3503 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3504 * Iterate to convergence.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3505 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3506 do {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3507 spa->spa_sync_pass++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3508
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3509 spa_sync_config_object(spa, tx);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3510 spa_sync_spares(spa, tx);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3511 spa_errlog_sync(spa, txg);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3512 dsl_pool_sync(dp, txg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3513
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3514 dirty_vdevs = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3515 while (vd = txg_list_remove(&spa->spa_vdev_txg_list, txg)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3516 vdev_sync(vd, txg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3517 dirty_vdevs++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3518 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3519
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3520 bplist_sync(bpl, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3521 } while (dirty_vdevs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3522
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3523 bplist_close(bpl);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3524
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3525 dprintf("txg %llu passes %d\n", txg, spa->spa_sync_pass);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3526
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3527 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3528 * Rewrite the vdev configuration (which includes the uberblock)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3529 * to commit the transaction group.
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3530 *
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3531 * If there are any dirty vdevs, sync the uberblock to all vdevs.
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3532 * Otherwise, pick a random top-level vdev that's known to be
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3533 * visible in the config cache (see spa_vdev_add() for details).
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3534 * If the write fails, try the next vdev until we're tried them all.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3535 */
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3536 if (!list_is_empty(&spa->spa_dirty_list)) {
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3537 VERIFY(vdev_config_sync(rvd, txg) == 0);
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3538 } else {
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3539 int children = rvd->vdev_children;
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3540 int c0 = spa_get_random(children);
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3541 int c;
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3542
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3543 for (c = 0; c < children; c++) {
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3544 vd = rvd->vdev_child[(c0 + c) % children];
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3545 if (vd->vdev_ms_array == 0)
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3546 continue;
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3547 if (vdev_config_sync(vd, txg) == 0)
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3548 break;
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3549 }
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3550 if (c == children)
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3551 VERIFY(vdev_config_sync(rvd, txg) == 0);
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3552 }
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3553
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3554 dmu_tx_commit(tx);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3555
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3556 /*
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3557 * Clear the dirty config list.
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3558 */
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3559 while ((vd = list_head(&spa->spa_dirty_list)) != NULL)
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3560 vdev_config_clean(vd);
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3561
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3562 /*
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3563 * Now that the new config has synced transactionally,
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3564 * let it become visible to the config cache.
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3565 */
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3566 if (spa->spa_config_syncing != NULL) {
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3567 spa_config_set(spa, spa->spa_config_syncing);
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3568 spa->spa_config_txg = txg;
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3569 spa->spa_config_syncing = NULL;
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3570 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3571
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3572 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3573 * Make a stable copy of the fully synced uberblock.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3574 * We use this as the root for pool traversals.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3575 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3576 spa->spa_traverse_wanted = 1; /* tells traverse_more() to stop */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3577
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3578 spa_scrub_suspend(spa); /* stop scrubbing and finish I/Os */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3579
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3580 rw_enter(&spa->spa_traverse_lock, RW_WRITER);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3581 spa->spa_traverse_wanted = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3582 spa->spa_ubsync = spa->spa_uberblock;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3583 rw_exit(&spa->spa_traverse_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3584
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3585 spa_scrub_resume(spa); /* resume scrub with new ubsync */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3586
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3587 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3588 * Clean up the ZIL records for the synced txg.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3589 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3590 dsl_pool_zil_clean(dp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3591
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3592 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3593 * Update usable space statistics.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3594 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3595 while (vd = txg_list_remove(&spa->spa_vdev_txg_list, TXG_CLEAN(txg)))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3596 vdev_sync_done(vd, txg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3597
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3598 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3599 * It had better be the case that we didn't dirty anything
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3600 * since vdev_config_sync().
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3601 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3602 ASSERT(txg_list_empty(&dp->dp_dirty_datasets, txg));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3603 ASSERT(txg_list_empty(&dp->dp_dirty_dirs, txg));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3604 ASSERT(txg_list_empty(&spa->spa_vdev_txg_list, txg));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3605 ASSERT(bpl->bpl_queue == NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3606
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3607 spa_config_exit(spa, FTAG);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3608
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3609 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3610 * If any async tasks have been requested, kick them off.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3611 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3612 spa_async_dispatch(spa);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3613 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3614
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3615 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3616 * Sync all pools. We don't want to hold the namespace lock across these
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3617 * operations, so we take a reference on the spa_t and drop the lock during the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3618 * sync.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3619 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3620 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3621 spa_sync_allpools(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3622 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3623 spa_t *spa = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3624 mutex_enter(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3625 while ((spa = spa_next(spa)) != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3626 if (spa_state(spa) != POOL_STATE_ACTIVE)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3627 continue;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3628 spa_open_ref(spa, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3629 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3630 txg_wait_synced(spa_get_dsl(spa), 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3631 mutex_enter(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3632 spa_close(spa, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3633 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3634 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3635 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3636
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3637 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3638 * ==========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3639 * Miscellaneous routines
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3640 * ==========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3641 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3642
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3643 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3644 * Remove all pools in the system.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3645 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3646 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3647 spa_evict_all(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3648 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3649 spa_t *spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3650
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3651 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3652 * Remove all cached state. All pools should be closed now,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3653 * so every spa in the AVL tree should be unreferenced.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3654 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3655 mutex_enter(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3656 while ((spa = spa_next(NULL)) != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3657 /*
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3658 * Stop async tasks. The async thread may need to detach
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3659 * a device that's been replaced, which requires grabbing
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3660 * spa_namespace_lock, so we must drop it here.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3661 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3662 spa_open_ref(spa, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3663 mutex_exit(&spa_namespace_lock);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3664 spa_async_suspend(spa);
4808
63629eaeb41a 6498144 ::kmastat could be even easier to read
ek110237
parents: 4787
diff changeset
3665 mutex_enter(&spa_namespace_lock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3666 VERIFY(spa_scrub(spa, POOL_SCRUB_NONE, B_TRUE) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3667 spa_close(spa, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3668
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3669 if (spa->spa_state != POOL_STATE_UNINITIALIZED) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3670 spa_unload(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3671 spa_deactivate(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3672 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3673 spa_remove(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3674 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3675 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3676 }
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3677
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3678 vdev_t *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3679 spa_lookup_by_guid(spa_t *spa, uint64_t guid)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3680 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3681 return (vdev_lookup_by_guid(spa->spa_root_vdev, guid));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3682 }
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
3683
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
3684 void
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3685 spa_upgrade(spa_t *spa, uint64_t version)
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
3686 {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
3687 spa_config_enter(spa, RW_WRITER, FTAG);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
3688
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
3689 /*
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
3690 * This should only be called for a non-faulted pool, and since a
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
3691 * future version would result in an unopenable pool, this shouldn't be
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
3692 * possible.
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
3693 */
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
3694 ASSERT(spa->spa_uberblock.ub_version <= SPA_VERSION);
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3695 ASSERT(version >= spa->spa_uberblock.ub_version);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3696
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3697 spa->spa_uberblock.ub_version = version;
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
3698 vdev_config_dirty(spa->spa_root_vdev);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
3699
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
3700 spa_config_exit(spa, FTAG);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3701
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3702 txg_wait_synced(spa_get_dsl(spa), 0);
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
3703 }
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3704
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3705 boolean_t
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3706 spa_has_spare(spa_t *spa, uint64_t guid)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3707 {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3708 int i;
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
3709 uint64_t spareguid;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3710
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3711 for (i = 0; i < spa->spa_nspares; i++)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3712 if (spa->spa_spares[i]->vdev_guid == guid)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3713 return (B_TRUE);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3714
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
3715 for (i = 0; i < spa->spa_pending_nspares; i++) {
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
3716 if (nvlist_lookup_uint64(spa->spa_pending_spares[i],
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
3717 ZPOOL_CONFIG_GUID, &spareguid) == 0 &&
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
3718 spareguid == guid)
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
3719 return (B_TRUE);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
3720 }
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
3721
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3722 return (B_FALSE);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3723 }
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
3724
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3725 /*
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3726 * Post a sysevent corresponding to the given event. The 'name' must be one of
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3727 * the event definitions in sys/sysevent/eventdefs.h. The payload will be
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3728 * filled in from the spa and (optionally) the vdev. This doesn't do anything
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3729 * in the userland libzpool, as we don't want consumers to misinterpret ztest
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3730 * or zdb as real changes.
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3731 */
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3732 void
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3733 spa_event_notify(spa_t *spa, vdev_t *vd, const char *name)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3734 {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3735 #ifdef _KERNEL
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3736 sysevent_t *ev;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3737 sysevent_attr_list_t *attr = NULL;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3738 sysevent_value_t value;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3739 sysevent_id_t eid;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3740
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3741 ev = sysevent_alloc(EC_ZFS, (char *)name, SUNW_KERN_PUB "zfs",
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3742 SE_SLEEP);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3743
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3744 value.value_type = SE_DATA_TYPE_STRING;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3745 value.value.sv_string = spa_name(spa);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3746 if (sysevent_add_attr(&attr, ZFS_EV_POOL_NAME, &value, SE_SLEEP) != 0)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3747 goto done;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3748
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3749 value.value_type = SE_DATA_TYPE_UINT64;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3750 value.value.sv_uint64 = spa_guid(spa);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3751 if (sysevent_add_attr(&attr, ZFS_EV_POOL_GUID, &value, SE_SLEEP) != 0)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3752 goto done;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3753
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3754 if (vd) {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3755 value.value_type = SE_DATA_TYPE_UINT64;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3756 value.value.sv_uint64 = vd->vdev_guid;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3757 if (sysevent_add_attr(&attr, ZFS_EV_VDEV_GUID, &value,
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3758 SE_SLEEP) != 0)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3759 goto done;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3760
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3761 if (vd->vdev_path) {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3762 value.value_type = SE_DATA_TYPE_STRING;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3763 value.value.sv_string = vd->vdev_path;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3764 if (sysevent_add_attr(&attr, ZFS_EV_VDEV_PATH,
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3765 &value, SE_SLEEP) != 0)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3766 goto done;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3767 }
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3768 }
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3769
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3770 (void) log_sysevent(ev, SE_SLEEP, &eid);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3771
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3772 done:
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3773 if (attr)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3774 sysevent_free_attr(attr);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3775 sysevent_free(ev);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3776 #endif
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3777 }