annotate usr/src/uts/common/fs/zfs/spa.c @ 4577:ed36b0e652bc

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