annotate usr/src/uts/common/fs/zfs/spa.c @ 9425:e7ffacaec3a8

6799895 spa_add_spares() needs to be protected by config lock 6826466 want to post sysevents on hot spare activation 6826468 spa 'allowfaulted' needs some work 6826469 kernel support for storing vdev FRU information 6826470 skip posting checksum errors from DTL regions of leaf vdevs 6826471 I/O errors after device remove probe can confuse FMA 6826472 spares should enjoy some of the benefits of cache devices
author Eric Schrock <Eric.Schrock@Sun.COM>
date Wed, 22 Apr 2009 14:55:27 -0700
parents a8a7fc849933
children fcff33da767f
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 /*
8525
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
23 * Copyright 2009 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 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
28 * This file contains all the routines used when modifying on-disk SPA state.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
29 * This includes opening, importing, destroying, exporting a pool, and syncing a
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
30 * pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
31 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
32
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
33 #include <sys/zfs_context.h>
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
34 #include <sys/fm/fs/zfs.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
35 #include <sys/spa_impl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
36 #include <sys/zio.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
37 #include <sys/zio_checksum.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
38 #include <sys/zio_compress.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
39 #include <sys/dmu.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
40 #include <sys/dmu_tx.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
41 #include <sys/zap.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
42 #include <sys/zil.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
43 #include <sys/vdev_impl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
44 #include <sys/metaslab.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
45 #include <sys/uberblock_impl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
46 #include <sys/txg.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
47 #include <sys/avl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
48 #include <sys/dmu_traverse.h>
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
49 #include <sys/dmu_objset.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
50 #include <sys/unique.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
51 #include <sys/dsl_pool.h>
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
52 #include <sys/dsl_dataset.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
53 #include <sys/dsl_dir.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
54 #include <sys/dsl_prop.h>
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
55 #include <sys/dsl_synctask.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
56 #include <sys/fs/zfs.h>
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
57 #include <sys/arc.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
58 #include <sys/callb.h>
3975
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
59 #include <sys/systeminfo.h>
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
60 #include <sys/sunddi.h>
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
61 #include <sys/spa_boot.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
62
8662
18153249ee93 PSARC/2008/647 Configurable Hostids for Non-Global Zones
jv227347 <Jordan.Vaughan@Sun.com>
parents: 8525
diff changeset
63 #ifdef _KERNEL
18153249ee93 PSARC/2008/647 Configurable Hostids for Non-Global Zones
jv227347 <Jordan.Vaughan@Sun.com>
parents: 8525
diff changeset
64 #include <sys/zone.h>
18153249ee93 PSARC/2008/647 Configurable Hostids for Non-Global Zones
jv227347 <Jordan.Vaughan@Sun.com>
parents: 8525
diff changeset
65 #endif /* _KERNEL */
18153249ee93 PSARC/2008/647 Configurable Hostids for Non-Global Zones
jv227347 <Jordan.Vaughan@Sun.com>
parents: 8525
diff changeset
66
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
67 #include "zfs_prop.h"
5913
a77f8ad2ce63 6575965 panic/thread=2a1016b5ca0: BAD TRAP: type=9 rp=1858500 addr=0 mmu_fsr=0, really, truly out of space
perrin
parents: 5886
diff changeset
68 #include "zfs_comutil.h"
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
69
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
70 int zio_taskq_threads[ZIO_TYPES][ZIO_TASKQ_TYPES] = {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
71 /* ISSUE INTR */
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
72 { 1, 1 }, /* ZIO_TYPE_NULL */
9230
e4561e3eb1ef 6821169 offlining a device results in checksum errors
George Wilson <George.Wilson@Sun.COM>
parents: 8680
diff changeset
73 { 8, 8 }, /* ZIO_TYPE_READ */
e4561e3eb1ef 6821169 offlining a device results in checksum errors
George Wilson <George.Wilson@Sun.COM>
parents: 8680
diff changeset
74 { 8, 8 }, /* ZIO_TYPE_WRITE */
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
75 { 1, 1 }, /* ZIO_TYPE_FREE */
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
76 { 1, 1 }, /* ZIO_TYPE_CLAIM */
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
77 { 1, 1 }, /* ZIO_TYPE_IOCTL */
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
78 };
2986
c782fcf7a319 6485204 more tuneable tweakin
ek110237
parents: 2926
diff changeset
79
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
80 static void spa_sync_props(void *arg1, void *arg2, cred_t *cr, dmu_tx_t *tx);
7214
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
81 static boolean_t spa_has_active_shared_spare(spa_t *spa);
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
82
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
83 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
84 * ==========================================================================
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
85 * SPA properties routines
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
86 * ==========================================================================
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
87 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
88
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
89 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
90 * Add a (source=src, propname=propval) list to an nvlist.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
91 */
5949
02e692d1cb28 6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents: 5913
diff changeset
92 static void
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
93 spa_prop_add_list(nvlist_t *nvl, zpool_prop_t prop, char *strval,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
94 uint64_t intval, zprop_source_t src)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
95 {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
96 const char *propname = zpool_prop_to_name(prop);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
97 nvlist_t *propval;
5949
02e692d1cb28 6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents: 5913
diff changeset
98
02e692d1cb28 6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents: 5913
diff changeset
99 VERIFY(nvlist_alloc(&propval, NV_UNIQUE_NAME, KM_SLEEP) == 0);
02e692d1cb28 6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents: 5913
diff changeset
100 VERIFY(nvlist_add_uint64(propval, ZPROP_SOURCE, src) == 0);
02e692d1cb28 6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents: 5913
diff changeset
101
02e692d1cb28 6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents: 5913
diff changeset
102 if (strval != NULL)
02e692d1cb28 6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents: 5913
diff changeset
103 VERIFY(nvlist_add_string(propval, ZPROP_VALUE, strval) == 0);
02e692d1cb28 6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents: 5913
diff changeset
104 else
02e692d1cb28 6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents: 5913
diff changeset
105 VERIFY(nvlist_add_uint64(propval, ZPROP_VALUE, intval) == 0);
02e692d1cb28 6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents: 5913
diff changeset
106
02e692d1cb28 6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents: 5913
diff changeset
107 VERIFY(nvlist_add_nvlist(nvl, propname, propval) == 0);
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
108 nvlist_free(propval);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
109 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
110
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
111 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
112 * Get property values from the spa configuration.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
113 */
5949
02e692d1cb28 6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents: 5913
diff changeset
114 static void
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
115 spa_prop_get_config(spa_t *spa, nvlist_t **nvp)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
116 {
8525
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
117 uint64_t size;
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
118 uint64_t used;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
119 uint64_t cap, version;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
120 zprop_source_t src = ZPROP_SRC_NONE;
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
121 spa_config_dirent_t *dp;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
122
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
123 ASSERT(MUTEX_HELD(&spa->spa_props_lock));
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
124
8525
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
125 if (spa->spa_root_vdev != NULL) {
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
126 size = spa_get_space(spa);
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
127 used = spa_get_alloc(spa);
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
128 spa_prop_add_list(*nvp, ZPOOL_PROP_NAME, spa_name(spa), 0, src);
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
129 spa_prop_add_list(*nvp, ZPOOL_PROP_SIZE, NULL, size, src);
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
130 spa_prop_add_list(*nvp, ZPOOL_PROP_USED, NULL, used, src);
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
131 spa_prop_add_list(*nvp, ZPOOL_PROP_AVAILABLE, NULL,
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
132 size - used, src);
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
133
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
134 cap = (size == 0) ? 0 : (used * 100 / size);
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
135 spa_prop_add_list(*nvp, ZPOOL_PROP_CAPACITY, NULL, cap, src);
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
136
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
137 spa_prop_add_list(*nvp, ZPOOL_PROP_HEALTH, NULL,
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
138 spa->spa_root_vdev->vdev_state, src);
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
139
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
140 version = spa_version(spa);
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
141 if (version == zpool_prop_default_numeric(ZPOOL_PROP_VERSION))
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
142 src = ZPROP_SRC_DEFAULT;
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
143 else
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
144 src = ZPROP_SRC_LOCAL;
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
145 spa_prop_add_list(*nvp, ZPOOL_PROP_VERSION, NULL, version, src);
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
146 }
5949
02e692d1cb28 6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents: 5913
diff changeset
147
02e692d1cb28 6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents: 5913
diff changeset
148 spa_prop_add_list(*nvp, ZPOOL_PROP_GUID, NULL, spa_guid(spa), src);
02e692d1cb28 6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents: 5913
diff changeset
149
02e692d1cb28 6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents: 5913
diff changeset
150 if (spa->spa_root != NULL)
02e692d1cb28 6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents: 5913
diff changeset
151 spa_prop_add_list(*nvp, ZPOOL_PROP_ALTROOT, spa->spa_root,
02e692d1cb28 6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents: 5913
diff changeset
152 0, ZPROP_SRC_LOCAL);
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
153
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
154 if ((dp = list_head(&spa->spa_config_list)) != NULL) {
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
155 if (dp->scd_path == NULL) {
5949
02e692d1cb28 6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents: 5913
diff changeset
156 spa_prop_add_list(*nvp, ZPOOL_PROP_CACHEFILE,
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
157 "none", 0, ZPROP_SRC_LOCAL);
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
158 } else if (strcmp(dp->scd_path, spa_config_path) != 0) {
5949
02e692d1cb28 6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents: 5913
diff changeset
159 spa_prop_add_list(*nvp, ZPOOL_PROP_CACHEFILE,
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
160 dp->scd_path, 0, ZPROP_SRC_LOCAL);
5363
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
161 }
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
162 }
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
163 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
164
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
165 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
166 * Get zpool property values.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
167 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
168 int
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
169 spa_prop_get(spa_t *spa, nvlist_t **nvp)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
170 {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
171 zap_cursor_t zc;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
172 zap_attribute_t za;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
173 objset_t *mos = spa->spa_meta_objset;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
174 int err;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
175
5949
02e692d1cb28 6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents: 5913
diff changeset
176 VERIFY(nvlist_alloc(nvp, NV_UNIQUE_NAME, KM_SLEEP) == 0);
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
177
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
178 mutex_enter(&spa->spa_props_lock);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
179
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
180 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
181 * Get properties from the spa config.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
182 */
5949
02e692d1cb28 6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents: 5913
diff changeset
183 spa_prop_get_config(spa, nvp);
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
184
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
185 /* If no pool property object, no more prop to get. */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
186 if (spa->spa_pool_props_object == 0) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
187 mutex_exit(&spa->spa_props_lock);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
188 return (0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
189 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
190
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
191 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
192 * Get properties from the MOS pool property object.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
193 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
194 for (zap_cursor_init(&zc, mos, spa->spa_pool_props_object);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
195 (err = zap_cursor_retrieve(&zc, &za)) == 0;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
196 zap_cursor_advance(&zc)) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
197 uint64_t intval = 0;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
198 char *strval = NULL;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
199 zprop_source_t src = ZPROP_SRC_DEFAULT;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
200 zpool_prop_t prop;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
201
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
202 if ((prop = zpool_name_to_prop(za.za_name)) == ZPROP_INVAL)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
203 continue;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
204
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
205 switch (za.za_integer_length) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
206 case 8:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
207 /* integer property */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
208 if (za.za_first_integer !=
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
209 zpool_prop_default_numeric(prop))
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
210 src = ZPROP_SRC_LOCAL;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
211
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
212 if (prop == ZPOOL_PROP_BOOTFS) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
213 dsl_pool_t *dp;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
214 dsl_dataset_t *ds = NULL;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
215
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
216 dp = spa_get_dsl(spa);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
217 rw_enter(&dp->dp_config_rwlock, RW_READER);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6673
diff changeset
218 if (err = dsl_dataset_hold_obj(dp,
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6673
diff changeset
219 za.za_first_integer, FTAG, &ds)) {
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
220 rw_exit(&dp->dp_config_rwlock);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
221 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
222 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
223
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
224 strval = kmem_alloc(
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
225 MAXNAMELEN + strlen(MOS_DIR_NAME) + 1,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
226 KM_SLEEP);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
227 dsl_dataset_name(ds, strval);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6673
diff changeset
228 dsl_dataset_rele(ds, FTAG);
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
229 rw_exit(&dp->dp_config_rwlock);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
230 } else {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
231 strval = NULL;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
232 intval = za.za_first_integer;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
233 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
234
5949
02e692d1cb28 6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents: 5913
diff changeset
235 spa_prop_add_list(*nvp, prop, strval, intval, src);
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
236
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
237 if (strval != NULL)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
238 kmem_free(strval,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
239 MAXNAMELEN + strlen(MOS_DIR_NAME) + 1);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
240
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
241 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
242
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
243 case 1:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
244 /* string property */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
245 strval = kmem_alloc(za.za_num_integers, KM_SLEEP);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
246 err = zap_lookup(mos, spa->spa_pool_props_object,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
247 za.za_name, 1, za.za_num_integers, strval);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
248 if (err) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
249 kmem_free(strval, za.za_num_integers);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
250 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
251 }
5949
02e692d1cb28 6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents: 5913
diff changeset
252 spa_prop_add_list(*nvp, prop, strval, 0, src);
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
253 kmem_free(strval, za.za_num_integers);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
254 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
255
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
256 default:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
257 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
258 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
259 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
260 zap_cursor_fini(&zc);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
261 mutex_exit(&spa->spa_props_lock);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
262 out:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
263 if (err && err != ENOENT) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
264 nvlist_free(*nvp);
5949
02e692d1cb28 6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents: 5913
diff changeset
265 *nvp = NULL;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
266 return (err);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
267 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
268
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
269 return (0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
270 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
271
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
272 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
273 * Validate the given pool properties nvlist and modify the list
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
274 * for the property values to be set.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
275 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
276 static int
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
277 spa_prop_validate(spa_t *spa, nvlist_t *props)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
278 {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
279 nvpair_t *elem;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
280 int error = 0, reset_bootfs = 0;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
281 uint64_t objnum;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
282
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
283 elem = NULL;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
284 while ((elem = nvlist_next_nvpair(props, elem)) != NULL) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
285 zpool_prop_t prop;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
286 char *propname, *strval;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
287 uint64_t intval;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
288 objset_t *os;
5363
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
289 char *slash;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
290
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
291 propname = nvpair_name(elem);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
292
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
293 if ((prop = zpool_name_to_prop(propname)) == ZPROP_INVAL)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
294 return (EINVAL);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
295
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
296 switch (prop) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
297 case ZPOOL_PROP_VERSION:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
298 error = nvpair_value_uint64(elem, &intval);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
299 if (!error &&
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
300 (intval < spa_version(spa) || intval > SPA_VERSION))
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
301 error = EINVAL;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
302 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
303
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
304 case ZPOOL_PROP_DELEGATION:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
305 case ZPOOL_PROP_AUTOREPLACE:
7538
18c2451107fd PSARC 2008/469 Excluding snapshot info from 'zfs list'
Rich Morris <Richard.Morris@Sun.COM>
parents: 7497
diff changeset
306 case ZPOOL_PROP_LISTSNAPS:
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
307 error = nvpair_value_uint64(elem, &intval);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
308 if (!error && intval > 1)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
309 error = EINVAL;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
310 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
311
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
312 case ZPOOL_PROP_BOOTFS:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
313 if (spa_version(spa) < SPA_VERSION_BOOTFS) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
314 error = ENOTSUP;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
315 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
316 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
317
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
318 /*
7042
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6995
diff changeset
319 * Make sure the vdev config is bootable
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
320 */
7042
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6995
diff changeset
321 if (!vdev_is_bootable(spa->spa_root_vdev)) {
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
322 error = ENOTSUP;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
323 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
324 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
325
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
326 reset_bootfs = 1;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
327
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
328 error = nvpair_value_string(elem, &strval);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
329
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
330 if (!error) {
7042
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6995
diff changeset
331 uint64_t compress;
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6995
diff changeset
332
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
333 if (strval == NULL || strval[0] == '\0') {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
334 objnum = zpool_prop_default_numeric(
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
335 ZPOOL_PROP_BOOTFS);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
336 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
337 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
338
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
339 if (error = dmu_objset_open(strval, DMU_OST_ZFS,
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6673
diff changeset
340 DS_MODE_USER | DS_MODE_READONLY, &os))
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
341 break;
7042
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6995
diff changeset
342
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6995
diff changeset
343 /* We don't support gzip bootable datasets */
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6995
diff changeset
344 if ((error = dsl_prop_get_integer(strval,
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6995
diff changeset
345 zfs_prop_to_name(ZFS_PROP_COMPRESSION),
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6995
diff changeset
346 &compress, NULL)) == 0 &&
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6995
diff changeset
347 !BOOTFS_COMPRESS_VALID(compress)) {
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6995
diff changeset
348 error = ENOTSUP;
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6995
diff changeset
349 } else {
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6995
diff changeset
350 objnum = dmu_objset_id(os);
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6995
diff changeset
351 }
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
352 dmu_objset_close(os);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
353 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
354 break;
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
355
5329
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
356 case ZPOOL_PROP_FAILUREMODE:
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
357 error = nvpair_value_uint64(elem, &intval);
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
358 if (!error && (intval < ZIO_FAILURE_MODE_WAIT ||
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
359 intval > ZIO_FAILURE_MODE_PANIC))
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
360 error = EINVAL;
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
361
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
362 /*
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
363 * This is a special case which only occurs when
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
364 * the pool has completely failed. This allows
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
365 * the user to change the in-core failmode property
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
366 * without syncing it out to disk (I/Os might
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
367 * currently be blocked). We do this by returning
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
368 * EIO to the caller (spa_prop_set) to trick it
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
369 * into thinking we encountered a property validation
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
370 * error.
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
371 */
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
372 if (!error && spa_suspended(spa)) {
5329
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
373 spa->spa_failmode = intval;
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
374 error = EIO;
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
375 }
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
376 break;
5363
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
377
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
378 case ZPOOL_PROP_CACHEFILE:
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
379 if ((error = nvpair_value_string(elem, &strval)) != 0)
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
380 break;
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
381
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
382 if (strval[0] == '\0')
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
383 break;
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
384
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
385 if (strcmp(strval, "none") == 0)
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
386 break;
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
387
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
388 if (strval[0] != '/') {
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
389 error = EINVAL;
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
390 break;
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
391 }
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
392
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
393 slash = strrchr(strval, '/');
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
394 ASSERT(slash != NULL);
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
395
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
396 if (slash[1] == '\0' || strcmp(slash, "/.") == 0 ||
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
397 strcmp(slash, "/..") == 0)
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
398 error = EINVAL;
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
399 break;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
400 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
401
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
402 if (error)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
403 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
404 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
405
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
406 if (!error && reset_bootfs) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
407 error = nvlist_remove(props,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
408 zpool_prop_to_name(ZPOOL_PROP_BOOTFS), DATA_TYPE_STRING);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
409
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
410 if (!error) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
411 error = nvlist_add_uint64(props,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
412 zpool_prop_to_name(ZPOOL_PROP_BOOTFS), objnum);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
413 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
414 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
415
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
416 return (error);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
417 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
418
8525
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
419 void
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
420 spa_configfile_set(spa_t *spa, nvlist_t *nvp, boolean_t need_sync)
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
421 {
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
422 char *cachefile;
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
423 spa_config_dirent_t *dp;
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
424
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
425 if (nvlist_lookup_string(nvp, zpool_prop_to_name(ZPOOL_PROP_CACHEFILE),
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
426 &cachefile) != 0)
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
427 return;
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
428
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
429 dp = kmem_alloc(sizeof (spa_config_dirent_t),
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
430 KM_SLEEP);
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
431
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
432 if (cachefile[0] == '\0')
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
433 dp->scd_path = spa_strdup(spa_config_path);
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
434 else if (strcmp(cachefile, "none") == 0)
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
435 dp->scd_path = NULL;
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
436 else
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
437 dp->scd_path = spa_strdup(cachefile);
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
438
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
439 list_insert_head(&spa->spa_config_list, dp);
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
440 if (need_sync)
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
441 spa_async_request(spa, SPA_ASYNC_CONFIG_UPDATE);
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
442 }
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
443
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
444 int
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
445 spa_prop_set(spa_t *spa, nvlist_t *nvp)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
446 {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
447 int error;
8525
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
448 nvpair_t *elem;
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
449 boolean_t need_sync = B_FALSE;
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
450 zpool_prop_t prop;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
451
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
452 if ((error = spa_prop_validate(spa, nvp)) != 0)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
453 return (error);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
454
8525
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
455 elem = NULL;
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
456 while ((elem = nvlist_next_nvpair(nvp, elem)) != NULL) {
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
457 if ((prop = zpool_name_to_prop(
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
458 nvpair_name(elem))) == ZPROP_INVAL)
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
459 return (EINVAL);
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
460
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
461 if (prop == ZPOOL_PROP_CACHEFILE || prop == ZPOOL_PROP_ALTROOT)
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
462 continue;
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
463
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
464 need_sync = B_TRUE;
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
465 break;
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
466 }
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
467
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
468 if (need_sync)
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
469 return (dsl_sync_task_do(spa_get_dsl(spa), NULL, spa_sync_props,
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
470 spa, nvp, 3));
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
471 else
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
472 return (0);
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
473 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
474
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
475 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
476 * If the bootfs property value is dsobj, clear it.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
477 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
478 void
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
479 spa_prop_clear_bootfs(spa_t *spa, uint64_t dsobj, dmu_tx_t *tx)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
480 {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
481 if (spa->spa_bootfs == dsobj && spa->spa_pool_props_object != 0) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
482 VERIFY(zap_remove(spa->spa_meta_objset,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
483 spa->spa_pool_props_object,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
484 zpool_prop_to_name(ZPOOL_PROP_BOOTFS), tx) == 0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
485 spa->spa_bootfs = 0;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
486 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
487 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
488
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
489 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
490 * ==========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
491 * SPA state manipulation (open/create/destroy/import/export)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
492 * ==========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
493 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
494
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
495 static int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
496 spa_error_entry_compare(const void *a, const void *b)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
497 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
498 spa_error_entry_t *sa = (spa_error_entry_t *)a;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
499 spa_error_entry_t *sb = (spa_error_entry_t *)b;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
500 int ret;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
501
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
502 ret = bcmp(&sa->se_bookmark, &sb->se_bookmark,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
503 sizeof (zbookmark_t));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
504
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
505 if (ret < 0)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
506 return (-1);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
507 else if (ret > 0)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
508 return (1);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
509 else
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
510 return (0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
511 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
512
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
513 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
514 * Utility function which retrieves copies of the current logs and
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
515 * re-initializes them in the process.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
516 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
517 void
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
518 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
519 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
520 ASSERT(MUTEX_HELD(&spa->spa_errlist_lock));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
521
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
522 bcopy(&spa->spa_errlist_last, last, sizeof (avl_tree_t));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
523 bcopy(&spa->spa_errlist_scrub, scrub, sizeof (avl_tree_t));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
524
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
525 avl_create(&spa->spa_errlist_scrub,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
526 spa_error_entry_compare, sizeof (spa_error_entry_t),
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
527 offsetof(spa_error_entry_t, se_avl));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
528 avl_create(&spa->spa_errlist_last,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
529 spa_error_entry_compare, sizeof (spa_error_entry_t),
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
530 offsetof(spa_error_entry_t, se_avl));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
531 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
532
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
533 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
534 * Activate an uninitialized pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
535 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
536 static void
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
537 spa_activate(spa_t *spa, int mode)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
538 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
539 ASSERT(spa->spa_state == POOL_STATE_UNINITIALIZED);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
540
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
541 spa->spa_state = POOL_STATE_ACTIVE;
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
542 spa->spa_mode = mode;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
543
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
544 spa->spa_normal_class = metaslab_class_create();
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
545 spa->spa_log_class = metaslab_class_create();
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
546
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
547 for (int t = 0; t < ZIO_TYPES; t++) {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
548 for (int q = 0; q < ZIO_TASKQ_TYPES; q++) {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
549 spa->spa_zio_taskq[t][q] = taskq_create("spa_zio",
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
550 zio_taskq_threads[t][q], maxclsyspri, 50,
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
551 INT_MAX, TASKQ_PREPOPULATE);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
552 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
553 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
554
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
555 list_create(&spa->spa_config_dirty_list, sizeof (vdev_t),
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
556 offsetof(vdev_t, vdev_config_dirty_node));
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
557 list_create(&spa->spa_state_dirty_list, sizeof (vdev_t),
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
558 offsetof(vdev_t, vdev_state_dirty_node));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
559
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
560 txg_list_create(&spa->spa_vdev_txg_list,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
561 offsetof(struct vdev, vdev_txg_node));
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
562
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
563 avl_create(&spa->spa_errlist_scrub,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
564 spa_error_entry_compare, sizeof (spa_error_entry_t),
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
565 offsetof(spa_error_entry_t, se_avl));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
566 avl_create(&spa->spa_errlist_last,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
567 spa_error_entry_compare, sizeof (spa_error_entry_t),
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
568 offsetof(spa_error_entry_t, se_avl));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
569 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
570
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
571 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
572 * Opposite of spa_activate().
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
573 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
574 static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
575 spa_deactivate(spa_t *spa)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
576 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
577 ASSERT(spa->spa_sync_on == B_FALSE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
578 ASSERT(spa->spa_dsl_pool == NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
579 ASSERT(spa->spa_root_vdev == NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
580
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
581 ASSERT(spa->spa_state != POOL_STATE_UNINITIALIZED);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
582
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
583 txg_list_destroy(&spa->spa_vdev_txg_list);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
584
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
585 list_destroy(&spa->spa_config_dirty_list);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
586 list_destroy(&spa->spa_state_dirty_list);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
587
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
588 for (int t = 0; t < ZIO_TYPES; t++) {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
589 for (int q = 0; q < ZIO_TASKQ_TYPES; q++) {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
590 taskq_destroy(spa->spa_zio_taskq[t][q]);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
591 spa->spa_zio_taskq[t][q] = NULL;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
592 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
593 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
594
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
595 metaslab_class_destroy(spa->spa_normal_class);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
596 spa->spa_normal_class = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
597
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
598 metaslab_class_destroy(spa->spa_log_class);
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
599 spa->spa_log_class = NULL;
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
600
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
601 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
602 * 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
603 * still have errors left in the queues. Empty them just in case.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
604 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
605 spa_errlog_drain(spa);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
606
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
607 avl_destroy(&spa->spa_errlist_scrub);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
608 avl_destroy(&spa->spa_errlist_last);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
609
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
610 spa->spa_state = POOL_STATE_UNINITIALIZED;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
611 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
612
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
613 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
614 * Verify a pool configuration, and construct the vdev tree appropriately. This
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
615 * will create all the necessary vdevs in the appropriate layout, with each vdev
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
616 * in the CLOSED state. This will prep the pool before open/creation/import.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
617 * All vdev validation is done by the vdev_alloc() routine.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
618 */
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
619 static int
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
620 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
621 uint_t id, int atype)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
622 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
623 nvlist_t **child;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
624 uint_t c, children;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
625 int error;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
626
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
627 if ((error = vdev_alloc(spa, vdp, nv, parent, id, atype)) != 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
628 return (error);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
629
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
630 if ((*vdp)->vdev_ops->vdev_op_leaf)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
631 return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
632
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
633 error = nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
634 &child, &children);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
635
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
636 if (error == ENOENT)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
637 return (0);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
638
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
639 if (error) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
640 vdev_free(*vdp);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
641 *vdp = NULL;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
642 return (EINVAL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
643 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
644
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
645 for (c = 0; c < children; c++) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
646 vdev_t *vd;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
647 if ((error = spa_config_parse(spa, &vd, child[c], *vdp, c,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
648 atype)) != 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
649 vdev_free(*vdp);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
650 *vdp = NULL;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
651 return (error);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
652 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
653 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
654
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
655 ASSERT(*vdp != NULL);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
656
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
657 return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
658 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
659
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
660 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
661 * Opposite of spa_load().
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
662 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
663 static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
664 spa_unload(spa_t *spa)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
665 {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
666 int i;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
667
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
668 ASSERT(MUTEX_HELD(&spa_namespace_lock));
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
669
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
670 /*
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
671 * Stop async tasks.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
672 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
673 spa_async_suspend(spa);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
674
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
675 /*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
676 * Stop syncing.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
677 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
678 if (spa->spa_sync_on) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
679 txg_sync_stop(spa->spa_dsl_pool);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
680 spa->spa_sync_on = B_FALSE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
681 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
682
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
683 /*
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
684 * Wait for any outstanding async I/O to complete.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
685 */
9234
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9230
diff changeset
686 if (spa->spa_async_zio_root != NULL) {
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9230
diff changeset
687 (void) zio_wait(spa->spa_async_zio_root);
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9230
diff changeset
688 spa->spa_async_zio_root = NULL;
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9230
diff changeset
689 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
690
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
691 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
692 * Close the dsl pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
693 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
694 if (spa->spa_dsl_pool) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
695 dsl_pool_close(spa->spa_dsl_pool);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
696 spa->spa_dsl_pool = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
697 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
698
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
699 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
700
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
701 /*
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
702 * Drop and purge level 2 cache
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
703 */
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
704 spa_l2cache_drop(spa);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
705
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
706 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
707 * Close all vdevs.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
708 */
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
709 if (spa->spa_root_vdev)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
710 vdev_free(spa->spa_root_vdev);
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
711 ASSERT(spa->spa_root_vdev == NULL);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
712
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
713 for (i = 0; i < spa->spa_spares.sav_count; i++)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
714 vdev_free(spa->spa_spares.sav_vdevs[i]);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
715 if (spa->spa_spares.sav_vdevs) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
716 kmem_free(spa->spa_spares.sav_vdevs,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
717 spa->spa_spares.sav_count * sizeof (void *));
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
718 spa->spa_spares.sav_vdevs = NULL;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
719 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
720 if (spa->spa_spares.sav_config) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
721 nvlist_free(spa->spa_spares.sav_config);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
722 spa->spa_spares.sav_config = NULL;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
723 }
7377
2afc6772d754 6739314 failed log devices in a pool with spares causes panic on load
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 7361
diff changeset
724 spa->spa_spares.sav_count = 0;
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
725
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
726 for (i = 0; i < spa->spa_l2cache.sav_count; i++)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
727 vdev_free(spa->spa_l2cache.sav_vdevs[i]);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
728 if (spa->spa_l2cache.sav_vdevs) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
729 kmem_free(spa->spa_l2cache.sav_vdevs,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
730 spa->spa_l2cache.sav_count * sizeof (void *));
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
731 spa->spa_l2cache.sav_vdevs = NULL;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
732 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
733 if (spa->spa_l2cache.sav_config) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
734 nvlist_free(spa->spa_l2cache.sav_config);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
735 spa->spa_l2cache.sav_config = NULL;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
736 }
7377
2afc6772d754 6739314 failed log devices in a pool with spares causes panic on load
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 7361
diff changeset
737 spa->spa_l2cache.sav_count = 0;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
738
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
739 spa->spa_async_suspended = 0;
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
740
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
741 spa_config_exit(spa, SCL_ALL, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
742 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
743
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
744 /*
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
745 * 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
746 * this pool. When this is called, we have some form of basic information in
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
747 * 'spa_spares.sav_config'. We parse this into vdevs, try to open them, and
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
748 * then re-generate a more complete list including status information.
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
749 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
750 static void
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
751 spa_load_spares(spa_t *spa)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
752 {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
753 nvlist_t **spares;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
754 uint_t nspares;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
755 int i;
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
756 vdev_t *vd, *tvd;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
757
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
758 ASSERT(spa_config_held(spa, SCL_ALL, RW_WRITER) == SCL_ALL);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
759
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
760 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
761 * First, close and free any existing spare vdevs.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
762 */
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
763 for (i = 0; i < spa->spa_spares.sav_count; i++) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
764 vd = spa->spa_spares.sav_vdevs[i];
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
765
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
766 /* Undo the call to spa_activate() below */
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
767 if ((tvd = spa_lookup_by_guid(spa, vd->vdev_guid,
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
768 B_FALSE)) != NULL && tvd->vdev_isspare)
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
769 spa_spare_remove(tvd);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
770 vdev_close(vd);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
771 vdev_free(vd);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
772 }
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
773
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
774 if (spa->spa_spares.sav_vdevs)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
775 kmem_free(spa->spa_spares.sav_vdevs,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
776 spa->spa_spares.sav_count * sizeof (void *));
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
777
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
778 if (spa->spa_spares.sav_config == NULL)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
779 nspares = 0;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
780 else
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
781 VERIFY(nvlist_lookup_nvlist_array(spa->spa_spares.sav_config,
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
782 ZPOOL_CONFIG_SPARES, &spares, &nspares) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
783
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
784 spa->spa_spares.sav_count = (int)nspares;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
785 spa->spa_spares.sav_vdevs = NULL;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
786
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
787 if (nspares == 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
788 return;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
789
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
790 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
791 * 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
792 * 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
793 * 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
794 * 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
795 * 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
796 * 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
797 * 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
798 */
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
799 spa->spa_spares.sav_vdevs = kmem_alloc(nspares * sizeof (void *),
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
800 KM_SLEEP);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
801 for (i = 0; i < spa->spa_spares.sav_count; i++) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
802 VERIFY(spa_config_parse(spa, &vd, spares[i], NULL, 0,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
803 VDEV_ALLOC_SPARE) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
804 ASSERT(vd != NULL);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
805
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
806 spa->spa_spares.sav_vdevs[i] = vd;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
807
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
808 if ((tvd = spa_lookup_by_guid(spa, vd->vdev_guid,
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
809 B_FALSE)) != NULL) {
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
810 if (!tvd->vdev_isspare)
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
811 spa_spare_add(tvd);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
812
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
813 /*
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
814 * 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
815 * 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
816 * 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
817 * 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
818 * is actively in use.
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
819 *
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
820 * 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
821 * 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
822 * 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
823 * 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
824 * it adds, we ignore the possibility.
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
825 */
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
826 if (!vdev_is_dead(tvd))
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
827 spa_spare_activate(tvd);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
828 }
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
829
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
830 vd->vdev_top = vd;
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
831 vd->vdev_aux = &spa->spa_spares;
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
832
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
833 if (vdev_open(vd) != 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
834 continue;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
835
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
836 if (vdev_validate_aux(vd) == 0)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
837 spa_spare_add(vd);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
838 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
839
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
840 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
841 * Recompute the stashed list of spares, with status information
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
842 * this time.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
843 */
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
844 VERIFY(nvlist_remove(spa->spa_spares.sav_config, ZPOOL_CONFIG_SPARES,
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
845 DATA_TYPE_NVLIST_ARRAY) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
846
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
847 spares = kmem_alloc(spa->spa_spares.sav_count * sizeof (void *),
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
848 KM_SLEEP);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
849 for (i = 0; i < spa->spa_spares.sav_count; i++)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
850 spares[i] = vdev_config_generate(spa,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
851 spa->spa_spares.sav_vdevs[i], B_TRUE, B_TRUE, B_FALSE);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
852 VERIFY(nvlist_add_nvlist_array(spa->spa_spares.sav_config,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
853 ZPOOL_CONFIG_SPARES, spares, spa->spa_spares.sav_count) == 0);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
854 for (i = 0; i < spa->spa_spares.sav_count; i++)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
855 nvlist_free(spares[i]);
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
856 kmem_free(spares, spa->spa_spares.sav_count * sizeof (void *));
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
857 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
858
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
859 /*
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
860 * Load (or re-load) the current list of vdevs describing the active l2cache for
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
861 * this pool. When this is called, we have some form of basic information in
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
862 * 'spa_l2cache.sav_config'. We parse this into vdevs, try to open them, and
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
863 * then re-generate a more complete list including status information.
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
864 * Devices which are already active have their details maintained, and are
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
865 * not re-opened.
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
866 */
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
867 static void
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
868 spa_load_l2cache(spa_t *spa)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
869 {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
870 nvlist_t **l2cache;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
871 uint_t nl2cache;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
872 int i, j, oldnvdevs;
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
873 uint64_t guid, size;
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
874 vdev_t *vd, **oldvdevs, **newvdevs;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
875 spa_aux_vdev_t *sav = &spa->spa_l2cache;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
876
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
877 ASSERT(spa_config_held(spa, SCL_ALL, RW_WRITER) == SCL_ALL);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
878
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
879 if (sav->sav_config != NULL) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
880 VERIFY(nvlist_lookup_nvlist_array(sav->sav_config,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
881 ZPOOL_CONFIG_L2CACHE, &l2cache, &nl2cache) == 0);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
882 newvdevs = kmem_alloc(nl2cache * sizeof (void *), KM_SLEEP);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
883 } else {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
884 nl2cache = 0;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
885 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
886
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
887 oldvdevs = sav->sav_vdevs;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
888 oldnvdevs = sav->sav_count;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
889 sav->sav_vdevs = NULL;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
890 sav->sav_count = 0;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
891
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
892 /*
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
893 * Process new nvlist of vdevs.
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
894 */
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
895 for (i = 0; i < nl2cache; i++) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
896 VERIFY(nvlist_lookup_uint64(l2cache[i], ZPOOL_CONFIG_GUID,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
897 &guid) == 0);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
898
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
899 newvdevs[i] = NULL;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
900 for (j = 0; j < oldnvdevs; j++) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
901 vd = oldvdevs[j];
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
902 if (vd != NULL && guid == vd->vdev_guid) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
903 /*
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
904 * Retain previous vdev for add/remove ops.
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
905 */
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
906 newvdevs[i] = vd;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
907 oldvdevs[j] = NULL;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
908 break;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
909 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
910 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
911
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
912 if (newvdevs[i] == NULL) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
913 /*
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
914 * Create new vdev
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
915 */
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
916 VERIFY(spa_config_parse(spa, &vd, l2cache[i], NULL, 0,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
917 VDEV_ALLOC_L2CACHE) == 0);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
918 ASSERT(vd != NULL);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
919 newvdevs[i] = vd;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
920
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
921 /*
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
922 * Commit this vdev as an l2cache device,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
923 * even if it fails to open.
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
924 */
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
925 spa_l2cache_add(vd);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
926
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
927 vd->vdev_top = vd;
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
928 vd->vdev_aux = sav;
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
929
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
930 spa_l2cache_activate(vd);
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
931
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
932 if (vdev_open(vd) != 0)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
933 continue;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
934
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
935 (void) vdev_validate_aux(vd);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
936
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
937 if (!vdev_is_dead(vd)) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
938 size = vdev_get_rsize(vd);
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
939 l2arc_add_vdev(spa, vd,
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
940 VDEV_LABEL_START_SIZE,
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
941 size - VDEV_LABEL_START_SIZE);
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
942 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
943 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
944 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
945
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
946 /*
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
947 * Purge vdevs that were dropped
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
948 */
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
949 for (i = 0; i < oldnvdevs; i++) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
950 uint64_t pool;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
951
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
952 vd = oldvdevs[i];
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
953 if (vd != NULL) {
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
954 if (spa_l2cache_exists(vd->vdev_guid, &pool) &&
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
955 pool != 0ULL && l2arc_vdev_present(vd))
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
956 l2arc_remove_vdev(vd);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
957 (void) vdev_close(vd);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
958 spa_l2cache_remove(vd);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
959 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
960 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
961
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
962 if (oldvdevs)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
963 kmem_free(oldvdevs, oldnvdevs * sizeof (void *));
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
964
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
965 if (sav->sav_config == NULL)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
966 goto out;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
967
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
968 sav->sav_vdevs = newvdevs;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
969 sav->sav_count = (int)nl2cache;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
970
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
971 /*
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
972 * Recompute the stashed list of l2cache devices, with status
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
973 * information this time.
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
974 */
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
975 VERIFY(nvlist_remove(sav->sav_config, ZPOOL_CONFIG_L2CACHE,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
976 DATA_TYPE_NVLIST_ARRAY) == 0);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
977
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
978 l2cache = kmem_alloc(sav->sav_count * sizeof (void *), KM_SLEEP);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
979 for (i = 0; i < sav->sav_count; i++)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
980 l2cache[i] = vdev_config_generate(spa,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
981 sav->sav_vdevs[i], B_TRUE, B_FALSE, B_TRUE);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
982 VERIFY(nvlist_add_nvlist_array(sav->sav_config,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
983 ZPOOL_CONFIG_L2CACHE, l2cache, sav->sav_count) == 0);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
984 out:
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
985 for (i = 0; i < sav->sav_count; i++)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
986 nvlist_free(l2cache[i]);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
987 if (sav->sav_count)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
988 kmem_free(l2cache, sav->sav_count * sizeof (void *));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
989 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
990
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
991 static int
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
992 load_nvlist(spa_t *spa, uint64_t obj, nvlist_t **value)
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 dmu_buf_t *db;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
995 char *packed = NULL;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
996 size_t nvsize = 0;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
997 int error;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
998 *value = NULL;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
999
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1000 VERIFY(0 == dmu_bonus_hold(spa->spa_meta_objset, obj, FTAG, &db));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1001 nvsize = *(uint64_t *)db->db_data;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1002 dmu_buf_rele(db, FTAG);
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 packed = kmem_alloc(nvsize, KM_SLEEP);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1005 error = dmu_read(spa->spa_meta_objset, obj, 0, nvsize, packed);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1006 if (error == 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1007 error = nvlist_unpack(packed, nvsize, value, 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1008 kmem_free(packed, nvsize);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1009
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1010 return (error);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1011 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1012
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1013 /*
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1014 * 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
1015 * sysevent to notify the autoreplace code that the device has been removed.
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1016 */
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1017 static void
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1018 spa_check_removed(vdev_t *vd)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1019 {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1020 int c;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1021
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1022 for (c = 0; c < vd->vdev_children; c++)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1023 spa_check_removed(vd->vdev_child[c]);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1024
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1025 if (vd->vdev_ops->vdev_op_leaf && vdev_is_dead(vd)) {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1026 zfs_post_autoreplace(vd->vdev_spa, vd);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1027 spa_event_notify(vd->vdev_spa, vd, ESC_ZFS_VDEV_CHECK);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1028 }
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1029 }
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1030
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1031 /*
7294
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1032 * Check for missing log devices
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1033 */
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1034 int
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1035 spa_check_logs(spa_t *spa)
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1036 {
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1037 switch (spa->spa_log_state) {
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1038 case SPA_LOG_MISSING:
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1039 /* need to recheck in case slog has been restored */
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1040 case SPA_LOG_UNKNOWN:
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1041 if (dmu_objset_find(spa->spa_name, zil_check_log_chain, NULL,
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1042 DS_FIND_CHILDREN)) {
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1043 spa->spa_log_state = SPA_LOG_MISSING;
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1044 return (1);
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1045 }
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1046 break;
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1047
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1048 case SPA_LOG_CLEAR:
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1049 (void) dmu_objset_find(spa->spa_name, zil_clear_log_chain, NULL,
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1050 DS_FIND_CHILDREN);
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1051 break;
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1052 }
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1053 spa->spa_log_state = SPA_LOG_GOOD;
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1054 return (0);
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1055 }
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1056
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1057 /*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1058 * 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
1059 * source of configuration information.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1060 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1061 static int
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1062 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
1063 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1064 int error = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1065 nvlist_t *nvroot = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1066 vdev_t *rvd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1067 uberblock_t *ub = &spa->spa_uberblock;
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1068 uint64_t config_cache_txg = spa->spa_config_txg;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1069 uint64_t pool_guid;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1070 uint64_t version;
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1071 uint64_t autoreplace = 0;
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
1072 int orig_mode = spa->spa_mode;
7294
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1073 char *ereport = FM_EREPORT_ZFS_POOL;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1074
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
1075 /*
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
1076 * If this is an untrusted config, access the pool in read-only mode.
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
1077 * This prevents things like resilvering recently removed devices.
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
1078 */
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
1079 if (!mosconfig)
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
1080 spa->spa_mode = FREAD;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
1081
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1082 ASSERT(MUTEX_HELD(&spa_namespace_lock));
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1083
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1084 spa->spa_load_state = state;
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1085
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1086 if (nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, &nvroot) ||
1733
a7c3bc84e012 6407377 spa_tryimport() is broken
bonwick
parents: 1732
diff changeset
1087 nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID, &pool_guid)) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1088 error = EINVAL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1089 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1090 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1091
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1092 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1093 * Versioning wasn't explicitly added to the label until later, so if
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1094 * it's not present treat it as the initial version.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1095 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1096 if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION, &version) != 0)
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
1097 version = SPA_VERSION_INITIAL;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1098
1733
a7c3bc84e012 6407377 spa_tryimport() is broken
bonwick
parents: 1732
diff changeset
1099 (void) nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_TXG,
a7c3bc84e012 6407377 spa_tryimport() is broken
bonwick
parents: 1732
diff changeset
1100 &spa->spa_config_txg);
a7c3bc84e012 6407377 spa_tryimport() is broken
bonwick
parents: 1732
diff changeset
1101
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1102 if ((state == SPA_LOAD_IMPORT || state == SPA_LOAD_TRYIMPORT) &&
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1103 spa_guid_exists(pool_guid, 0)) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1104 error = EEXIST;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1105 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1106 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1107
2174
73de7a781492 6433717 offline devices should not be marked persistently unavailble
eschrock
parents: 2082
diff changeset
1108 spa->spa_load_guid = pool_guid;
73de7a781492 6433717 offline devices should not be marked persistently unavailble
eschrock
parents: 2082
diff changeset
1109
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1110 /*
9234
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9230
diff changeset
1111 * Create "The Godfather" zio to hold all async IOs
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9230
diff changeset
1112 */
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9230
diff changeset
1113 if (spa->spa_async_zio_root == NULL)
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9230
diff changeset
1114 spa->spa_async_zio_root = zio_root(spa, NULL, NULL,
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9230
diff changeset
1115 ZIO_FLAG_CANFAIL | ZIO_FLAG_SPECULATIVE |
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9230
diff changeset
1116 ZIO_FLAG_GODFATHER);
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9230
diff changeset
1117
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9230
diff changeset
1118 /*
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1119 * Parse the configuration into a vdev tree. We explicitly set the
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1120 * value that will be returned by spa_version() since parsing the
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1121 * configuration requires knowing the version number.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1122 */
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1123 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1124 spa->spa_ubsync.ub_version = version;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1125 error = spa_config_parse(spa, &rvd, nvroot, NULL, 0, VDEV_ALLOC_LOAD);
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1126 spa_config_exit(spa, SCL_ALL, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1127
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1128 if (error != 0)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1129 goto out;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1130
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
1131 ASSERT(spa->spa_root_vdev == rvd);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1132 ASSERT(spa_guid(spa) == pool_guid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1133
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1134 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1135 * Try to open all vdevs, loading each label in the process.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1136 */
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1137 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
4070
4390ea390a1e 6386594 zdb message should be clearer when failing for lack of permissions
mc142369
parents: 3975
diff changeset
1138 error = vdev_open(rvd);
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1139 spa_config_exit(spa, SCL_ALL, FTAG);
4070
4390ea390a1e 6386594 zdb message should be clearer when failing for lack of permissions
mc142369
parents: 3975
diff changeset
1140 if (error != 0)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1141 goto out;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1142
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1143 /*
9276
a8a7fc849933 6816124 System crash running zpool destroy on broken zpool
Mark J Musante <Mark.Musante@Sun.COM>
parents: 9234
diff changeset
1144 * We need to validate the vdev labels against the configuration that
a8a7fc849933 6816124 System crash running zpool destroy on broken zpool
Mark J Musante <Mark.Musante@Sun.COM>
parents: 9234
diff changeset
1145 * we have in hand, which is dependent on the setting of mosconfig. If
a8a7fc849933 6816124 System crash running zpool destroy on broken zpool
Mark J Musante <Mark.Musante@Sun.COM>
parents: 9234
diff changeset
1146 * mosconfig is true then we're validating the vdev labels based on
a8a7fc849933 6816124 System crash running zpool destroy on broken zpool
Mark J Musante <Mark.Musante@Sun.COM>
parents: 9234
diff changeset
1147 * that config. Otherwise, we're validating against the cached config
a8a7fc849933 6816124 System crash running zpool destroy on broken zpool
Mark J Musante <Mark.Musante@Sun.COM>
parents: 9234
diff changeset
1148 * (zpool.cache) that was read when we loaded the zfs module, and then
a8a7fc849933 6816124 System crash running zpool destroy on broken zpool
Mark J Musante <Mark.Musante@Sun.COM>
parents: 9234
diff changeset
1149 * later we will recursively call spa_load() and validate against
a8a7fc849933 6816124 System crash running zpool destroy on broken zpool
Mark J Musante <Mark.Musante@Sun.COM>
parents: 9234
diff changeset
1150 * the vdev config.
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
1151 */
9276
a8a7fc849933 6816124 System crash running zpool destroy on broken zpool
Mark J Musante <Mark.Musante@Sun.COM>
parents: 9234
diff changeset
1152 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
a8a7fc849933 6816124 System crash running zpool destroy on broken zpool
Mark J Musante <Mark.Musante@Sun.COM>
parents: 9234
diff changeset
1153 error = vdev_validate(rvd);
a8a7fc849933 6816124 System crash running zpool destroy on broken zpool
Mark J Musante <Mark.Musante@Sun.COM>
parents: 9234
diff changeset
1154 spa_config_exit(spa, SCL_ALL, FTAG);
a8a7fc849933 6816124 System crash running zpool destroy on broken zpool
Mark J Musante <Mark.Musante@Sun.COM>
parents: 9234
diff changeset
1155 if (error != 0)
a8a7fc849933 6816124 System crash running zpool destroy on broken zpool
Mark J Musante <Mark.Musante@Sun.COM>
parents: 9234
diff changeset
1156 goto out;
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
1157
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
1158 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
1159 error = ENXIO;
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
1160 goto out;
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
1161 }
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
1162
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
1163 /*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1164 * Find the best uberblock.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1165 */
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1166 vdev_uberblock_load(NULL, rvd, ub);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1167
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1168 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1169 * If we weren't able to find a single valid uberblock, return failure.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1170 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1171 if (ub->ub_txg == 0) {
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
1172 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
1173 VDEV_AUX_CORRUPT_DATA);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1174 error = ENXIO;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1175 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1176 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1177
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1178 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1179 * If the pool is newer than the code, we can't open it.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1180 */
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
1181 if (ub->ub_version > SPA_VERSION) {
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
1182 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
1183 VDEV_AUX_VERSION_NEWER);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1184 error = ENOTSUP;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1185 goto out;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1186 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1187
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1188 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1189 * If the vdev guid sum doesn't match the uberblock, we have an
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1190 * incomplete configuration.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1191 */
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
1192 if (rvd->vdev_guid_sum != ub->ub_guid_sum && mosconfig) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1193 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1194 VDEV_AUX_BAD_GUID_SUM);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1195 error = ENXIO;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1196 goto out;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1197 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1198
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1199 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1200 * Initialize internal SPA structures.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1201 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1202 spa->spa_state = POOL_STATE_ACTIVE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1203 spa->spa_ubsync = spa->spa_uberblock;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1204 spa->spa_first_txg = spa_last_synced_txg(spa) + 1;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1205 error = dsl_pool_open(spa, spa->spa_first_txg, &spa->spa_dsl_pool);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1206 if (error) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1207 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1208 VDEV_AUX_CORRUPT_DATA);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1209 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1210 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1211 spa->spa_meta_objset = spa->spa_dsl_pool->dp_meta_objset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1212
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1213 if (zap_lookup(spa->spa_meta_objset,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1214 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_CONFIG,
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1215 sizeof (uint64_t), 1, &spa->spa_config_object) != 0) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1216 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1217 VDEV_AUX_CORRUPT_DATA);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1218 error = EIO;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1219 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1220 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1221
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1222 if (!mosconfig) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1223 nvlist_t *newconfig;
3975
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
1224 uint64_t hostid;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1225
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1226 if (load_nvlist(spa, spa->spa_config_object, &newconfig) != 0) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1227 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1228 VDEV_AUX_CORRUPT_DATA);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1229 error = EIO;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1230 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1231 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1232
7706
75cbbfb9ce50 6716241 Changing hostid, by moving in a new sysinit file, panics a zfs root file system
Lin Ling <Lin.Ling@Sun.COM>
parents: 7687
diff changeset
1233 if (!spa_is_root(spa) && nvlist_lookup_uint64(newconfig,
75cbbfb9ce50 6716241 Changing hostid, by moving in a new sysinit file, panics a zfs root file system
Lin Ling <Lin.Ling@Sun.COM>
parents: 7687
diff changeset
1234 ZPOOL_CONFIG_HOSTID, &hostid) == 0) {
3975
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
1235 char *hostname;
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
1236 unsigned long myhostid = 0;
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
1237
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
1238 VERIFY(nvlist_lookup_string(newconfig,
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
1239 ZPOOL_CONFIG_HOSTNAME, &hostname) == 0);
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
1240
8662
18153249ee93 PSARC/2008/647 Configurable Hostids for Non-Global Zones
jv227347 <Jordan.Vaughan@Sun.com>
parents: 8525
diff changeset
1241 #ifdef _KERNEL
18153249ee93 PSARC/2008/647 Configurable Hostids for Non-Global Zones
jv227347 <Jordan.Vaughan@Sun.com>
parents: 8525
diff changeset
1242 myhostid = zone_get_hostid(NULL);
18153249ee93 PSARC/2008/647 Configurable Hostids for Non-Global Zones
jv227347 <Jordan.Vaughan@Sun.com>
parents: 8525
diff changeset
1243 #else /* _KERNEL */
18153249ee93 PSARC/2008/647 Configurable Hostids for Non-Global Zones
jv227347 <Jordan.Vaughan@Sun.com>
parents: 8525
diff changeset
1244 /*
18153249ee93 PSARC/2008/647 Configurable Hostids for Non-Global Zones
jv227347 <Jordan.Vaughan@Sun.com>
parents: 8525
diff changeset
1245 * We're emulating the system's hostid in userland, so
18153249ee93 PSARC/2008/647 Configurable Hostids for Non-Global Zones
jv227347 <Jordan.Vaughan@Sun.com>
parents: 8525
diff changeset
1246 * we can't use zone_get_hostid().
18153249ee93 PSARC/2008/647 Configurable Hostids for Non-Global Zones
jv227347 <Jordan.Vaughan@Sun.com>
parents: 8525
diff changeset
1247 */
3975
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
1248 (void) ddi_strtoul(hw_serial, NULL, 10, &myhostid);
8662
18153249ee93 PSARC/2008/647 Configurable Hostids for Non-Global Zones
jv227347 <Jordan.Vaughan@Sun.com>
parents: 8525
diff changeset
1249 #endif /* _KERNEL */
4178
ad95fd86760b 6553537 zfs root fails to boot from a snv_63+zfsboot-pfinstall netinstall image
lling
parents: 4070
diff changeset
1250 if (hostid != 0 && myhostid != 0 &&
8662
18153249ee93 PSARC/2008/647 Configurable Hostids for Non-Global Zones
jv227347 <Jordan.Vaughan@Sun.com>
parents: 8525
diff changeset
1251 hostid != myhostid) {
3975
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
1252 cmn_err(CE_WARN, "pool '%s' could not be "
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
1253 "loaded as it was last accessed by "
7706
75cbbfb9ce50 6716241 Changing hostid, by moving in a new sysinit file, panics a zfs root file system
Lin Ling <Lin.Ling@Sun.COM>
parents: 7687
diff changeset
1254 "another system (host: %s hostid: 0x%lx). "
3975
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
1255 "See: http://www.sun.com/msg/ZFS-8000-EY",
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1256 spa_name(spa), hostname,
3975
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
1257 (unsigned long)hostid);
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
1258 error = EBADF;
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
1259 goto out;
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
1260 }
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
1261 }
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
1262
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1263 spa_config_set(spa, newconfig);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1264 spa_unload(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1265 spa_deactivate(spa);
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
1266 spa_activate(spa, orig_mode);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1267
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1268 return (spa_load(spa, newconfig, state, B_TRUE));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1269 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1270
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1271 if (zap_lookup(spa->spa_meta_objset,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1272 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_SYNC_BPLIST,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1273 sizeof (uint64_t), 1, &spa->spa_sync_bplist_obj) != 0) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1274 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1275 VDEV_AUX_CORRUPT_DATA);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1276 error = EIO;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1277 goto out;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1278 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1279
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1280 /*
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1281 * Load the bit that tells us to use the new accounting function
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1282 * (raid-z deflation). If we have an older pool, this will not
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1283 * be present.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1284 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1285 error = zap_lookup(spa->spa_meta_objset,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1286 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_DEFLATE,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1287 sizeof (uint64_t), 1, &spa->spa_deflate);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1288 if (error != 0 && error != ENOENT) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1289 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1290 VDEV_AUX_CORRUPT_DATA);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1291 error = EIO;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1292 goto out;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1293 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1294
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1295 /*
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1296 * Load the persistent error log. If we have an older pool, this will
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1297 * not be present.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1298 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1299 error = zap_lookup(spa->spa_meta_objset,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1300 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_ERRLOG_LAST,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1301 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
1302 if (error != 0 && error != ENOENT) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1303 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1304 VDEV_AUX_CORRUPT_DATA);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1305 error = EIO;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1306 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1307 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1308
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1309 error = zap_lookup(spa->spa_meta_objset,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1310 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_ERRLOG_SCRUB,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1311 sizeof (uint64_t), 1, &spa->spa_errlog_scrub);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1312 if (error != 0 && error != ENOENT) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1313 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1314 VDEV_AUX_CORRUPT_DATA);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1315 error = EIO;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1316 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1317 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1318
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1319 /*
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1320 * Load the history object. If we have an older pool, this
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1321 * will not be present.
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1322 */
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1323 error = zap_lookup(spa->spa_meta_objset,
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1324 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_HISTORY,
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1325 sizeof (uint64_t), 1, &spa->spa_history);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1326 if (error != 0 && error != ENOENT) {
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1327 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1328 VDEV_AUX_CORRUPT_DATA);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1329 error = EIO;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1330 goto out;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1331 }
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1332
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
1333 /*
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1334 * Load any hot spares for this pool.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1335 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1336 error = zap_lookup(spa->spa_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1337 DMU_POOL_SPARES, sizeof (uint64_t), 1, &spa->spa_spares.sav_object);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1338 if (error != 0 && error != ENOENT) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1339 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1340 VDEV_AUX_CORRUPT_DATA);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1341 error = EIO;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1342 goto out;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1343 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1344 if (error == 0) {
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
1345 ASSERT(spa_version(spa) >= SPA_VERSION_SPARES);
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1346 if (load_nvlist(spa, spa->spa_spares.sav_object,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1347 &spa->spa_spares.sav_config) != 0) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1348 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1349 VDEV_AUX_CORRUPT_DATA);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1350 error = EIO;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1351 goto out;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1352 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1353
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1354 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1355 spa_load_spares(spa);
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1356 spa_config_exit(spa, SCL_ALL, FTAG);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1357 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1358
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1359 /*
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1360 * Load any level 2 ARC devices for this pool.
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1361 */
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1362 error = zap_lookup(spa->spa_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1363 DMU_POOL_L2CACHE, sizeof (uint64_t), 1,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1364 &spa->spa_l2cache.sav_object);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1365 if (error != 0 && error != ENOENT) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1366 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1367 VDEV_AUX_CORRUPT_DATA);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1368 error = EIO;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1369 goto out;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1370 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1371 if (error == 0) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1372 ASSERT(spa_version(spa) >= SPA_VERSION_L2CACHE);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1373 if (load_nvlist(spa, spa->spa_l2cache.sav_object,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1374 &spa->spa_l2cache.sav_config) != 0) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1375 vdev_set_state(rvd, B_TRUE,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1376 VDEV_STATE_CANT_OPEN,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1377 VDEV_AUX_CORRUPT_DATA);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1378 error = EIO;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1379 goto out;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1380 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1381
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1382 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1383 spa_load_l2cache(spa);
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1384 spa_config_exit(spa, SCL_ALL, FTAG);
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1385 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1386
7294
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1387 if (spa_check_logs(spa)) {
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1388 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1389 VDEV_AUX_BAD_LOG);
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1390 error = ENXIO;
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1391 ereport = FM_EREPORT_ZFS_LOG_REPLAY;
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1392 goto out;
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1393 }
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1394
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1395
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1396 spa->spa_delegation = zpool_prop_default_numeric(ZPOOL_PROP_DELEGATION);
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
1397
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1398 error = zap_lookup(spa->spa_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1399 DMU_POOL_PROPS, sizeof (uint64_t), 1, &spa->spa_pool_props_object);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1400
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1401 if (error && error != ENOENT) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1402 vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1403 VDEV_AUX_CORRUPT_DATA);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1404 error = EIO;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1405 goto out;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1406 }
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1407
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1408 if (error == 0) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1409 (void) zap_lookup(spa->spa_meta_objset,
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1410 spa->spa_pool_props_object,
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1411 zpool_prop_to_name(ZPOOL_PROP_BOOTFS),
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1412 sizeof (uint64_t), 1, &spa->spa_bootfs);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1413 (void) zap_lookup(spa->spa_meta_objset,
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1414 spa->spa_pool_props_object,
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1415 zpool_prop_to_name(ZPOOL_PROP_AUTOREPLACE),
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1416 sizeof (uint64_t), 1, &autoreplace);
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
1417 (void) zap_lookup(spa->spa_meta_objset,
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
1418 spa->spa_pool_props_object,
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
1419 zpool_prop_to_name(ZPOOL_PROP_DELEGATION),
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
1420 sizeof (uint64_t), 1, &spa->spa_delegation);
5329
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
1421 (void) zap_lookup(spa->spa_meta_objset,
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
1422 spa->spa_pool_props_object,
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
1423 zpool_prop_to_name(ZPOOL_PROP_FAILUREMODE),
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
1424 sizeof (uint64_t), 1, &spa->spa_failmode);
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1425 }
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
1426
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1427 /*
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1428 * If the 'autoreplace' property is set, then post a resource notifying
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1429 * the ZFS DE that it should not issue any faults for unopenable
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1430 * devices. We also iterate over the vdevs, and post a sysevent for any
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1431 * unopenable vdevs so that the normal autoreplace handler can take
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1432 * over.
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1433 */
5756
05eb4c1ff492 6585441 spa_event_notify() doesn't pass its attributes
eschrock
parents: 5688
diff changeset
1434 if (autoreplace && state != SPA_LOAD_TRYIMPORT)
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1435 spa_check_removed(spa->spa_root_vdev);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1436
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1437 /*
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
1438 * Load the vdev state for all toplevel vdevs.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1439 */
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
1440 vdev_load(rvd);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1441
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1442 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1443 * Propagate the leaf DTLs we just loaded all the way up the tree.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1444 */
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1445 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1446 vdev_dtl_reassess(rvd, 0, 0, B_FALSE);
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1447 spa_config_exit(spa, SCL_ALL, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1448
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1449 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1450 * Check the state of the root vdev. If it can't be opened, it
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1451 * indicates one or more toplevel vdevs are faulted.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1452 */
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1453 if (rvd->vdev_state <= VDEV_STATE_CANT_OPEN) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1454 error = ENXIO;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1455 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1456 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1457
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
1458 if (spa_writeable(spa)) {
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1459 dmu_tx_t *tx;
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1460 int need_update = B_FALSE;
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
1461
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
1462 ASSERT(state != SPA_LOAD_TRYIMPORT);
1601
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
1463
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1464 /*
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1465 * 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
1466 * 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
1467 */
1601
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
1468 tx = dmu_tx_create_assigned(spa_get_dsl(spa),
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1469 spa_first_txg(spa));
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1470 (void) dmu_objset_find(spa_name(spa),
2417
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 2329
diff changeset
1471 zil_claim, tx, DS_FIND_CHILDREN);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1472 dmu_tx_commit(tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1473
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1474 spa->spa_sync_on = B_TRUE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1475 txg_sync_start(spa->spa_dsl_pool);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1476
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1477 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1478 * Wait for all claims to sync.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1479 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1480 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
1481
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
1482 /*
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1483 * 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
1484 * 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
1485 */
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1486 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
1487 state == SPA_LOAD_IMPORT)
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1488 need_update = B_TRUE;
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1489
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
1490 for (int c = 0; c < rvd->vdev_children; c++)
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1491 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
1492 need_update = B_TRUE;
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
1493
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
1494 /*
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1495 * 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
1496 * 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
1497 */
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1498 if (need_update)
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1499 spa_async_request(spa, SPA_ASYNC_CONFIG_UPDATE);
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
1500
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
1501 /*
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
1502 * Check all DTLs to see if anything needs resilvering.
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
1503 */
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
1504 if (vdev_resilver_needed(rvd, NULL, NULL))
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
1505 spa_async_request(spa, SPA_ASYNC_RESILVER);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1506 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1507
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1508 error = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1509 out:
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
1510 spa->spa_minref = refcount_count(&spa->spa_refcount);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1511 if (error && error != EBADF)
7294
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 7214
diff changeset
1512 zfs_ereport_post(ereport, spa, NULL, NULL, 0, 0);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1513 spa->spa_load_state = SPA_LOAD_NONE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1514 spa->spa_ena = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1515
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1516 return (error);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1517 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1518
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1519 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1520 * Pool Open/Import
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1521 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1522 * The import case is identical to an open except that the configuration is sent
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1523 * down from userland, instead of grabbed from the configuration cache. For the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1524 * case of an open, the pool configuration will exist in the
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1525 * POOL_STATE_UNINITIALIZED state.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1526 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1527 * The stats information (gen/count/ustats) is used to gather vdev statistics at
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1528 * 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
1529 * ambiguous state.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1530 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1531 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1532 spa_open_common(const char *pool, spa_t **spapp, void *tag, nvlist_t **config)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1533 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1534 spa_t *spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1535 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1536 int locked = B_FALSE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1537
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1538 *spapp = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1539
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1540 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1541 * As disgusting as this is, we need to support recursive calls to this
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1542 * function because dsl_dir_open() is called during spa_load(), and ends
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1543 * up calling spa_open() again. The real fix is to figure out how to
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1544 * avoid dsl_dir_open() calling this in the first place.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1545 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1546 if (mutex_owner(&spa_namespace_lock) != curthread) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1547 mutex_enter(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1548 locked = B_TRUE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1549 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1550
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1551 if ((spa = spa_lookup(pool)) == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1552 if (locked)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1553 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1554 return (ENOENT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1555 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1556 if (spa->spa_state == POOL_STATE_UNINITIALIZED) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1557
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
1558 spa_activate(spa, spa_mode_global);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1559
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1560 error = spa_load(spa, spa->spa_config, SPA_LOAD_OPEN, B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1561
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1562 if (error == EBADF) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1563 /*
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
1564 * 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
1565 * 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
1566 * 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
1567 * 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
1568 * we should remove the pool from the namespace.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1569 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1570 spa_unload(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1571 spa_deactivate(spa);
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
1572 spa_config_sync(spa, B_TRUE, B_TRUE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1573 spa_remove(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1574 if (locked)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1575 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1576 return (ENOENT);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1577 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1578
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1579 if (error) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1580 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1581 * We can't open the pool, but we still have useful
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1582 * information: the state of each vdev after the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1583 * attempted vdev_open(). Return this to the user.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1584 */
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1585 if (config != NULL && spa->spa_root_vdev != NULL)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1586 *config = spa_config_generate(spa, NULL, -1ULL,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1587 B_TRUE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1588 spa_unload(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1589 spa_deactivate(spa);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1590 spa->spa_last_open_failed = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1591 if (locked)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1592 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1593 *spapp = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1594 return (error);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1595 } else {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1596 spa->spa_last_open_failed = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1597 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1598 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1599
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1600 spa_open_ref(spa, tag);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
1601
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1602 if (locked)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1603 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1604
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1605 *spapp = spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1606
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1607 if (config != NULL)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1608 *config = spa_config_generate(spa, NULL, -1ULL, B_TRUE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1609
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1610 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1611 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1612
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1613 int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1614 spa_open(const char *name, spa_t **spapp, void *tag)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1615 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1616 return (spa_open_common(name, spapp, tag, NULL));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1617 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1618
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1619 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1620 * Lookup the given spa_t, incrementing the inject count in the process,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1621 * preventing it from being exported or destroyed.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1622 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1623 spa_t *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1624 spa_inject_addref(char *name)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1625 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1626 spa_t *spa;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1627
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1628 mutex_enter(&spa_namespace_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1629 if ((spa = spa_lookup(name)) == NULL) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1630 mutex_exit(&spa_namespace_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1631 return (NULL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1632 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1633 spa->spa_inject_ref++;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1634 mutex_exit(&spa_namespace_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1635
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1636 return (spa);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1637 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1638
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1639 void
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1640 spa_inject_delref(spa_t *spa)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1641 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1642 mutex_enter(&spa_namespace_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1643 spa->spa_inject_ref--;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1644 mutex_exit(&spa_namespace_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1645 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1646
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1647 /*
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1648 * Add spares device information to the nvlist.
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1649 */
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1650 static void
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1651 spa_add_spares(spa_t *spa, nvlist_t *config)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1652 {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1653 nvlist_t **spares;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1654 uint_t i, nspares;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1655 nvlist_t *nvroot;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1656 uint64_t guid;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1657 vdev_stat_t *vs;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1658 uint_t vsc;
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1659 uint64_t pool;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1660
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1661 ASSERT(spa_config_held(spa, SCL_CONFIG, RW_READER));
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1662
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1663 if (spa->spa_spares.sav_count == 0)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1664 return;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1665
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1666 VERIFY(nvlist_lookup_nvlist(config,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1667 ZPOOL_CONFIG_VDEV_TREE, &nvroot) == 0);
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1668 VERIFY(nvlist_lookup_nvlist_array(spa->spa_spares.sav_config,
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1669 ZPOOL_CONFIG_SPARES, &spares, &nspares) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1670 if (nspares != 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1671 VERIFY(nvlist_add_nvlist_array(nvroot,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1672 ZPOOL_CONFIG_SPARES, spares, nspares) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1673 VERIFY(nvlist_lookup_nvlist_array(nvroot,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1674 ZPOOL_CONFIG_SPARES, &spares, &nspares) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1675
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1676 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1677 * Go through and find any spares which have since been
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1678 * repurposed as an active spare. If this is the case, update
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1679 * their status appropriately.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1680 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1681 for (i = 0; i < nspares; i++) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1682 VERIFY(nvlist_lookup_uint64(spares[i],
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1683 ZPOOL_CONFIG_GUID, &guid) == 0);
7214
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
1684 if (spa_spare_exists(guid, &pool, NULL) &&
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
1685 pool != 0ULL) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1686 VERIFY(nvlist_lookup_uint64_array(
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1687 spares[i], ZPOOL_CONFIG_STATS,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1688 (uint64_t **)&vs, &vsc) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1689 vs->vs_state = VDEV_STATE_CANT_OPEN;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1690 vs->vs_aux = VDEV_AUX_SPARED;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1691 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1692 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1693 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1694 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1695
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1696 /*
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1697 * Add l2cache device information to the nvlist, including vdev stats.
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1698 */
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1699 static void
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1700 spa_add_l2cache(spa_t *spa, nvlist_t *config)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1701 {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1702 nvlist_t **l2cache;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1703 uint_t i, j, nl2cache;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1704 nvlist_t *nvroot;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1705 uint64_t guid;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1706 vdev_t *vd;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1707 vdev_stat_t *vs;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1708 uint_t vsc;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1709
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1710 ASSERT(spa_config_held(spa, SCL_CONFIG, RW_READER));
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1711
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1712 if (spa->spa_l2cache.sav_count == 0)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1713 return;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1714
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1715 VERIFY(nvlist_lookup_nvlist(config,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1716 ZPOOL_CONFIG_VDEV_TREE, &nvroot) == 0);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1717 VERIFY(nvlist_lookup_nvlist_array(spa->spa_l2cache.sav_config,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1718 ZPOOL_CONFIG_L2CACHE, &l2cache, &nl2cache) == 0);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1719 if (nl2cache != 0) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1720 VERIFY(nvlist_add_nvlist_array(nvroot,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1721 ZPOOL_CONFIG_L2CACHE, l2cache, nl2cache) == 0);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1722 VERIFY(nvlist_lookup_nvlist_array(nvroot,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1723 ZPOOL_CONFIG_L2CACHE, &l2cache, &nl2cache) == 0);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1724
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1725 /*
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1726 * Update level 2 cache device stats.
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1727 */
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1728
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1729 for (i = 0; i < nl2cache; i++) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1730 VERIFY(nvlist_lookup_uint64(l2cache[i],
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1731 ZPOOL_CONFIG_GUID, &guid) == 0);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1732
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1733 vd = NULL;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1734 for (j = 0; j < spa->spa_l2cache.sav_count; j++) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1735 if (guid ==
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1736 spa->spa_l2cache.sav_vdevs[j]->vdev_guid) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1737 vd = spa->spa_l2cache.sav_vdevs[j];
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1738 break;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1739 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1740 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1741 ASSERT(vd != NULL);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1742
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1743 VERIFY(nvlist_lookup_uint64_array(l2cache[i],
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1744 ZPOOL_CONFIG_STATS, (uint64_t **)&vs, &vsc) == 0);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1745 vdev_get_stats(vd, vs);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1746 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1747 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1748 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1749
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1750 int
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1751 spa_get_stats(const char *name, nvlist_t **config, char *altroot, size_t buflen)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1752 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1753 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1754 spa_t *spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1755
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1756 *config = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1757 error = spa_open_common(name, &spa, FTAG, config);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1758
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1759 if (spa != NULL) {
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1760 /*
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1761 * This still leaves a window of inconsistency where the spares
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1762 * or l2cache devices could change and the config would be
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1763 * self-inconsistent.
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1764 */
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1765 spa_config_enter(spa, SCL_CONFIG, FTAG, RW_READER);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1766
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1767 if (*config != NULL) {
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1768 VERIFY(nvlist_add_uint64(*config,
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1769 ZPOOL_CONFIG_ERRCOUNT,
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1770 spa_get_errlog_size(spa)) == 0);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1771
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1772 if (spa_suspended(spa))
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1773 VERIFY(nvlist_add_uint64(*config,
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1774 ZPOOL_CONFIG_SUSPENDED,
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1775 spa->spa_failmode) == 0);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1776
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1777 spa_add_spares(spa, *config);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1778 spa_add_l2cache(spa, *config);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1779 }
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1780 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1781
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1782 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1783 * 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
1784 * and call spa_lookup() directly.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1785 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1786 if (altroot) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1787 if (spa == NULL) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1788 mutex_enter(&spa_namespace_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1789 spa = spa_lookup(name);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1790 if (spa)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1791 spa_altroot(spa, altroot, buflen);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1792 else
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1793 altroot[0] = '\0';
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1794 spa = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1795 mutex_exit(&spa_namespace_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1796 } else {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1797 spa_altroot(spa, altroot, buflen);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1798 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1799 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
1800
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1801 if (spa != NULL) {
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1802 spa_config_exit(spa, SCL_CONFIG, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1803 spa_close(spa, FTAG);
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
1804 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1805
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1806 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1807 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1808
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1809 /*
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1810 * Validate that the auxiliary device array is well formed. We must have an
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1811 * array of nvlists, each which describes a valid leaf vdev. If this is an
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1812 * import (mode is VDEV_ALLOC_SPARE), then we allow corrupted spares to be
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1813 * specified, as long as they are well-formed.
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1814 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1815 static int
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1816 spa_validate_aux_devs(spa_t *spa, nvlist_t *nvroot, uint64_t crtxg, int mode,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1817 spa_aux_vdev_t *sav, const char *config, uint64_t version,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1818 vdev_labeltype_t label)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1819 {
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1820 nvlist_t **dev;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1821 uint_t i, ndev;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1822 vdev_t *vd;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1823 int error;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1824
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1825 ASSERT(spa_config_held(spa, SCL_ALL, RW_WRITER) == SCL_ALL);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1826
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1827 /*
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1828 * It's acceptable to have no devs specified.
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1829 */
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1830 if (nvlist_lookup_nvlist_array(nvroot, config, &dev, &ndev) != 0)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1831 return (0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1832
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1833 if (ndev == 0)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1834 return (EINVAL);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1835
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1836 /*
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1837 * Make sure the pool is formatted with a version that supports this
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1838 * device type.
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1839 */
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1840 if (spa_version(spa) < version)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1841 return (ENOTSUP);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1842
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1843 /*
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1844 * Set the pending device list so we correctly handle device in-use
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1845 * checking.
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1846 */
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1847 sav->sav_pending = dev;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1848 sav->sav_npending = ndev;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1849
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1850 for (i = 0; i < ndev; i++) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1851 if ((error = spa_config_parse(spa, &vd, dev[i], NULL, 0,
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1852 mode)) != 0)
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1853 goto out;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1854
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1855 if (!vd->vdev_ops->vdev_op_leaf) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1856 vdev_free(vd);
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1857 error = EINVAL;
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1858 goto out;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1859 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1860
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1861 /*
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1862 * The L2ARC currently only supports disk devices in
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1863 * kernel context. For user-level testing, we allow it.
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1864 */
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1865 #ifdef _KERNEL
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1866 if ((strcmp(config, ZPOOL_CONFIG_L2CACHE) == 0) &&
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1867 strcmp(vd->vdev_ops->vdev_op_type, VDEV_TYPE_DISK) != 0) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1868 error = ENOTBLK;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1869 goto out;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1870 }
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1871 #endif
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1872 vd->vdev_top = vd;
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1873
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1874 if ((error = vdev_open(vd)) == 0 &&
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1875 (error = vdev_label_init(vd, crtxg, label)) == 0) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1876 VERIFY(nvlist_add_uint64(dev[i], ZPOOL_CONFIG_GUID,
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1877 vd->vdev_guid) == 0);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1878 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1879
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1880 vdev_free(vd);
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1881
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1882 if (error &&
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1883 (mode != VDEV_ALLOC_SPARE && mode != VDEV_ALLOC_L2CACHE))
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1884 goto out;
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1885 else
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1886 error = 0;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1887 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1888
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1889 out:
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1890 sav->sav_pending = NULL;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1891 sav->sav_npending = 0;
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
1892 return (error);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1893 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1894
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1895 static int
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1896 spa_validate_aux(spa_t *spa, nvlist_t *nvroot, uint64_t crtxg, int mode)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1897 {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1898 int error;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1899
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1900 ASSERT(spa_config_held(spa, SCL_ALL, RW_WRITER) == SCL_ALL);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
1901
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1902 if ((error = spa_validate_aux_devs(spa, nvroot, crtxg, mode,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1903 &spa->spa_spares, ZPOOL_CONFIG_SPARES, SPA_VERSION_SPARES,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1904 VDEV_LABEL_SPARE)) != 0) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1905 return (error);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1906 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1907
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1908 return (spa_validate_aux_devs(spa, nvroot, crtxg, mode,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1909 &spa->spa_l2cache, ZPOOL_CONFIG_L2CACHE, SPA_VERSION_L2CACHE,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1910 VDEV_LABEL_L2CACHE));
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1911 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1912
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1913 static void
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1914 spa_set_aux_vdevs(spa_aux_vdev_t *sav, nvlist_t **devs, int ndevs,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1915 const char *config)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1916 {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1917 int i;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1918
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1919 if (sav->sav_config != NULL) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1920 nvlist_t **olddevs;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1921 uint_t oldndevs;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1922 nvlist_t **newdevs;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1923
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1924 /*
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1925 * Generate new dev list by concatentating with the
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1926 * current dev list.
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1927 */
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1928 VERIFY(nvlist_lookup_nvlist_array(sav->sav_config, config,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1929 &olddevs, &oldndevs) == 0);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1930
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1931 newdevs = kmem_alloc(sizeof (void *) *
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1932 (ndevs + oldndevs), KM_SLEEP);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1933 for (i = 0; i < oldndevs; i++)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1934 VERIFY(nvlist_dup(olddevs[i], &newdevs[i],
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1935 KM_SLEEP) == 0);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1936 for (i = 0; i < ndevs; i++)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1937 VERIFY(nvlist_dup(devs[i], &newdevs[i + oldndevs],
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1938 KM_SLEEP) == 0);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1939
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1940 VERIFY(nvlist_remove(sav->sav_config, config,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1941 DATA_TYPE_NVLIST_ARRAY) == 0);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1942
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1943 VERIFY(nvlist_add_nvlist_array(sav->sav_config,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1944 config, newdevs, ndevs + oldndevs) == 0);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1945 for (i = 0; i < oldndevs + ndevs; i++)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1946 nvlist_free(newdevs[i]);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1947 kmem_free(newdevs, (oldndevs + ndevs) * sizeof (void *));
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1948 } else {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1949 /*
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1950 * Generate a new dev list.
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1951 */
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1952 VERIFY(nvlist_alloc(&sav->sav_config, NV_UNIQUE_NAME,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1953 KM_SLEEP) == 0);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1954 VERIFY(nvlist_add_nvlist_array(sav->sav_config, config,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1955 devs, ndevs) == 0);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1956 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1957 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1958
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1959 /*
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1960 * Stop and drop level 2 ARC devices
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1961 */
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1962 void
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1963 spa_l2cache_drop(spa_t *spa)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1964 {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1965 vdev_t *vd;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1966 int i;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1967 spa_aux_vdev_t *sav = &spa->spa_l2cache;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1968
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1969 for (i = 0; i < sav->sav_count; i++) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1970 uint64_t pool;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1971
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1972 vd = sav->sav_vdevs[i];
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1973 ASSERT(vd != NULL);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1974
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
1975 if (spa_l2cache_exists(vd->vdev_guid, &pool) &&
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
1976 pool != 0ULL && l2arc_vdev_present(vd))
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1977 l2arc_remove_vdev(vd);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1978 if (vd->vdev_isl2cache)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1979 spa_l2cache_remove(vd);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1980 vdev_clear_stats(vd);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1981 (void) vdev_close(vd);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1982 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1983 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1984
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1985 /*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1986 * Pool Creation
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1987 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1988 int
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1989 spa_create(const char *pool, nvlist_t *nvroot, nvlist_t *props,
7184
9508660f9c27 PSARC 2008/223 Pool root file system properties via zpool(1M)
timh
parents: 7147
diff changeset
1990 const char *history_str, nvlist_t *zplprops)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1991 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1992 spa_t *spa;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
1993 char *altroot = NULL;
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
1994 vdev_t *rvd;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1995 dsl_pool_t *dp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1996 dmu_tx_t *tx;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
1997 int c, error = 0;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1998 uint64_t txg = TXG_INITIAL;
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
1999 nvlist_t **spares, **l2cache;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2000 uint_t nspares, nl2cache;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2001 uint64_t version;
789
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 * If this pool already exists, return failure.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2005 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2006 mutex_enter(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2007 if (spa_lookup(pool) != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2008 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2009 return (EEXIST);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2010 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2011
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2012 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2013 * Allocate a new spa_t structure.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2014 */
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2015 (void) nvlist_lookup_string(props,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2016 zpool_prop_to_name(ZPOOL_PROP_ALTROOT), &altroot);
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
2017 spa = spa_add(pool, altroot);
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
2018 spa_activate(spa, spa_mode_global);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2019
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2020 spa->spa_uberblock.ub_txg = txg - 1;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2021
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2022 if (props && (error = spa_prop_validate(spa, props))) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2023 spa_unload(spa);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2024 spa_deactivate(spa);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2025 spa_remove(spa);
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
2026 mutex_exit(&spa_namespace_lock);
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2027 return (error);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2028 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2029
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2030 if (nvlist_lookup_uint64(props, zpool_prop_to_name(ZPOOL_PROP_VERSION),
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2031 &version) != 0)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2032 version = SPA_VERSION;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2033 ASSERT(version <= SPA_VERSION);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2034 spa->spa_uberblock.ub_version = version;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2035 spa->spa_ubsync = spa->spa_uberblock;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2036
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
2037 /*
9234
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9230
diff changeset
2038 * Create "The Godfather" zio to hold all async IOs
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9230
diff changeset
2039 */
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9230
diff changeset
2040 if (spa->spa_async_zio_root == NULL)
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9230
diff changeset
2041 spa->spa_async_zio_root = zio_root(spa, NULL, NULL,
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9230
diff changeset
2042 ZIO_FLAG_CANFAIL | ZIO_FLAG_SPECULATIVE |
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9230
diff changeset
2043 ZIO_FLAG_GODFATHER);
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9230
diff changeset
2044
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9230
diff changeset
2045 /*
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
2046 * Create the root vdev.
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
2047 */
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
2048 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
2049
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2050 error = spa_config_parse(spa, &rvd, nvroot, NULL, 0, VDEV_ALLOC_ADD);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2051
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2052 ASSERT(error != 0 || rvd != NULL);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2053 ASSERT(error != 0 || spa->spa_root_vdev == rvd);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2054
5913
a77f8ad2ce63 6575965 panic/thread=2a1016b5ca0: BAD TRAP: type=9 rp=1858500 addr=0 mmu_fsr=0, really, truly out of space
perrin
parents: 5886
diff changeset
2055 if (error == 0 && !zfs_allocatable_devs(nvroot))
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
2056 error = EINVAL;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2057
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2058 if (error == 0 &&
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2059 (error = vdev_create(rvd, txg, B_FALSE)) == 0 &&
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2060 (error = spa_validate_aux(spa, nvroot, txg,
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2061 VDEV_ALLOC_ADD)) == 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2062 for (c = 0; c < rvd->vdev_children; c++)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2063 vdev_init(rvd->vdev_child[c], txg);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2064 vdev_config_dirty(rvd);
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
2065 }
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
2066
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
2067 spa_config_exit(spa, SCL_ALL, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2068
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2069 if (error != 0) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2070 spa_unload(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2071 spa_deactivate(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2072 spa_remove(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2073 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2074 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2075 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2076
2082
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 * Get the list of spares, if specified.
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 if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2081 &spares, &nspares) == 0) {
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2082 VERIFY(nvlist_alloc(&spa->spa_spares.sav_config, NV_UNIQUE_NAME,
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2083 KM_SLEEP) == 0);
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2084 VERIFY(nvlist_add_nvlist_array(spa->spa_spares.sav_config,
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2085 ZPOOL_CONFIG_SPARES, spares, nspares) == 0);
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
2086 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2087 spa_load_spares(spa);
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
2088 spa_config_exit(spa, SCL_ALL, FTAG);
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2089 spa->spa_spares.sav_sync = B_TRUE;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2090 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2091
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2092 /*
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2093 * Get the list of level 2 cache devices, if specified.
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2094 */
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2095 if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_L2CACHE,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2096 &l2cache, &nl2cache) == 0) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2097 VERIFY(nvlist_alloc(&spa->spa_l2cache.sav_config,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2098 NV_UNIQUE_NAME, KM_SLEEP) == 0);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2099 VERIFY(nvlist_add_nvlist_array(spa->spa_l2cache.sav_config,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2100 ZPOOL_CONFIG_L2CACHE, l2cache, nl2cache) == 0);
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
2101 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2102 spa_load_l2cache(spa);
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
2103 spa_config_exit(spa, SCL_ALL, FTAG);
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2104 spa->spa_l2cache.sav_sync = B_TRUE;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2105 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2106
7184
9508660f9c27 PSARC 2008/223 Pool root file system properties via zpool(1M)
timh
parents: 7147
diff changeset
2107 spa->spa_dsl_pool = dp = dsl_pool_create(spa, zplprops, txg);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2108 spa->spa_meta_objset = dp->dp_meta_objset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2109
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2110 tx = dmu_tx_create_assigned(dp, txg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2111
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2112 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2113 * Create the pool config object.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2114 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2115 spa->spa_config_object = dmu_object_alloc(spa->spa_meta_objset,
7497
f6c6be3b6154 6733970 assertion failure in dbuf_dirty() via spa_sync_nvlist()
Tim Haley <Tim.Haley@Sun.COM>
parents: 7377
diff changeset
2116 DMU_OT_PACKED_NVLIST, SPA_CONFIG_BLOCKSIZE,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2117 DMU_OT_PACKED_NVLIST_SIZE, sizeof (uint64_t), tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2118
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2119 if (zap_add(spa->spa_meta_objset,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2120 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_CONFIG,
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2121 sizeof (uint64_t), 1, &spa->spa_config_object, tx) != 0) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2122 cmn_err(CE_PANIC, "failed to add pool config");
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2123 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2124
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2125 /* Newly created pools with the right version are always deflated. */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2126 if (version >= SPA_VERSION_RAIDZ_DEFLATE) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2127 spa->spa_deflate = TRUE;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2128 if (zap_add(spa->spa_meta_objset,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2129 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_DEFLATE,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2130 sizeof (uint64_t), 1, &spa->spa_deflate, tx) != 0) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2131 cmn_err(CE_PANIC, "failed to add deflate");
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2132 }
2082
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
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2135 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2136 * Create the deferred-free bplist object. Turn off compression
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2137 * because sync-to-convergence takes longer if the blocksize
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2138 * keeps changing.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2139 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2140 spa->spa_sync_bplist_obj = bplist_create(spa->spa_meta_objset,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2141 1 << 14, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2142 dmu_object_set_compress(spa->spa_meta_objset, spa->spa_sync_bplist_obj,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2143 ZIO_COMPRESS_OFF, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2144
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2145 if (zap_add(spa->spa_meta_objset,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2146 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_SYNC_BPLIST,
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2147 sizeof (uint64_t), 1, &spa->spa_sync_bplist_obj, tx) != 0) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2148 cmn_err(CE_PANIC, "failed to add bplist");
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2149 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2150
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
2151 /*
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
2152 * Create the pool's history object.
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
2153 */
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2154 if (version >= SPA_VERSION_ZPOOL_HISTORY)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2155 spa_history_create_obj(spa, tx);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2156
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2157 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2158 * Set pool properties.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2159 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2160 spa->spa_bootfs = zpool_prop_default_numeric(ZPOOL_PROP_BOOTFS);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2161 spa->spa_delegation = zpool_prop_default_numeric(ZPOOL_PROP_DELEGATION);
5329
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
2162 spa->spa_failmode = zpool_prop_default_numeric(ZPOOL_PROP_FAILUREMODE);
8525
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
2163 if (props != NULL) {
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
2164 spa_configfile_set(spa, props, B_FALSE);
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2165 spa_sync_props(spa, props, CRED(), tx);
8525
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
2166 }
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
2167
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2168 dmu_tx_commit(tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2169
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2170 spa->spa_sync_on = B_TRUE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2171 txg_sync_start(spa->spa_dsl_pool);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2172
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2173 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2174 * We explicitly wait for the first transaction to complete so that our
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2175 * bean counters are appropriately updated.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2176 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2177 txg_wait_synced(spa->spa_dsl_pool, txg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2178
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
2179 spa_config_sync(spa, B_FALSE, B_TRUE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2180
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
2181 if (version >= SPA_VERSION_ZPOOL_HISTORY && history_str != NULL)
4715
e8d212dda064 6535695 Panic: shpp->sh_eof == shpp->sh_pool_create_len, file: ../../common/fs/zfs/spa_history.c, line: 235
ek110237
parents: 4627
diff changeset
2182 (void) spa_history_log(spa, history_str, LOG_CMD_POOL_CREATE);
e8d212dda064 6535695 Panic: shpp->sh_eof == shpp->sh_pool_create_len, file: ../../common/fs/zfs/spa_history.c, line: 235
ek110237
parents: 4627
diff changeset
2183
8667
5c308a17eb7c 6795440 Assertion failure in spa_close()
George Wilson <George.Wilson@Sun.COM>
parents: 8662
diff changeset
2184 spa->spa_minref = refcount_count(&spa->spa_refcount);
5c308a17eb7c 6795440 Assertion failure in spa_close()
George Wilson <George.Wilson@Sun.COM>
parents: 8662
diff changeset
2185
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2186 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2187
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2188 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2189 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2190
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2191 #ifdef _KERNEL
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2192 /*
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2193 * Build a "root" vdev for a top level vdev read in from a rootpool
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2194 * device label.
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2195 */
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2196 static void
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2197 spa_build_rootpool_config(nvlist_t *config)
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2198 {
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2199 nvlist_t *nvtop, *nvroot;
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2200 uint64_t pgid;
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2201
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2202 /*
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2203 * Add this top-level vdev to the child array.
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2204 */
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2205 VERIFY(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, &nvtop)
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2206 == 0);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2207 VERIFY(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID, &pgid)
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2208 == 0);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2209
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2210 /*
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2211 * Put this pool's top-level vdevs into a root vdev.
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2212 */
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2213 VERIFY(nvlist_alloc(&nvroot, NV_UNIQUE_NAME, KM_SLEEP) == 0);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2214 VERIFY(nvlist_add_string(nvroot, ZPOOL_CONFIG_TYPE, VDEV_TYPE_ROOT)
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2215 == 0);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2216 VERIFY(nvlist_add_uint64(nvroot, ZPOOL_CONFIG_ID, 0ULL) == 0);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2217 VERIFY(nvlist_add_uint64(nvroot, ZPOOL_CONFIG_GUID, pgid) == 0);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2218 VERIFY(nvlist_add_nvlist_array(nvroot, ZPOOL_CONFIG_CHILDREN,
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2219 &nvtop, 1) == 0);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2220
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2221 /*
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2222 * Replace the existing vdev_tree with the new root vdev in
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2223 * this pool's configuration (remove the old, add the new).
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2224 */
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2225 VERIFY(nvlist_add_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, nvroot) == 0);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2226 nvlist_free(nvroot);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2227 }
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2228
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2229 /*
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2230 * Get the root pool information from the root disk, then import the root pool
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2231 * during the system boot up time.
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2232 */
7539
e3f4b4b9f982 6724326 better "can't mountroot" message
Lin Ling <Lin.Ling@Sun.COM>
parents: 7538
diff changeset
2233 extern int vdev_disk_read_rootlabel(char *, char *, nvlist_t **);
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2234
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2235 int
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2236 spa_check_rootconf(char *devpath, char *devid, nvlist_t **bestconf,
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2237 uint64_t *besttxg)
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2238 {
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2239 nvlist_t *config;
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2240 uint64_t txg;
7539
e3f4b4b9f982 6724326 better "can't mountroot" message
Lin Ling <Lin.Ling@Sun.COM>
parents: 7538
diff changeset
2241 int error;
e3f4b4b9f982 6724326 better "can't mountroot" message
Lin Ling <Lin.Ling@Sun.COM>
parents: 7538
diff changeset
2242
e3f4b4b9f982 6724326 better "can't mountroot" message
Lin Ling <Lin.Ling@Sun.COM>
parents: 7538
diff changeset
2243 if (error = vdev_disk_read_rootlabel(devpath, devid, &config))
e3f4b4b9f982 6724326 better "can't mountroot" message
Lin Ling <Lin.Ling@Sun.COM>
parents: 7538
diff changeset
2244 return (error);
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2245
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2246 VERIFY(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_TXG, &txg) == 0);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2247
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2248 if (bestconf != NULL)
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2249 *bestconf = config;
7539
e3f4b4b9f982 6724326 better "can't mountroot" message
Lin Ling <Lin.Ling@Sun.COM>
parents: 7538
diff changeset
2250 else
e3f4b4b9f982 6724326 better "can't mountroot" message
Lin Ling <Lin.Ling@Sun.COM>
parents: 7538
diff changeset
2251 nvlist_free(config);
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2252 *besttxg = txg;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2253 return (0);
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2254 }
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2255
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2256 boolean_t
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2257 spa_rootdev_validate(nvlist_t *nv)
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2258 {
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2259 uint64_t ival;
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2260
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2261 if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_OFFLINE, &ival) == 0 ||
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2262 nvlist_lookup_uint64(nv, ZPOOL_CONFIG_FAULTED, &ival) == 0 ||
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2263 nvlist_lookup_uint64(nv, ZPOOL_CONFIG_REMOVED, &ival) == 0)
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2264 return (B_FALSE);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2265
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2266 return (B_TRUE);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2267 }
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2268
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2269
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2270 /*
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2271 * Given the boot device's physical path or devid, check if the device
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2272 * is in a valid state. If so, return the configuration from the vdev
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2273 * label.
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2274 */
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2275 int
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2276 spa_get_rootconf(char *devpath, char *devid, nvlist_t **bestconf)
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2277 {
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2278 nvlist_t *conf = NULL;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2279 uint64_t txg = 0;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2280 nvlist_t *nvtop, **child;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2281 char *type;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2282 char *bootpath = NULL;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2283 uint_t children, c;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2284 char *tmp;
7539
e3f4b4b9f982 6724326 better "can't mountroot" message
Lin Ling <Lin.Ling@Sun.COM>
parents: 7538
diff changeset
2285 int error;
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2286
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2287 if (devpath && ((tmp = strchr(devpath, ' ')) != NULL))
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2288 *tmp = '\0';
7539
e3f4b4b9f982 6724326 better "can't mountroot" message
Lin Ling <Lin.Ling@Sun.COM>
parents: 7538
diff changeset
2289 if (error = spa_check_rootconf(devpath, devid, &conf, &txg)) {
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2290 cmn_err(CE_NOTE, "error reading device label");
7539
e3f4b4b9f982 6724326 better "can't mountroot" message
Lin Ling <Lin.Ling@Sun.COM>
parents: 7538
diff changeset
2291 return (error);
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2292 }
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2293 if (txg == 0) {
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2294 cmn_err(CE_NOTE, "this device is detached");
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2295 nvlist_free(conf);
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2296 return (EINVAL);
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2297 }
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2298
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2299 VERIFY(nvlist_lookup_nvlist(conf, ZPOOL_CONFIG_VDEV_TREE,
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2300 &nvtop) == 0);
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2301 VERIFY(nvlist_lookup_string(nvtop, ZPOOL_CONFIG_TYPE, &type) == 0);
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2302
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2303 if (strcmp(type, VDEV_TYPE_DISK) == 0) {
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2304 if (spa_rootdev_validate(nvtop)) {
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2305 goto out;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2306 } else {
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2307 nvlist_free(conf);
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2308 return (EINVAL);
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2309 }
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2310 }
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2311
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2312 ASSERT(strcmp(type, VDEV_TYPE_MIRROR) == 0);
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2313
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2314 VERIFY(nvlist_lookup_nvlist_array(nvtop, ZPOOL_CONFIG_CHILDREN,
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2315 &child, &children) == 0);
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2316
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2317 /*
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2318 * Go thru vdevs in the mirror to see if the given device
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2319 * has the most recent txg. Only the device with the most
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2320 * recent txg has valid information and should be booted.
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2321 */
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2322 for (c = 0; c < children; c++) {
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2323 char *cdevid, *cpath;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2324 uint64_t tmptxg;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2325
8242
e46e4b2f0a03 6770866 GRUB/ZFS should require physical path or devid, but not both
Lin Ling <Lin.Ling@Sun.COM>
parents: 8241
diff changeset
2326 cpath = NULL;
e46e4b2f0a03 6770866 GRUB/ZFS should require physical path or devid, but not both
Lin Ling <Lin.Ling@Sun.COM>
parents: 8241
diff changeset
2327 cdevid = NULL;
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2328 if (nvlist_lookup_string(child[c], ZPOOL_CONFIG_PHYS_PATH,
8242
e46e4b2f0a03 6770866 GRUB/ZFS should require physical path or devid, but not both
Lin Ling <Lin.Ling@Sun.COM>
parents: 8241
diff changeset
2329 &cpath) != 0 && nvlist_lookup_string(child[c],
e46e4b2f0a03 6770866 GRUB/ZFS should require physical path or devid, but not both
Lin Ling <Lin.Ling@Sun.COM>
parents: 8241
diff changeset
2330 ZPOOL_CONFIG_DEVID, &cdevid) != 0)
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2331 return (EINVAL);
7687
1132fbaf0c27 6750475 can't boot off a mirrored root with a failed disk
Lin Ling <Lin.Ling@Sun.COM>
parents: 7539
diff changeset
2332 if ((spa_check_rootconf(cpath, cdevid, NULL,
1132fbaf0c27 6750475 can't boot off a mirrored root with a failed disk
Lin Ling <Lin.Ling@Sun.COM>
parents: 7539
diff changeset
2333 &tmptxg) == 0) && (tmptxg > txg)) {
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2334 txg = tmptxg;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2335 VERIFY(nvlist_lookup_string(child[c],
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2336 ZPOOL_CONFIG_PATH, &bootpath) == 0);
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2337 }
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2338 }
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2339
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2340 /* Does the best device match the one we've booted from? */
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2341 if (bootpath) {
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2342 cmn_err(CE_NOTE, "try booting from '%s'", bootpath);
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2343 return (EINVAL);
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2344 }
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2345 out:
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2346 *bestconf = conf;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2347 return (0);
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2348 }
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2349
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2350 /*
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2351 * Import a root pool.
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2352 *
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2353 * For x86. devpath_list will consist of devid and/or physpath name of
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2354 * the vdev (e.g. "id1,sd@SSEAGATE..." or "/pci@1f,0/ide@d/disk@0,0:a").
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2355 * The GRUB "findroot" command will return the vdev we should boot.
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2356 *
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2357 * For Sparc, devpath_list consists the physpath name of the booting device
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2358 * no matter the rootpool is a single device pool or a mirrored pool.
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2359 * e.g.
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2360 * "/pci@1f,0/ide@d/disk@0,0:a"
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2361 */
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2362 int
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2363 spa_import_rootpool(char *devpath, char *devid)
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2364 {
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2365 nvlist_t *conf = NULL;
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2366 char *pname;
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2367 int error;
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2368 spa_t *spa;
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2369
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2370 /*
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2371 * Get the vdev pathname and configuation from the most
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2372 * recently updated vdev (highest txg).
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2373 */
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2374 if (error = spa_get_rootconf(devpath, devid, &conf))
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2375 goto msg_out;
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2376
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2377 /*
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2378 * Add type "root" vdev to the config.
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2379 */
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2380 spa_build_rootpool_config(conf);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2381
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2382 VERIFY(nvlist_lookup_string(conf, ZPOOL_CONFIG_POOL_NAME, &pname) == 0);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2383
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2384 mutex_enter(&spa_namespace_lock);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2385 if ((spa = spa_lookup(pname)) != NULL) {
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2386 /*
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2387 * Remove the existing root pool from the namespace so that we
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2388 * can replace it with the correct config we just read in.
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2389 */
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2390 spa_remove(spa);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2391 }
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2392
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2393 spa = spa_add(pname, NULL);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2394
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2395 spa->spa_is_root = B_TRUE;
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2396 VERIFY(nvlist_dup(conf, &spa->spa_config, 0) == 0);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2397 mutex_exit(&spa_namespace_lock);
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2398
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2399 nvlist_free(conf);
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2400 return (0);
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2401
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2402 msg_out:
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2403 cmn_err(CE_NOTE, "\n"
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2404 " *************************************************** \n"
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2405 " * This device is not bootable! * \n"
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2406 " * It is either offlined or detached or faulted. * \n"
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2407 " * Please try to boot from a different device. * \n"
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
2408 " *************************************************** ");
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2409
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2410 return (error);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2411 }
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2412 #endif
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2413
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2414 /*
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2415 * Take a pool and insert it into the namespace as if it had been loaded at
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2416 * boot.
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2417 */
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2418 int
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2419 spa_import_verbatim(const char *pool, nvlist_t *config, nvlist_t *props)
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2420 {
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2421 spa_t *spa;
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2422 char *altroot = NULL;
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2423
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2424 mutex_enter(&spa_namespace_lock);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2425 if (spa_lookup(pool) != NULL) {
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2426 mutex_exit(&spa_namespace_lock);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2427 return (EEXIST);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2428 }
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2429
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2430 (void) nvlist_lookup_string(props,
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2431 zpool_prop_to_name(ZPOOL_PROP_ALTROOT), &altroot);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2432 spa = spa_add(pool, altroot);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2433
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2434 VERIFY(nvlist_dup(config, &spa->spa_config, 0) == 0);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2435
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2436 if (props != NULL)
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2437 spa_configfile_set(spa, props, B_FALSE);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2438
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2439 spa_config_sync(spa, B_FALSE, B_TRUE);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2440
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2441 mutex_exit(&spa_namespace_lock);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2442
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2443 return (0);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2444 }
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2445
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2446 /*
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2447 * Import a non-root pool into the system.
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2448 */
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2449 int
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2450 spa_import(const char *pool, nvlist_t *config, nvlist_t *props)
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2451 {
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2452 spa_t *spa;
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2453 char *altroot = NULL;
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2454 int error;
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2455 nvlist_t *nvroot;
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2456 nvlist_t **spares, **l2cache;
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2457 uint_t nspares, nl2cache;
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2458
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2459 /*
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2460 * If a pool with this name exists, return failure.
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2461 */
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2462 mutex_enter(&spa_namespace_lock);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2463 if ((spa = spa_lookup(pool)) != NULL) {
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2464 mutex_exit(&spa_namespace_lock);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2465 return (EEXIST);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2466 }
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2467
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2468 /*
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2469 * Create and initialize the spa structure.
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2470 */
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2471 (void) nvlist_lookup_string(props,
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2472 zpool_prop_to_name(ZPOOL_PROP_ALTROOT), &altroot);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2473 spa = spa_add(pool, altroot);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2474 spa_activate(spa, spa_mode_global);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2475
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2476 /*
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2477 * Pass off the heavy lifting to spa_load(). Pass TRUE for mosconfig
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2478 * because the user-supplied config is actually the one to trust when
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2479 * doing an import.
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2480 */
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2481 error = spa_load(spa, config, SPA_LOAD_IMPORT, B_TRUE);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2482
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2483 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2484 /*
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2485 * Toss any existing sparelist, as it doesn't have any validity
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2486 * anymore, and conflicts with spa_has_spare().
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2487 */
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2488 if (spa->spa_spares.sav_config) {
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2489 nvlist_free(spa->spa_spares.sav_config);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2490 spa->spa_spares.sav_config = NULL;
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2491 spa_load_spares(spa);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2492 }
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2493 if (spa->spa_l2cache.sav_config) {
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2494 nvlist_free(spa->spa_l2cache.sav_config);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2495 spa->spa_l2cache.sav_config = NULL;
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2496 spa_load_l2cache(spa);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2497 }
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2498
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2499 VERIFY(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2500 &nvroot) == 0);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2501 if (error == 0)
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2502 error = spa_validate_aux(spa, nvroot, -1ULL,
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2503 VDEV_ALLOC_SPARE);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2504 if (error == 0)
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2505 error = spa_validate_aux(spa, nvroot, -1ULL,
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2506 VDEV_ALLOC_L2CACHE);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2507 spa_config_exit(spa, SCL_ALL, FTAG);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2508
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2509 if (props != NULL)
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2510 spa_configfile_set(spa, props, B_FALSE);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2511
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2512 if (error != 0 || (props && spa_writeable(spa) &&
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2513 (error = spa_prop_set(spa, props)))) {
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2514 spa_unload(spa);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2515 spa_deactivate(spa);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2516 spa_remove(spa);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2517 mutex_exit(&spa_namespace_lock);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2518 return (error);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2519 }
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2520
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2521 /*
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2522 * Override any spares and level 2 cache devices as specified by
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2523 * the user, as these may have correct device names/devids, etc.
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2524 */
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2525 if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2526 &spares, &nspares) == 0) {
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2527 if (spa->spa_spares.sav_config)
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2528 VERIFY(nvlist_remove(spa->spa_spares.sav_config,
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2529 ZPOOL_CONFIG_SPARES, DATA_TYPE_NVLIST_ARRAY) == 0);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2530 else
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2531 VERIFY(nvlist_alloc(&spa->spa_spares.sav_config,
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2532 NV_UNIQUE_NAME, KM_SLEEP) == 0);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2533 VERIFY(nvlist_add_nvlist_array(spa->spa_spares.sav_config,
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2534 ZPOOL_CONFIG_SPARES, spares, nspares) == 0);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2535 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2536 spa_load_spares(spa);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2537 spa_config_exit(spa, SCL_ALL, FTAG);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2538 spa->spa_spares.sav_sync = B_TRUE;
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2539 }
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2540 if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_L2CACHE,
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2541 &l2cache, &nl2cache) == 0) {
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2542 if (spa->spa_l2cache.sav_config)
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2543 VERIFY(nvlist_remove(spa->spa_l2cache.sav_config,
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2544 ZPOOL_CONFIG_L2CACHE, DATA_TYPE_NVLIST_ARRAY) == 0);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2545 else
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2546 VERIFY(nvlist_alloc(&spa->spa_l2cache.sav_config,
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2547 NV_UNIQUE_NAME, KM_SLEEP) == 0);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2548 VERIFY(nvlist_add_nvlist_array(spa->spa_l2cache.sav_config,
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2549 ZPOOL_CONFIG_L2CACHE, l2cache, nl2cache) == 0);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2550 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2551 spa_load_l2cache(spa);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2552 spa_config_exit(spa, SCL_ALL, FTAG);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2553 spa->spa_l2cache.sav_sync = B_TRUE;
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2554 }
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2555
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2556 if (spa_writeable(spa)) {
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2557 /*
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2558 * Update the config cache to include the newly-imported pool.
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2559 */
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2560 spa_config_update_common(spa, SPA_CONFIG_UPDATE_POOL, B_FALSE);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2561 }
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2562
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2563 mutex_exit(&spa_namespace_lock);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2564
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2565 return (0);
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
2566 }
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
2567
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
2568
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2569 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2570 * This (illegal) pool name is used when temporarily importing a spa_t in order
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2571 * to get the vdev stats associated with the imported devices.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2572 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2573 #define TRYIMPORT_NAME "$import"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2574
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2575 nvlist_t *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2576 spa_tryimport(nvlist_t *tryconfig)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2577 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2578 nvlist_t *config = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2579 char *poolname;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2580 spa_t *spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2581 uint64_t state;
8680
005fe27123ba 6786321 panic on spa_tryimport() a corrupted pool
Lin Ling <Lin.Ling@Sun.COM>
parents: 8667
diff changeset
2582 int error;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2583
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2584 if (nvlist_lookup_string(tryconfig, ZPOOL_CONFIG_POOL_NAME, &poolname))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2585 return (NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2586
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2587 if (nvlist_lookup_uint64(tryconfig, ZPOOL_CONFIG_POOL_STATE, &state))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2588 return (NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2589
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
2590 /*
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
2591 * Create and initialize the spa structure.
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
2592 */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2593 mutex_enter(&spa_namespace_lock);
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
2594 spa = spa_add(TRYIMPORT_NAME, NULL);
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
2595 spa_activate(spa, FREAD);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2596
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2597 /*
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
2598 * Pass off the heavy lifting to spa_load().
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
2599 * Pass TRUE for mosconfig because the user-supplied config
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
2600 * is actually the one to trust when doing an import.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2601 */
8680
005fe27123ba 6786321 panic on spa_tryimport() a corrupted pool
Lin Ling <Lin.Ling@Sun.COM>
parents: 8667
diff changeset
2602 error = spa_load(spa, tryconfig, SPA_LOAD_TRYIMPORT, B_TRUE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2603
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2604 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2605 * If 'tryconfig' was at least parsable, return the current config.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2606 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2607 if (spa->spa_root_vdev != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2608 config = spa_config_generate(spa, NULL, -1ULL, B_TRUE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2609 VERIFY(nvlist_add_string(config, ZPOOL_CONFIG_POOL_NAME,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2610 poolname) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2611 VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_POOL_STATE,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2612 state) == 0);
3975
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
2613 VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_TIMESTAMP,
6674f5d79069 6282725 hostname/hostid should be stored in the label
ek110237
parents: 3912
diff changeset
2614 spa->spa_uberblock.ub_timestamp) == 0);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2615
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2616 /*
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2617 * If the bootfs property exists on this pool then we
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2618 * copy it out so that external consumers can tell which
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2619 * pools are bootable.
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2620 */
8680
005fe27123ba 6786321 panic on spa_tryimport() a corrupted pool
Lin Ling <Lin.Ling@Sun.COM>
parents: 8667
diff changeset
2621 if ((!error || error == EEXIST) && spa->spa_bootfs) {
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2622 char *tmpname = kmem_alloc(MAXPATHLEN, KM_SLEEP);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2623
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2624 /*
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2625 * We have to play games with the name since the
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2626 * pool was opened as TRYIMPORT_NAME.
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2627 */
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
2628 if (dsl_dsobj_to_dsname(spa_name(spa),
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2629 spa->spa_bootfs, tmpname) == 0) {
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2630 char *cp;
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2631 char *dsname = kmem_alloc(MAXPATHLEN, KM_SLEEP);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2632
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2633 cp = strchr(tmpname, '/');
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2634 if (cp == NULL) {
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2635 (void) strlcpy(dsname, tmpname,
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2636 MAXPATHLEN);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2637 } else {
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2638 (void) snprintf(dsname, MAXPATHLEN,
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2639 "%s/%s", poolname, ++cp);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2640 }
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2641 VERIFY(nvlist_add_string(config,
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2642 ZPOOL_CONFIG_BOOTFS, dsname) == 0);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2643 kmem_free(dsname, MAXPATHLEN);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2644 }
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2645 kmem_free(tmpname, MAXPATHLEN);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2646 }
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2647
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5949
diff changeset
2648 /*
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2649 * Add the list of hot spares and level 2 cache devices.
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2650 */
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2651 spa_config_enter(spa, SCL_CONFIG, FTAG, RW_READER);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2652 spa_add_spares(spa, config);
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2653 spa_add_l2cache(spa, config);
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
2654 spa_config_exit(spa, SCL_CONFIG, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2655 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2656
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2657 spa_unload(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2658 spa_deactivate(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2659 spa_remove(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2660 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2661
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2662 return (config);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2663 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2664
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2665 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2666 * Pool export/destroy
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2667 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2668 * The act of destroying or exporting a pool is very simple. We make sure there
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2669 * 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
2670 * update the pool state and sync all the labels to disk, removing the
8211
32722be6ad3b 6775357 ZFS should have a way to export a pool without touching anything
George Wilson <George.Wilson@Sun.COM>
parents: 7897
diff changeset
2671 * configuration from the cache afterwards. If the 'hardforce' flag is set, then
32722be6ad3b 6775357 ZFS should have a way to export a pool without touching anything
George Wilson <George.Wilson@Sun.COM>
parents: 7897
diff changeset
2672 * we don't sync the labels or remove the configuration cache.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2673 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2674 static int
7214
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
2675 spa_export_common(char *pool, int new_state, nvlist_t **oldconfig,
8211
32722be6ad3b 6775357 ZFS should have a way to export a pool without touching anything
George Wilson <George.Wilson@Sun.COM>
parents: 7897
diff changeset
2676 boolean_t force, boolean_t hardforce)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2677 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2678 spa_t *spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2679
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2680 if (oldconfig)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2681 *oldconfig = NULL;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2682
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
2683 if (!(spa_mode_global & FWRITE))
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2684 return (EROFS);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2685
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2686 mutex_enter(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2687 if ((spa = spa_lookup(pool)) == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2688 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2689 return (ENOENT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2690 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2691
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2692 /*
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2693 * Put a hold on the pool, drop the namespace lock, stop async tasks,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2694 * reacquire the namespace lock, and see if we can export.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2695 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2696 spa_open_ref(spa, FTAG);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2697 mutex_exit(&spa_namespace_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2698 spa_async_suspend(spa);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2699 mutex_enter(&spa_namespace_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2700 spa_close(spa, FTAG);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2701
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2702 /*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2703 * The pool will be in core if it's openable,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2704 * in which case we can modify its state.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2705 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2706 if (spa->spa_state != POOL_STATE_UNINITIALIZED && spa->spa_sync_on) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2707 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2708 * Objsets may be open only because they're dirty, so we
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2709 * have to force it to sync before checking spa_refcnt.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2710 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2711 txg_wait_synced(spa->spa_dsl_pool, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2712
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2713 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2714 * A pool cannot be exported or destroyed if there are active
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2715 * references. If we are resetting a pool, allow references by
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2716 * fault injection handlers.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2717 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2718 if (!spa_refcount_zero(spa) ||
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2719 (spa->spa_inject_ref != 0 &&
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2720 new_state != POOL_STATE_UNINITIALIZED)) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2721 spa_async_resume(spa);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2722 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2723 return (EBUSY);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2724 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2725
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2726 /*
7214
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
2727 * A pool cannot be exported if it has an active shared spare.
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
2728 * This is to prevent other pools stealing the active spare
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
2729 * from an exported pool. At user's own will, such pool can
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
2730 * be forcedly exported.
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
2731 */
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
2732 if (!force && new_state == POOL_STATE_EXPORTED &&
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
2733 spa_has_active_shared_spare(spa)) {
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
2734 spa_async_resume(spa);
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
2735 mutex_exit(&spa_namespace_lock);
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
2736 return (EXDEV);
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
2737 }
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
2738
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
2739 /*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2740 * We want this to be reflected on every label,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2741 * so mark them all dirty. spa_unload() will do the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2742 * final sync that pushes these changes out.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2743 */
8211
32722be6ad3b 6775357 ZFS should have a way to export a pool without touching anything
George Wilson <George.Wilson@Sun.COM>
parents: 7897
diff changeset
2744 if (new_state != POOL_STATE_UNINITIALIZED && !hardforce) {
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
2745 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2746 spa->spa_state = new_state;
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
2747 spa->spa_final_txg = spa_last_synced_txg(spa) + 1;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2748 vdev_config_dirty(spa->spa_root_vdev);
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
2749 spa_config_exit(spa, SCL_ALL, FTAG);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2750 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2751 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2752
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2753 spa_event_notify(spa, NULL, ESC_ZFS_POOL_DESTROY);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2754
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2755 if (spa->spa_state != POOL_STATE_UNINITIALIZED) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2756 spa_unload(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2757 spa_deactivate(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2758 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2759
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2760 if (oldconfig && spa->spa_config)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
2761 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
2762
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2763 if (new_state != POOL_STATE_UNINITIALIZED) {
8211
32722be6ad3b 6775357 ZFS should have a way to export a pool without touching anything
George Wilson <George.Wilson@Sun.COM>
parents: 7897
diff changeset
2764 if (!hardforce)
32722be6ad3b 6775357 ZFS should have a way to export a pool without touching anything
George Wilson <George.Wilson@Sun.COM>
parents: 7897
diff changeset
2765 spa_config_sync(spa, B_TRUE, B_TRUE);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2766 spa_remove(spa);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2767 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2768 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2769
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2770 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2771 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2772
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2773 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2774 * Destroy a storage pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2775 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2776 int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2777 spa_destroy(char *pool)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2778 {
8211
32722be6ad3b 6775357 ZFS should have a way to export a pool without touching anything
George Wilson <George.Wilson@Sun.COM>
parents: 7897
diff changeset
2779 return (spa_export_common(pool, POOL_STATE_DESTROYED, NULL,
32722be6ad3b 6775357 ZFS should have a way to export a pool without touching anything
George Wilson <George.Wilson@Sun.COM>
parents: 7897
diff changeset
2780 B_FALSE, B_FALSE));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2781 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2782
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2783 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2784 * Export a storage pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2785 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2786 int
8211
32722be6ad3b 6775357 ZFS should have a way to export a pool without touching anything
George Wilson <George.Wilson@Sun.COM>
parents: 7897
diff changeset
2787 spa_export(char *pool, nvlist_t **oldconfig, boolean_t force,
32722be6ad3b 6775357 ZFS should have a way to export a pool without touching anything
George Wilson <George.Wilson@Sun.COM>
parents: 7897
diff changeset
2788 boolean_t hardforce)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2789 {
8211
32722be6ad3b 6775357 ZFS should have a way to export a pool without touching anything
George Wilson <George.Wilson@Sun.COM>
parents: 7897
diff changeset
2790 return (spa_export_common(pool, POOL_STATE_EXPORTED, oldconfig,
32722be6ad3b 6775357 ZFS should have a way to export a pool without touching anything
George Wilson <George.Wilson@Sun.COM>
parents: 7897
diff changeset
2791 force, hardforce));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2792 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2793
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2794 /*
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2795 * Similar to spa_export(), this unloads the spa_t without actually removing it
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2796 * from the namespace in any way.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2797 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2798 int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2799 spa_reset(char *pool)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2800 {
7214
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
2801 return (spa_export_common(pool, POOL_STATE_UNINITIALIZED, NULL,
8211
32722be6ad3b 6775357 ZFS should have a way to export a pool without touching anything
George Wilson <George.Wilson@Sun.COM>
parents: 7897
diff changeset
2802 B_FALSE, B_FALSE));
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2803 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2804
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2805 /*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2806 * ==========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2807 * Device manipulation
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2808 * ==========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2809 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2810
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2811 /*
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
2812 * Add a device to a storage pool.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2813 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2814 int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2815 spa_vdev_add(spa_t *spa, nvlist_t *nvroot)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2816 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2817 uint64_t txg;
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
2818 int error;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2819 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
2820 vdev_t *vd, *tvd;
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2821 nvlist_t **spares, **l2cache;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2822 uint_t nspares, nl2cache;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2823
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2824 txg = spa_vdev_enter(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2825
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2826 if ((error = spa_config_parse(spa, &vd, nvroot, NULL, 0,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2827 VDEV_ALLOC_ADD)) != 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2828 return (spa_vdev_exit(spa, NULL, txg, error));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2829
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
2830 spa->spa_pending_vdev = vd; /* spa_vdev_exit() will clear this */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2831
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2832 if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES, &spares,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2833 &nspares) != 0)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2834 nspares = 0;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2835
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2836 if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_L2CACHE, &l2cache,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2837 &nl2cache) != 0)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2838 nl2cache = 0;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2839
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
2840 if (vd->vdev_children == 0 && nspares == 0 && nl2cache == 0)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2841 return (spa_vdev_exit(spa, vd, txg, EINVAL));
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
2842
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
2843 if (vd->vdev_children != 0 &&
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
2844 (error = vdev_create(vd, txg, B_FALSE)) != 0)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
2845 return (spa_vdev_exit(spa, vd, txg, error));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2846
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2847 /*
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2848 * We must validate the spares and l2cache devices after checking the
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2849 * children. Otherwise, vdev_inuse() will blindly overwrite the spare.
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2850 */
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
2851 if ((error = spa_validate_aux(spa, nvroot, txg, VDEV_ALLOC_ADD)) != 0)
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2852 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
2853
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2854 /*
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2855 * 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
2856 */
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
2857 for (int c = 0; c < vd->vdev_children; c++) {
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2858 tvd = vd->vdev_child[c];
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2859 vdev_remove_child(vd, tvd);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2860 tvd->vdev_id = rvd->vdev_children;
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2861 vdev_add_child(rvd, tvd);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2862 vdev_config_dirty(tvd);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2863 }
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2864
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2865 if (nspares != 0) {
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2866 spa_set_aux_vdevs(&spa->spa_spares, spares, nspares,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2867 ZPOOL_CONFIG_SPARES);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2868 spa_load_spares(spa);
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2869 spa->spa_spares.sav_sync = B_TRUE;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2870 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2871
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2872 if (nl2cache != 0) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2873 spa_set_aux_vdevs(&spa->spa_l2cache, l2cache, nl2cache,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2874 ZPOOL_CONFIG_L2CACHE);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2875 spa_load_l2cache(spa);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
2876 spa->spa_l2cache.sav_sync = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2877 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2878
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2879 /*
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
2880 * 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
2881 * 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
2882 * 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
2883 * 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
2884 * 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
2885 * 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
2886 * 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
2887 *
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
2888 * 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
2889 * 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
2890 * steps will be completed the next time we load the pool.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2891 */
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
2892 (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
2893
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
2894 mutex_enter(&spa_namespace_lock);
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
2895 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
2896 mutex_exit(&spa_namespace_lock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2897
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
2898 return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2899 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2900
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2901 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2902 * Attach a device to a mirror. The arguments are the path to any device
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2903 * in the mirror, and the nvroot for the new device. If the path specifies
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2904 * a device that is not mirrored, we automatically insert the mirror vdev.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2905 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2906 * If 'replacing' is specified, the new device is intended to replace the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2907 * 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
2908 * mirror using the 'replacing' vdev, which is functionally identical to
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2909 * the mirror vdev (it actually reuses all the same ops) but has a few
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2910 * extra rules: you can't attach to it after it's been created, and upon
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2911 * completion of resilvering, the first disk (the one being replaced)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2912 * is automatically detached.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2913 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2914 int
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
2915 spa_vdev_attach(spa_t *spa, uint64_t guid, nvlist_t *nvroot, int replacing)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2916 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2917 uint64_t txg, open_txg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2918 vdev_t *rvd = spa->spa_root_vdev;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2919 vdev_t *oldvd, *newvd, *newrootvd, *pvd, *tvd;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2920 vdev_ops_t *pvops;
7313
99e2110471bb 6734585 zpool history should log when a spare device becomes active
Eric Kustarz <Eric.Kustarz@Sun.COM>
parents: 7294
diff changeset
2921 dmu_tx_t *tx;
99e2110471bb 6734585 zpool history should log when a spare device becomes active
Eric Kustarz <Eric.Kustarz@Sun.COM>
parents: 7294
diff changeset
2922 char *oldvdpath, *newvdpath;
99e2110471bb 6734585 zpool history should log when a spare device becomes active
Eric Kustarz <Eric.Kustarz@Sun.COM>
parents: 7294
diff changeset
2923 int newvd_isspare;
99e2110471bb 6734585 zpool history should log when a spare device becomes active
Eric Kustarz <Eric.Kustarz@Sun.COM>
parents: 7294
diff changeset
2924 int error;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2925
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2926 txg = spa_vdev_enter(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2927
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
2928 oldvd = spa_lookup_by_guid(spa, guid, B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2929
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2930 if (oldvd == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2931 return (spa_vdev_exit(spa, NULL, txg, ENODEV));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2932
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
2933 if (!oldvd->vdev_ops->vdev_op_leaf)
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
2934 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
2935
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2936 pvd = oldvd->vdev_parent;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2937
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2938 if ((error = spa_config_parse(spa, &newrootvd, nvroot, NULL, 0,
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2939 VDEV_ALLOC_ADD)) != 0)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2940 return (spa_vdev_exit(spa, NULL, txg, EINVAL));
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2941
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
2942 if (newrootvd->vdev_children != 1)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2943 return (spa_vdev_exit(spa, newrootvd, txg, EINVAL));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2944
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2945 newvd = newrootvd->vdev_child[0];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2946
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2947 if (!newvd->vdev_ops->vdev_op_leaf)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2948 return (spa_vdev_exit(spa, newrootvd, txg, EINVAL));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2949
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2950 if ((error = vdev_create(newrootvd, txg, replacing)) != 0)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2951 return (spa_vdev_exit(spa, newrootvd, txg, error));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2952
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
2953 /*
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
2954 * Spares can't replace logs
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
2955 */
7326
a3c803100a09 6713886 hot spares of mirrored log devices should not be allowed
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 7313
diff changeset
2956 if (oldvd->vdev_top->vdev_islog && newvd->vdev_isspare)
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
2957 return (spa_vdev_exit(spa, newrootvd, txg, ENOTSUP));
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
2958
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2959 if (!replacing) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2960 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2961 * For attach, the only allowable parent is a mirror or the root
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2962 * vdev.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2963 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2964 if (pvd->vdev_ops != &vdev_mirror_ops &&
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2965 pvd->vdev_ops != &vdev_root_ops)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2966 return (spa_vdev_exit(spa, newrootvd, txg, ENOTSUP));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2967
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2968 pvops = &vdev_mirror_ops;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2969 } else {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2970 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2971 * Active hot spares can only be replaced by inactive hot
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2972 * spares.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2973 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2974 if (pvd->vdev_ops == &vdev_spare_ops &&
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2975 pvd->vdev_child[1] == oldvd &&
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2976 !spa_has_spare(spa, newvd->vdev_guid))
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2977 return (spa_vdev_exit(spa, newrootvd, txg, ENOTSUP));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2978
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2979 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2980 * 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
2981 * 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
2982 * 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
2983 * 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
2984 * 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
2985 * non-spare).
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2986 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2987 if (pvd->vdev_ops == &vdev_replacing_ops)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2988 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
2989 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
2990 newvd->vdev_isspare != oldvd->vdev_isspare)
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
2991 return (spa_vdev_exit(spa, newrootvd, txg, ENOTSUP));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2992 else if (pvd->vdev_ops != &vdev_spare_ops &&
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2993 newvd->vdev_isspare)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2994 pvops = &vdev_spare_ops;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2995 else
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2996 pvops = &vdev_replacing_ops;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2997 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
2998
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
2999 /*
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
3000 * 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
3001 * 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
3002 */
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
3003 if (newvd->vdev_psize < vdev_get_rsize(oldvd))
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3004 return (spa_vdev_exit(spa, newrootvd, txg, EOVERFLOW));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3005
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
3006 /*
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
3007 * The new device cannot have a higher alignment requirement
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
3008 * than the top-level vdev.
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
3009 */
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
3010 if (newvd->vdev_ashift > oldvd->vdev_top->vdev_ashift)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3011 return (spa_vdev_exit(spa, newrootvd, txg, EDOM));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3012
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3013 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3014 * If this is an in-place replacement, update oldvd's path and devid
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3015 * to make it distinguishable from newvd, and unopenable from now on.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3016 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3017 if (strcmp(oldvd->vdev_path, newvd->vdev_path) == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3018 spa_strfree(oldvd->vdev_path);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3019 oldvd->vdev_path = kmem_alloc(strlen(newvd->vdev_path) + 5,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3020 KM_SLEEP);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3021 (void) sprintf(oldvd->vdev_path, "%s/%s",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3022 newvd->vdev_path, "old");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3023 if (oldvd->vdev_devid != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3024 spa_strfree(oldvd->vdev_devid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3025 oldvd->vdev_devid = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3026 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3027 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3028
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3029 /*
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3030 * 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
3031 * mirror/replacing/spare vdev above oldvd.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3032 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3033 if (pvd->vdev_ops != pvops)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3034 pvd = vdev_add_parent(oldvd, pvops);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3035
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3036 ASSERT(pvd->vdev_top->vdev_parent == rvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3037 ASSERT(pvd->vdev_ops == pvops);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3038 ASSERT(oldvd->vdev_parent == pvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3039
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3040 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3041 * Extract the new device from its root and add it to pvd.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3042 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3043 vdev_remove_child(newrootvd, newvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3044 newvd->vdev_id = pvd->vdev_children;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3045 vdev_add_child(pvd, newvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3046
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3047 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3048 * If newvd is smaller than oldvd, but larger than its rsize,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3049 * the addition of newvd may have decreased our parent's asize.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3050 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3051 pvd->vdev_asize = MIN(pvd->vdev_asize, newvd->vdev_asize);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3052
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3053 tvd = newvd->vdev_top;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3054 ASSERT(pvd->vdev_top == tvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3055 ASSERT(tvd->vdev_parent == rvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3056
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3057 vdev_config_dirty(tvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3058
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3059 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3060 * Set newvd's DTL to [TXG_INITIAL, open_txg]. It will propagate
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3061 * upward when spa_vdev_exit() calls vdev_dtl_reassess().
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3062 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3063 open_txg = txg + TXG_CONCURRENT_STATES - 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3064
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3065 vdev_dtl_dirty(newvd, DTL_MISSING,
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3066 TXG_INITIAL, open_txg - TXG_INITIAL + 1);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3067
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3068 if (newvd->vdev_isspare) {
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
3069 spa_spare_activate(newvd);
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3070 spa_event_notify(spa, newvd, ESC_ZFS_VDEV_SPARE);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3071 }
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3072
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3073 oldvdpath = spa_strdup(oldvd->vdev_path);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3074 newvdpath = spa_strdup(newvd->vdev_path);
7313
99e2110471bb 6734585 zpool history should log when a spare device becomes active
Eric Kustarz <Eric.Kustarz@Sun.COM>
parents: 7294
diff changeset
3075 newvd_isspare = newvd->vdev_isspare;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3076
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3077 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3078 * Mark newvd's DTL dirty in this txg.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3079 */
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
3080 vdev_dirty(tvd, VDD_DTL, newvd, txg);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3081
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3082 (void) spa_vdev_exit(spa, newrootvd, open_txg, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3083
7313
99e2110471bb 6734585 zpool history should log when a spare device becomes active
Eric Kustarz <Eric.Kustarz@Sun.COM>
parents: 7294
diff changeset
3084 tx = dmu_tx_create_dd(spa_get_dsl(spa)->dp_mos_dir);
99e2110471bb 6734585 zpool history should log when a spare device becomes active
Eric Kustarz <Eric.Kustarz@Sun.COM>
parents: 7294
diff changeset
3085 if (dmu_tx_assign(tx, TXG_WAIT) == 0) {
99e2110471bb 6734585 zpool history should log when a spare device becomes active
Eric Kustarz <Eric.Kustarz@Sun.COM>
parents: 7294
diff changeset
3086 spa_history_internal_log(LOG_POOL_VDEV_ATTACH, spa, tx,
99e2110471bb 6734585 zpool history should log when a spare device becomes active
Eric Kustarz <Eric.Kustarz@Sun.COM>
parents: 7294
diff changeset
3087 CRED(), "%s vdev=%s %s vdev=%s",
99e2110471bb 6734585 zpool history should log when a spare device becomes active
Eric Kustarz <Eric.Kustarz@Sun.COM>
parents: 7294
diff changeset
3088 replacing && newvd_isspare ? "spare in" :
99e2110471bb 6734585 zpool history should log when a spare device becomes active
Eric Kustarz <Eric.Kustarz@Sun.COM>
parents: 7294
diff changeset
3089 replacing ? "replace" : "attach", newvdpath,
99e2110471bb 6734585 zpool history should log when a spare device becomes active
Eric Kustarz <Eric.Kustarz@Sun.COM>
parents: 7294
diff changeset
3090 replacing ? "for" : "to", oldvdpath);
99e2110471bb 6734585 zpool history should log when a spare device becomes active
Eric Kustarz <Eric.Kustarz@Sun.COM>
parents: 7294
diff changeset
3091 dmu_tx_commit(tx);
99e2110471bb 6734585 zpool history should log when a spare device becomes active
Eric Kustarz <Eric.Kustarz@Sun.COM>
parents: 7294
diff changeset
3092 } else {
99e2110471bb 6734585 zpool history should log when a spare device becomes active
Eric Kustarz <Eric.Kustarz@Sun.COM>
parents: 7294
diff changeset
3093 dmu_tx_abort(tx);
99e2110471bb 6734585 zpool history should log when a spare device becomes active
Eric Kustarz <Eric.Kustarz@Sun.COM>
parents: 7294
diff changeset
3094 }
99e2110471bb 6734585 zpool history should log when a spare device becomes active
Eric Kustarz <Eric.Kustarz@Sun.COM>
parents: 7294
diff changeset
3095
99e2110471bb 6734585 zpool history should log when a spare device becomes active
Eric Kustarz <Eric.Kustarz@Sun.COM>
parents: 7294
diff changeset
3096 spa_strfree(oldvdpath);
99e2110471bb 6734585 zpool history should log when a spare device becomes active
Eric Kustarz <Eric.Kustarz@Sun.COM>
parents: 7294
diff changeset
3097 spa_strfree(newvdpath);
99e2110471bb 6734585 zpool history should log when a spare device becomes active
Eric Kustarz <Eric.Kustarz@Sun.COM>
parents: 7294
diff changeset
3098
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3099 /*
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
3100 * Kick off a resilver to update newvd.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3101 */
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
3102 VERIFY3U(spa_scrub(spa, POOL_SCRUB_RESILVER), ==, 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3103
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3104 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3105 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3106
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3107 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3108 * Detach a device from a mirror or replacing vdev.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3109 * If 'replace_done' is specified, only detach if the parent
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3110 * is a replacing vdev.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3111 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3112 int
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3113 spa_vdev_detach(spa_t *spa, uint64_t guid, uint64_t pguid, int replace_done)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3114 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3115 uint64_t txg;
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3116 int error;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3117 vdev_t *rvd = spa->spa_root_vdev;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3118 vdev_t *vd, *pvd, *cvd, *tvd;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3119 boolean_t unspare = B_FALSE;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3120 uint64_t unspare_guid;
6673
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6643
diff changeset
3121 size_t len;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3122
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3123 txg = spa_vdev_enter(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3124
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
3125 vd = spa_lookup_by_guid(spa, guid, B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3126
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3127 if (vd == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3128 return (spa_vdev_exit(spa, NULL, txg, ENODEV));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3129
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
3130 if (!vd->vdev_ops->vdev_op_leaf)
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
3131 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
3132
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3133 pvd = vd->vdev_parent;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3134
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3135 /*
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3136 * If the parent/child relationship is not as expected, don't do it.
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3137 * Consider M(A,R(B,C)) -- that is, a mirror of A with a replacing
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3138 * vdev that's replacing B with C. The user's intent in replacing
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3139 * is to go from M(A,B) to M(A,C). If the user decides to cancel
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3140 * the replace by detaching C, the expected behavior is to end up
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3141 * M(A,B). But suppose that right after deciding to detach C,
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3142 * the replacement of B completes. We would have M(A,C), and then
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3143 * ask to detach C, which would leave us with just A -- not what
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3144 * the user wanted. To prevent this, we make sure that the
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3145 * parent/child relationship hasn't changed -- in this example,
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3146 * that C's parent is still the replacing vdev R.
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3147 */
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3148 if (pvd->vdev_guid != pguid && pguid != 0)
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3149 return (spa_vdev_exit(spa, NULL, txg, EBUSY));
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3150
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3151 /*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3152 * 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
3153 * the first child of a replacing vdev. For the 'spare' vdev, either
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3154 * disk can be removed.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3155 */
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3156 if (replace_done) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3157 if (pvd->vdev_ops == &vdev_replacing_ops) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3158 if (vd->vdev_id != 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3159 return (spa_vdev_exit(spa, NULL, txg, ENOTSUP));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3160 } else if (pvd->vdev_ops != &vdev_spare_ops) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3161 return (spa_vdev_exit(spa, NULL, txg, ENOTSUP));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3162 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3163 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3164
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3165 ASSERT(pvd->vdev_ops != &vdev_spare_ops ||
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
3166 spa_version(spa) >= SPA_VERSION_SPARES);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3167
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3168 /*
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3169 * Only mirror, replacing, and spare vdevs support detach.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3170 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3171 if (pvd->vdev_ops != &vdev_replacing_ops &&
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3172 pvd->vdev_ops != &vdev_mirror_ops &&
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3173 pvd->vdev_ops != &vdev_spare_ops)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3174 return (spa_vdev_exit(spa, NULL, txg, ENOTSUP));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3175
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3176 /*
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3177 * If this device has the only valid copy of some data,
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3178 * we cannot safely detach it.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3179 */
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3180 if (vdev_dtl_required(vd))
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3181 return (spa_vdev_exit(spa, NULL, txg, EBUSY));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3182
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3183 ASSERT(pvd->vdev_children >= 2);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3184
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3185 /*
6673
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6643
diff changeset
3186 * If we are detaching the second disk from a replacing vdev, then
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6643
diff changeset
3187 * check to see if we changed the original vdev's path to have "/old"
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6643
diff changeset
3188 * at the end in spa_vdev_attach(). If so, undo that change now.
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6643
diff changeset
3189 */
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6643
diff changeset
3190 if (pvd->vdev_ops == &vdev_replacing_ops && vd->vdev_id == 1 &&
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6643
diff changeset
3191 pvd->vdev_child[0]->vdev_path != NULL &&
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6643
diff changeset
3192 pvd->vdev_child[1]->vdev_path != NULL) {
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6643
diff changeset
3193 ASSERT(pvd->vdev_child[1] == vd);
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6643
diff changeset
3194 cvd = pvd->vdev_child[0];
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6643
diff changeset
3195 len = strlen(vd->vdev_path);
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6643
diff changeset
3196 if (strncmp(cvd->vdev_path, vd->vdev_path, len) == 0 &&
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6643
diff changeset
3197 strcmp(cvd->vdev_path + len, "/old") == 0) {
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6643
diff changeset
3198 spa_strfree(cvd->vdev_path);
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6643
diff changeset
3199 cvd->vdev_path = spa_strdup(vd->vdev_path);
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6643
diff changeset
3200 }
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6643
diff changeset
3201 }
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6643
diff changeset
3202
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6643
diff changeset
3203 /*
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3204 * 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
3205 * 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
3206 * active spare list for the pool.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3207 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3208 if (pvd->vdev_ops == &vdev_spare_ops &&
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3209 vd->vdev_id == 0 && pvd->vdev_child[1]->vdev_isspare)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3210 unspare = B_TRUE;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3211
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3212 /*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3213 * Erase the disk labels so the disk can be used for other things.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3214 * This must be done after all other error cases are handled,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3215 * but before we disembowel vd (so we can still do I/O to it).
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3216 * But if we can't do it, don't treat the error as fatal --
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3217 * it may be that the unwritability of the disk is the reason
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3218 * it's being detached!
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3219 */
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
3220 error = vdev_label_init(vd, 0, VDEV_LABEL_REMOVE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3221
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3222 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3223 * Remove vd from its parent and compact the parent's children.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3224 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3225 vdev_remove_child(pvd, vd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3226 vdev_compact_children(pvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3227
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3228 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3229 * Remember one of the remaining children so we can get tvd below.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3230 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3231 cvd = pvd->vdev_child[0];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3232
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3233 /*
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3234 * If we need to remove the remaining child from the list of hot spares,
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3235 * do it now, marking the vdev as no longer a spare in the process.
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3236 * We must do this before vdev_remove_parent(), because that can
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3237 * change the GUID if it creates a new toplevel GUID. For a similar
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3238 * reason, we must remove the spare now, in the same txg as the detach;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3239 * otherwise someone could attach a new sibling, change the GUID, and
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3240 * the subsequent attempt to spa_vdev_remove(unspare_guid) would fail.
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3241 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3242 if (unspare) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3243 ASSERT(cvd->vdev_isspare);
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
3244 spa_spare_remove(cvd);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3245 unspare_guid = cvd->vdev_guid;
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3246 (void) spa_vdev_remove(spa, unspare_guid, B_TRUE);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3247 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3248
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3249 /*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3250 * If the parent mirror/replacing vdev only has one child,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3251 * the parent is no longer needed. Remove it from the tree.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3252 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3253 if (pvd->vdev_children == 1)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3254 vdev_remove_parent(cvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3255
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3256 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3257 * We don't set tvd until now because the parent we just removed
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3258 * may have been the previous top-level vdev.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3259 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3260 tvd = cvd->vdev_top;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3261 ASSERT(tvd->vdev_parent == rvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3262
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3263 /*
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
3264 * Reevaluate the parent vdev state.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3265 */
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3266 vdev_propagate_state(cvd);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3267
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3268 /*
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
3269 * 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
3270 * 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
3271 * 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
3272 * there's nothing to read from disk.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3273 */
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
3274 VERIFY(vdev_metaslab_init(tvd, txg) == 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3275
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3276 vdev_config_dirty(tvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3277
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3278 /*
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
3279 * 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
3280 * 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
3281 * 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
3282 * prevent vd from being accessed after it's freed.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3283 */
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3284 for (int t = 0; t < TXG_SIZE; t++)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3285 (void) txg_list_remove_this(&tvd->vdev_dtl_list, vd, t);
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
3286 vd->vdev_detached = B_TRUE;
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1635
diff changeset
3287 vdev_dirty(tvd, VDD_DTL, vd, txg);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3288
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3289 spa_event_notify(spa, vd, ESC_ZFS_VDEV_REMOVE);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3290
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3291 error = spa_vdev_exit(spa, vd, txg, 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3292
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3293 /*
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
3294 * 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
3295 * 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
3296 * list of every other pool.
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3297 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3298 if (unspare) {
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3299 spa_t *myspa = spa;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3300 spa = NULL;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3301 mutex_enter(&spa_namespace_lock);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3302 while ((spa = spa_next(spa)) != NULL) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3303 if (spa->spa_state != POOL_STATE_ACTIVE)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3304 continue;
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3305 if (spa == myspa)
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3306 continue;
7793
4dbbc0a3f135 6755897 recursive mutex enter in spa_vdev_enter when running test suite
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7754
diff changeset
3307 spa_open_ref(spa, FTAG);
4dbbc0a3f135 6755897 recursive mutex enter in spa_vdev_enter when running test suite
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7754
diff changeset
3308 mutex_exit(&spa_namespace_lock);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3309 (void) spa_vdev_remove(spa, unspare_guid, B_TRUE);
7793
4dbbc0a3f135 6755897 recursive mutex enter in spa_vdev_enter when running test suite
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7754
diff changeset
3310 mutex_enter(&spa_namespace_lock);
4dbbc0a3f135 6755897 recursive mutex enter in spa_vdev_enter when running test suite
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7754
diff changeset
3311 spa_close(spa, FTAG);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3312 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3313 mutex_exit(&spa_namespace_lock);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3314 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3315
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3316 return (error);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3317 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3318
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3319 static nvlist_t *
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3320 spa_nvlist_lookup_by_guid(nvlist_t **nvpp, int count, uint64_t target_guid)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3321 {
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3322 for (int i = 0; i < count; i++) {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3323 uint64_t guid;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3324
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3325 VERIFY(nvlist_lookup_uint64(nvpp[i], ZPOOL_CONFIG_GUID,
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3326 &guid) == 0);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3327
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3328 if (guid == target_guid)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3329 return (nvpp[i]);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3330 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3331
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3332 return (NULL);
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3333 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3334
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3335 static void
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3336 spa_vdev_remove_aux(nvlist_t *config, char *name, nvlist_t **dev, int count,
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3337 nvlist_t *dev_to_remove)
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3338 {
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3339 nvlist_t **newdev = NULL;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3340
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3341 if (count > 1)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3342 newdev = kmem_alloc((count - 1) * sizeof (void *), KM_SLEEP);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3343
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3344 for (int i = 0, j = 0; i < count; i++) {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3345 if (dev[i] == dev_to_remove)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3346 continue;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3347 VERIFY(nvlist_dup(dev[i], &newdev[j++], KM_SLEEP) == 0);
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3348 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3349
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3350 VERIFY(nvlist_remove(config, name, DATA_TYPE_NVLIST_ARRAY) == 0);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3351 VERIFY(nvlist_add_nvlist_array(config, name, newdev, count - 1) == 0);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3352
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3353 for (int i = 0; i < count - 1; i++)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3354 nvlist_free(newdev[i]);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3355
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3356 if (count > 1)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3357 kmem_free(newdev, (count - 1) * sizeof (void *));
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3358 }
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3359
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3360 /*
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3361 * Remove a device from the pool. Currently, this supports removing only hot
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3362 * spares and level 2 ARC devices.
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3363 */
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3364 int
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3365 spa_vdev_remove(spa_t *spa, uint64_t guid, boolean_t unspare)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3366 {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3367 vdev_t *vd;
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3368 nvlist_t **spares, **l2cache, *nv;
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3369 uint_t nspares, nl2cache;
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3370 uint64_t txg = 0;
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3371 int error = 0;
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3372 boolean_t locked = MUTEX_HELD(&spa_namespace_lock);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3373
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3374 if (!locked)
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3375 txg = spa_vdev_enter(spa);
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3376
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
3377 vd = spa_lookup_by_guid(spa, guid, B_FALSE);
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3378
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3379 if (spa->spa_spares.sav_vdevs != NULL &&
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3380 nvlist_lookup_nvlist_array(spa->spa_spares.sav_config,
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3381 ZPOOL_CONFIG_SPARES, &spares, &nspares) == 0 &&
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3382 (nv = spa_nvlist_lookup_by_guid(spares, nspares, guid)) != NULL) {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3383 /*
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3384 * Only remove the hot spare if it's not currently in use
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3385 * in this pool.
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3386 */
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3387 if (vd == NULL || unspare) {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3388 spa_vdev_remove_aux(spa->spa_spares.sav_config,
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3389 ZPOOL_CONFIG_SPARES, spares, nspares, nv);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3390 spa_load_spares(spa);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3391 spa->spa_spares.sav_sync = B_TRUE;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3392 } else {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3393 error = EBUSY;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3394 }
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3395 } else if (spa->spa_l2cache.sav_vdevs != NULL &&
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3396 nvlist_lookup_nvlist_array(spa->spa_l2cache.sav_config,
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3397 ZPOOL_CONFIG_L2CACHE, &l2cache, &nl2cache) == 0 &&
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3398 (nv = spa_nvlist_lookup_by_guid(l2cache, nl2cache, guid)) != NULL) {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3399 /*
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3400 * Cache devices can always be removed.
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3401 */
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3402 spa_vdev_remove_aux(spa->spa_l2cache.sav_config,
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3403 ZPOOL_CONFIG_L2CACHE, l2cache, nl2cache, nv);
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3404 spa_load_l2cache(spa);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3405 spa->spa_l2cache.sav_sync = B_TRUE;
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3406 } else if (vd != NULL) {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3407 /*
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3408 * Normal vdevs cannot be removed (yet).
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3409 */
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3410 error = ENOTSUP;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3411 } else {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3412 /*
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3413 * There is no vdev of any kind with the specified guid.
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3414 */
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3415 error = ENOENT;
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3416 }
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3417
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3418 if (!locked)
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3419 return (spa_vdev_exit(spa, NULL, txg, error));
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3420
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3421 return (error);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3422 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3423
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3424 /*
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3425 * 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
3426 * current spared, so we can detach it.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3427 */
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3428 static vdev_t *
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3429 spa_vdev_resilver_done_hunt(vdev_t *vd)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3430 {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3431 vdev_t *newvd, *oldvd;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3432 int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3433
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3434 for (c = 0; c < vd->vdev_children; c++) {
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3435 oldvd = spa_vdev_resilver_done_hunt(vd->vdev_child[c]);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3436 if (oldvd != NULL)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3437 return (oldvd);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3438 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3439
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3440 /*
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3441 * Check for a completed replacement.
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3442 */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3443 if (vd->vdev_ops == &vdev_replacing_ops && vd->vdev_children == 2) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3444 oldvd = vd->vdev_child[0];
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3445 newvd = vd->vdev_child[1];
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3446
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3447 if (vdev_dtl_empty(newvd, DTL_MISSING) &&
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3448 !vdev_dtl_required(oldvd))
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3449 return (oldvd);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3450 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3451
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3452 /*
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3453 * Check for a completed resilver with the 'unspare' flag set.
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3454 */
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3455 if (vd->vdev_ops == &vdev_spare_ops && vd->vdev_children == 2) {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3456 newvd = vd->vdev_child[0];
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3457 oldvd = vd->vdev_child[1];
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3458
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3459 if (newvd->vdev_unspare &&
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3460 vdev_dtl_empty(newvd, DTL_MISSING) &&
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3461 !vdev_dtl_required(oldvd)) {
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3462 newvd->vdev_unspare = 0;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3463 return (oldvd);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3464 }
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3465 }
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3466
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3467 return (NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3468 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3469
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3470 static void
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3471 spa_vdev_resilver_done(spa_t *spa)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3472 {
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3473 vdev_t *vd, *pvd, *ppvd;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3474 uint64_t guid, sguid, pguid, ppguid;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3475
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3476 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3477
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3478 while ((vd = spa_vdev_resilver_done_hunt(spa->spa_root_vdev)) != NULL) {
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3479 pvd = vd->vdev_parent;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3480 ppvd = pvd->vdev_parent;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3481 guid = vd->vdev_guid;
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3482 pguid = pvd->vdev_guid;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3483 ppguid = ppvd->vdev_guid;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3484 sguid = 0;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3485 /*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3486 * If we have just finished replacing a hot spared device, then
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3487 * we need to detach the parent's first child (the original hot
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3488 * spare) as well.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3489 */
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3490 if (ppvd->vdev_ops == &vdev_spare_ops && pvd->vdev_id == 0) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3491 ASSERT(pvd->vdev_ops == &vdev_replacing_ops);
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3492 ASSERT(ppvd->vdev_children == 2);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3493 sguid = ppvd->vdev_child[1]->vdev_guid;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3494 }
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3495 spa_config_exit(spa, SCL_ALL, FTAG);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3496 if (spa_vdev_detach(spa, guid, pguid, B_TRUE) != 0)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3497 return;
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3498 if (sguid && spa_vdev_detach(spa, sguid, ppguid, B_TRUE) != 0)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3499 return;
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3500 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3501 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3502
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
3503 spa_config_exit(spa, SCL_ALL, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3504 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3505
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3506 /*
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3507 * Update the stored path or FRU for this vdev. Dirty the vdev configuration,
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3508 * relying on spa_vdev_enter/exit() to synchronize the labels and cache.
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
3509 */
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
3510 int
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3511 spa_vdev_set_common(spa_t *spa, uint64_t guid, const char *value,
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3512 boolean_t ispath)
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
3513 {
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
3514 vdev_t *vd;
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
3515 uint64_t txg;
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
3516
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
3517 txg = spa_vdev_enter(spa);
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
3518
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3519 if ((vd = spa_lookup_by_guid(spa, guid, B_TRUE)) == NULL)
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3520 return (spa_vdev_exit(spa, NULL, txg, ENOENT));
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
3521
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
3522 if (!vd->vdev_ops->vdev_op_leaf)
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
3523 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
3524
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3525 if (ispath) {
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3526 spa_strfree(vd->vdev_path);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3527 vd->vdev_path = spa_strdup(value);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3528 } else {
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3529 if (vd->vdev_fru != NULL)
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3530 spa_strfree(vd->vdev_fru);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3531 vd->vdev_fru = spa_strdup(value);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3532 }
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
3533
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
3534 vdev_config_dirty(vd->vdev_top);
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
3535
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
3536 return (spa_vdev_exit(spa, NULL, txg, 0));
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
3537 }
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
3538
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3539 int
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3540 spa_vdev_setpath(spa_t *spa, uint64_t guid, const char *newpath)
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3541 {
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3542 return (spa_vdev_set_common(spa, guid, newpath, B_TRUE));
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3543 }
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3544
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3545 int
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3546 spa_vdev_setfru(spa_t *spa, uint64_t guid, const char *newfru)
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3547 {
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3548 return (spa_vdev_set_common(spa, guid, newfru, B_FALSE));
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3549 }
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
3550
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1175
diff changeset
3551 /*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3552 * ==========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3553 * SPA Scrubbing
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3554 * ==========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3555 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3556
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
3557 int
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
3558 spa_scrub(spa_t *spa, pool_scrub_type_t type)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3559 {
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3560 ASSERT(spa_config_held(spa, SCL_ALL, RW_WRITER) == 0);
4808
63629eaeb41a 6498144 ::kmastat could be even easier to read
ek110237
parents: 4787
diff changeset
3561
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3562 if ((uint_t)type >= POOL_SCRUB_TYPES)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3563 return (ENOTSUP);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3564
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3565 /*
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
3566 * If a resilver was requested, but there is no DTL on a
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
3567 * writeable leaf device, we have nothing to do.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3568 */
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
3569 if (type == POOL_SCRUB_RESILVER &&
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
3570 !vdev_resilver_needed(spa->spa_root_vdev, NULL, NULL)) {
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
3571 spa_async_request(spa, SPA_ASYNC_RESILVER_DONE);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3572 return (0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3573 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3574
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
3575 if (type == POOL_SCRUB_EVERYTHING &&
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
3576 spa->spa_dsl_pool->dp_scrub_func != SCRUB_FUNC_NONE &&
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
3577 spa->spa_dsl_pool->dp_scrub_isresilver)
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
3578 return (EBUSY);
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
3579
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
3580 if (type == POOL_SCRUB_EVERYTHING || type == POOL_SCRUB_RESILVER) {
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
3581 return (dsl_pool_scrub_clean(spa->spa_dsl_pool));
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
3582 } else if (type == POOL_SCRUB_NONE) {
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
3583 return (dsl_pool_scrub_cancel(spa->spa_dsl_pool));
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3584 } else {
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
3585 return (EINVAL);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3586 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3587 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3588
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3589 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3590 * ==========================================================================
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3591 * SPA async task processing
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3592 * ==========================================================================
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3593 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3594
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3595 static void
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3596 spa_async_remove(spa_t *spa, vdev_t *vd)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3597 {
7361
e7d1b928b483 6715111 A removed L2ARC device should show status REMOVED
Brendan Gregg - Sun Microsystems <Brendan.Gregg@Sun.COM>
parents: 7326
diff changeset
3598 if (vd->vdev_remove_wanted) {
e7d1b928b483 6715111 A removed L2ARC device should show status REMOVED
Brendan Gregg - Sun Microsystems <Brendan.Gregg@Sun.COM>
parents: 7326
diff changeset
3599 vd->vdev_remove_wanted = 0;
e7d1b928b483 6715111 A removed L2ARC device should show status REMOVED
Brendan Gregg - Sun Microsystems <Brendan.Gregg@Sun.COM>
parents: 7326
diff changeset
3600 vdev_set_state(vd, B_FALSE, VDEV_STATE_REMOVED, VDEV_AUX_NONE);
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3601 vdev_clear(spa, vd);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3602 vdev_state_dirty(vd->vdev_top);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3603 }
7361
e7d1b928b483 6715111 A removed L2ARC device should show status REMOVED
Brendan Gregg - Sun Microsystems <Brendan.Gregg@Sun.COM>
parents: 7326
diff changeset
3604
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3605 for (int c = 0; c < vd->vdev_children; c++)
7361
e7d1b928b483 6715111 A removed L2ARC device should show status REMOVED
Brendan Gregg - Sun Microsystems <Brendan.Gregg@Sun.COM>
parents: 7326
diff changeset
3606 spa_async_remove(spa, vd->vdev_child[c]);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3607 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3608
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3609 static void
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3610 spa_async_probe(spa_t *spa, vdev_t *vd)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3611 {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3612 if (vd->vdev_probe_wanted) {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3613 vd->vdev_probe_wanted = 0;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3614 vdev_reopen(vd); /* vdev_open() does the actual probe */
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3615 }
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3616
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3617 for (int c = 0; c < vd->vdev_children; c++)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3618 spa_async_probe(spa, vd->vdev_child[c]);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3619 }
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3620
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3621 static void
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3622 spa_async_thread(spa_t *spa)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3623 {
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3624 int tasks;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3625
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3626 ASSERT(spa->spa_sync_on);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3627
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3628 mutex_enter(&spa->spa_async_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3629 tasks = spa->spa_async_tasks;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3630 spa->spa_async_tasks = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3631 mutex_exit(&spa->spa_async_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3632
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3633 /*
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3634 * 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
3635 */
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3636 if (tasks & SPA_ASYNC_CONFIG_UPDATE) {
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3637 mutex_enter(&spa_namespace_lock);
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3638 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
3639 mutex_exit(&spa_namespace_lock);
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3640 }
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3641
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3642 /*
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3643 * See if any devices need to be marked REMOVED.
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3644 */
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3645 if (tasks & SPA_ASYNC_REMOVE) {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3646 spa_vdev_state_enter(spa);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3647 spa_async_remove(spa, spa->spa_root_vdev);
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3648 for (int i = 0; i < spa->spa_l2cache.sav_count; i++)
7361
e7d1b928b483 6715111 A removed L2ARC device should show status REMOVED
Brendan Gregg - Sun Microsystems <Brendan.Gregg@Sun.COM>
parents: 7326
diff changeset
3649 spa_async_remove(spa, spa->spa_l2cache.sav_vdevs[i]);
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3650 for (int i = 0; i < spa->spa_spares.sav_count; i++)
7361
e7d1b928b483 6715111 A removed L2ARC device should show status REMOVED
Brendan Gregg - Sun Microsystems <Brendan.Gregg@Sun.COM>
parents: 7326
diff changeset
3651 spa_async_remove(spa, spa->spa_spares.sav_vdevs[i]);
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3652 (void) spa_vdev_state_exit(spa, NULL, 0);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3653 }
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3654
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3655 /*
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3656 * See if any devices need to be probed.
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3657 */
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3658 if (tasks & SPA_ASYNC_PROBE) {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3659 spa_vdev_state_enter(spa);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3660 spa_async_probe(spa, spa->spa_root_vdev);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3661 (void) spa_vdev_state_exit(spa, NULL, 0);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3662 }
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3663
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3664 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3665 * If any devices are done replacing, detach them.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3666 */
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3667 if (tasks & SPA_ASYNC_RESILVER_DONE)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3668 spa_vdev_resilver_done(spa);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3669
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3670 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3671 * Kick off a resilver.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3672 */
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
3673 if (tasks & SPA_ASYNC_RESILVER)
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
3674 VERIFY(spa_scrub(spa, POOL_SCRUB_RESILVER) == 0);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3675
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3676 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3677 * Let the world know that we're done.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3678 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3679 mutex_enter(&spa->spa_async_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3680 spa->spa_async_thread = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3681 cv_broadcast(&spa->spa_async_cv);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3682 mutex_exit(&spa->spa_async_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3683 thread_exit();
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3684 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3685
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3686 void
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3687 spa_async_suspend(spa_t *spa)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3688 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3689 mutex_enter(&spa->spa_async_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3690 spa->spa_async_suspended++;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3691 while (spa->spa_async_thread != NULL)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3692 cv_wait(&spa->spa_async_cv, &spa->spa_async_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3693 mutex_exit(&spa->spa_async_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3694 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3695
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3696 void
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3697 spa_async_resume(spa_t *spa)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3698 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3699 mutex_enter(&spa->spa_async_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3700 ASSERT(spa->spa_async_suspended != 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3701 spa->spa_async_suspended--;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3702 mutex_exit(&spa->spa_async_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3703 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3704
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3705 static void
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3706 spa_async_dispatch(spa_t *spa)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3707 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3708 mutex_enter(&spa->spa_async_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3709 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
3710 spa->spa_async_thread == NULL &&
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3711 rootdir != NULL && !vn_is_readonly(rootdir))
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3712 spa->spa_async_thread = thread_create(NULL, 0,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3713 spa_async_thread, spa, 0, &p0, TS_RUN, maxclsyspri);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3714 mutex_exit(&spa->spa_async_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3715 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3716
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3717 void
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3718 spa_async_request(spa_t *spa, int task)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3719 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3720 mutex_enter(&spa->spa_async_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3721 spa->spa_async_tasks |= task;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
3722 mutex_exit(&spa->spa_async_lock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3723 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3724
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3725 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3726 * ==========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3727 * SPA syncing routines
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3728 * ==========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3729 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3730
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3731 static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3732 spa_sync_deferred_frees(spa_t *spa, uint64_t txg)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3733 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3734 bplist_t *bpl = &spa->spa_sync_bplist;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3735 dmu_tx_t *tx;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3736 blkptr_t blk;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3737 uint64_t itor = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3738 zio_t *zio;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3739 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3740 uint8_t c = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3741
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3742 zio = zio_root(spa, NULL, NULL, ZIO_FLAG_CANFAIL);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3743
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3744 while (bplist_iterate(bpl, &itor, &blk) == 0) {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3745 ASSERT(blk.blk_birth < txg);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3746 zio_nowait(zio_free(zio, spa, txg, &blk, NULL, NULL,
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3747 ZIO_FLAG_MUSTSUCCEED));
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3748 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3749
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3750 error = zio_wait(zio);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3751 ASSERT3U(error, ==, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3752
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3753 tx = dmu_tx_create_assigned(spa->spa_dsl_pool, txg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3754 bplist_vacate(bpl, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3755
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3756 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3757 * Pre-dirty the first block so we sync to convergence faster.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3758 * (Usually only the first block is needed.)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3759 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3760 dmu_write(spa->spa_meta_objset, spa->spa_sync_bplist_obj, 0, 1, &c, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3761 dmu_tx_commit(tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3762 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3763
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3764 static void
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3765 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
3766 {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3767 char *packed = NULL;
7497
f6c6be3b6154 6733970 assertion failure in dbuf_dirty() via spa_sync_nvlist()
Tim Haley <Tim.Haley@Sun.COM>
parents: 7377
diff changeset
3768 size_t bufsize;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3769 size_t nvsize = 0;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3770 dmu_buf_t *db;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3771
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3772 VERIFY(nvlist_size(nv, &nvsize, NV_ENCODE_XDR) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3773
7497
f6c6be3b6154 6733970 assertion failure in dbuf_dirty() via spa_sync_nvlist()
Tim Haley <Tim.Haley@Sun.COM>
parents: 7377
diff changeset
3774 /*
f6c6be3b6154 6733970 assertion failure in dbuf_dirty() via spa_sync_nvlist()
Tim Haley <Tim.Haley@Sun.COM>
parents: 7377
diff changeset
3775 * Write full (SPA_CONFIG_BLOCKSIZE) blocks of configuration
f6c6be3b6154 6733970 assertion failure in dbuf_dirty() via spa_sync_nvlist()
Tim Haley <Tim.Haley@Sun.COM>
parents: 7377
diff changeset
3776 * information. This avoids the dbuf_will_dirty() path and
f6c6be3b6154 6733970 assertion failure in dbuf_dirty() via spa_sync_nvlist()
Tim Haley <Tim.Haley@Sun.COM>
parents: 7377
diff changeset
3777 * saves us a pre-read to get data we don't actually care about.
f6c6be3b6154 6733970 assertion failure in dbuf_dirty() via spa_sync_nvlist()
Tim Haley <Tim.Haley@Sun.COM>
parents: 7377
diff changeset
3778 */
f6c6be3b6154 6733970 assertion failure in dbuf_dirty() via spa_sync_nvlist()
Tim Haley <Tim.Haley@Sun.COM>
parents: 7377
diff changeset
3779 bufsize = P2ROUNDUP(nvsize, SPA_CONFIG_BLOCKSIZE);
f6c6be3b6154 6733970 assertion failure in dbuf_dirty() via spa_sync_nvlist()
Tim Haley <Tim.Haley@Sun.COM>
parents: 7377
diff changeset
3780 packed = kmem_alloc(bufsize, KM_SLEEP);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3781
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3782 VERIFY(nvlist_pack(nv, &packed, &nvsize, NV_ENCODE_XDR,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3783 KM_SLEEP) == 0);
7497
f6c6be3b6154 6733970 assertion failure in dbuf_dirty() via spa_sync_nvlist()
Tim Haley <Tim.Haley@Sun.COM>
parents: 7377
diff changeset
3784 bzero(packed + nvsize, bufsize - nvsize);
f6c6be3b6154 6733970 assertion failure in dbuf_dirty() via spa_sync_nvlist()
Tim Haley <Tim.Haley@Sun.COM>
parents: 7377
diff changeset
3785
f6c6be3b6154 6733970 assertion failure in dbuf_dirty() via spa_sync_nvlist()
Tim Haley <Tim.Haley@Sun.COM>
parents: 7377
diff changeset
3786 dmu_write(spa->spa_meta_objset, obj, 0, bufsize, packed, tx);
f6c6be3b6154 6733970 assertion failure in dbuf_dirty() via spa_sync_nvlist()
Tim Haley <Tim.Haley@Sun.COM>
parents: 7377
diff changeset
3787
f6c6be3b6154 6733970 assertion failure in dbuf_dirty() via spa_sync_nvlist()
Tim Haley <Tim.Haley@Sun.COM>
parents: 7377
diff changeset
3788 kmem_free(packed, bufsize);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3789
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3790 VERIFY(0 == dmu_bonus_hold(spa->spa_meta_objset, obj, FTAG, &db));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3791 dmu_buf_will_dirty(db, tx);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3792 *(uint64_t *)db->db_data = nvsize;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3793 dmu_buf_rele(db, FTAG);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3794 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3795
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3796 static void
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3797 spa_sync_aux_dev(spa_t *spa, spa_aux_vdev_t *sav, dmu_tx_t *tx,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3798 const char *config, const char *entry)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3799 {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3800 nvlist_t *nvroot;
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3801 nvlist_t **list;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3802 int i;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3803
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3804 if (!sav->sav_sync)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3805 return;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3806
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3807 /*
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3808 * Update the MOS nvlist describing the list of available devices.
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3809 * spa_validate_aux() will have already made sure this nvlist is
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3810 * valid and the vdevs are labeled appropriately.
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3811 */
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3812 if (sav->sav_object == 0) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3813 sav->sav_object = dmu_object_alloc(spa->spa_meta_objset,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3814 DMU_OT_PACKED_NVLIST, 1 << 14, DMU_OT_PACKED_NVLIST_SIZE,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3815 sizeof (uint64_t), tx);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3816 VERIFY(zap_update(spa->spa_meta_objset,
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3817 DMU_POOL_DIRECTORY_OBJECT, entry, sizeof (uint64_t), 1,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3818 &sav->sav_object, tx) == 0);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3819 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3820
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3821 VERIFY(nvlist_alloc(&nvroot, NV_UNIQUE_NAME, KM_SLEEP) == 0);
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3822 if (sav->sav_count == 0) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3823 VERIFY(nvlist_add_nvlist_array(nvroot, config, NULL, 0) == 0);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3824 } else {
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3825 list = kmem_alloc(sav->sav_count * sizeof (void *), KM_SLEEP);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3826 for (i = 0; i < sav->sav_count; i++)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3827 list[i] = vdev_config_generate(spa, sav->sav_vdevs[i],
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3828 B_FALSE, B_FALSE, B_TRUE);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3829 VERIFY(nvlist_add_nvlist_array(nvroot, config, list,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3830 sav->sav_count) == 0);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3831 for (i = 0; i < sav->sav_count; i++)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3832 nvlist_free(list[i]);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3833 kmem_free(list, sav->sav_count * sizeof (void *));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3834 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3835
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3836 spa_sync_nvlist(spa, sav->sav_object, nvroot, tx);
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
3837 nvlist_free(nvroot);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3838
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
3839 sav->sav_sync = B_FALSE;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3840 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3841
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3842 static void
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3843 spa_sync_config_object(spa_t *spa, dmu_tx_t *tx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3844 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3845 nvlist_t *config;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3846
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3847 if (list_is_empty(&spa->spa_config_dirty_list))
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3848 return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3849
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3850 spa_config_enter(spa, SCL_STATE, FTAG, RW_READER);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3851
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3852 config = spa_config_generate(spa, spa->spa_root_vdev,
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3853 dmu_tx_get_txg(tx), B_FALSE);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3854
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3855 spa_config_exit(spa, SCL_STATE, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3856
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3857 if (spa->spa_config_syncing)
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3858 nvlist_free(spa->spa_config_syncing);
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
3859 spa->spa_config_syncing = config;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3860
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
3861 spa_sync_nvlist(spa, spa->spa_config_object, config, tx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3862 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3863
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3864 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3865 * Set zpool properties.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3866 */
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
3867 static void
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
3868 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
3869 {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
3870 spa_t *spa = arg1;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3871 objset_t *mos = spa->spa_meta_objset;
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
3872 nvlist_t *nvp = arg2;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3873 nvpair_t *elem;
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
3874 uint64_t intval;
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
3875 char *strval;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3876 zpool_prop_t prop;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3877 const char *propname;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3878 zprop_type_t proptype;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3879
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3880 mutex_enter(&spa->spa_props_lock);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3881
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3882 elem = NULL;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3883 while ((elem = nvlist_next_nvpair(nvp, elem))) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3884 switch (prop = zpool_name_to_prop(nvpair_name(elem))) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3885 case ZPOOL_PROP_VERSION:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3886 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3887 * Only set version for non-zpool-creation cases
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3888 * (set/import). spa_create() needs special care
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3889 * for version setting.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3890 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3891 if (tx->tx_txg != TXG_INITIAL) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3892 VERIFY(nvpair_value_uint64(elem,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3893 &intval) == 0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3894 ASSERT(intval <= SPA_VERSION);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3895 ASSERT(intval >= spa_version(spa));
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3896 spa->spa_uberblock.ub_version = intval;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3897 vdev_config_dirty(spa->spa_root_vdev);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3898 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3899 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3900
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3901 case ZPOOL_PROP_ALTROOT:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3902 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3903 * 'altroot' is a non-persistent property. It should
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3904 * have been set temporarily at creation or import time.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3905 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3906 ASSERT(spa->spa_root != NULL);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3907 break;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3908
5363
36eeffc5336d PSARC 2007/607 ZFS cachefile property
eschrock
parents: 5329
diff changeset
3909 case ZPOOL_PROP_CACHEFILE:
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3910 /*
8525
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8242
diff changeset
3911 * 'cachefile' is also a non-persisitent property.
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3912 */
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
3913 break;
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3914 default:
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3915 /*
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3916 * Set pool property values in the poolprops mos object.
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3917 */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3918 if (spa->spa_pool_props_object == 0) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3919 objset_t *mos = spa->spa_meta_objset;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3920
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3921 VERIFY((spa->spa_pool_props_object =
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3922 zap_create(mos, DMU_OT_POOL_PROPS,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3923 DMU_OT_NONE, 0, tx)) > 0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3924
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3925 VERIFY(zap_update(mos,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3926 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_PROPS,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3927 8, 1, &spa->spa_pool_props_object, tx)
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3928 == 0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3929 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3930
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3931 /* normalize the property name */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3932 propname = zpool_prop_to_name(prop);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3933 proptype = zpool_prop_get_type(prop);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3934
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3935 if (nvpair_type(elem) == DATA_TYPE_STRING) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3936 ASSERT(proptype == PROP_TYPE_STRING);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3937 VERIFY(nvpair_value_string(elem, &strval) == 0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3938 VERIFY(zap_update(mos,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3939 spa->spa_pool_props_object, propname,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3940 1, strlen(strval) + 1, strval, tx) == 0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3941
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3942 } else if (nvpair_type(elem) == DATA_TYPE_UINT64) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3943 VERIFY(nvpair_value_uint64(elem, &intval) == 0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3944
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3945 if (proptype == PROP_TYPE_INDEX) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3946 const char *unused;
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3947 VERIFY(zpool_prop_index_to_string(
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3948 prop, intval, &unused) == 0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3949 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3950 VERIFY(zap_update(mos,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3951 spa->spa_pool_props_object, propname,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3952 8, 1, &intval, tx) == 0);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3953 } else {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3954 ASSERT(0); /* not allowed */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3955 }
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3956
5329
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
3957 switch (prop) {
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
3958 case ZPOOL_PROP_DELEGATION:
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3959 spa->spa_delegation = intval;
5329
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
3960 break;
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
3961 case ZPOOL_PROP_BOOTFS:
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3962 spa->spa_bootfs = intval;
5329
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
3963 break;
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
3964 case ZPOOL_PROP_FAILUREMODE:
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
3965 spa->spa_failmode = intval;
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
3966 break;
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
3967 default:
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
3968 break;
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
3969 }
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
3970 }
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3971
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3972 /* log internal history if this is not a zpool create */
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3973 if (spa_version(spa) >= SPA_VERSION_ZPOOL_HISTORY &&
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3974 tx->tx_txg != TXG_INITIAL) {
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3975 spa_history_internal_log(LOG_POOL_PROPSET,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3976 spa, tx, cr, "%s %lld %s",
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3977 nvpair_name(elem), intval, spa_name(spa));
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
3978 }
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
3979 }
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3980
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3981 mutex_exit(&spa->spa_props_lock);
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
3982 }
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
3983
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3984 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3985 * Sync the specified transaction group. New blocks may be dirtied as
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3986 * part of the process, so we iterate until it converges.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3987 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3988 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3989 spa_sync(spa_t *spa, uint64_t txg)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3990 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3991 dsl_pool_t *dp = spa->spa_dsl_pool;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3992 objset_t *mos = spa->spa_meta_objset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3993 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
3994 vdev_t *rvd = spa->spa_root_vdev;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3995 vdev_t *vd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3996 dmu_tx_t *tx;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3997 int dirty_vdevs;
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
3998 int error;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3999
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4000 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4001 * Lock out configuration changes.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4002 */
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4003 spa_config_enter(spa, SCL_CONFIG, FTAG, RW_READER);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4004
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4005 spa->spa_syncing_txg = txg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4006 spa->spa_sync_pass = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4007
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4008 /*
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4009 * If there are any pending vdev state changes, convert them
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4010 * into config changes that go out with this transaction group.
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4011 */
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4012 spa_config_enter(spa, SCL_STATE, FTAG, RW_READER);
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
4013 while (list_head(&spa->spa_state_dirty_list) != NULL) {
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
4014 /*
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
4015 * We need the write lock here because, for aux vdevs,
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
4016 * calling vdev_config_dirty() modifies sav_config.
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
4017 * This is ugly and will become unnecessary when we
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
4018 * eliminate the aux vdev wart by integrating all vdevs
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
4019 * into the root vdev tree.
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
4020 */
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
4021 spa_config_exit(spa, SCL_CONFIG | SCL_STATE, FTAG);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
4022 spa_config_enter(spa, SCL_CONFIG | SCL_STATE, FTAG, RW_WRITER);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
4023 while ((vd = list_head(&spa->spa_state_dirty_list)) != NULL) {
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
4024 vdev_state_clean(vd);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
4025 vdev_config_dirty(vd);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
4026 }
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
4027 spa_config_exit(spa, SCL_CONFIG | SCL_STATE, FTAG);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8211
diff changeset
4028 spa_config_enter(spa, SCL_CONFIG | SCL_STATE, FTAG, RW_READER);
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4029 }
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4030 spa_config_exit(spa, SCL_STATE, FTAG);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4031
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
4032 VERIFY(0 == bplist_open(bpl, mos, spa->spa_sync_bplist_obj));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4033
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4034 tx = dmu_tx_create_assigned(dp, txg);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4035
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4036 /*
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
4037 * If we are upgrading to SPA_VERSION_RAIDZ_DEFLATE this txg,
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4038 * set spa_deflate if we have no raid-z vdevs.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4039 */
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
4040 if (spa->spa_ubsync.ub_version < SPA_VERSION_RAIDZ_DEFLATE &&
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
4041 spa->spa_uberblock.ub_version >= SPA_VERSION_RAIDZ_DEFLATE) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4042 int i;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4043
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4044 for (i = 0; i < rvd->vdev_children; i++) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4045 vd = rvd->vdev_child[i];
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4046 if (vd->vdev_deflate_ratio != SPA_MINBLOCKSIZE)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4047 break;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4048 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4049 if (i == rvd->vdev_children) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4050 spa->spa_deflate = TRUE;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4051 VERIFY(0 == zap_add(spa->spa_meta_objset,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4052 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_DEFLATE,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4053 sizeof (uint64_t), 1, &spa->spa_deflate, tx));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4054 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4055 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4056
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
4057 if (spa->spa_ubsync.ub_version < SPA_VERSION_ORIGIN &&
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
4058 spa->spa_uberblock.ub_version >= SPA_VERSION_ORIGIN) {
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
4059 dsl_pool_create_origin(dp, tx);
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
4060
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
4061 /* Keeping the origin open increases spa_minref */
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
4062 spa->spa_minref += 3;
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
4063 }
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
4064
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
4065 if (spa->spa_ubsync.ub_version < SPA_VERSION_NEXT_CLONES &&
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
4066 spa->spa_uberblock.ub_version >= SPA_VERSION_NEXT_CLONES) {
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
4067 dsl_pool_upgrade_clones(dp, tx);
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
4068 }
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
4069
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4070 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4071 * If anything has changed in this txg, push the deferred frees
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4072 * from the previous txg. If not, leave them alone so that we
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4073 * don't generate work on an otherwise idle system.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4074 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4075 if (!txg_list_empty(&dp->dp_dirty_datasets, txg) ||
2329
e640bebc73b3 6446569 deferred list is hooked on flintstone vitamins
ek110237
parents: 2199
diff changeset
4076 !txg_list_empty(&dp->dp_dirty_dirs, txg) ||
e640bebc73b3 6446569 deferred list is hooked on flintstone vitamins
ek110237
parents: 2199
diff changeset
4077 !txg_list_empty(&dp->dp_sync_tasks, txg))
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4078 spa_sync_deferred_frees(spa, txg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4079
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4080 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4081 * Iterate to convergence.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4082 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4083 do {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4084 spa->spa_sync_pass++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4085
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4086 spa_sync_config_object(spa, tx);
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
4087 spa_sync_aux_dev(spa, &spa->spa_spares, tx,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
4088 ZPOOL_CONFIG_SPARES, DMU_POOL_SPARES);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
4089 spa_sync_aux_dev(spa, &spa->spa_l2cache, tx,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
4090 ZPOOL_CONFIG_L2CACHE, DMU_POOL_L2CACHE);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
4091 spa_errlog_sync(spa, txg);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4092 dsl_pool_sync(dp, txg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4093
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4094 dirty_vdevs = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4095 while (vd = txg_list_remove(&spa->spa_vdev_txg_list, txg)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4096 vdev_sync(vd, txg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4097 dirty_vdevs++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4098 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4099
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4100 bplist_sync(bpl, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4101 } while (dirty_vdevs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4102
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4103 bplist_close(bpl);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4104
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4105 dprintf("txg %llu passes %d\n", txg, spa->spa_sync_pass);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4106
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4107 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4108 * Rewrite the vdev configuration (which includes the uberblock)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4109 * to commit the transaction group.
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
4110 *
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5621
diff changeset
4111 * If there are no dirty vdevs, we sync the uberblock to a few
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5621
diff changeset
4112 * random top-level vdevs that are known to be visible in the
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4113 * config cache (see spa_vdev_add() for a complete description).
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4114 * If there *are* dirty vdevs, sync the uberblock to all vdevs.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4115 */
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4116 for (;;) {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4117 /*
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4118 * We hold SCL_STATE to prevent vdev open/close/etc.
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4119 * while we're attempting to write the vdev labels.
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4120 */
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4121 spa_config_enter(spa, SCL_STATE, FTAG, RW_READER);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4122
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4123 if (list_is_empty(&spa->spa_config_dirty_list)) {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4124 vdev_t *svd[SPA_DVAS_PER_BP];
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4125 int svdcount = 0;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4126 int children = rvd->vdev_children;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4127 int c0 = spa_get_random(children);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4128 int c;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4129
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4130 for (c = 0; c < children; c++) {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4131 vd = rvd->vdev_child[(c0 + c) % children];
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4132 if (vd->vdev_ms_array == 0 || vd->vdev_islog)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4133 continue;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4134 svd[svdcount++] = vd;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4135 if (svdcount == SPA_DVAS_PER_BP)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4136 break;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4137 }
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4138 error = vdev_config_sync(svd, svdcount, txg);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4139 } else {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4140 error = vdev_config_sync(rvd->vdev_child,
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4141 rvd->vdev_children, txg);
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
4142 }
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4143
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4144 spa_config_exit(spa, SCL_STATE, FTAG);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4145
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4146 if (error == 0)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4147 break;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4148 zio_suspend(spa, NULL);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4149 zio_resume_wait(spa);
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
4150 }
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4151 dmu_tx_commit(tx);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4152
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
4153 /*
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
4154 * Clear the dirty config list.
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
4155 */
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4156 while ((vd = list_head(&spa->spa_config_dirty_list)) != NULL)
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
4157 vdev_config_clean(vd);
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
4158
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
4159 /*
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
4160 * 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
4161 * 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
4162 */
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
4163 if (spa->spa_config_syncing != NULL) {
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
4164 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
4165 spa->spa_config_txg = txg;
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
4166 spa->spa_config_syncing = NULL;
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
4167 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4168
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4169 spa->spa_ubsync = spa->spa_uberblock;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4170
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4171 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4172 * Clean up the ZIL records for the synced txg.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4173 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4174 dsl_pool_zil_clean(dp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4175
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4176 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4177 * Update usable space statistics.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4178 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4179 while (vd = txg_list_remove(&spa->spa_vdev_txg_list, TXG_CLEAN(txg)))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4180 vdev_sync_done(vd, txg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4181
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4182 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4183 * 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
4184 * since vdev_config_sync().
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4185 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4186 ASSERT(txg_list_empty(&dp->dp_dirty_datasets, txg));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4187 ASSERT(txg_list_empty(&dp->dp_dirty_dirs, txg));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4188 ASSERT(txg_list_empty(&spa->spa_vdev_txg_list, txg));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4189 ASSERT(bpl->bpl_queue == NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4190
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4191 spa_config_exit(spa, SCL_CONFIG, FTAG);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
4192
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
4193 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
4194 * If any async tasks have been requested, kick them off.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
4195 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
4196 spa_async_dispatch(spa);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4197 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4198
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4199 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4200 * Sync all pools. We don't want to hold the namespace lock across these
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4201 * 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
4202 * sync.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4203 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4204 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4205 spa_sync_allpools(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4206 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4207 spa_t *spa = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4208 mutex_enter(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4209 while ((spa = spa_next(spa)) != NULL) {
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4210 if (spa_state(spa) != POOL_STATE_ACTIVE || spa_suspended(spa))
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4211 continue;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4212 spa_open_ref(spa, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4213 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4214 txg_wait_synced(spa_get_dsl(spa), 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4215 mutex_enter(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4216 spa_close(spa, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4217 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4218 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4219 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4220
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4221 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4222 * ==========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4223 * Miscellaneous routines
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4224 * ==========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4225 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4226
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4227 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4228 * Remove all pools in the system.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4229 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4230 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4231 spa_evict_all(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4232 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4233 spa_t *spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4234
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4235 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4236 * Remove all cached state. All pools should be closed now,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4237 * so every spa in the AVL tree should be unreferenced.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4238 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4239 mutex_enter(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4240 while ((spa = spa_next(NULL)) != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4241 /*
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
4242 * Stop async tasks. The async thread may need to detach
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
4243 * a device that's been replaced, which requires grabbing
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
4244 * spa_namespace_lock, so we must drop it here.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4245 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4246 spa_open_ref(spa, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4247 mutex_exit(&spa_namespace_lock);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
4248 spa_async_suspend(spa);
4808
63629eaeb41a 6498144 ::kmastat could be even easier to read
ek110237
parents: 4787
diff changeset
4249 mutex_enter(&spa_namespace_lock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4250 spa_close(spa, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4251
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4252 if (spa->spa_state != POOL_STATE_UNINITIALIZED) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4253 spa_unload(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4254 spa_deactivate(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4255 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4256 spa_remove(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4257 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4258 mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4259 }
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
4260
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
4261 vdev_t *
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
4262 spa_lookup_by_guid(spa_t *spa, uint64_t guid, boolean_t aux)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
4263 {
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
4264 vdev_t *vd;
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
4265 int i;
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
4266
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
4267 if ((vd = vdev_lookup_by_guid(spa->spa_root_vdev, guid)) != NULL)
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
4268 return (vd);
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
4269
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
4270 if (aux) {
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
4271 for (i = 0; i < spa->spa_l2cache.sav_count; i++) {
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
4272 vd = spa->spa_l2cache.sav_vdevs[i];
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
4273 if (vd->vdev_guid == guid)
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
4274 return (vd);
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
4275 }
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
4276
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
4277 for (i = 0; i < spa->spa_spares.sav_count; i++) {
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
4278 vd = spa->spa_spares.sav_vdevs[i];
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
4279 if (vd->vdev_guid == guid)
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
4280 return (vd);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9276
diff changeset
4281 }
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
4282 }
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
4283
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6615
diff changeset
4284 return (NULL);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
4285 }
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
4286
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
4287 void
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
4288 spa_upgrade(spa_t *spa, uint64_t version)
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
4289 {
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4290 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
4291
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
4292 /*
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
4293 * This should only be called for a non-faulted pool, and since a
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
4294 * future version would result in an unopenable pool, this shouldn't be
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
4295 * possible.
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
4296 */
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
4297 ASSERT(spa->spa_uberblock.ub_version <= SPA_VERSION);
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
4298 ASSERT(version >= spa->spa_uberblock.ub_version);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
4299
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4831
diff changeset
4300 spa->spa_uberblock.ub_version = version;
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
4301 vdev_config_dirty(spa->spa_root_vdev);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
4302
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7706
diff changeset
4303 spa_config_exit(spa, SCL_ALL, FTAG);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4304
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4305 txg_wait_synced(spa_get_dsl(spa), 0);
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1733
diff changeset
4306 }
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4307
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4308 boolean_t
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4309 spa_has_spare(spa_t *spa, uint64_t guid)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4310 {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4311 int i;
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
4312 uint64_t spareguid;
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
4313 spa_aux_vdev_t *sav = &spa->spa_spares;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
4314
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
4315 for (i = 0; i < sav->sav_count; i++)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
4316 if (sav->sav_vdevs[i]->vdev_guid == guid)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4317 return (B_TRUE);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4318
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
4319 for (i = 0; i < sav->sav_npending; i++) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
4320 if (nvlist_lookup_uint64(sav->sav_pending[i], ZPOOL_CONFIG_GUID,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
4321 &spareguid) == 0 && spareguid == guid)
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
4322 return (B_TRUE);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
4323 }
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
4324
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4325 return (B_FALSE);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
4326 }
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3697
diff changeset
4327
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4328 /*
7214
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
4329 * Check if a pool has an active shared spare device.
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
4330 * Note: reference count of an active spare is 2, as a spare and as a replace
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
4331 */
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
4332 static boolean_t
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
4333 spa_has_active_shared_spare(spa_t *spa)
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
4334 {
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
4335 int i, refcnt;
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
4336 uint64_t pool;
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
4337 spa_aux_vdev_t *sav = &spa->spa_spares;
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
4338
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
4339 for (i = 0; i < sav->sav_count; i++) {
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
4340 if (spa_spare_exists(sav->sav_vdevs[i]->vdev_guid, &pool,
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
4341 &refcnt) && pool != 0ULL && pool == spa_guid(spa) &&
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
4342 refcnt > 2)
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
4343 return (B_TRUE);
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
4344 }
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
4345
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
4346 return (B_FALSE);
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
4347 }
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
4348
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7184
diff changeset
4349 /*
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4350 * 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
4351 * the event definitions in sys/sysevent/eventdefs.h. The payload will be
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4352 * 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
4353 * in the userland libzpool, as we don't want consumers to misinterpret ztest
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4354 * or zdb as real changes.
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4355 */
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4356 void
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4357 spa_event_notify(spa_t *spa, vdev_t *vd, const char *name)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4358 {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4359 #ifdef _KERNEL
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4360 sysevent_t *ev;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4361 sysevent_attr_list_t *attr = NULL;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4362 sysevent_value_t value;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4363 sysevent_id_t eid;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4364
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4365 ev = sysevent_alloc(EC_ZFS, (char *)name, SUNW_KERN_PUB "zfs",
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4366 SE_SLEEP);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4367
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4368 value.value_type = SE_DATA_TYPE_STRING;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4369 value.value.sv_string = spa_name(spa);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4370 if (sysevent_add_attr(&attr, ZFS_EV_POOL_NAME, &value, SE_SLEEP) != 0)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4371 goto done;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4372
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4373 value.value_type = SE_DATA_TYPE_UINT64;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4374 value.value.sv_uint64 = spa_guid(spa);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4375 if (sysevent_add_attr(&attr, ZFS_EV_POOL_GUID, &value, SE_SLEEP) != 0)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4376 goto done;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4377
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4378 if (vd) {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4379 value.value_type = SE_DATA_TYPE_UINT64;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4380 value.value.sv_uint64 = vd->vdev_guid;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4381 if (sysevent_add_attr(&attr, ZFS_EV_VDEV_GUID, &value,
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4382 SE_SLEEP) != 0)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4383 goto done;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4384
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4385 if (vd->vdev_path) {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4386 value.value_type = SE_DATA_TYPE_STRING;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4387 value.value.sv_string = vd->vdev_path;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4388 if (sysevent_add_attr(&attr, ZFS_EV_VDEV_PATH,
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4389 &value, SE_SLEEP) != 0)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4390 goto done;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4391 }
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4392 }
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4393
5756
05eb4c1ff492 6585441 spa_event_notify() doesn't pass its attributes
eschrock
parents: 5688
diff changeset
4394 if (sysevent_attach_attributes(ev, attr) != 0)
05eb4c1ff492 6585441 spa_event_notify() doesn't pass its attributes
eschrock
parents: 5688
diff changeset
4395 goto done;
05eb4c1ff492 6585441 spa_event_notify() doesn't pass its attributes
eschrock
parents: 5688
diff changeset
4396 attr = NULL;
05eb4c1ff492 6585441 spa_event_notify() doesn't pass its attributes
eschrock
parents: 5688
diff changeset
4397
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4398 (void) log_sysevent(ev, SE_SLEEP, &eid);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4399
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4400 done:
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4401 if (attr)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4402 sysevent_free_attr(attr);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4403 sysevent_free(ev);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4404 #endif
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4309
diff changeset
4405 }