Mercurial > illumos > illumos-gate
annotate usr/src/uts/common/fs/zfs/spa.c @ 13970:c9a5683da38e
3543 Feature flags causes assertion in spa.c to miss certain cases
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Approved by: Christopher Siden <christopher.siden@delphix.com>
author | Richard Yao <ryao@gentoo.org> |
---|---|
date | Mon, 25 Feb 2013 17:37:11 -0800 |
parents | 1fd91513472c |
children | d1648d817bd6 |
rev | line source |
---|---|
789 | 1 /* |
2 * CDDL HEADER START | |
3 * | |
4 * The contents of this file are subject to the terms of the | |
1544 | 5 * Common Development and Distribution License (the "License"). |
6 * You may not use this file except in compliance with the License. | |
789 | 7 * |
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | |
9 * or http://www.opensolaris.org/os/licensing. | |
10 * See the License for the specific language governing permissions | |
11 * and limitations under the License. | |
12 * | |
13 * When distributing Covered Code, include this CDDL HEADER in each | |
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | |
15 * If applicable, add the following below this CDDL HEADER, with the | |
16 * fields enclosed by brackets "[]" replaced with your own identifying | |
17 * information: Portions Copyright [yyyy] [name of copyright owner] | |
18 * | |
19 * CDDL HEADER END | |
20 */ | |
2082 | 21 |
789 | 22 /* |
12247
5bcd281629f8
6911420 ZFS device removal detection should work with SCSAv3
George Wilson <George.Wilson@Sun.COM>
parents:
11932
diff
changeset
|
23 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. |
13414
b42c1f0432b6
734 taskq_dispatch_prealloc() desired
Garrett D'Amore <garrett@nexenta.com>
parents:
13061
diff
changeset
|
24 * Copyright 2011 Nexenta Systems, Inc. All rights reserved. |
13570
3411fd5f1589
1948 zpool list should show more detailed pool information
George Wilson <George.Wilson@delphix.com>
parents:
13525
diff
changeset
|
25 * Copyright (c) 2012 by Delphix. All rights reserved. |
13414
b42c1f0432b6
734 taskq_dispatch_prealloc() desired
Garrett D'Amore <garrett@nexenta.com>
parents:
13061
diff
changeset
|
26 */ |
789 | 27 |
28 /* | |
29 * This file contains all the routines used when modifying on-disk SPA state. | |
30 * This includes opening, importing, destroying, exporting a pool, and syncing a | |
31 * pool. | |
32 */ | |
33 | |
34 #include <sys/zfs_context.h> | |
1544 | 35 #include <sys/fm/fs/zfs.h> |
789 | 36 #include <sys/spa_impl.h> |
37 #include <sys/zio.h> | |
38 #include <sys/zio_checksum.h> | |
39 #include <sys/dmu.h> | |
40 #include <sys/dmu_tx.h> | |
41 #include <sys/zap.h> | |
42 #include <sys/zil.h> | |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
43 #include <sys/ddt.h> |
789 | 44 #include <sys/vdev_impl.h> |
45 #include <sys/metaslab.h> | |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
46 #include <sys/metaslab_impl.h> |
789 | 47 #include <sys/uberblock_impl.h> |
48 #include <sys/txg.h> | |
49 #include <sys/avl.h> | |
50 #include <sys/dmu_traverse.h> | |
3912 | 51 #include <sys/dmu_objset.h> |
789 | 52 #include <sys/unique.h> |
53 #include <sys/dsl_pool.h> | |
3912 | 54 #include <sys/dsl_dataset.h> |
789 | 55 #include <sys/dsl_dir.h> |
56 #include <sys/dsl_prop.h> | |
3912 | 57 #include <sys/dsl_synctask.h> |
789 | 58 #include <sys/fs/zfs.h> |
5450 | 59 #include <sys/arc.h> |
789 | 60 #include <sys/callb.h> |
3975
6674f5d79069
6282725 hostname/hostid should be stored in the label
ek110237
parents:
3912
diff
changeset
|
61 #include <sys/systeminfo.h> |
6423 | 62 #include <sys/spa_boot.h> |
9816
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
63 #include <sys/zfs_ioctl.h> |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
64 #include <sys/dsl_scan.h> |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
65 #include <sys/zfeature.h> |
789 | 66 |
8662
18153249ee93
PSARC/2008/647 Configurable Hostids for Non-Global Zones
jv227347 <Jordan.Vaughan@Sun.com>
parents:
8525
diff
changeset
|
67 #ifdef _KERNEL |
11173
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
68 #include <sys/bootprops.h> |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
69 #include <sys/callb.h> |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
70 #include <sys/cpupart.h> |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
71 #include <sys/pool.h> |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
72 #include <sys/sysdc.h> |
8662
18153249ee93
PSARC/2008/647 Configurable Hostids for Non-Global Zones
jv227347 <Jordan.Vaughan@Sun.com>
parents:
8525
diff
changeset
|
73 #include <sys/zone.h> |
18153249ee93
PSARC/2008/647 Configurable Hostids for Non-Global Zones
jv227347 <Jordan.Vaughan@Sun.com>
parents:
8525
diff
changeset
|
74 #endif /* _KERNEL */ |
18153249ee93
PSARC/2008/647 Configurable Hostids for Non-Global Zones
jv227347 <Jordan.Vaughan@Sun.com>
parents:
8525
diff
changeset
|
75 |
5094 | 76 #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
|
77 #include "zfs_comutil.h" |
5094 | 78 |
11173
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
79 typedef enum zti_modes { |
9515
d3b739d9d043
6586537 async zio taskqs can block out userland commands
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
9512
diff
changeset
|
80 zti_mode_fixed, /* value is # of threads (min 1) */ |
d3b739d9d043
6586537 async zio taskqs can block out userland commands
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
9512
diff
changeset
|
81 zti_mode_online_percent, /* value is % of online CPUs */ |
11173
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
82 zti_mode_batch, /* cpu-intensive; value is ignored */ |
11146
7e58f40bcb1c
6826241 Sync write IOPS drops dramatically during TXG sync
George Wilson <George.Wilson@Sun.COM>
parents:
11125
diff
changeset
|
83 zti_mode_null, /* don't create a taskq */ |
9515
d3b739d9d043
6586537 async zio taskqs can block out userland commands
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
9512
diff
changeset
|
84 zti_nmodes |
11173
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
85 } zti_modes_t; |
2986 | 86 |
11146
7e58f40bcb1c
6826241 Sync write IOPS drops dramatically during TXG sync
George Wilson <George.Wilson@Sun.COM>
parents:
11125
diff
changeset
|
87 #define ZTI_FIX(n) { zti_mode_fixed, (n) } |
7e58f40bcb1c
6826241 Sync write IOPS drops dramatically during TXG sync
George Wilson <George.Wilson@Sun.COM>
parents:
11125
diff
changeset
|
88 #define ZTI_PCT(n) { zti_mode_online_percent, (n) } |
11173
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
89 #define ZTI_BATCH { zti_mode_batch, 0 } |
11146
7e58f40bcb1c
6826241 Sync write IOPS drops dramatically during TXG sync
George Wilson <George.Wilson@Sun.COM>
parents:
11125
diff
changeset
|
90 #define ZTI_NULL { zti_mode_null, 0 } |
7e58f40bcb1c
6826241 Sync write IOPS drops dramatically during TXG sync
George Wilson <George.Wilson@Sun.COM>
parents:
11125
diff
changeset
|
91 |
7e58f40bcb1c
6826241 Sync write IOPS drops dramatically during TXG sync
George Wilson <George.Wilson@Sun.COM>
parents:
11125
diff
changeset
|
92 #define ZTI_ONE ZTI_FIX(1) |
9515
d3b739d9d043
6586537 async zio taskqs can block out userland commands
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
9512
diff
changeset
|
93 |
d3b739d9d043
6586537 async zio taskqs can block out userland commands
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
9512
diff
changeset
|
94 typedef struct zio_taskq_info { |
11146
7e58f40bcb1c
6826241 Sync write IOPS drops dramatically during TXG sync
George Wilson <George.Wilson@Sun.COM>
parents:
11125
diff
changeset
|
95 enum zti_modes zti_mode; |
7e58f40bcb1c
6826241 Sync write IOPS drops dramatically during TXG sync
George Wilson <George.Wilson@Sun.COM>
parents:
11125
diff
changeset
|
96 uint_t zti_value; |
9515
d3b739d9d043
6586537 async zio taskqs can block out userland commands
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
9512
diff
changeset
|
97 } zio_taskq_info_t; |
d3b739d9d043
6586537 async zio taskqs can block out userland commands
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
9512
diff
changeset
|
98 |
d3b739d9d043
6586537 async zio taskqs can block out userland commands
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
9512
diff
changeset
|
99 static const char *const zio_taskq_types[ZIO_TASKQ_TYPES] = { |
11173
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
100 "issue", "issue_high", "intr", "intr_high" |
9515
d3b739d9d043
6586537 async zio taskqs can block out userland commands
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
9512
diff
changeset
|
101 }; |
d3b739d9d043
6586537 async zio taskqs can block out userland commands
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
9512
diff
changeset
|
102 |
11146
7e58f40bcb1c
6826241 Sync write IOPS drops dramatically during TXG sync
George Wilson <George.Wilson@Sun.COM>
parents:
11125
diff
changeset
|
103 /* |
7e58f40bcb1c
6826241 Sync write IOPS drops dramatically during TXG sync
George Wilson <George.Wilson@Sun.COM>
parents:
11125
diff
changeset
|
104 * Define the taskq threads for the following I/O types: |
7e58f40bcb1c
6826241 Sync write IOPS drops dramatically during TXG sync
George Wilson <George.Wilson@Sun.COM>
parents:
11125
diff
changeset
|
105 * NULL, READ, WRITE, FREE, CLAIM, and IOCTL |
7e58f40bcb1c
6826241 Sync write IOPS drops dramatically during TXG sync
George Wilson <George.Wilson@Sun.COM>
parents:
11125
diff
changeset
|
106 */ |
7e58f40bcb1c
6826241 Sync write IOPS drops dramatically during TXG sync
George Wilson <George.Wilson@Sun.COM>
parents:
11125
diff
changeset
|
107 const zio_taskq_info_t zio_taskqs[ZIO_TYPES][ZIO_TASKQ_TYPES] = { |
7e58f40bcb1c
6826241 Sync write IOPS drops dramatically during TXG sync
George Wilson <George.Wilson@Sun.COM>
parents:
11125
diff
changeset
|
108 /* ISSUE ISSUE_HIGH INTR INTR_HIGH */ |
7e58f40bcb1c
6826241 Sync write IOPS drops dramatically during TXG sync
George Wilson <George.Wilson@Sun.COM>
parents:
11125
diff
changeset
|
109 { ZTI_ONE, ZTI_NULL, ZTI_ONE, ZTI_NULL }, |
11173
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
110 { ZTI_FIX(8), ZTI_NULL, ZTI_BATCH, ZTI_NULL }, |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
111 { ZTI_BATCH, ZTI_FIX(5), ZTI_FIX(8), ZTI_FIX(5) }, |
12450
c77e20e4e046
6938089 dedup-induced latency causes FC initiator logouts/FC port resets
George Wilson <George.Wilson@Sun.COM>
parents:
12352
diff
changeset
|
112 { ZTI_FIX(100), ZTI_NULL, ZTI_ONE, ZTI_NULL }, |
11146
7e58f40bcb1c
6826241 Sync write IOPS drops dramatically during TXG sync
George Wilson <George.Wilson@Sun.COM>
parents:
11125
diff
changeset
|
113 { ZTI_ONE, ZTI_NULL, ZTI_ONE, ZTI_NULL }, |
7e58f40bcb1c
6826241 Sync write IOPS drops dramatically during TXG sync
George Wilson <George.Wilson@Sun.COM>
parents:
11125
diff
changeset
|
114 { ZTI_ONE, ZTI_NULL, ZTI_ONE, ZTI_NULL }, |
9515
d3b739d9d043
6586537 async zio taskqs can block out userland commands
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
9512
diff
changeset
|
115 }; |
d3b739d9d043
6586537 async zio taskqs can block out userland commands
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
9512
diff
changeset
|
116 |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
117 static dsl_syncfunc_t spa_sync_version; |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
118 static dsl_syncfunc_t spa_sync_props; |
13777
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
119 static dsl_checkfunc_t spa_change_guid_check; |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
120 static dsl_syncfunc_t spa_change_guid_sync; |
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
|
121 static boolean_t spa_has_active_shared_spare(spa_t *spa); |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
122 static int spa_load_impl(spa_t *spa, uint64_t, nvlist_t *config, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
123 spa_load_state_t state, spa_import_type_t type, boolean_t mosconfig, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
124 char **ereport); |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
125 static void spa_vdev_resilver_done(spa_t *spa); |
5094 | 126 |
11173
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
127 uint_t zio_taskq_batch_pct = 100; /* 1 thread per cpu in pset */ |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
128 id_t zio_taskq_psrset_bind = PS_NONE; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
129 boolean_t zio_taskq_sysdc = B_TRUE; /* use SDC scheduling class */ |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
130 uint_t zio_taskq_basedc = 80; /* base duty cycle */ |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
131 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
132 boolean_t spa_create_process = B_TRUE; /* no process ==> no sysdc */ |
13879
4eac7a87eff2
3329 spa_sync() spends 10-20% of its time in spa_free_sync_cb()
George Wilson <george.wilson@delphix.com>
parents:
13869
diff
changeset
|
133 extern int zfs_sync_pass_deferred_free; |
11173
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
134 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
135 /* |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
136 * This (illegal) pool name is used when temporarily importing a spa_t in order |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
137 * to get the vdev stats associated with the imported devices. |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
138 */ |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
139 #define TRYIMPORT_NAME "$import" |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
140 |
5094 | 141 /* |
142 * ========================================================================== | |
143 * SPA properties routines | |
144 * ========================================================================== | |
145 */ | |
146 | |
147 /* | |
148 * Add a (source=src, propname=propval) list to an nvlist. | |
149 */ | |
5949
02e692d1cb28
6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents:
5913
diff
changeset
|
150 static void |
5094 | 151 spa_prop_add_list(nvlist_t *nvl, zpool_prop_t prop, char *strval, |
152 uint64_t intval, zprop_source_t src) | |
153 { | |
154 const char *propname = zpool_prop_to_name(prop); | |
155 nvlist_t *propval; | |
5949
02e692d1cb28
6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents:
5913
diff
changeset
|
156 |
02e692d1cb28
6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents:
5913
diff
changeset
|
157 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
|
158 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
|
159 |
02e692d1cb28
6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents:
5913
diff
changeset
|
160 if (strval != NULL) |
02e692d1cb28
6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents:
5913
diff
changeset
|
161 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
|
162 else |
02e692d1cb28
6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents:
5913
diff
changeset
|
163 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
|
164 |
02e692d1cb28
6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents:
5913
diff
changeset
|
165 VERIFY(nvlist_add_nvlist(nvl, propname, propval) == 0); |
5094 | 166 nvlist_free(propval); |
167 } | |
168 | |
169 /* | |
170 * Get property values from the spa configuration. | |
171 */ | |
5949
02e692d1cb28
6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents:
5913
diff
changeset
|
172 static void |
5094 | 173 spa_prop_get_config(spa_t *spa, nvlist_t **nvp) |
174 { | |
13570
3411fd5f1589
1948 zpool list should show more detailed pool information
George Wilson <George.Wilson@delphix.com>
parents:
13525
diff
changeset
|
175 vdev_t *rvd = spa->spa_root_vdev; |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
176 dsl_pool_t *pool = spa->spa_dsl_pool; |
8525
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
177 uint64_t size; |
10956
0c81acaaf614
6897693 deduplication can only go so far
George Wilson <George.Wilson@Sun.COM>
parents:
10950
diff
changeset
|
178 uint64_t alloc; |
13570
3411fd5f1589
1948 zpool list should show more detailed pool information
George Wilson <George.Wilson@delphix.com>
parents:
13525
diff
changeset
|
179 uint64_t space; |
5094 | 180 uint64_t cap, version; |
181 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
|
182 spa_config_dirent_t *dp; |
5094 | 183 |
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
|
184 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
|
185 |
13570
3411fd5f1589
1948 zpool list should show more detailed pool information
George Wilson <George.Wilson@delphix.com>
parents:
13525
diff
changeset
|
186 if (rvd != NULL) { |
10956
0c81acaaf614
6897693 deduplication can only go so far
George Wilson <George.Wilson@Sun.COM>
parents:
10950
diff
changeset
|
187 alloc = metaslab_class_get_alloc(spa_normal_class(spa)); |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
188 size = metaslab_class_get_space(spa_normal_class(spa)); |
8525
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
189 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
|
190 spa_prop_add_list(*nvp, ZPOOL_PROP_SIZE, NULL, size, src); |
10956
0c81acaaf614
6897693 deduplication can only go so far
George Wilson <George.Wilson@Sun.COM>
parents:
10950
diff
changeset
|
191 spa_prop_add_list(*nvp, ZPOOL_PROP_ALLOCATED, NULL, alloc, src); |
0c81acaaf614
6897693 deduplication can only go so far
George Wilson <George.Wilson@Sun.COM>
parents:
10950
diff
changeset
|
192 spa_prop_add_list(*nvp, ZPOOL_PROP_FREE, NULL, |
0c81acaaf614
6897693 deduplication can only go so far
George Wilson <George.Wilson@Sun.COM>
parents:
10950
diff
changeset
|
193 size - alloc, src); |
13570
3411fd5f1589
1948 zpool list should show more detailed pool information
George Wilson <George.Wilson@delphix.com>
parents:
13525
diff
changeset
|
194 |
3411fd5f1589
1948 zpool list should show more detailed pool information
George Wilson <George.Wilson@delphix.com>
parents:
13525
diff
changeset
|
195 space = 0; |
3411fd5f1589
1948 zpool list should show more detailed pool information
George Wilson <George.Wilson@delphix.com>
parents:
13525
diff
changeset
|
196 for (int c = 0; c < rvd->vdev_children; c++) { |
3411fd5f1589
1948 zpool list should show more detailed pool information
George Wilson <George.Wilson@delphix.com>
parents:
13525
diff
changeset
|
197 vdev_t *tvd = rvd->vdev_child[c]; |
3411fd5f1589
1948 zpool list should show more detailed pool information
George Wilson <George.Wilson@delphix.com>
parents:
13525
diff
changeset
|
198 space += tvd->vdev_max_asize - tvd->vdev_asize; |
3411fd5f1589
1948 zpool list should show more detailed pool information
George Wilson <George.Wilson@delphix.com>
parents:
13525
diff
changeset
|
199 } |
3411fd5f1589
1948 zpool list should show more detailed pool information
George Wilson <George.Wilson@delphix.com>
parents:
13525
diff
changeset
|
200 spa_prop_add_list(*nvp, ZPOOL_PROP_EXPANDSZ, NULL, space, |
3411fd5f1589
1948 zpool list should show more detailed pool information
George Wilson <George.Wilson@delphix.com>
parents:
13525
diff
changeset
|
201 src); |
3411fd5f1589
1948 zpool list should show more detailed pool information
George Wilson <George.Wilson@delphix.com>
parents:
13525
diff
changeset
|
202 |
13061
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
203 spa_prop_add_list(*nvp, ZPOOL_PROP_READONLY, NULL, |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
204 (spa_mode(spa) == FREAD), src); |
10956
0c81acaaf614
6897693 deduplication can only go so far
George Wilson <George.Wilson@Sun.COM>
parents:
10950
diff
changeset
|
205 |
0c81acaaf614
6897693 deduplication can only go so far
George Wilson <George.Wilson@Sun.COM>
parents:
10950
diff
changeset
|
206 cap = (size == 0) ? 0 : (alloc * 100 / size); |
8525
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
207 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
|
208 |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
209 spa_prop_add_list(*nvp, ZPOOL_PROP_DEDUPRATIO, NULL, |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
210 ddt_get_pool_dedup_ratio(spa), src); |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
211 |
8525
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
212 spa_prop_add_list(*nvp, ZPOOL_PROP_HEALTH, NULL, |
13570
3411fd5f1589
1948 zpool list should show more detailed pool information
George Wilson <George.Wilson@delphix.com>
parents:
13525
diff
changeset
|
213 rvd->vdev_state, src); |
8525
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
214 |
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
215 version = spa_version(spa); |
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
216 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
|
217 src = ZPROP_SRC_DEFAULT; |
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
218 else |
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
219 src = ZPROP_SRC_LOCAL; |
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
220 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
|
221 } |
5949
02e692d1cb28
6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents:
5913
diff
changeset
|
222 |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
223 if (pool != NULL) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
224 dsl_dir_t *freedir = pool->dp_free_dir; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
225 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
226 /* |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
227 * The $FREE directory was introduced in SPA_VERSION_DEADLISTS, |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
228 * when opening pools before this version freedir will be NULL. |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
229 */ |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
230 if (freedir != NULL) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
231 spa_prop_add_list(*nvp, ZPOOL_PROP_FREEING, NULL, |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
232 freedir->dd_phys->dd_used_bytes, src); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
233 } else { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
234 spa_prop_add_list(*nvp, ZPOOL_PROP_FREEING, |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
235 NULL, 0, src); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
236 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
237 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
238 |
5949
02e692d1cb28
6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents:
5913
diff
changeset
|
239 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
|
240 |
13525
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
241 if (spa->spa_comment != NULL) { |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
242 spa_prop_add_list(*nvp, ZPOOL_PROP_COMMENT, spa->spa_comment, |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
243 0, ZPROP_SRC_LOCAL); |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
244 } |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
245 |
5949
02e692d1cb28
6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents:
5913
diff
changeset
|
246 if (spa->spa_root != NULL) |
02e692d1cb28
6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents:
5913
diff
changeset
|
247 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
|
248 0, ZPROP_SRC_LOCAL); |
5094 | 249 |
6643
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
250 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
|
251 if (dp->scd_path == NULL) { |
5949
02e692d1cb28
6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents:
5913
diff
changeset
|
252 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
|
253 "none", 0, ZPROP_SRC_LOCAL); |
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
254 } 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
|
255 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
|
256 dp->scd_path, 0, ZPROP_SRC_LOCAL); |
5363 | 257 } |
258 } | |
5094 | 259 } |
260 | |
261 /* | |
262 * Get zpool property values. | |
263 */ | |
264 int | |
265 spa_prop_get(spa_t *spa, nvlist_t **nvp) | |
266 { | |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
267 objset_t *mos = spa->spa_meta_objset; |
5094 | 268 zap_cursor_t zc; |
269 zap_attribute_t za; | |
270 int err; | |
271 | |
5949
02e692d1cb28
6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents:
5913
diff
changeset
|
272 VERIFY(nvlist_alloc(nvp, NV_UNIQUE_NAME, KM_SLEEP) == 0); |
5094 | 273 |
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
|
274 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
|
275 |
5094 | 276 /* |
277 * Get properties from the spa config. | |
278 */ | |
5949
02e692d1cb28
6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents:
5913
diff
changeset
|
279 spa_prop_get_config(spa, nvp); |
5094 | 280 |
281 /* If no pool property object, no more prop to get. */ | |
11619
d3fb7ae6fe56
6909744 dedup should be set to off when a ZVOL is dumpified
George Wilson <George.Wilson@Sun.COM>
parents:
11497
diff
changeset
|
282 if (mos == NULL || spa->spa_pool_props_object == 0) { |
5094 | 283 mutex_exit(&spa->spa_props_lock); |
284 return (0); | |
285 } | |
286 | |
287 /* | |
288 * Get properties from the MOS pool property object. | |
289 */ | |
290 for (zap_cursor_init(&zc, mos, spa->spa_pool_props_object); | |
291 (err = zap_cursor_retrieve(&zc, &za)) == 0; | |
292 zap_cursor_advance(&zc)) { | |
293 uint64_t intval = 0; | |
294 char *strval = NULL; | |
295 zprop_source_t src = ZPROP_SRC_DEFAULT; | |
296 zpool_prop_t prop; | |
297 | |
298 if ((prop = zpool_name_to_prop(za.za_name)) == ZPROP_INVAL) | |
299 continue; | |
300 | |
301 switch (za.za_integer_length) { | |
302 case 8: | |
303 /* integer property */ | |
304 if (za.za_first_integer != | |
305 zpool_prop_default_numeric(prop)) | |
306 src = ZPROP_SRC_LOCAL; | |
307 | |
308 if (prop == ZPOOL_PROP_BOOTFS) { | |
309 dsl_pool_t *dp; | |
310 dsl_dataset_t *ds = NULL; | |
311 | |
312 dp = spa_get_dsl(spa); | |
313 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
|
314 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
|
315 za.za_first_integer, FTAG, &ds)) { |
5094 | 316 rw_exit(&dp->dp_config_rwlock); |
317 break; | |
318 } | |
319 | |
320 strval = kmem_alloc( | |
321 MAXNAMELEN + strlen(MOS_DIR_NAME) + 1, | |
322 KM_SLEEP); | |
323 dsl_dataset_name(ds, strval); | |
6689
47572a2f5e73
6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents:
6673
diff
changeset
|
324 dsl_dataset_rele(ds, FTAG); |
5094 | 325 rw_exit(&dp->dp_config_rwlock); |
326 } else { | |
327 strval = NULL; | |
328 intval = za.za_first_integer; | |
329 } | |
330 | |
5949
02e692d1cb28
6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents:
5913
diff
changeset
|
331 spa_prop_add_list(*nvp, prop, strval, intval, src); |
5094 | 332 |
333 if (strval != NULL) | |
334 kmem_free(strval, | |
335 MAXNAMELEN + strlen(MOS_DIR_NAME) + 1); | |
336 | |
337 break; | |
338 | |
339 case 1: | |
340 /* string property */ | |
341 strval = kmem_alloc(za.za_num_integers, KM_SLEEP); | |
342 err = zap_lookup(mos, spa->spa_pool_props_object, | |
343 za.za_name, 1, za.za_num_integers, strval); | |
344 if (err) { | |
345 kmem_free(strval, za.za_num_integers); | |
346 break; | |
347 } | |
5949
02e692d1cb28
6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents:
5913
diff
changeset
|
348 spa_prop_add_list(*nvp, prop, strval, 0, src); |
5094 | 349 kmem_free(strval, za.za_num_integers); |
350 break; | |
351 | |
352 default: | |
353 break; | |
354 } | |
355 } | |
356 zap_cursor_fini(&zc); | |
357 mutex_exit(&spa->spa_props_lock); | |
358 out: | |
359 if (err && err != ENOENT) { | |
360 nvlist_free(*nvp); | |
5949
02e692d1cb28
6654224 zfs_ioc_pool_get_props() double-frees nvlist on error
lling
parents:
5913
diff
changeset
|
361 *nvp = NULL; |
5094 | 362 return (err); |
363 } | |
364 | |
365 return (0); | |
366 } | |
367 | |
368 /* | |
369 * Validate the given pool properties nvlist and modify the list | |
370 * for the property values to be set. | |
371 */ | |
372 static int | |
373 spa_prop_validate(spa_t *spa, nvlist_t *props) | |
374 { | |
375 nvpair_t *elem; | |
376 int error = 0, reset_bootfs = 0; | |
13952
7a22d0770fc8
3522 zfs module should not allow uninitialized variables
George Wilson <george.wilson@delphix.com>
parents:
13941
diff
changeset
|
377 uint64_t objnum = 0; |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
378 boolean_t has_feature = B_FALSE; |
5094 | 379 |
380 elem = NULL; | |
381 while ((elem = nvlist_next_nvpair(props, elem)) != NULL) { | |
382 uint64_t intval; | |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
383 char *strval, *slash, *check, *fname; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
384 const char *propname = nvpair_name(elem); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
385 zpool_prop_t prop = zpool_name_to_prop(propname); |
5094 | 386 |
387 switch (prop) { | |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
388 case ZPROP_INVAL: |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
389 if (!zpool_prop_feature(propname)) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
390 error = EINVAL; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
391 break; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
392 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
393 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
394 /* |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
395 * Sanitize the input. |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
396 */ |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
397 if (nvpair_type(elem) != DATA_TYPE_UINT64) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
398 error = EINVAL; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
399 break; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
400 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
401 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
402 if (nvpair_value_uint64(elem, &intval) != 0) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
403 error = EINVAL; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
404 break; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
405 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
406 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
407 if (intval != 0) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
408 error = EINVAL; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
409 break; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
410 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
411 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
412 fname = strchr(propname, '@') + 1; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
413 if (zfeature_lookup_name(fname, NULL) != 0) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
414 error = EINVAL; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
415 break; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
416 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
417 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
418 has_feature = B_TRUE; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
419 break; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
420 |
5094 | 421 case ZPOOL_PROP_VERSION: |
422 error = nvpair_value_uint64(elem, &intval); | |
423 if (!error && | |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
424 (intval < spa_version(spa) || |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
425 intval > SPA_VERSION_BEFORE_FEATURES || |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
426 has_feature)) |
5094 | 427 error = EINVAL; |
428 break; | |
429 | |
430 case ZPOOL_PROP_DELEGATION: | |
431 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
|
432 case ZPOOL_PROP_LISTSNAPS: |
9816
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
433 case ZPOOL_PROP_AUTOEXPAND: |
5094 | 434 error = nvpair_value_uint64(elem, &intval); |
435 if (!error && intval > 1) | |
436 error = EINVAL; | |
437 break; | |
438 | |
439 case ZPOOL_PROP_BOOTFS: | |
9630
e25a03f552e0
6776104 "zfs import" deadlock between spa_unload() and spa_async_thread()
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
9616
diff
changeset
|
440 /* |
e25a03f552e0
6776104 "zfs import" deadlock between spa_unload() and spa_async_thread()
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
9616
diff
changeset
|
441 * If the pool version is less than SPA_VERSION_BOOTFS, |
e25a03f552e0
6776104 "zfs import" deadlock between spa_unload() and spa_async_thread()
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
9616
diff
changeset
|
442 * or the pool is still being created (version == 0), |
e25a03f552e0
6776104 "zfs import" deadlock between spa_unload() and spa_async_thread()
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
9616
diff
changeset
|
443 * the bootfs property cannot be set. |
e25a03f552e0
6776104 "zfs import" deadlock between spa_unload() and spa_async_thread()
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
9616
diff
changeset
|
444 */ |
5094 | 445 if (spa_version(spa) < SPA_VERSION_BOOTFS) { |
446 error = ENOTSUP; | |
447 break; | |
448 } | |
449 | |
450 /* | |
7042
46fc4b6db23e
6721094 Setting certain properties on root pools should not be allowed
gw25295
parents:
6995
diff
changeset
|
451 * Make sure the vdev config is bootable |
5094 | 452 */ |
7042
46fc4b6db23e
6721094 Setting certain properties on root pools should not be allowed
gw25295
parents:
6995
diff
changeset
|
453 if (!vdev_is_bootable(spa->spa_root_vdev)) { |
5094 | 454 error = ENOTSUP; |
455 break; | |
456 } | |
457 | |
458 reset_bootfs = 1; | |
459 | |
460 error = nvpair_value_string(elem, &strval); | |
461 | |
462 if (!error) { | |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
463 objset_t *os; |
7042
46fc4b6db23e
6721094 Setting certain properties on root pools should not be allowed
gw25295
parents:
6995
diff
changeset
|
464 uint64_t compress; |
46fc4b6db23e
6721094 Setting certain properties on root pools should not be allowed
gw25295
parents:
6995
diff
changeset
|
465 |
5094 | 466 if (strval == NULL || strval[0] == '\0') { |
467 objnum = zpool_prop_default_numeric( | |
468 ZPOOL_PROP_BOOTFS); | |
469 break; | |
470 } | |
471 | |
10298
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10100
diff
changeset
|
472 if (error = dmu_objset_hold(strval, FTAG, &os)) |
5094 | 473 break; |
7042
46fc4b6db23e
6721094 Setting certain properties on root pools should not be allowed
gw25295
parents:
6995
diff
changeset
|
474 |
10298
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10100
diff
changeset
|
475 /* Must be ZPL and not gzip compressed. */ |
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10100
diff
changeset
|
476 |
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10100
diff
changeset
|
477 if (dmu_objset_type(os) != DMU_OST_ZFS) { |
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10100
diff
changeset
|
478 error = ENOTSUP; |
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10100
diff
changeset
|
479 } else if ((error = dsl_prop_get_integer(strval, |
7042
46fc4b6db23e
6721094 Setting certain properties on root pools should not be allowed
gw25295
parents:
6995
diff
changeset
|
480 zfs_prop_to_name(ZFS_PROP_COMPRESSION), |
46fc4b6db23e
6721094 Setting certain properties on root pools should not be allowed
gw25295
parents:
6995
diff
changeset
|
481 &compress, NULL)) == 0 && |
46fc4b6db23e
6721094 Setting certain properties on root pools should not be allowed
gw25295
parents:
6995
diff
changeset
|
482 !BOOTFS_COMPRESS_VALID(compress)) { |
46fc4b6db23e
6721094 Setting certain properties on root pools should not be allowed
gw25295
parents:
6995
diff
changeset
|
483 error = ENOTSUP; |
46fc4b6db23e
6721094 Setting certain properties on root pools should not be allowed
gw25295
parents:
6995
diff
changeset
|
484 } else { |
46fc4b6db23e
6721094 Setting certain properties on root pools should not be allowed
gw25295
parents:
6995
diff
changeset
|
485 objnum = dmu_objset_id(os); |
46fc4b6db23e
6721094 Setting certain properties on root pools should not be allowed
gw25295
parents:
6995
diff
changeset
|
486 } |
10298
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10100
diff
changeset
|
487 dmu_objset_rele(os, FTAG); |
5094 | 488 } |
489 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
|
490 |
5329 | 491 case ZPOOL_PROP_FAILUREMODE: |
492 error = nvpair_value_uint64(elem, &intval); | |
493 if (!error && (intval < ZIO_FAILURE_MODE_WAIT || | |
494 intval > ZIO_FAILURE_MODE_PANIC)) | |
495 error = EINVAL; | |
496 | |
497 /* | |
498 * This is a special case which only occurs when | |
499 * the pool has completely failed. This allows | |
500 * the user to change the in-core failmode property | |
501 * without syncing it out to disk (I/Os might | |
502 * currently be blocked). We do this by returning | |
503 * EIO to the caller (spa_prop_set) to trick it | |
504 * into thinking we encountered a property validation | |
505 * error. | |
506 */ | |
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
|
507 if (!error && spa_suspended(spa)) { |
5329 | 508 spa->spa_failmode = intval; |
509 error = EIO; | |
510 } | |
511 break; | |
5363 | 512 |
513 case ZPOOL_PROP_CACHEFILE: | |
514 if ((error = nvpair_value_string(elem, &strval)) != 0) | |
515 break; | |
516 | |
517 if (strval[0] == '\0') | |
518 break; | |
519 | |
520 if (strcmp(strval, "none") == 0) | |
521 break; | |
522 | |
523 if (strval[0] != '/') { | |
524 error = EINVAL; | |
525 break; | |
526 } | |
527 | |
528 slash = strrchr(strval, '/'); | |
529 ASSERT(slash != NULL); | |
530 | |
531 if (slash[1] == '\0' || strcmp(slash, "/.") == 0 || | |
532 strcmp(slash, "/..") == 0) | |
533 error = EINVAL; | |
534 break; | |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
535 |
13525
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
536 case ZPOOL_PROP_COMMENT: |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
537 if ((error = nvpair_value_string(elem, &strval)) != 0) |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
538 break; |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
539 for (check = strval; *check != '\0'; check++) { |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
540 /* |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
541 * The kernel doesn't have an easy isprint() |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
542 * check. For this kernel check, we merely |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
543 * check ASCII apart from DEL. Fix this if |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
544 * there is an easy-to-use kernel isprint(). |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
545 */ |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
546 if (*check >= 0x7f) { |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
547 error = EINVAL; |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
548 break; |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
549 } |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
550 check++; |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
551 } |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
552 if (strlen(strval) > ZPROP_MAX_COMMENT) |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
553 error = E2BIG; |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
554 break; |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
555 |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
556 case ZPOOL_PROP_DEDUPDITTO: |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
557 if (spa_version(spa) < SPA_VERSION_DEDUP) |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
558 error = ENOTSUP; |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
559 else |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
560 error = nvpair_value_uint64(elem, &intval); |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
561 if (error == 0 && |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
562 intval != 0 && intval < ZIO_DEDUPDITTO_MIN) |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
563 error = EINVAL; |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
564 break; |
5094 | 565 } |
566 | |
567 if (error) | |
568 break; | |
569 } | |
570 | |
571 if (!error && reset_bootfs) { | |
572 error = nvlist_remove(props, | |
573 zpool_prop_to_name(ZPOOL_PROP_BOOTFS), DATA_TYPE_STRING); | |
574 | |
575 if (!error) { | |
576 error = nvlist_add_uint64(props, | |
577 zpool_prop_to_name(ZPOOL_PROP_BOOTFS), objnum); | |
578 } | |
579 } | |
580 | |
581 return (error); | |
582 } | |
583 | |
8525
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
584 void |
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
585 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
|
586 { |
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
587 char *cachefile; |
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
588 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
|
589 |
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
590 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
|
591 &cachefile) != 0) |
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
592 return; |
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
593 |
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
594 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
|
595 KM_SLEEP); |
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
596 |
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
597 if (cachefile[0] == '\0') |
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
598 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
|
599 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
|
600 dp->scd_path = NULL; |
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
601 else |
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
602 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
|
603 |
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
604 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
|
605 if (need_sync) |
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
606 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
|
607 } |
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
608 |
5094 | 609 int |
610 spa_prop_set(spa_t *spa, nvlist_t *nvp) | |
611 { | |
612 int error; | |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
613 nvpair_t *elem = NULL; |
8525
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
614 boolean_t need_sync = B_FALSE; |
5094 | 615 |
616 if ((error = spa_prop_validate(spa, nvp)) != 0) | |
617 return (error); | |
618 | |
8525
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
619 while ((elem = nvlist_next_nvpair(nvp, elem)) != NULL) { |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
620 zpool_prop_t prop = zpool_name_to_prop(nvpair_name(elem)); |
8525
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
621 |
13061
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
622 if (prop == ZPOOL_PROP_CACHEFILE || |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
623 prop == ZPOOL_PROP_ALTROOT || |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
624 prop == ZPOOL_PROP_READONLY) |
8525
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
625 continue; |
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
626 |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
627 if (prop == ZPOOL_PROP_VERSION || prop == ZPROP_INVAL) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
628 uint64_t ver; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
629 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
630 if (prop == ZPOOL_PROP_VERSION) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
631 VERIFY(nvpair_value_uint64(elem, &ver) == 0); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
632 } else { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
633 ASSERT(zpool_prop_feature(nvpair_name(elem))); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
634 ver = SPA_VERSION_FEATURES; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
635 need_sync = B_TRUE; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
636 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
637 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
638 /* Save time if the version is already set. */ |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
639 if (ver == spa_version(spa)) |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
640 continue; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
641 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
642 /* |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
643 * In addition to the pool directory object, we might |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
644 * create the pool properties object, the features for |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
645 * read object, the features for write object, or the |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
646 * feature descriptions object. |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
647 */ |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
648 error = dsl_sync_task_do(spa_get_dsl(spa), NULL, |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
649 spa_sync_version, spa, &ver, 6); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
650 if (error) |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
651 return (error); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
652 continue; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
653 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
654 |
8525
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
655 need_sync = B_TRUE; |
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
656 break; |
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
657 } |
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
658 |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
659 if (need_sync) { |
8525
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
660 return (dsl_sync_task_do(spa_get_dsl(spa), NULL, spa_sync_props, |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
661 spa, nvp, 6)); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
662 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
663 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
664 return (0); |
5094 | 665 } |
666 | |
667 /* | |
668 * If the bootfs property value is dsobj, clear it. | |
669 */ | |
670 void | |
671 spa_prop_clear_bootfs(spa_t *spa, uint64_t dsobj, dmu_tx_t *tx) | |
672 { | |
673 if (spa->spa_bootfs == dsobj && spa->spa_pool_props_object != 0) { | |
674 VERIFY(zap_remove(spa->spa_meta_objset, | |
675 spa->spa_pool_props_object, | |
676 zpool_prop_to_name(ZPOOL_PROP_BOOTFS), tx) == 0); | |
677 spa->spa_bootfs = 0; | |
678 } | |
679 } | |
680 | |
13777
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
681 /*ARGSUSED*/ |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
682 static int |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
683 spa_change_guid_check(void *arg1, void *arg2, dmu_tx_t *tx) |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
684 { |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
685 spa_t *spa = arg1; |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
686 uint64_t *newguid = arg2; |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
687 vdev_t *rvd = spa->spa_root_vdev; |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
688 uint64_t vdev_state; |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
689 |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
690 spa_config_enter(spa, SCL_STATE, FTAG, RW_READER); |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
691 vdev_state = rvd->vdev_state; |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
692 spa_config_exit(spa, SCL_STATE, FTAG); |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
693 |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
694 if (vdev_state != VDEV_STATE_HEALTHY) |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
695 return (ENXIO); |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
696 |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
697 ASSERT3U(spa_guid(spa), !=, *newguid); |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
698 |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
699 return (0); |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
700 } |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
701 |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
702 static void |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
703 spa_change_guid_sync(void *arg1, void *arg2, dmu_tx_t *tx) |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
704 { |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
705 spa_t *spa = arg1; |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
706 uint64_t *newguid = arg2; |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
707 uint64_t oldguid; |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
708 vdev_t *rvd = spa->spa_root_vdev; |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
709 |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
710 oldguid = spa_guid(spa); |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
711 |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
712 spa_config_enter(spa, SCL_STATE, FTAG, RW_READER); |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
713 rvd->vdev_guid = *newguid; |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
714 rvd->vdev_guid_sum += (*newguid - oldguid); |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
715 vdev_config_dirty(rvd); |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
716 spa_config_exit(spa, SCL_STATE, FTAG); |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
717 |
13958
1fd91513472c
3561 arc_meta_limit should be exposed via kstats
George Wilson <george.wilson@delphix.com>
parents:
13952
diff
changeset
|
718 spa_history_log_internal(spa, "guid change", tx, "old=%llu new=%llu", |
13777
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
719 oldguid, *newguid); |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
720 } |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
721 |
789 | 722 /* |
13514
417c34452f03
1748 desire support for reguid in zfs
Garrett D'Amore <garrett@nexenta.com>
parents:
13414
diff
changeset
|
723 * Change the GUID for the pool. This is done so that we can later |
417c34452f03
1748 desire support for reguid in zfs
Garrett D'Amore <garrett@nexenta.com>
parents:
13414
diff
changeset
|
724 * re-import a pool built from a clone of our own vdevs. We will modify |
417c34452f03
1748 desire support for reguid in zfs
Garrett D'Amore <garrett@nexenta.com>
parents:
13414
diff
changeset
|
725 * the root vdev's guid, our own pool guid, and then mark all of our |
417c34452f03
1748 desire support for reguid in zfs
Garrett D'Amore <garrett@nexenta.com>
parents:
13414
diff
changeset
|
726 * vdevs dirty. Note that we must make sure that all our vdevs are |
417c34452f03
1748 desire support for reguid in zfs
Garrett D'Amore <garrett@nexenta.com>
parents:
13414
diff
changeset
|
727 * online when we do this, or else any vdevs that weren't present |
417c34452f03
1748 desire support for reguid in zfs
Garrett D'Amore <garrett@nexenta.com>
parents:
13414
diff
changeset
|
728 * would be orphaned from our pool. We are also going to issue a |
417c34452f03
1748 desire support for reguid in zfs
Garrett D'Amore <garrett@nexenta.com>
parents:
13414
diff
changeset
|
729 * sysevent to update any watchers. |
417c34452f03
1748 desire support for reguid in zfs
Garrett D'Amore <garrett@nexenta.com>
parents:
13414
diff
changeset
|
730 */ |
417c34452f03
1748 desire support for reguid in zfs
Garrett D'Amore <garrett@nexenta.com>
parents:
13414
diff
changeset
|
731 int |
417c34452f03
1748 desire support for reguid in zfs
Garrett D'Amore <garrett@nexenta.com>
parents:
13414
diff
changeset
|
732 spa_change_guid(spa_t *spa) |
417c34452f03
1748 desire support for reguid in zfs
Garrett D'Amore <garrett@nexenta.com>
parents:
13414
diff
changeset
|
733 { |
13777
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
734 int error; |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
735 uint64_t guid; |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
736 |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
737 mutex_enter(&spa_namespace_lock); |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
738 guid = spa_generate_guid(NULL); |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
739 |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
740 error = dsl_sync_task_do(spa_get_dsl(spa), spa_change_guid_check, |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
741 spa_change_guid_sync, spa, &guid, 5); |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
742 |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
743 if (error == 0) { |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
744 spa_config_sync(spa, B_FALSE, B_TRUE); |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
745 spa_event_notify(spa, NULL, ESC_ZFS_POOL_REGUID); |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
746 } |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
747 |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
748 mutex_exit(&spa_namespace_lock); |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
749 |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
750 return (error); |
13514
417c34452f03
1748 desire support for reguid in zfs
Garrett D'Amore <garrett@nexenta.com>
parents:
13414
diff
changeset
|
751 } |
417c34452f03
1748 desire support for reguid in zfs
Garrett D'Amore <garrett@nexenta.com>
parents:
13414
diff
changeset
|
752 |
417c34452f03
1748 desire support for reguid in zfs
Garrett D'Amore <garrett@nexenta.com>
parents:
13414
diff
changeset
|
753 /* |
789 | 754 * ========================================================================== |
755 * SPA state manipulation (open/create/destroy/import/export) | |
756 * ========================================================================== | |
757 */ | |
758 | |
1544 | 759 static int |
760 spa_error_entry_compare(const void *a, const void *b) | |
761 { | |
762 spa_error_entry_t *sa = (spa_error_entry_t *)a; | |
763 spa_error_entry_t *sb = (spa_error_entry_t *)b; | |
764 int ret; | |
765 | |
766 ret = bcmp(&sa->se_bookmark, &sb->se_bookmark, | |
767 sizeof (zbookmark_t)); | |
768 | |
769 if (ret < 0) | |
770 return (-1); | |
771 else if (ret > 0) | |
772 return (1); | |
773 else | |
774 return (0); | |
775 } | |
776 | |
777 /* | |
778 * Utility function which retrieves copies of the current logs and | |
779 * re-initializes them in the process. | |
780 */ | |
781 void | |
782 spa_get_errlists(spa_t *spa, avl_tree_t *last, avl_tree_t *scrub) | |
783 { | |
784 ASSERT(MUTEX_HELD(&spa->spa_errlist_lock)); | |
785 | |
786 bcopy(&spa->spa_errlist_last, last, sizeof (avl_tree_t)); | |
787 bcopy(&spa->spa_errlist_scrub, scrub, sizeof (avl_tree_t)); | |
788 | |
789 avl_create(&spa->spa_errlist_scrub, | |
790 spa_error_entry_compare, sizeof (spa_error_entry_t), | |
791 offsetof(spa_error_entry_t, se_avl)); | |
792 avl_create(&spa->spa_errlist_last, | |
793 spa_error_entry_compare, sizeof (spa_error_entry_t), | |
794 offsetof(spa_error_entry_t, se_avl)); | |
795 } | |
796 | |
11173
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
797 static taskq_t * |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
798 spa_taskq_create(spa_t *spa, const char *name, enum zti_modes mode, |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
799 uint_t value) |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
800 { |
13414
b42c1f0432b6
734 taskq_dispatch_prealloc() desired
Garrett D'Amore <garrett@nexenta.com>
parents:
13061
diff
changeset
|
801 uint_t flags = 0; |
11173
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
802 boolean_t batch = B_FALSE; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
803 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
804 switch (mode) { |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
805 case zti_mode_null: |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
806 return (NULL); /* no taskq needed */ |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
807 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
808 case zti_mode_fixed: |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
809 ASSERT3U(value, >=, 1); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
810 value = MAX(value, 1); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
811 break; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
812 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
813 case zti_mode_batch: |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
814 batch = B_TRUE; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
815 flags |= TASKQ_THREADS_CPU_PCT; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
816 value = zio_taskq_batch_pct; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
817 break; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
818 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
819 case zti_mode_online_percent: |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
820 flags |= TASKQ_THREADS_CPU_PCT; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
821 break; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
822 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
823 default: |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
824 panic("unrecognized mode for %s taskq (%u:%u) in " |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
825 "spa_activate()", |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
826 name, mode, value); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
827 break; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
828 } |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
829 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
830 if (zio_taskq_sysdc && spa->spa_proc != &p0) { |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
831 if (batch) |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
832 flags |= TASKQ_DC_BATCH; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
833 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
834 return (taskq_create_sysdc(name, value, 50, INT_MAX, |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
835 spa->spa_proc, zio_taskq_basedc, flags)); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
836 } |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
837 return (taskq_create_proc(name, value, maxclsyspri, 50, INT_MAX, |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
838 spa->spa_proc, flags)); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
839 } |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
840 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
841 static void |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
842 spa_create_zio_taskqs(spa_t *spa) |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
843 { |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
844 for (int t = 0; t < ZIO_TYPES; t++) { |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
845 for (int q = 0; q < ZIO_TASKQ_TYPES; q++) { |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
846 const zio_taskq_info_t *ztip = &zio_taskqs[t][q]; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
847 enum zti_modes mode = ztip->zti_mode; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
848 uint_t value = ztip->zti_value; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
849 char name[32]; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
850 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
851 (void) snprintf(name, sizeof (name), |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
852 "%s_%s", zio_type_name[t], zio_taskq_types[q]); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
853 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
854 spa->spa_zio_taskq[t][q] = |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
855 spa_taskq_create(spa, name, mode, value); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
856 } |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
857 } |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
858 } |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
859 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
860 #ifdef _KERNEL |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
861 static void |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
862 spa_thread(void *arg) |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
863 { |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
864 callb_cpr_t cprinfo; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
865 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
866 spa_t *spa = arg; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
867 user_t *pu = PTOU(curproc); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
868 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
869 CALLB_CPR_INIT(&cprinfo, &spa->spa_proc_lock, callb_generic_cpr, |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
870 spa->spa_name); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
871 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
872 ASSERT(curproc != &p0); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
873 (void) snprintf(pu->u_psargs, sizeof (pu->u_psargs), |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
874 "zpool-%s", spa->spa_name); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
875 (void) strlcpy(pu->u_comm, pu->u_psargs, sizeof (pu->u_comm)); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
876 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
877 /* bind this thread to the requested psrset */ |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
878 if (zio_taskq_psrset_bind != PS_NONE) { |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
879 pool_lock(); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
880 mutex_enter(&cpu_lock); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
881 mutex_enter(&pidlock); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
882 mutex_enter(&curproc->p_lock); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
883 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
884 if (cpupart_bind_thread(curthread, zio_taskq_psrset_bind, |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
885 0, NULL, NULL) == 0) { |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
886 curthread->t_bind_pset = zio_taskq_psrset_bind; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
887 } else { |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
888 cmn_err(CE_WARN, |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
889 "Couldn't bind process for zfs pool \"%s\" to " |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
890 "pset %d\n", spa->spa_name, zio_taskq_psrset_bind); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
891 } |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
892 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
893 mutex_exit(&curproc->p_lock); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
894 mutex_exit(&pidlock); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
895 mutex_exit(&cpu_lock); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
896 pool_unlock(); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
897 } |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
898 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
899 if (zio_taskq_sysdc) { |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
900 sysdc_thread_enter(curthread, 100, 0); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
901 } |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
902 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
903 spa->spa_proc = curproc; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
904 spa->spa_did = curthread->t_did; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
905 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
906 spa_create_zio_taskqs(spa); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
907 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
908 mutex_enter(&spa->spa_proc_lock); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
909 ASSERT(spa->spa_proc_state == SPA_PROC_CREATED); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
910 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
911 spa->spa_proc_state = SPA_PROC_ACTIVE; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
912 cv_broadcast(&spa->spa_proc_cv); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
913 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
914 CALLB_CPR_SAFE_BEGIN(&cprinfo); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
915 while (spa->spa_proc_state == SPA_PROC_ACTIVE) |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
916 cv_wait(&spa->spa_proc_cv, &spa->spa_proc_lock); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
917 CALLB_CPR_SAFE_END(&cprinfo, &spa->spa_proc_lock); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
918 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
919 ASSERT(spa->spa_proc_state == SPA_PROC_DEACTIVATE); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
920 spa->spa_proc_state = SPA_PROC_GONE; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
921 spa->spa_proc = &p0; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
922 cv_broadcast(&spa->spa_proc_cv); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
923 CALLB_CPR_EXIT(&cprinfo); /* drops spa_proc_lock */ |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
924 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
925 mutex_enter(&curproc->p_lock); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
926 lwp_exit(); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
927 } |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
928 #endif |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
929 |
789 | 930 /* |
931 * Activate an uninitialized pool. | |
932 */ | |
933 static void | |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
934 spa_activate(spa_t *spa, int mode) |
789 | 935 { |
936 ASSERT(spa->spa_state == POOL_STATE_UNINITIALIZED); | |
937 | |
938 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
|
939 spa->spa_mode = mode; |
789 | 940 |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
941 spa->spa_normal_class = metaslab_class_create(spa, zfs_metaslab_ops); |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
942 spa->spa_log_class = metaslab_class_create(spa, zfs_metaslab_ops); |
789 | 943 |
11173
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
944 /* Try to create a covering process */ |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
945 mutex_enter(&spa->spa_proc_lock); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
946 ASSERT(spa->spa_proc_state == SPA_PROC_NONE); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
947 ASSERT(spa->spa_proc == &p0); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
948 spa->spa_did = 0; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
949 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
950 /* Only create a process if we're going to be around a while. */ |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
951 if (spa_create_process && strcmp(spa->spa_name, TRYIMPORT_NAME) != 0) { |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
952 if (newproc(spa_thread, (caddr_t)spa, syscid, maxclsyspri, |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
953 NULL, 0) == 0) { |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
954 spa->spa_proc_state = SPA_PROC_CREATED; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
955 while (spa->spa_proc_state == SPA_PROC_CREATED) { |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
956 cv_wait(&spa->spa_proc_cv, |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
957 &spa->spa_proc_lock); |
9515
d3b739d9d043
6586537 async zio taskqs can block out userland commands
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
9512
diff
changeset
|
958 } |
11173
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
959 ASSERT(spa->spa_proc_state == SPA_PROC_ACTIVE); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
960 ASSERT(spa->spa_proc != &p0); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
961 ASSERT(spa->spa_did != 0); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
962 } else { |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
963 #ifdef _KERNEL |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
964 cmn_err(CE_WARN, |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
965 "Couldn't create process for zfs pool \"%s\"\n", |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
966 spa->spa_name); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
967 #endif |
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
|
968 } |
789 | 969 } |
11173
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
970 mutex_exit(&spa->spa_proc_lock); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
971 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
972 /* If we didn't create a process, we need to create our taskqs. */ |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
973 if (spa->spa_proc == &p0) { |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
974 spa_create_zio_taskqs(spa); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
975 } |
789 | 976 |
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
|
977 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
|
978 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
|
979 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
|
980 offsetof(vdev_t, vdev_state_dirty_node)); |
789 | 981 |
982 txg_list_create(&spa->spa_vdev_txg_list, | |
983 offsetof(struct vdev, vdev_txg_node)); | |
1544 | 984 |
985 avl_create(&spa->spa_errlist_scrub, | |
986 spa_error_entry_compare, sizeof (spa_error_entry_t), | |
987 offsetof(spa_error_entry_t, se_avl)); | |
988 avl_create(&spa->spa_errlist_last, | |
989 spa_error_entry_compare, sizeof (spa_error_entry_t), | |
990 offsetof(spa_error_entry_t, se_avl)); | |
789 | 991 } |
992 | |
993 /* | |
994 * Opposite of spa_activate(). | |
995 */ | |
996 static void | |
997 spa_deactivate(spa_t *spa) | |
998 { | |
999 ASSERT(spa->spa_sync_on == B_FALSE); | |
1000 ASSERT(spa->spa_dsl_pool == NULL); | |
1001 ASSERT(spa->spa_root_vdev == NULL); | |
9630
e25a03f552e0
6776104 "zfs import" deadlock between spa_unload() and spa_async_thread()
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
9616
diff
changeset
|
1002 ASSERT(spa->spa_async_zio_root == NULL); |
789 | 1003 ASSERT(spa->spa_state != POOL_STATE_UNINITIALIZED); |
1004 | |
1005 txg_list_destroy(&spa->spa_vdev_txg_list); | |
1006 | |
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
|
1007 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
|
1008 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
|
1009 |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
1010 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
|
1011 for (int q = 0; q < ZIO_TASKQ_TYPES; q++) { |
11146
7e58f40bcb1c
6826241 Sync write IOPS drops dramatically during TXG sync
George Wilson <George.Wilson@Sun.COM>
parents:
11125
diff
changeset
|
1012 if (spa->spa_zio_taskq[t][q] != NULL) |
7e58f40bcb1c
6826241 Sync write IOPS drops dramatically during TXG sync
George Wilson <George.Wilson@Sun.COM>
parents:
11125
diff
changeset
|
1013 taskq_destroy(spa->spa_zio_taskq[t][q]); |
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
|
1014 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
|
1015 } |
789 | 1016 } |
1017 | |
1018 metaslab_class_destroy(spa->spa_normal_class); | |
1019 spa->spa_normal_class = NULL; | |
1020 | |
4527 | 1021 metaslab_class_destroy(spa->spa_log_class); |
1022 spa->spa_log_class = NULL; | |
1023 | |
1544 | 1024 /* |
1025 * If this was part of an import or the open otherwise failed, we may | |
1026 * still have errors left in the queues. Empty them just in case. | |
1027 */ | |
1028 spa_errlog_drain(spa); | |
1029 | |
1030 avl_destroy(&spa->spa_errlist_scrub); | |
1031 avl_destroy(&spa->spa_errlist_last); | |
1032 | |
789 | 1033 spa->spa_state = POOL_STATE_UNINITIALIZED; |
11173
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
1034 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
1035 mutex_enter(&spa->spa_proc_lock); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
1036 if (spa->spa_proc_state != SPA_PROC_NONE) { |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
1037 ASSERT(spa->spa_proc_state == SPA_PROC_ACTIVE); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
1038 spa->spa_proc_state = SPA_PROC_DEACTIVATE; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
1039 cv_broadcast(&spa->spa_proc_cv); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
1040 while (spa->spa_proc_state == SPA_PROC_DEACTIVATE) { |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
1041 ASSERT(spa->spa_proc != &p0); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
1042 cv_wait(&spa->spa_proc_cv, &spa->spa_proc_lock); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
1043 } |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
1044 ASSERT(spa->spa_proc_state == SPA_PROC_GONE); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
1045 spa->spa_proc_state = SPA_PROC_NONE; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
1046 } |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
1047 ASSERT(spa->spa_proc == &p0); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
1048 mutex_exit(&spa->spa_proc_lock); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
1049 |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
1050 /* |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
1051 * We want to make sure spa_thread() has actually exited the ZFS |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
1052 * module, so that the module can't be unloaded out from underneath |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
1053 * it. |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
1054 */ |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
1055 if (spa->spa_did != 0) { |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
1056 thread_join(spa->spa_did); |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
1057 spa->spa_did = 0; |
87f3734e64df
6881015 ZFS write activity prevents other threads from running in a timely manner
Jonathan Adams <Jonathan.Adams@Sun.COM>
parents:
11149
diff
changeset
|
1058 } |
789 | 1059 } |
1060 | |
1061 /* | |
1062 * Verify a pool configuration, and construct the vdev tree appropriately. This | |
1063 * will create all the necessary vdevs in the appropriate layout, with each vdev | |
1064 * in the CLOSED state. This will prep the pool before open/creation/import. | |
1065 * All vdev validation is done by the vdev_alloc() routine. | |
1066 */ | |
2082 | 1067 static int |
1068 spa_config_parse(spa_t *spa, vdev_t **vdp, nvlist_t *nv, vdev_t *parent, | |
1069 uint_t id, int atype) | |
789 | 1070 { |
1071 nvlist_t **child; | |
9816
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
1072 uint_t children; |
2082 | 1073 int error; |
1074 | |
1075 if ((error = vdev_alloc(spa, vdp, nv, parent, id, atype)) != 0) | |
1076 return (error); | |
1077 | |
1078 if ((*vdp)->vdev_ops->vdev_op_leaf) | |
1079 return (0); | |
789 | 1080 |
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
|
1081 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
|
1082 &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
|
1083 |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
1084 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
|
1085 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
|
1086 |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
1087 if (error) { |
2082 | 1088 vdev_free(*vdp); |
1089 *vdp = NULL; | |
1090 return (EINVAL); | |
789 | 1091 } |
1092 | |
9816
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
1093 for (int c = 0; c < children; c++) { |
2082 | 1094 vdev_t *vd; |
1095 if ((error = spa_config_parse(spa, &vd, child[c], *vdp, c, | |
1096 atype)) != 0) { | |
1097 vdev_free(*vdp); | |
1098 *vdp = NULL; | |
1099 return (error); | |
789 | 1100 } |
1101 } | |
1102 | |
2082 | 1103 ASSERT(*vdp != NULL); |
1104 | |
1105 return (0); | |
789 | 1106 } |
1107 | |
1108 /* | |
1109 * Opposite of spa_load(). | |
1110 */ | |
1111 static void | |
1112 spa_unload(spa_t *spa) | |
1113 { | |
2082 | 1114 int i; |
1115 | |
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
|
1116 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
|
1117 |
789 | 1118 /* |
1544 | 1119 * Stop async tasks. |
1120 */ | |
1121 spa_async_suspend(spa); | |
1122 | |
1123 /* | |
789 | 1124 * Stop syncing. |
1125 */ | |
1126 if (spa->spa_sync_on) { | |
1127 txg_sync_stop(spa->spa_dsl_pool); | |
1128 spa->spa_sync_on = B_FALSE; | |
1129 } | |
1130 | |
1131 /* | |
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
|
1132 * Wait for any outstanding async I/O to complete. |
789 | 1133 */ |
9234
bffdc4fc05c4
6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents:
9230
diff
changeset
|
1134 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
|
1135 (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
|
1136 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
|
1137 } |
789 | 1138 |
12470
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
1139 bpobj_close(&spa->spa_deferred_bpobj); |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
1140 |
789 | 1141 /* |
1142 * Close the dsl pool. | |
1143 */ | |
1144 if (spa->spa_dsl_pool) { | |
1145 dsl_pool_close(spa->spa_dsl_pool); | |
1146 spa->spa_dsl_pool = NULL; | |
11619
d3fb7ae6fe56
6909744 dedup should be set to off when a ZVOL is dumpified
George Wilson <George.Wilson@Sun.COM>
parents:
11497
diff
changeset
|
1147 spa->spa_meta_objset = NULL; |
789 | 1148 } |
1149 | |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
1150 ddt_unload(spa); |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
1151 |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
1152 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
|
1153 |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
1154 /* |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
1155 * 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
|
1156 */ |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
1157 spa_l2cache_drop(spa); |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
1158 |
789 | 1159 /* |
1160 * Close all vdevs. | |
1161 */ | |
1585
4ad213e858a9
6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents:
1544
diff
changeset
|
1162 if (spa->spa_root_vdev) |
789 | 1163 vdev_free(spa->spa_root_vdev); |
1585
4ad213e858a9
6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents:
1544
diff
changeset
|
1164 ASSERT(spa->spa_root_vdev == NULL); |
1544 | 1165 |
5450 | 1166 for (i = 0; i < spa->spa_spares.sav_count; i++) |
1167 vdev_free(spa->spa_spares.sav_vdevs[i]); | |
1168 if (spa->spa_spares.sav_vdevs) { | |
1169 kmem_free(spa->spa_spares.sav_vdevs, | |
1170 spa->spa_spares.sav_count * sizeof (void *)); | |
1171 spa->spa_spares.sav_vdevs = NULL; | |
1172 } | |
1173 if (spa->spa_spares.sav_config) { | |
1174 nvlist_free(spa->spa_spares.sav_config); | |
1175 spa->spa_spares.sav_config = NULL; | |
2082 | 1176 } |
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
|
1177 spa->spa_spares.sav_count = 0; |
5450 | 1178 |
13574
d0fde6cacaac
1951 leaking a vdev when removing an l2cache device
George Wilson <george.wilson@delphix.com>
parents:
13573
diff
changeset
|
1179 for (i = 0; i < spa->spa_l2cache.sav_count; i++) { |
d0fde6cacaac
1951 leaking a vdev when removing an l2cache device
George Wilson <george.wilson@delphix.com>
parents:
13573
diff
changeset
|
1180 vdev_clear_stats(spa->spa_l2cache.sav_vdevs[i]); |
5450 | 1181 vdev_free(spa->spa_l2cache.sav_vdevs[i]); |
13574
d0fde6cacaac
1951 leaking a vdev when removing an l2cache device
George Wilson <george.wilson@delphix.com>
parents:
13573
diff
changeset
|
1182 } |
5450 | 1183 if (spa->spa_l2cache.sav_vdevs) { |
1184 kmem_free(spa->spa_l2cache.sav_vdevs, | |
1185 spa->spa_l2cache.sav_count * sizeof (void *)); | |
1186 spa->spa_l2cache.sav_vdevs = NULL; | |
1187 } | |
1188 if (spa->spa_l2cache.sav_config) { | |
1189 nvlist_free(spa->spa_l2cache.sav_config); | |
1190 spa->spa_l2cache.sav_config = NULL; | |
2082 | 1191 } |
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
|
1192 spa->spa_l2cache.sav_count = 0; |
2082 | 1193 |
1544 | 1194 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
|
1195 |
13525
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
1196 if (spa->spa_comment != NULL) { |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
1197 spa_strfree(spa->spa_comment); |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
1198 spa->spa_comment = NULL; |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
1199 } |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
1200 |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
1201 spa_config_exit(spa, SCL_ALL, FTAG); |
789 | 1202 } |
1203 | |
1204 /* | |
2082 | 1205 * Load (or re-load) the current list of vdevs describing the active spares for |
1206 * this pool. When this is called, we have some form of basic information in | |
5450 | 1207 * 'spa_spares.sav_config'. We parse this into vdevs, try to open them, and |
1208 * then re-generate a more complete list including status information. | |
2082 | 1209 */ |
1210 static void | |
1211 spa_load_spares(spa_t *spa) | |
1212 { | |
1213 nvlist_t **spares; | |
1214 uint_t nspares; | |
1215 int i; | |
3377
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
1216 vdev_t *vd, *tvd; |
2082 | 1217 |
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
|
1218 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
|
1219 |
2082 | 1220 /* |
1221 * First, close and free any existing spare vdevs. | |
1222 */ | |
5450 | 1223 for (i = 0; i < spa->spa_spares.sav_count; i++) { |
1224 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
|
1225 |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
1226 /* 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
|
1227 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
|
1228 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
|
1229 spa_spare_remove(tvd); |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
1230 vdev_close(vd); |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
1231 vdev_free(vd); |
2082 | 1232 } |
3377
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
1233 |
5450 | 1234 if (spa->spa_spares.sav_vdevs) |
1235 kmem_free(spa->spa_spares.sav_vdevs, | |
1236 spa->spa_spares.sav_count * sizeof (void *)); | |
1237 | |
1238 if (spa->spa_spares.sav_config == NULL) | |
2082 | 1239 nspares = 0; |
1240 else | |
5450 | 1241 VERIFY(nvlist_lookup_nvlist_array(spa->spa_spares.sav_config, |
2082 | 1242 ZPOOL_CONFIG_SPARES, &spares, &nspares) == 0); |
1243 | |
5450 | 1244 spa->spa_spares.sav_count = (int)nspares; |
1245 spa->spa_spares.sav_vdevs = NULL; | |
2082 | 1246 |
1247 if (nspares == 0) | |
1248 return; | |
1249 | |
1250 /* | |
1251 * 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
|
1252 * 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
|
1253 * 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
|
1254 * 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
|
1255 * 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
|
1256 * 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
|
1257 * active configuration, then we also mark this vdev as an active spare. |
2082 | 1258 */ |
5450 | 1259 spa->spa_spares.sav_vdevs = kmem_alloc(nspares * sizeof (void *), |
1260 KM_SLEEP); | |
1261 for (i = 0; i < spa->spa_spares.sav_count; i++) { | |
2082 | 1262 VERIFY(spa_config_parse(spa, &vd, spares[i], NULL, 0, |
1263 VDEV_ALLOC_SPARE) == 0); | |
1264 ASSERT(vd != NULL); | |
1265 | |
5450 | 1266 spa->spa_spares.sav_vdevs[i] = vd; |
2082 | 1267 |
6643
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
1268 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
|
1269 B_FALSE)) != NULL) { |
3377
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
1270 if (!tvd->vdev_isspare) |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
1271 spa_spare_add(tvd); |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
1272 |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
1273 /* |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
1274 * 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
|
1275 * 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
|
1276 * 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
|
1277 * 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
|
1278 * is actively in use. |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
1279 * |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
1280 * 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
|
1281 * 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
|
1282 * 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
|
1283 * 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
|
1284 * it adds, we ignore the possibility. |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
1285 */ |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
1286 if (!vdev_is_dead(tvd)) |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
1287 spa_spare_activate(tvd); |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
1288 } |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
1289 |
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
|
1290 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
|
1291 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
|
1292 |
2082 | 1293 if (vdev_open(vd) != 0) |
1294 continue; | |
1295 | |
5450 | 1296 if (vdev_validate_aux(vd) == 0) |
1297 spa_spare_add(vd); | |
2082 | 1298 } |
1299 | |
1300 /* | |
1301 * Recompute the stashed list of spares, with status information | |
1302 * this time. | |
1303 */ | |
5450 | 1304 VERIFY(nvlist_remove(spa->spa_spares.sav_config, ZPOOL_CONFIG_SPARES, |
2082 | 1305 DATA_TYPE_NVLIST_ARRAY) == 0); |
1306 | |
5450 | 1307 spares = kmem_alloc(spa->spa_spares.sav_count * sizeof (void *), |
1308 KM_SLEEP); | |
1309 for (i = 0; i < spa->spa_spares.sav_count; i++) | |
1310 spares[i] = vdev_config_generate(spa, | |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
1311 spa->spa_spares.sav_vdevs[i], B_TRUE, VDEV_CONFIG_SPARE); |
5450 | 1312 VERIFY(nvlist_add_nvlist_array(spa->spa_spares.sav_config, |
1313 ZPOOL_CONFIG_SPARES, spares, spa->spa_spares.sav_count) == 0); | |
1314 for (i = 0; i < spa->spa_spares.sav_count; i++) | |
2082 | 1315 nvlist_free(spares[i]); |
5450 | 1316 kmem_free(spares, spa->spa_spares.sav_count * sizeof (void *)); |
1317 } | |
1318 | |
1319 /* | |
1320 * Load (or re-load) the current list of vdevs describing the active l2cache for | |
1321 * this pool. When this is called, we have some form of basic information in | |
1322 * 'spa_l2cache.sav_config'. We parse this into vdevs, try to open them, and | |
1323 * then re-generate a more complete list including status information. | |
1324 * Devices which are already active have their details maintained, and are | |
1325 * not re-opened. | |
1326 */ | |
1327 static void | |
1328 spa_load_l2cache(spa_t *spa) | |
1329 { | |
1330 nvlist_t **l2cache; | |
1331 uint_t nl2cache; | |
1332 int i, j, oldnvdevs; | |
9816
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
1333 uint64_t guid; |
5450 | 1334 vdev_t *vd, **oldvdevs, **newvdevs; |
1335 spa_aux_vdev_t *sav = &spa->spa_l2cache; | |
1336 | |
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
|
1337 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
|
1338 |
5450 | 1339 if (sav->sav_config != NULL) { |
1340 VERIFY(nvlist_lookup_nvlist_array(sav->sav_config, | |
1341 ZPOOL_CONFIG_L2CACHE, &l2cache, &nl2cache) == 0); | |
1342 newvdevs = kmem_alloc(nl2cache * sizeof (void *), KM_SLEEP); | |
1343 } else { | |
1344 nl2cache = 0; | |
13952
7a22d0770fc8
3522 zfs module should not allow uninitialized variables
George Wilson <george.wilson@delphix.com>
parents:
13941
diff
changeset
|
1345 newvdevs = NULL; |
5450 | 1346 } |
1347 | |
1348 oldvdevs = sav->sav_vdevs; | |
1349 oldnvdevs = sav->sav_count; | |
1350 sav->sav_vdevs = NULL; | |
1351 sav->sav_count = 0; | |
1352 | |
1353 /* | |
1354 * Process new nvlist of vdevs. | |
1355 */ | |
1356 for (i = 0; i < nl2cache; i++) { | |
1357 VERIFY(nvlist_lookup_uint64(l2cache[i], ZPOOL_CONFIG_GUID, | |
1358 &guid) == 0); | |
1359 | |
1360 newvdevs[i] = NULL; | |
1361 for (j = 0; j < oldnvdevs; j++) { | |
1362 vd = oldvdevs[j]; | |
1363 if (vd != NULL && guid == vd->vdev_guid) { | |
1364 /* | |
1365 * Retain previous vdev for add/remove ops. | |
1366 */ | |
1367 newvdevs[i] = vd; | |
1368 oldvdevs[j] = NULL; | |
1369 break; | |
1370 } | |
1371 } | |
1372 | |
1373 if (newvdevs[i] == NULL) { | |
1374 /* | |
1375 * Create new vdev | |
1376 */ | |
1377 VERIFY(spa_config_parse(spa, &vd, l2cache[i], NULL, 0, | |
1378 VDEV_ALLOC_L2CACHE) == 0); | |
1379 ASSERT(vd != NULL); | |
1380 newvdevs[i] = vd; | |
1381 | |
1382 /* | |
1383 * Commit this vdev as an l2cache device, | |
1384 * even if it fails to open. | |
1385 */ | |
1386 spa_l2cache_add(vd); | |
1387 | |
6643
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
1388 vd->vdev_top = vd; |
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
1389 vd->vdev_aux = sav; |
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
1390 |
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
1391 spa_l2cache_activate(vd); |
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
1392 |
5450 | 1393 if (vdev_open(vd) != 0) |
1394 continue; | |
1395 | |
1396 (void) vdev_validate_aux(vd); | |
1397 | |
9816
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
1398 if (!vdev_is_dead(vd)) |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
1399 l2arc_add_vdev(spa, vd); |
5450 | 1400 } |
1401 } | |
1402 | |
1403 /* | |
1404 * Purge vdevs that were dropped | |
1405 */ | |
1406 for (i = 0; i < oldnvdevs; i++) { | |
1407 uint64_t pool; | |
1408 | |
1409 vd = oldvdevs[i]; | |
1410 if (vd != NULL) { | |
13574
d0fde6cacaac
1951 leaking a vdev when removing an l2cache device
George Wilson <george.wilson@delphix.com>
parents:
13573
diff
changeset
|
1411 ASSERT(vd->vdev_isl2cache); |
d0fde6cacaac
1951 leaking a vdev when removing an l2cache device
George Wilson <george.wilson@delphix.com>
parents:
13573
diff
changeset
|
1412 |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
1413 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
|
1414 pool != 0ULL && l2arc_vdev_present(vd)) |
5450 | 1415 l2arc_remove_vdev(vd); |
13574
d0fde6cacaac
1951 leaking a vdev when removing an l2cache device
George Wilson <george.wilson@delphix.com>
parents:
13573
diff
changeset
|
1416 vdev_clear_stats(vd); |
d0fde6cacaac
1951 leaking a vdev when removing an l2cache device
George Wilson <george.wilson@delphix.com>
parents:
13573
diff
changeset
|
1417 vdev_free(vd); |
5450 | 1418 } |
1419 } | |
1420 | |
1421 if (oldvdevs) | |
1422 kmem_free(oldvdevs, oldnvdevs * sizeof (void *)); | |
1423 | |
1424 if (sav->sav_config == NULL) | |
1425 goto out; | |
1426 | |
1427 sav->sav_vdevs = newvdevs; | |
1428 sav->sav_count = (int)nl2cache; | |
1429 | |
1430 /* | |
1431 * Recompute the stashed list of l2cache devices, with status | |
1432 * information this time. | |
1433 */ | |
1434 VERIFY(nvlist_remove(sav->sav_config, ZPOOL_CONFIG_L2CACHE, | |
1435 DATA_TYPE_NVLIST_ARRAY) == 0); | |
1436 | |
1437 l2cache = kmem_alloc(sav->sav_count * sizeof (void *), KM_SLEEP); | |
1438 for (i = 0; i < sav->sav_count; i++) | |
1439 l2cache[i] = vdev_config_generate(spa, | |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
1440 sav->sav_vdevs[i], B_TRUE, VDEV_CONFIG_L2CACHE); |
5450 | 1441 VERIFY(nvlist_add_nvlist_array(sav->sav_config, |
1442 ZPOOL_CONFIG_L2CACHE, l2cache, sav->sav_count) == 0); | |
1443 out: | |
1444 for (i = 0; i < sav->sav_count; i++) | |
1445 nvlist_free(l2cache[i]); | |
1446 if (sav->sav_count) | |
1447 kmem_free(l2cache, sav->sav_count * sizeof (void *)); | |
2082 | 1448 } |
1449 | |
1450 static int | |
1451 load_nvlist(spa_t *spa, uint64_t obj, nvlist_t **value) | |
1452 { | |
1453 dmu_buf_t *db; | |
1454 char *packed = NULL; | |
1455 size_t nvsize = 0; | |
1456 int error; | |
1457 *value = NULL; | |
1458 | |
1459 VERIFY(0 == dmu_bonus_hold(spa->spa_meta_objset, obj, FTAG, &db)); | |
1460 nvsize = *(uint64_t *)db->db_data; | |
1461 dmu_buf_rele(db, FTAG); | |
1462 | |
1463 packed = kmem_alloc(nvsize, KM_SLEEP); | |
9512
64cafcbcc337
6801810 Commit of aligned streaming rewrites to ZIL device causes unwanted disk reads
Neil Perrin <Neil.Perrin@Sun.COM>
parents:
9480
diff
changeset
|
1464 error = dmu_read(spa->spa_meta_objset, obj, 0, nvsize, packed, |
64cafcbcc337
6801810 Commit of aligned streaming rewrites to ZIL device causes unwanted disk reads
Neil Perrin <Neil.Perrin@Sun.COM>
parents:
9480
diff
changeset
|
1465 DMU_READ_PREFETCH); |
2082 | 1466 if (error == 0) |
1467 error = nvlist_unpack(packed, nvsize, value, 0); | |
1468 kmem_free(packed, nvsize); | |
1469 | |
1470 return (error); | |
1471 } | |
1472 | |
1473 /* | |
4451 | 1474 * Checks to see if the given vdev could not be opened, in which case we post a |
1475 * sysevent to notify the autoreplace code that the device has been removed. | |
1476 */ | |
1477 static void | |
1478 spa_check_removed(vdev_t *vd) | |
1479 { | |
9816
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
1480 for (int c = 0; c < vd->vdev_children; c++) |
4451 | 1481 spa_check_removed(vd->vdev_child[c]); |
1482 | |
1483 if (vd->vdev_ops->vdev_op_leaf && vdev_is_dead(vd)) { | |
1484 zfs_post_autoreplace(vd->vdev_spa, vd); | |
1485 spa_event_notify(vd->vdev_spa, vd, ESC_ZFS_VDEV_CHECK); | |
1486 } | |
1487 } | |
1488 | |
1489 /* | |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1490 * Validate the current config against the MOS config |
9701
cc5b64682e64
6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents:
9630
diff
changeset
|
1491 */ |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1492 static boolean_t |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1493 spa_config_valid(spa_t *spa, nvlist_t *config) |
9701
cc5b64682e64
6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents:
9630
diff
changeset
|
1494 { |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1495 vdev_t *mrvd, *rvd = spa->spa_root_vdev; |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1496 nvlist_t *nv; |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1497 |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1498 VERIFY(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, &nv) == 0); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1499 |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1500 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1501 VERIFY(spa_config_parse(spa, &mrvd, nv, NULL, 0, VDEV_ALLOC_LOAD) == 0); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1502 |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1503 ASSERT3U(rvd->vdev_children, ==, mrvd->vdev_children); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1504 |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1505 /* |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1506 * If we're doing a normal import, then build up any additional |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1507 * diagnostic information about missing devices in this config. |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1508 * We'll pass this up to the user for further processing. |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1509 */ |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1510 if (!(spa->spa_import_flags & ZFS_IMPORT_MISSING_LOG)) { |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1511 nvlist_t **child, *nv; |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1512 uint64_t idx = 0; |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1513 |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1514 child = kmem_alloc(rvd->vdev_children * sizeof (nvlist_t **), |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1515 KM_SLEEP); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1516 VERIFY(nvlist_alloc(&nv, NV_UNIQUE_NAME, KM_SLEEP) == 0); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1517 |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1518 for (int c = 0; c < rvd->vdev_children; c++) { |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1519 vdev_t *tvd = rvd->vdev_child[c]; |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1520 vdev_t *mtvd = mrvd->vdev_child[c]; |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1521 |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1522 if (tvd->vdev_ops == &vdev_missing_ops && |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1523 mtvd->vdev_ops != &vdev_missing_ops && |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1524 mtvd->vdev_islog) |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1525 child[idx++] = vdev_config_generate(spa, mtvd, |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1526 B_FALSE, 0); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1527 } |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1528 |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1529 if (idx) { |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1530 VERIFY(nvlist_add_nvlist_array(nv, |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1531 ZPOOL_CONFIG_CHILDREN, child, idx) == 0); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1532 VERIFY(nvlist_add_nvlist(spa->spa_load_info, |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1533 ZPOOL_CONFIG_MISSING_DEVICES, nv) == 0); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1534 |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1535 for (int i = 0; i < idx; i++) |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1536 nvlist_free(child[i]); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1537 } |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1538 nvlist_free(nv); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1539 kmem_free(child, rvd->vdev_children * sizeof (char **)); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1540 } |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
1541 |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
1542 /* |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1543 * Compare the root vdev tree with the information we have |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1544 * from the MOS config (mrvd). Check each top-level vdev |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1545 * with the corresponding MOS config top-level (mtvd). |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
1546 */ |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
1547 for (int c = 0; c < rvd->vdev_children; c++) { |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1548 vdev_t *tvd = rvd->vdev_child[c]; |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1549 vdev_t *mtvd = mrvd->vdev_child[c]; |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1550 |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1551 /* |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1552 * Resolve any "missing" vdevs in the current configuration. |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1553 * If we find that the MOS config has more accurate information |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1554 * about the top-level vdev then use that vdev instead. |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1555 */ |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1556 if (tvd->vdev_ops == &vdev_missing_ops && |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1557 mtvd->vdev_ops != &vdev_missing_ops) { |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1558 |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1559 if (!(spa->spa_import_flags & ZFS_IMPORT_MISSING_LOG)) |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1560 continue; |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1561 |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1562 /* |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1563 * Device specific actions. |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1564 */ |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1565 if (mtvd->vdev_islog) { |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1566 spa_set_log_state(spa, SPA_LOG_CLEAR); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1567 } else { |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1568 /* |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1569 * XXX - once we have 'readonly' pool |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1570 * support we should be able to handle |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1571 * missing data devices by transitioning |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1572 * the pool to readonly. |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1573 */ |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1574 continue; |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1575 } |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1576 |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1577 /* |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1578 * Swap the missing vdev with the data we were |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1579 * able to obtain from the MOS config. |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1580 */ |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1581 vdev_remove_child(rvd, tvd); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1582 vdev_remove_child(mrvd, mtvd); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1583 |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1584 vdev_add_child(rvd, mtvd); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1585 vdev_add_child(mrvd, tvd); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1586 |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1587 spa_config_exit(spa, SCL_ALL, FTAG); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1588 vdev_load(mtvd); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1589 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1590 |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1591 vdev_reopen(rvd); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1592 } else if (mtvd->vdev_islog) { |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1593 /* |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1594 * Load the slog device's state from the MOS config |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1595 * since it's possible that the label does not |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1596 * contain the most up-to-date information. |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1597 */ |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1598 vdev_load_log_state(tvd, mtvd); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1599 vdev_reopen(tvd); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1600 } |
9701
cc5b64682e64
6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents:
9630
diff
changeset
|
1601 } |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1602 vdev_free(mrvd); |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
1603 spa_config_exit(spa, SCL_ALL, FTAG); |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1604 |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1605 /* |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1606 * Ensure we were able to validate the config. |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1607 */ |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1608 return (rvd->vdev_guid_sum == spa->spa_uberblock.ub_guid_sum); |
9701
cc5b64682e64
6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents:
9630
diff
changeset
|
1609 } |
cc5b64682e64
6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents:
9630
diff
changeset
|
1610 |
cc5b64682e64
6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents:
9630
diff
changeset
|
1611 /* |
7294 | 1612 * Check for missing log devices |
1613 */ | |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1614 static int |
7294 | 1615 spa_check_logs(spa_t *spa) |
1616 { | |
1617 switch (spa->spa_log_state) { | |
1618 case SPA_LOG_MISSING: | |
1619 /* need to recheck in case slog has been restored */ | |
1620 case SPA_LOG_UNKNOWN: | |
1621 if (dmu_objset_find(spa->spa_name, zil_check_log_chain, NULL, | |
1622 DS_FIND_CHILDREN)) { | |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1623 spa_set_log_state(spa, SPA_LOG_MISSING); |
7294 | 1624 return (1); |
1625 } | |
1626 break; | |
1627 } | |
1628 return (0); | |
1629 } | |
1630 | |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1631 static boolean_t |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1632 spa_passivate_log(spa_t *spa) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1633 { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1634 vdev_t *rvd = spa->spa_root_vdev; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1635 boolean_t slog_found = B_FALSE; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1636 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1637 ASSERT(spa_config_held(spa, SCL_ALLOC, RW_WRITER)); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1638 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1639 if (!spa_has_slogs(spa)) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1640 return (B_FALSE); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1641 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1642 for (int c = 0; c < rvd->vdev_children; c++) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1643 vdev_t *tvd = rvd->vdev_child[c]; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1644 metaslab_group_t *mg = tvd->vdev_mg; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1645 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1646 if (tvd->vdev_islog) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1647 metaslab_group_passivate(mg); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1648 slog_found = B_TRUE; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1649 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1650 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1651 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1652 return (slog_found); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1653 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1654 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1655 static void |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1656 spa_activate_log(spa_t *spa) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1657 { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1658 vdev_t *rvd = spa->spa_root_vdev; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1659 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1660 ASSERT(spa_config_held(spa, SCL_ALLOC, RW_WRITER)); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1661 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1662 for (int c = 0; c < rvd->vdev_children; c++) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1663 vdev_t *tvd = rvd->vdev_child[c]; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1664 metaslab_group_t *mg = tvd->vdev_mg; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1665 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1666 if (tvd->vdev_islog) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1667 metaslab_group_activate(mg); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1668 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1669 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1670 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1671 int |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1672 spa_offline_log(spa_t *spa) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1673 { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1674 int error = 0; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1675 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1676 if ((error = dmu_objset_find(spa_name(spa), zil_vdev_offline, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1677 NULL, DS_FIND_CHILDREN)) == 0) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1678 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1679 /* |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1680 * We successfully offlined the log device, sync out the |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1681 * current txg so that the "stubby" block can be removed |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1682 * by zil_sync(). |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1683 */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1684 txg_wait_synced(spa->spa_dsl_pool, 0); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1685 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1686 return (error); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1687 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1688 |
10672
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
1689 static void |
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
1690 spa_aux_check_removed(spa_aux_vdev_t *sav) |
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
1691 { |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
1692 for (int i = 0; i < sav->sav_count; i++) |
10672
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
1693 spa_check_removed(sav->sav_vdevs[i]); |
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
1694 } |
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
1695 |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
1696 void |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
1697 spa_claim_notify(zio_t *zio) |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
1698 { |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
1699 spa_t *spa = zio->io_spa; |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
1700 |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
1701 if (zio->io_error) |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
1702 return; |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
1703 |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
1704 mutex_enter(&spa->spa_props_lock); /* any mutex will do */ |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
1705 if (spa->spa_claim_max_txg < zio->io_bp->blk_birth) |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
1706 spa->spa_claim_max_txg = zio->io_bp->blk_birth; |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
1707 mutex_exit(&spa->spa_props_lock); |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
1708 } |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
1709 |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1710 typedef struct spa_load_error { |
11727
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
1711 uint64_t sle_meta_count; |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1712 uint64_t sle_data_count; |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1713 } spa_load_error_t; |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1714 |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1715 static void |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1716 spa_load_verify_done(zio_t *zio) |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1717 { |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1718 blkptr_t *bp = zio->io_bp; |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1719 spa_load_error_t *sle = zio->io_private; |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1720 dmu_object_type_t type = BP_GET_TYPE(bp); |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1721 int error = zio->io_error; |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1722 |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1723 if (error) { |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
1724 if ((BP_GET_LEVEL(bp) != 0 || DMU_OT_IS_METADATA(type)) && |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1725 type != DMU_OT_INTENT_LOG) |
11727
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
1726 atomic_add_64(&sle->sle_meta_count, 1); |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1727 else |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1728 atomic_add_64(&sle->sle_data_count, 1); |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1729 } |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1730 zio_data_buf_free(zio->io_data, zio->io_size); |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1731 } |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1732 |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1733 /*ARGSUSED*/ |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1734 static int |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
1735 spa_load_verify_cb(spa_t *spa, zilog_t *zilog, const blkptr_t *bp, |
13941
d48547176ab4
3498 panic in arc_read(): !refcount_is_zero(&pbuf->b_hdr->b_refcnt)
George Wilson <george.wilson@delphix.com>
parents:
13886
diff
changeset
|
1736 const zbookmark_t *zb, const dnode_phys_t *dnp, void *arg) |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1737 { |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1738 if (bp != NULL) { |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1739 zio_t *rio = arg; |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1740 size_t size = BP_GET_PSIZE(bp); |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1741 void *data = zio_data_buf_alloc(size); |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1742 |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1743 zio_nowait(zio_read(rio, spa, bp, data, size, |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1744 spa_load_verify_done, rio->io_private, ZIO_PRIORITY_SCRUB, |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1745 ZIO_FLAG_SPECULATIVE | ZIO_FLAG_CANFAIL | |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1746 ZIO_FLAG_SCRUB | ZIO_FLAG_RAW, zb)); |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1747 } |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1748 return (0); |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1749 } |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1750 |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1751 static int |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1752 spa_load_verify(spa_t *spa) |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1753 { |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1754 zio_t *rio; |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1755 spa_load_error_t sle = { 0 }; |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1756 zpool_rewind_policy_t policy; |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1757 boolean_t verify_ok = B_FALSE; |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1758 int error; |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1759 |
11727
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
1760 zpool_get_rewind_policy(spa->spa_config, &policy); |
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
1761 |
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
1762 if (policy.zrp_request & ZPOOL_NEVER_REWIND) |
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
1763 return (0); |
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
1764 |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1765 rio = zio_root(spa, NULL, &sle, |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1766 ZIO_FLAG_CANFAIL | ZIO_FLAG_SPECULATIVE); |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1767 |
11125
fca3e6d28599
6899923 vdev_offline/vdev_add deadlock
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
11041
diff
changeset
|
1768 error = traverse_pool(spa, spa->spa_verify_min_txg, |
fca3e6d28599
6899923 vdev_offline/vdev_add deadlock
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
11041
diff
changeset
|
1769 TRAVERSE_PRE | TRAVERSE_PREFETCH, spa_load_verify_cb, rio); |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1770 |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1771 (void) zio_wait(rio); |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1772 |
11727
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
1773 spa->spa_load_meta_errors = sle.sle_meta_count; |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1774 spa->spa_load_data_errors = sle.sle_data_count; |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1775 |
11727
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
1776 if (!error && sle.sle_meta_count <= policy.zrp_maxmeta && |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1777 sle.sle_data_count <= policy.zrp_maxdata) { |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1778 int64_t loss = 0; |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1779 |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1780 verify_ok = B_TRUE; |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1781 spa->spa_load_txg = spa->spa_uberblock.ub_txg; |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1782 spa->spa_load_txg_ts = spa->spa_uberblock.ub_timestamp; |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1783 |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1784 loss = spa->spa_last_ubsync_txg_ts - spa->spa_load_txg_ts; |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1785 VERIFY(nvlist_add_uint64(spa->spa_load_info, |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1786 ZPOOL_CONFIG_LOAD_TIME, spa->spa_load_txg_ts) == 0); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1787 VERIFY(nvlist_add_int64(spa->spa_load_info, |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1788 ZPOOL_CONFIG_REWIND_TIME, loss) == 0); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1789 VERIFY(nvlist_add_uint64(spa->spa_load_info, |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1790 ZPOOL_CONFIG_LOAD_DATA_ERRORS, sle.sle_data_count) == 0); |
11026
e8e10df16a8f
6899159 injection isn't trashing pools
Tim Haley <Tim.Haley@Sun.COM>
parents:
11022
diff
changeset
|
1791 } else { |
e8e10df16a8f
6899159 injection isn't trashing pools
Tim Haley <Tim.Haley@Sun.COM>
parents:
11022
diff
changeset
|
1792 spa->spa_load_max_txg = spa->spa_uberblock.ub_txg; |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1793 } |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1794 |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1795 if (error) { |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1796 if (error != ENXIO && error != EIO) |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1797 error = EIO; |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1798 return (error); |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1799 } |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1800 |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1801 return (verify_ok ? 0 : EIO); |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1802 } |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
1803 |
7294 | 1804 /* |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1805 * Find a value in the pool props object. |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1806 */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1807 static void |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1808 spa_prop_find(spa_t *spa, zpool_prop_t prop, uint64_t *val) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1809 { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1810 (void) zap_lookup(spa->spa_meta_objset, spa->spa_pool_props_object, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1811 zpool_prop_to_name(prop), sizeof (uint64_t), 1, val); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1812 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1813 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1814 /* |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1815 * Find a value in the pool directory object. |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1816 */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1817 static int |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1818 spa_dir_prop(spa_t *spa, const char *name, uint64_t *val) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1819 { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1820 return (zap_lookup(spa->spa_meta_objset, DMU_POOL_DIRECTORY_OBJECT, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1821 name, sizeof (uint64_t), 1, val)); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1822 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1823 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1824 static int |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1825 spa_vdev_err(vdev_t *vdev, vdev_aux_t aux, int err) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1826 { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1827 vdev_set_state(vdev, B_TRUE, VDEV_STATE_CANT_OPEN, aux); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1828 return (err); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1829 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1830 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1831 /* |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1832 * Fix up config after a partly-completed split. This is done with the |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1833 * ZPOOL_CONFIG_SPLIT nvlist. Both the splitting pool and the split-off |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1834 * pool have that entry in their config, but only the splitting one contains |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1835 * a list of all the guids of the vdevs that are being split off. |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1836 * |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1837 * This function determines what to do with that list: either rejoin |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1838 * all the disks to the pool, or complete the splitting process. To attempt |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1839 * the rejoin, each disk that is offlined is marked online again, and |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1840 * we do a reopen() call. If the vdev label for every disk that was |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1841 * marked online indicates it was successfully split off (VDEV_AUX_SPLIT_POOL) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1842 * then we call vdev_split() on each disk, and complete the split. |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1843 * |
11497
69b45e632792
6698011 zfs incorrectly reports file systems as children when attempting a rename
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11422
diff
changeset
|
1844 * Otherwise we leave the config alone, with all the vdevs in place in |
69b45e632792
6698011 zfs incorrectly reports file systems as children when attempting a rename
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11422
diff
changeset
|
1845 * the original pool. |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1846 */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1847 static void |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1848 spa_try_repair(spa_t *spa, nvlist_t *config) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1849 { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1850 uint_t extracted; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1851 uint64_t *glist; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1852 uint_t i, gcount; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1853 nvlist_t *nvl; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1854 vdev_t **vd; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1855 boolean_t attempt_reopen; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1856 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1857 if (nvlist_lookup_nvlist(config, ZPOOL_CONFIG_SPLIT, &nvl) != 0) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1858 return; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1859 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1860 /* check that the config is complete */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1861 if (nvlist_lookup_uint64_array(nvl, ZPOOL_CONFIG_SPLIT_LIST, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1862 &glist, &gcount) != 0) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1863 return; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1864 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1865 vd = kmem_zalloc(gcount * sizeof (vdev_t *), KM_SLEEP); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1866 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1867 /* attempt to online all the vdevs & validate */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1868 attempt_reopen = B_TRUE; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1869 for (i = 0; i < gcount; i++) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1870 if (glist[i] == 0) /* vdev is hole */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1871 continue; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1872 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1873 vd[i] = spa_lookup_by_guid(spa, glist[i], B_FALSE); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1874 if (vd[i] == NULL) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1875 /* |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1876 * Don't bother attempting to reopen the disks; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1877 * just do the split. |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1878 */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1879 attempt_reopen = B_FALSE; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1880 } else { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1881 /* attempt to re-online it */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1882 vd[i]->vdev_offline = B_FALSE; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1883 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1884 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1885 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1886 if (attempt_reopen) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1887 vdev_reopen(spa->spa_root_vdev); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1888 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1889 /* check each device to see what state it's in */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1890 for (extracted = 0, i = 0; i < gcount; i++) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1891 if (vd[i] != NULL && |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1892 vd[i]->vdev_stat.vs_aux != VDEV_AUX_SPLIT_POOL) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1893 break; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1894 ++extracted; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1895 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1896 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1897 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1898 /* |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1899 * If every disk has been moved to the new pool, or if we never |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1900 * even attempted to look at them, then we split them off for |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1901 * good. |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1902 */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1903 if (!attempt_reopen || gcount == extracted) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1904 for (i = 0; i < gcount; i++) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1905 if (vd[i] != NULL) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1906 vdev_split(vd[i]); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1907 vdev_reopen(spa->spa_root_vdev); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1908 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1909 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1910 kmem_free(vd, gcount * sizeof (vdev_t *)); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1911 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1912 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1913 static int |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1914 spa_load(spa_t *spa, spa_load_state_t state, spa_import_type_t type, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1915 boolean_t mosconfig) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1916 { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1917 nvlist_t *config = spa->spa_config; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1918 char *ereport = FM_EREPORT_ZFS_POOL; |
13525
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
1919 char *comment; |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1920 int error; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1921 uint64_t pool_guid; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1922 nvlist_t *nvl; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1923 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1924 if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID, &pool_guid)) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1925 return (EINVAL); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1926 |
13525
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
1927 ASSERT(spa->spa_comment == NULL); |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
1928 if (nvlist_lookup_string(config, ZPOOL_CONFIG_COMMENT, &comment) == 0) |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
1929 spa->spa_comment = spa_strdup(comment); |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
1930 |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1931 /* |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1932 * Versioning wasn't explicitly added to the label until later, so if |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1933 * it's not present treat it as the initial version. |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1934 */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1935 if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1936 &spa->spa_ubsync.ub_version) != 0) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1937 spa->spa_ubsync.ub_version = SPA_VERSION_INITIAL; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1938 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1939 (void) nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_TXG, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1940 &spa->spa_config_txg); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1941 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1942 if ((state == SPA_LOAD_IMPORT || state == SPA_LOAD_TRYIMPORT) && |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1943 spa_guid_exists(pool_guid, 0)) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1944 error = EEXIST; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1945 } else { |
13514
417c34452f03
1748 desire support for reguid in zfs
Garrett D'Amore <garrett@nexenta.com>
parents:
13414
diff
changeset
|
1946 spa->spa_config_guid = pool_guid; |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1947 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1948 if (nvlist_lookup_nvlist(config, ZPOOL_CONFIG_SPLIT, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1949 &nvl) == 0) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1950 VERIFY(nvlist_dup(nvl, &spa->spa_config_splitting, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1951 KM_SLEEP) == 0); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1952 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1953 |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
1954 nvlist_free(spa->spa_load_info); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
1955 spa->spa_load_info = fnvlist_alloc(); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
1956 |
12829
0336e913b141
6937608 ZFS DE should ignore ereports prior to pool import
Tim Haley <Tim.Haley@Sun.COM>
parents:
12600
diff
changeset
|
1957 gethrestime(&spa->spa_loaded_ts); |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1958 error = spa_load_impl(spa, pool_guid, config, state, type, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1959 mosconfig, &ereport); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1960 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1961 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1962 spa->spa_minref = refcount_count(&spa->spa_refcount); |
12829
0336e913b141
6937608 ZFS DE should ignore ereports prior to pool import
Tim Haley <Tim.Haley@Sun.COM>
parents:
12600
diff
changeset
|
1963 if (error) { |
0336e913b141
6937608 ZFS DE should ignore ereports prior to pool import
Tim Haley <Tim.Haley@Sun.COM>
parents:
12600
diff
changeset
|
1964 if (error != EEXIST) { |
0336e913b141
6937608 ZFS DE should ignore ereports prior to pool import
Tim Haley <Tim.Haley@Sun.COM>
parents:
12600
diff
changeset
|
1965 spa->spa_loaded_ts.tv_sec = 0; |
0336e913b141
6937608 ZFS DE should ignore ereports prior to pool import
Tim Haley <Tim.Haley@Sun.COM>
parents:
12600
diff
changeset
|
1966 spa->spa_loaded_ts.tv_nsec = 0; |
0336e913b141
6937608 ZFS DE should ignore ereports prior to pool import
Tim Haley <Tim.Haley@Sun.COM>
parents:
12600
diff
changeset
|
1967 } |
0336e913b141
6937608 ZFS DE should ignore ereports prior to pool import
Tim Haley <Tim.Haley@Sun.COM>
parents:
12600
diff
changeset
|
1968 if (error != EBADF) { |
0336e913b141
6937608 ZFS DE should ignore ereports prior to pool import
Tim Haley <Tim.Haley@Sun.COM>
parents:
12600
diff
changeset
|
1969 zfs_ereport_post(ereport, spa, NULL, NULL, 0, 0); |
0336e913b141
6937608 ZFS DE should ignore ereports prior to pool import
Tim Haley <Tim.Haley@Sun.COM>
parents:
12600
diff
changeset
|
1970 } |
0336e913b141
6937608 ZFS DE should ignore ereports prior to pool import
Tim Haley <Tim.Haley@Sun.COM>
parents:
12600
diff
changeset
|
1971 } |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1972 spa->spa_load_state = error ? SPA_LOAD_ERROR : SPA_LOAD_NONE; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1973 spa->spa_ena = 0; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1974 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1975 return (error); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1976 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1977 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1978 /* |
789 | 1979 * Load an existing storage pool, using the pool's builtin spa_config as a |
1544 | 1980 * source of configuration information. |
789 | 1981 */ |
1982 static int | |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1983 spa_load_impl(spa_t *spa, uint64_t pool_guid, nvlist_t *config, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1984 spa_load_state_t state, spa_import_type_t type, boolean_t mosconfig, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1985 char **ereport) |
789 | 1986 { |
1987 int error = 0; | |
11810
0a50367f8035
6923102 spa_load_impl() leaks nvconfig if type is SPA_IMPORT_ASSEMBLE
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11727
diff
changeset
|
1988 nvlist_t *nvroot = NULL; |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
1989 nvlist_t *label; |
789 | 1990 vdev_t *rvd; |
1991 uberblock_t *ub = &spa->spa_uberblock; | |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
1992 uint64_t children, config_cache_txg = spa->spa_config_txg; |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
1993 int orig_mode = spa->spa_mode; |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
1994 int parse; |
12470
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
1995 uint64_t obj; |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
1996 boolean_t missing_feat_write = B_FALSE; |
789 | 1997 |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
1998 /* |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
1999 * 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
|
2000 * 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
|
2001 */ |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
2002 if (!mosconfig) |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
2003 spa->spa_mode = FREAD; |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
2004 |
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
|
2005 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
|
2006 |
1544 | 2007 spa->spa_load_state = state; |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
2008 |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2009 if (nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, &nvroot)) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2010 return (EINVAL); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2011 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2012 parse = (type == SPA_IMPORT_EXISTING ? |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2013 VDEV_ALLOC_LOAD : VDEV_ALLOC_SPLIT); |
2174
73de7a781492
6433717 offline devices should not be marked persistently unavailble
eschrock
parents:
2082
diff
changeset
|
2014 |
789 | 2015 /* |
9234
bffdc4fc05c4
6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents:
9230
diff
changeset
|
2016 * 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
|
2017 */ |
9630
e25a03f552e0
6776104 "zfs import" deadlock between spa_unload() and spa_async_thread()
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
9616
diff
changeset
|
2018 spa->spa_async_zio_root = zio_root(spa, NULL, NULL, |
e25a03f552e0
6776104 "zfs import" deadlock between spa_unload() and spa_async_thread()
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
9616
diff
changeset
|
2019 ZIO_FLAG_CANFAIL | ZIO_FLAG_SPECULATIVE | ZIO_FLAG_GODFATHER); |
9234
bffdc4fc05c4
6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents:
9230
diff
changeset
|
2020 |
bffdc4fc05c4
6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents:
9230
diff
changeset
|
2021 /* |
2082 | 2022 * Parse the configuration into a vdev tree. We explicitly set the |
2023 * value that will be returned by spa_version() since parsing the | |
2024 * configuration requires knowing the version number. | |
789 | 2025 */ |
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
|
2026 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2027 error = spa_config_parse(spa, &rvd, nvroot, NULL, 0, parse); |
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
|
2028 spa_config_exit(spa, SCL_ALL, FTAG); |
789 | 2029 |
2082 | 2030 if (error != 0) |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2031 return (error); |
789 | 2032 |
1585
4ad213e858a9
6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents:
1544
diff
changeset
|
2033 ASSERT(spa->spa_root_vdev == rvd); |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2034 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2035 if (type != SPA_IMPORT_ASSEMBLE) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2036 ASSERT(spa_guid(spa) == pool_guid); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2037 } |
789 | 2038 |
2039 /* | |
2040 * Try to open all vdevs, loading each label in the process. | |
2041 */ | |
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
|
2042 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
|
2043 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
|
2044 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
|
2045 if (error != 0) |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2046 return (error); |
789 | 2047 |
2048 /* | |
9276
a8a7fc849933
6816124 System crash running zpool destroy on broken zpool
Mark J Musante <Mark.Musante@Sun.COM>
parents:
9234
diff
changeset
|
2049 * 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
|
2050 * 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
|
2051 * mosconfig is true then we're validating the vdev labels based on |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2052 * that config. Otherwise, we're validating against the cached config |
9276
a8a7fc849933
6816124 System crash running zpool destroy on broken zpool
Mark J Musante <Mark.Musante@Sun.COM>
parents:
9234
diff
changeset
|
2053 * (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
|
2054 * 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
|
2055 * the vdev config. |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2056 * |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2057 * If we're assembling a new pool that's been split off from an |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2058 * existing pool, the labels haven't yet been updated so we skip |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2059 * validation for now. |
1986
628267397204
6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents:
1807
diff
changeset
|
2060 */ |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2061 if (type != SPA_IMPORT_ASSEMBLE) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2062 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); |
13573
72c96cded60f
1949 crash during reguid causes stale config
George Wilson <george.wilson@delphix.com>
parents:
13570
diff
changeset
|
2063 error = vdev_validate(rvd, mosconfig); |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2064 spa_config_exit(spa, SCL_ALL, FTAG); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2065 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2066 if (error != 0) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2067 return (error); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2068 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2069 if (rvd->vdev_state <= VDEV_STATE_CANT_OPEN) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2070 return (ENXIO); |
1986
628267397204
6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents:
1807
diff
changeset
|
2071 } |
628267397204
6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents:
1807
diff
changeset
|
2072 |
628267397204
6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents:
1807
diff
changeset
|
2073 /* |
789 | 2074 * Find the best uberblock. |
2075 */ | |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2076 vdev_uberblock_load(rvd, ub, &label); |
789 | 2077 |
2078 /* | |
2079 * If we weren't able to find a single valid uberblock, return failure. | |
2080 */ | |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2081 if (ub->ub_txg == 0) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2082 nvlist_free(label); |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2083 return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, ENXIO)); |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2084 } |
1544 | 2085 |
2086 /* | |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2087 * If the pool has an unsupported version we can't open it. |
1544 | 2088 */ |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2089 if (!SPA_VERSION_IS_SUPPORTED(ub->ub_version)) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2090 nvlist_free(label); |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2091 return (spa_vdev_err(rvd, VDEV_AUX_VERSION_NEWER, ENOTSUP)); |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2092 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2093 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2094 if (ub->ub_version >= SPA_VERSION_FEATURES) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2095 nvlist_t *features; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2096 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2097 /* |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2098 * If we weren't able to find what's necessary for reading the |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2099 * MOS in the label, return failure. |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2100 */ |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2101 if (label == NULL || nvlist_lookup_nvlist(label, |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2102 ZPOOL_CONFIG_FEATURES_FOR_READ, &features) != 0) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2103 nvlist_free(label); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2104 return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2105 ENXIO)); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2106 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2107 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2108 /* |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2109 * Update our in-core representation with the definitive values |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2110 * from the label. |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2111 */ |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2112 nvlist_free(spa->spa_label_features); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2113 VERIFY(nvlist_dup(features, &spa->spa_label_features, 0) == 0); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2114 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2115 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2116 nvlist_free(label); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2117 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2118 /* |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2119 * Look through entries in the label nvlist's features_for_read. If |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2120 * there is a feature listed there which we don't understand then we |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2121 * cannot open a pool. |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2122 */ |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2123 if (ub->ub_version >= SPA_VERSION_FEATURES) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2124 nvlist_t *unsup_feat; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2125 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2126 VERIFY(nvlist_alloc(&unsup_feat, NV_UNIQUE_NAME, KM_SLEEP) == |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2127 0); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2128 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2129 for (nvpair_t *nvp = nvlist_next_nvpair(spa->spa_label_features, |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2130 NULL); nvp != NULL; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2131 nvp = nvlist_next_nvpair(spa->spa_label_features, nvp)) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2132 if (!zfeature_is_supported(nvpair_name(nvp))) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2133 VERIFY(nvlist_add_string(unsup_feat, |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2134 nvpair_name(nvp), "") == 0); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2135 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2136 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2137 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2138 if (!nvlist_empty(unsup_feat)) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2139 VERIFY(nvlist_add_nvlist(spa->spa_load_info, |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2140 ZPOOL_CONFIG_UNSUP_FEAT, unsup_feat) == 0); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2141 nvlist_free(unsup_feat); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2142 return (spa_vdev_err(rvd, VDEV_AUX_UNSUP_FEAT, |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2143 ENOTSUP)); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2144 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2145 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2146 nvlist_free(unsup_feat); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2147 } |
789 | 2148 |
2149 /* | |
2150 * If the vdev guid sum doesn't match the uberblock, we have an | |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2151 * incomplete configuration. We first check to see if the pool |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2152 * is aware of the complete config (i.e ZPOOL_CONFIG_VDEV_CHILDREN). |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2153 * If it is, defer the vdev_guid_sum check till later so we |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2154 * can handle missing vdevs. |
789 | 2155 */ |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2156 if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_VDEV_CHILDREN, |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2157 &children) != 0 && mosconfig && type != SPA_IMPORT_ASSEMBLE && |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2158 rvd->vdev_guid_sum != ub->ub_guid_sum) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2159 return (spa_vdev_err(rvd, VDEV_AUX_BAD_GUID_SUM, ENXIO)); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2160 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2161 if (type != SPA_IMPORT_ASSEMBLE && spa->spa_config_splitting) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2162 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2163 spa_try_repair(spa, config); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2164 spa_config_exit(spa, SCL_ALL, FTAG); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2165 nvlist_free(spa->spa_config_splitting); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2166 spa->spa_config_splitting = NULL; |
789 | 2167 } |
2168 | |
2169 /* | |
2170 * Initialize internal SPA structures. | |
2171 */ | |
2172 spa->spa_state = POOL_STATE_ACTIVE; | |
2173 spa->spa_ubsync = spa->spa_uberblock; | |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2174 spa->spa_verify_min_txg = spa->spa_extreme_rewind ? |
11727
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
2175 TXG_INITIAL - 1 : spa_last_synced_txg(spa) - TXG_DEFER_SIZE - 1; |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2176 spa->spa_first_txg = spa->spa_last_ubsync_txg ? |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2177 spa->spa_last_ubsync_txg : spa_last_synced_txg(spa) + 1; |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
2178 spa->spa_claim_max_txg = spa->spa_first_txg; |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
2179 spa->spa_prev_software_version = ub->ub_software_version; |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
2180 |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2181 error = dsl_pool_init(spa, spa->spa_first_txg, &spa->spa_dsl_pool); |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2182 if (error) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2183 return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); |
789 | 2184 spa->spa_meta_objset = spa->spa_dsl_pool->dp_meta_objset; |
2185 | |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2186 if (spa_dir_prop(spa, DMU_POOL_CONFIG, &spa->spa_config_object) != 0) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2187 return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2188 |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2189 if (spa_version(spa) >= SPA_VERSION_FEATURES) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2190 boolean_t missing_feat_read = B_FALSE; |
13753
2aba784c276b
2762 zpool command should have better support for feature flags
Christopher Siden <chris.siden@delphix.com>
parents:
13743
diff
changeset
|
2191 nvlist_t *unsup_feat, *enabled_feat; |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2192 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2193 if (spa_dir_prop(spa, DMU_POOL_FEATURES_FOR_READ, |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2194 &spa->spa_feat_for_read_obj) != 0) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2195 return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2196 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2197 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2198 if (spa_dir_prop(spa, DMU_POOL_FEATURES_FOR_WRITE, |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2199 &spa->spa_feat_for_write_obj) != 0) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2200 return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2201 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2202 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2203 if (spa_dir_prop(spa, DMU_POOL_FEATURE_DESCRIPTIONS, |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2204 &spa->spa_feat_desc_obj) != 0) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2205 return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2206 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2207 |
13753
2aba784c276b
2762 zpool command should have better support for feature flags
Christopher Siden <chris.siden@delphix.com>
parents:
13743
diff
changeset
|
2208 enabled_feat = fnvlist_alloc(); |
2aba784c276b
2762 zpool command should have better support for feature flags
Christopher Siden <chris.siden@delphix.com>
parents:
13743
diff
changeset
|
2209 unsup_feat = fnvlist_alloc(); |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2210 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2211 if (!feature_is_supported(spa->spa_meta_objset, |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2212 spa->spa_feat_for_read_obj, spa->spa_feat_desc_obj, |
13753
2aba784c276b
2762 zpool command should have better support for feature flags
Christopher Siden <chris.siden@delphix.com>
parents:
13743
diff
changeset
|
2213 unsup_feat, enabled_feat)) |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2214 missing_feat_read = B_TRUE; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2215 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2216 if (spa_writeable(spa) || state == SPA_LOAD_TRYIMPORT) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2217 if (!feature_is_supported(spa->spa_meta_objset, |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2218 spa->spa_feat_for_write_obj, spa->spa_feat_desc_obj, |
13753
2aba784c276b
2762 zpool command should have better support for feature flags
Christopher Siden <chris.siden@delphix.com>
parents:
13743
diff
changeset
|
2219 unsup_feat, enabled_feat)) { |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2220 missing_feat_write = B_TRUE; |
13753
2aba784c276b
2762 zpool command should have better support for feature flags
Christopher Siden <chris.siden@delphix.com>
parents:
13743
diff
changeset
|
2221 } |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2222 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2223 |
13753
2aba784c276b
2762 zpool command should have better support for feature flags
Christopher Siden <chris.siden@delphix.com>
parents:
13743
diff
changeset
|
2224 fnvlist_add_nvlist(spa->spa_load_info, |
2aba784c276b
2762 zpool command should have better support for feature flags
Christopher Siden <chris.siden@delphix.com>
parents:
13743
diff
changeset
|
2225 ZPOOL_CONFIG_ENABLED_FEAT, enabled_feat); |
2aba784c276b
2762 zpool command should have better support for feature flags
Christopher Siden <chris.siden@delphix.com>
parents:
13743
diff
changeset
|
2226 |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2227 if (!nvlist_empty(unsup_feat)) { |
13753
2aba784c276b
2762 zpool command should have better support for feature flags
Christopher Siden <chris.siden@delphix.com>
parents:
13743
diff
changeset
|
2228 fnvlist_add_nvlist(spa->spa_load_info, |
2aba784c276b
2762 zpool command should have better support for feature flags
Christopher Siden <chris.siden@delphix.com>
parents:
13743
diff
changeset
|
2229 ZPOOL_CONFIG_UNSUP_FEAT, unsup_feat); |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2230 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2231 |
13753
2aba784c276b
2762 zpool command should have better support for feature flags
Christopher Siden <chris.siden@delphix.com>
parents:
13743
diff
changeset
|
2232 fnvlist_free(enabled_feat); |
2aba784c276b
2762 zpool command should have better support for feature flags
Christopher Siden <chris.siden@delphix.com>
parents:
13743
diff
changeset
|
2233 fnvlist_free(unsup_feat); |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2234 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2235 if (!missing_feat_read) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2236 fnvlist_add_boolean(spa->spa_load_info, |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2237 ZPOOL_CONFIG_CAN_RDONLY); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2238 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2239 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2240 /* |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2241 * If the state is SPA_LOAD_TRYIMPORT, our objective is |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2242 * twofold: to determine whether the pool is available for |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2243 * import in read-write mode and (if it is not) whether the |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2244 * pool is available for import in read-only mode. If the pool |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2245 * is available for import in read-write mode, it is displayed |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2246 * as available in userland; if it is not available for import |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2247 * in read-only mode, it is displayed as unavailable in |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2248 * userland. If the pool is available for import in read-only |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2249 * mode but not read-write mode, it is displayed as unavailable |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2250 * in userland with a special note that the pool is actually |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2251 * available for open in read-only mode. |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2252 * |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2253 * As a result, if the state is SPA_LOAD_TRYIMPORT and we are |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2254 * missing a feature for write, we must first determine whether |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2255 * the pool can be opened read-only before returning to |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2256 * userland in order to know whether to display the |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2257 * abovementioned note. |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2258 */ |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2259 if (missing_feat_read || (missing_feat_write && |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2260 spa_writeable(spa))) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2261 return (spa_vdev_err(rvd, VDEV_AUX_UNSUP_FEAT, |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2262 ENOTSUP)); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2263 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2264 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2265 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2266 spa->spa_is_initializing = B_TRUE; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2267 error = dsl_pool_open(spa->spa_dsl_pool); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2268 spa->spa_is_initializing = B_FALSE; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2269 if (error != 0) |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2270 return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2271 |
789 | 2272 if (!mosconfig) { |
3975
6674f5d79069
6282725 hostname/hostid should be stored in the label
ek110237
parents:
3912
diff
changeset
|
2273 uint64_t hostid; |
11810
0a50367f8035
6923102 spa_load_impl() leaks nvconfig if type is SPA_IMPORT_ASSEMBLE
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11727
diff
changeset
|
2274 nvlist_t *policy = NULL, *nvconfig; |
0a50367f8035
6923102 spa_load_impl() leaks nvconfig if type is SPA_IMPORT_ASSEMBLE
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11727
diff
changeset
|
2275 |
0a50367f8035
6923102 spa_load_impl() leaks nvconfig if type is SPA_IMPORT_ASSEMBLE
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11727
diff
changeset
|
2276 if (load_nvlist(spa, spa->spa_config_object, &nvconfig) != 0) |
0a50367f8035
6923102 spa_load_impl() leaks nvconfig if type is SPA_IMPORT_ASSEMBLE
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11727
diff
changeset
|
2277 return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); |
2082 | 2278 |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
2279 if (!spa_is_root(spa) && nvlist_lookup_uint64(nvconfig, |
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
|
2280 ZPOOL_CONFIG_HOSTID, &hostid) == 0) { |
3975
6674f5d79069
6282725 hostname/hostid should be stored in the label
ek110237
parents:
3912
diff
changeset
|
2281 char *hostname; |
6674f5d79069
6282725 hostname/hostid should be stored in the label
ek110237
parents:
3912
diff
changeset
|
2282 unsigned long myhostid = 0; |
6674f5d79069
6282725 hostname/hostid should be stored in the label
ek110237
parents:
3912
diff
changeset
|
2283 |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
2284 VERIFY(nvlist_lookup_string(nvconfig, |
3975
6674f5d79069
6282725 hostname/hostid should be stored in the label
ek110237
parents:
3912
diff
changeset
|
2285 ZPOOL_CONFIG_HOSTNAME, &hostname) == 0); |
6674f5d79069
6282725 hostname/hostid should be stored in the label
ek110237
parents:
3912
diff
changeset
|
2286 |
8662
18153249ee93
PSARC/2008/647 Configurable Hostids for Non-Global Zones
jv227347 <Jordan.Vaughan@Sun.com>
parents:
8525
diff
changeset
|
2287 #ifdef _KERNEL |
18153249ee93
PSARC/2008/647 Configurable Hostids for Non-Global Zones
jv227347 <Jordan.Vaughan@Sun.com>
parents:
8525
diff
changeset
|
2288 myhostid = zone_get_hostid(NULL); |
18153249ee93
PSARC/2008/647 Configurable Hostids for Non-Global Zones
jv227347 <Jordan.Vaughan@Sun.com>
parents:
8525
diff
changeset
|
2289 #else /* _KERNEL */ |
18153249ee93
PSARC/2008/647 Configurable Hostids for Non-Global Zones
jv227347 <Jordan.Vaughan@Sun.com>
parents:
8525
diff
changeset
|
2290 /* |
18153249ee93
PSARC/2008/647 Configurable Hostids for Non-Global Zones
jv227347 <Jordan.Vaughan@Sun.com>
parents:
8525
diff
changeset
|
2291 * 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
|
2292 * 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
|
2293 */ |
3975
6674f5d79069
6282725 hostname/hostid should be stored in the label
ek110237
parents:
3912
diff
changeset
|
2294 (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
|
2295 #endif /* _KERNEL */ |
4178
ad95fd86760b
6553537 zfs root fails to boot from a snv_63+zfsboot-pfinstall netinstall image
lling
parents:
4070
diff
changeset
|
2296 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
|
2297 hostid != myhostid) { |
11810
0a50367f8035
6923102 spa_load_impl() leaks nvconfig if type is SPA_IMPORT_ASSEMBLE
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11727
diff
changeset
|
2298 nvlist_free(nvconfig); |
3975
6674f5d79069
6282725 hostname/hostid should be stored in the label
ek110237
parents:
3912
diff
changeset
|
2299 cmn_err(CE_WARN, "pool '%s' could not be " |
6674f5d79069
6282725 hostname/hostid should be stored in the label
ek110237
parents:
3912
diff
changeset
|
2300 "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
|
2301 "another system (host: %s hostid: 0x%lx). " |
13605
b5c2b5db80d6
763 FMD msg URLs should refer to something visible
Joshua M. Clulow <josh@sysmgr.org>
parents:
13574
diff
changeset
|
2302 "See: http://illumos.org/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
|
2303 spa_name(spa), hostname, |
3975
6674f5d79069
6282725 hostname/hostid should be stored in the label
ek110237
parents:
3912
diff
changeset
|
2304 (unsigned long)hostid); |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2305 return (EBADF); |
3975
6674f5d79069
6282725 hostname/hostid should be stored in the label
ek110237
parents:
3912
diff
changeset
|
2306 } |
6674f5d79069
6282725 hostname/hostid should be stored in the label
ek110237
parents:
3912
diff
changeset
|
2307 } |
11727
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
2308 if (nvlist_lookup_nvlist(spa->spa_config, |
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
2309 ZPOOL_REWIND_POLICY, &policy) == 0) |
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
2310 VERIFY(nvlist_add_nvlist(nvconfig, |
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
2311 ZPOOL_REWIND_POLICY, policy) == 0); |
3975
6674f5d79069
6282725 hostname/hostid should be stored in the label
ek110237
parents:
3912
diff
changeset
|
2312 |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
2313 spa_config_set(spa, nvconfig); |
789 | 2314 spa_unload(spa); |
2315 spa_deactivate(spa); | |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
2316 spa_activate(spa, orig_mode); |
789 | 2317 |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2318 return (spa_load(spa, state, SPA_IMPORT_EXISTING, B_TRUE)); |
1544 | 2319 } |
2320 | |
12470
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
2321 if (spa_dir_prop(spa, DMU_POOL_SYNC_BPOBJ, &obj) != 0) |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
2322 return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
2323 error = bpobj_open(&spa->spa_deferred_bpobj, spa->spa_meta_objset, obj); |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
2324 if (error != 0) |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2325 return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); |
789 | 2326 |
1544 | 2327 /* |
2082 | 2328 * Load the bit that tells us to use the new accounting function |
2329 * (raid-z deflation). If we have an older pool, this will not | |
2330 * be present. | |
2331 */ | |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2332 error = spa_dir_prop(spa, DMU_POOL_DEFLATE, &spa->spa_deflate); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2333 if (error != 0 && error != ENOENT) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2334 return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); |
2082 | 2335 |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
2336 error = spa_dir_prop(spa, DMU_POOL_CREATION_VERSION, |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
2337 &spa->spa_creation_version); |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
2338 if (error != 0 && error != ENOENT) |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
2339 return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
2340 |
2082 | 2341 /* |
1544 | 2342 * Load the persistent error log. If we have an older pool, this will |
2343 * not be present. | |
2344 */ | |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2345 error = spa_dir_prop(spa, DMU_POOL_ERRLOG_LAST, &spa->spa_errlog_last); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2346 if (error != 0 && error != ENOENT) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2347 return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2348 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2349 error = spa_dir_prop(spa, DMU_POOL_ERRLOG_SCRUB, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2350 &spa->spa_errlog_scrub); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2351 if (error != 0 && error != ENOENT) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2352 return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); |
789 | 2353 |
2354 /* | |
2926 | 2355 * Load the history object. If we have an older pool, this |
2356 * will not be present. | |
2357 */ | |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2358 error = spa_dir_prop(spa, DMU_POOL_HISTORY, &spa->spa_history); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2359 if (error != 0 && error != ENOENT) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2360 return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2361 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2362 /* |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2363 * If we're assembling the pool from the split-off vdevs of |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2364 * an existing pool, we don't want to attach the spares & cache |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2365 * devices. |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2366 */ |
2926 | 2367 |
2368 /* | |
2082 | 2369 * Load any hot spares for this pool. |
2370 */ | |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2371 error = spa_dir_prop(spa, DMU_POOL_SPARES, &spa->spa_spares.sav_object); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2372 if (error != 0 && error != ENOENT) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2373 return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2374 if (error == 0 && type != SPA_IMPORT_ASSEMBLE) { |
4577 | 2375 ASSERT(spa_version(spa) >= SPA_VERSION_SPARES); |
5450 | 2376 if (load_nvlist(spa, spa->spa_spares.sav_object, |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2377 &spa->spa_spares.sav_config) != 0) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2378 return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); |
2082 | 2379 |
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
|
2380 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); |
2082 | 2381 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
|
2382 spa_config_exit(spa, SCL_ALL, FTAG); |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2383 } else if (error == 0) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2384 spa->spa_spares.sav_sync = B_TRUE; |
2082 | 2385 } |
2386 | |
5450 | 2387 /* |
2388 * Load any level 2 ARC devices for this pool. | |
2389 */ | |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2390 error = spa_dir_prop(spa, DMU_POOL_L2CACHE, |
5450 | 2391 &spa->spa_l2cache.sav_object); |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2392 if (error != 0 && error != ENOENT) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2393 return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2394 if (error == 0 && type != SPA_IMPORT_ASSEMBLE) { |
5450 | 2395 ASSERT(spa_version(spa) >= SPA_VERSION_L2CACHE); |
2396 if (load_nvlist(spa, spa->spa_l2cache.sav_object, | |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2397 &spa->spa_l2cache.sav_config) != 0) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2398 return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); |
5450 | 2399 |
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
|
2400 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); |
5450 | 2401 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
|
2402 spa_config_exit(spa, SCL_ALL, FTAG); |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2403 } else if (error == 0) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2404 spa->spa_l2cache.sav_sync = B_TRUE; |
5450 | 2405 } |
2406 | |
5094 | 2407 spa->spa_delegation = zpool_prop_default_numeric(ZPOOL_PROP_DELEGATION); |
4543 | 2408 |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2409 error = spa_dir_prop(spa, DMU_POOL_PROPS, &spa->spa_pool_props_object); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2410 if (error && error != ENOENT) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2411 return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); |
3912 | 2412 |
2413 if (error == 0) { | |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2414 uint64_t autoreplace; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2415 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2416 spa_prop_find(spa, ZPOOL_PROP_BOOTFS, &spa->spa_bootfs); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2417 spa_prop_find(spa, ZPOOL_PROP_AUTOREPLACE, &autoreplace); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2418 spa_prop_find(spa, ZPOOL_PROP_DELEGATION, &spa->spa_delegation); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2419 spa_prop_find(spa, ZPOOL_PROP_FAILUREMODE, &spa->spa_failmode); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2420 spa_prop_find(spa, ZPOOL_PROP_AUTOEXPAND, &spa->spa_autoexpand); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2421 spa_prop_find(spa, ZPOOL_PROP_DEDUPDITTO, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2422 &spa->spa_dedup_ditto); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2423 |
10672
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
2424 spa->spa_autoreplace = (autoreplace != 0); |
3912 | 2425 } |
2426 | |
2082 | 2427 /* |
4451 | 2428 * If the 'autoreplace' property is set, then post a resource notifying |
2429 * the ZFS DE that it should not issue any faults for unopenable | |
2430 * devices. We also iterate over the vdevs, and post a sysevent for any | |
2431 * unopenable vdevs so that the normal autoreplace handler can take | |
2432 * over. | |
2433 */ | |
10672
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
2434 if (spa->spa_autoreplace && state != SPA_LOAD_TRYIMPORT) { |
4451 | 2435 spa_check_removed(spa->spa_root_vdev); |
10672
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
2436 /* |
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
2437 * For the import case, this is done in spa_import(), because |
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
2438 * at this point we're using the spare definitions from |
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
2439 * the MOS config, not necessarily from the userland config. |
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
2440 */ |
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
2441 if (state != SPA_LOAD_IMPORT) { |
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
2442 spa_aux_check_removed(&spa->spa_spares); |
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
2443 spa_aux_check_removed(&spa->spa_l2cache); |
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
2444 } |
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
2445 } |
4451 | 2446 |
2447 /* | |
1986
628267397204
6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents:
1807
diff
changeset
|
2448 * Load the vdev state for all toplevel vdevs. |
789 | 2449 */ |
1986
628267397204
6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents:
1807
diff
changeset
|
2450 vdev_load(rvd); |
789 | 2451 |
2452 /* | |
2453 * Propagate the leaf DTLs we just loaded all the way up the tree. | |
2454 */ | |
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
|
2455 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); |
789 | 2456 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
|
2457 spa_config_exit(spa, SCL_ALL, FTAG); |
789 | 2458 |
2459 /* | |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
2460 * Load the DDTs (dedup tables). |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
2461 */ |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
2462 error = ddt_load(spa); |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2463 if (error != 0) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2464 return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
2465 |
10956
0c81acaaf614
6897693 deduplication can only go so far
George Wilson <George.Wilson@Sun.COM>
parents:
10950
diff
changeset
|
2466 spa_update_dspace(spa); |
0c81acaaf614
6897693 deduplication can only go so far
George Wilson <George.Wilson@Sun.COM>
parents:
10950
diff
changeset
|
2467 |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
2468 /* |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2469 * Validate the config, using the MOS config to fill in any |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2470 * information which might be missing. If we fail to validate |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2471 * the config then declare the pool unfit for use. If we're |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2472 * assembling a pool from a split, the log is not transferred |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2473 * over. |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
2474 */ |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2475 if (type != SPA_IMPORT_ASSEMBLE) { |
11810
0a50367f8035
6923102 spa_load_impl() leaks nvconfig if type is SPA_IMPORT_ASSEMBLE
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11727
diff
changeset
|
2476 nvlist_t *nvconfig; |
0a50367f8035
6923102 spa_load_impl() leaks nvconfig if type is SPA_IMPORT_ASSEMBLE
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11727
diff
changeset
|
2477 |
0a50367f8035
6923102 spa_load_impl() leaks nvconfig if type is SPA_IMPORT_ASSEMBLE
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11727
diff
changeset
|
2478 if (load_nvlist(spa, spa->spa_config_object, &nvconfig) != 0) |
0a50367f8035
6923102 spa_load_impl() leaks nvconfig if type is SPA_IMPORT_ASSEMBLE
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11727
diff
changeset
|
2479 return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); |
0a50367f8035
6923102 spa_load_impl() leaks nvconfig if type is SPA_IMPORT_ASSEMBLE
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11727
diff
changeset
|
2480 |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2481 if (!spa_config_valid(spa, nvconfig)) { |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2482 nvlist_free(nvconfig); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2483 return (spa_vdev_err(rvd, VDEV_AUX_BAD_GUID_SUM, |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2484 ENXIO)); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2485 } |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2486 nvlist_free(nvconfig); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2487 |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2488 /* |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2489 * Now that we've validated the config, check the state of the |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2490 * root vdev. If it can't be opened, it indicates one or |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2491 * more toplevel vdevs are faulted. |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2492 */ |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2493 if (rvd->vdev_state <= VDEV_STATE_CANT_OPEN) |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2494 return (ENXIO); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2495 |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2496 if (spa_check_logs(spa)) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2497 *ereport = FM_EREPORT_ZFS_LOG_REPLAY; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2498 return (spa_vdev_err(rvd, VDEV_AUX_BAD_LOG, ENXIO)); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2499 } |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
2500 } |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
2501 |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2502 if (missing_feat_write) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2503 ASSERT(state == SPA_LOAD_TRYIMPORT); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2504 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2505 /* |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2506 * At this point, we know that we can open the pool in |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2507 * read-only mode but not read-write mode. We now have enough |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2508 * information and can return to userland. |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2509 */ |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2510 return (spa_vdev_err(rvd, VDEV_AUX_UNSUP_FEAT, ENOTSUP)); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2511 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2512 |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2513 /* |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2514 * We've successfully opened the pool, verify that we're ready |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2515 * to start pushing transactions. |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2516 */ |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2517 if (state != SPA_LOAD_TRYIMPORT) { |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2518 if (error = spa_load_verify(spa)) |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2519 return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2520 error)); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2521 } |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2522 |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2523 if (spa_writeable(spa) && (state == SPA_LOAD_RECOVER || |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2524 spa->spa_load_max_txg == UINT64_MAX)) { |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
2525 dmu_tx_t *tx; |
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
2526 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
|
2527 |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
2528 ASSERT(state != SPA_LOAD_TRYIMPORT); |
1601
438b928f80c7
6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents:
1585
diff
changeset
|
2529 |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
2530 /* |
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
2531 * 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
|
2532 * This must all happen in a single txg. |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
2533 * Note: spa_claim_max_txg is updated by spa_claim_notify(), |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
2534 * invoked from zil_claim_log_block()'s i/o done callback. |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2535 * Price of rollback is that we abandon the log. |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
2536 */ |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
2537 spa->spa_claiming = B_TRUE; |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
2538 |
1601
438b928f80c7
6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents:
1585
diff
changeset
|
2539 tx = dmu_tx_create_assigned(spa_get_dsl(spa), |
789 | 2540 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
|
2541 (void) dmu_objset_find(spa_name(spa), |
2417 | 2542 zil_claim, tx, DS_FIND_CHILDREN); |
789 | 2543 dmu_tx_commit(tx); |
2544 | |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
2545 spa->spa_claiming = B_FALSE; |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
2546 |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2547 spa_set_log_state(spa, SPA_LOG_GOOD); |
789 | 2548 spa->spa_sync_on = B_TRUE; |
2549 txg_sync_start(spa->spa_dsl_pool); | |
2550 | |
2551 /* | |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
2552 * Wait for all claims to sync. We sync up to the highest |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
2553 * claimed log block birth time so that claimed log blocks |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
2554 * don't appear to be from the future. spa_claim_max_txg |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
2555 * will have been set for us by either zil_check_log_chain() |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
2556 * (invoked from spa_check_logs()) or zil_claim() above. |
789 | 2557 */ |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
2558 txg_wait_synced(spa->spa_dsl_pool, spa->spa_claim_max_txg); |
1585
4ad213e858a9
6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents:
1544
diff
changeset
|
2559 |
4ad213e858a9
6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents:
1544
diff
changeset
|
2560 /* |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
2561 * 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
|
2562 * metaslabs (see spa_vdev_add()), then update the config. |
10100
4a6965f6bef8
6856634 snv_117 not booting: zfs_parse_bootfs: error2
Lin Ling <Lin.Ling@Sun.COM>
parents:
10000
diff
changeset
|
2563 * |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2564 * If this is a verbatim import, trust the current |
10100
4a6965f6bef8
6856634 snv_117 not booting: zfs_parse_bootfs: error2
Lin Ling <Lin.Ling@Sun.COM>
parents:
10000
diff
changeset
|
2565 * in-core spa_config and update the disk labels. |
1585
4ad213e858a9
6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents:
1544
diff
changeset
|
2566 */ |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
2567 if (config_cache_txg != spa->spa_config_txg || |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2568 state == SPA_LOAD_IMPORT || |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2569 state == SPA_LOAD_RECOVER || |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2570 (spa->spa_import_flags & ZFS_IMPORT_VERBATIM)) |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
2571 need_update = B_TRUE; |
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
2572 |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
2573 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
|
2574 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
|
2575 need_update = B_TRUE; |
1585
4ad213e858a9
6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents:
1544
diff
changeset
|
2576 |
4ad213e858a9
6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents:
1544
diff
changeset
|
2577 /* |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
2578 * 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
|
2579 * 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
|
2580 */ |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
2581 if (need_update) |
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
2582 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
|
2583 |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
2584 /* |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
2585 * 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
|
2586 */ |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
2587 if (!dsl_scan_resilvering(spa->spa_dsl_pool) && |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
2588 vdev_resilver_needed(rvd, NULL, NULL)) |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
2589 spa_async_request(spa, SPA_ASYNC_RESILVER); |
10298
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10100
diff
changeset
|
2590 |
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10100
diff
changeset
|
2591 /* |
13743
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
2592 * Log the fact that we booted up (so that we can detect if |
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
2593 * we rebooted in the middle of an operation). |
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
2594 */ |
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
2595 spa_history_log_version(spa, "open"); |
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
2596 |
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
2597 /* |
10298
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10100
diff
changeset
|
2598 * Delete any inconsistent datasets. |
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10100
diff
changeset
|
2599 */ |
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10100
diff
changeset
|
2600 (void) dmu_objset_find(spa_name(spa), |
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10100
diff
changeset
|
2601 dsl_destroy_inconsistent, NULL, DS_FIND_CHILDREN); |
10342
108f0058f837
6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents:
10298
diff
changeset
|
2602 |
108f0058f837
6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents:
10298
diff
changeset
|
2603 /* |
108f0058f837
6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents:
10298
diff
changeset
|
2604 * Clean up any stale temporary dataset userrefs. |
108f0058f837
6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents:
10298
diff
changeset
|
2605 */ |
108f0058f837
6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents:
10298
diff
changeset
|
2606 dsl_pool_clean_tmp_userrefs(spa->spa_dsl_pool); |
789 | 2607 } |
2608 | |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2609 return (0); |
789 | 2610 } |
2611 | |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2612 static int |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2613 spa_load_retry(spa_t *spa, spa_load_state_t state, int mosconfig) |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2614 { |
13061
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
2615 int mode = spa->spa_mode; |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
2616 |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2617 spa_unload(spa); |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2618 spa_deactivate(spa); |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2619 |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2620 spa->spa_load_max_txg--; |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2621 |
13061
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
2622 spa_activate(spa, mode); |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2623 spa_async_suspend(spa); |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2624 |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2625 return (spa_load(spa, state, SPA_IMPORT_EXISTING, mosconfig)); |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2626 } |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2627 |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2628 /* |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2629 * If spa_load() fails this function will try loading prior txg's. If |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2630 * 'state' is SPA_LOAD_RECOVER and one of these loads succeeds the pool |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2631 * will be rewound to that txg. If 'state' is not SPA_LOAD_RECOVER this |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2632 * function will not rewind the pool and will return the same error as |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2633 * spa_load(). |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2634 */ |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2635 static int |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2636 spa_load_best(spa_t *spa, spa_load_state_t state, int mosconfig, |
11727
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
2637 uint64_t max_request, int rewind_flags) |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2638 { |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2639 nvlist_t *loadinfo = NULL; |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2640 nvlist_t *config = NULL; |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2641 int load_error, rewind_error; |
11727
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
2642 uint64_t safe_rewind_txg; |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2643 uint64_t min_txg; |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2644 |
11026
e8e10df16a8f
6899159 injection isn't trashing pools
Tim Haley <Tim.Haley@Sun.COM>
parents:
11022
diff
changeset
|
2645 if (spa->spa_load_txg && state == SPA_LOAD_RECOVER) { |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2646 spa->spa_load_max_txg = spa->spa_load_txg; |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2647 spa_set_log_state(spa, SPA_LOG_CLEAR); |
11026
e8e10df16a8f
6899159 injection isn't trashing pools
Tim Haley <Tim.Haley@Sun.COM>
parents:
11022
diff
changeset
|
2648 } else { |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2649 spa->spa_load_max_txg = max_request; |
11026
e8e10df16a8f
6899159 injection isn't trashing pools
Tim Haley <Tim.Haley@Sun.COM>
parents:
11022
diff
changeset
|
2650 } |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2651 |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2652 load_error = rewind_error = spa_load(spa, state, SPA_IMPORT_EXISTING, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2653 mosconfig); |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2654 if (load_error == 0) |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2655 return (0); |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2656 |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2657 if (spa->spa_root_vdev != NULL) |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2658 config = spa_config_generate(spa, NULL, -1ULL, B_TRUE); |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2659 |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2660 spa->spa_last_ubsync_txg = spa->spa_uberblock.ub_txg; |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2661 spa->spa_last_ubsync_txg_ts = spa->spa_uberblock.ub_timestamp; |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2662 |
11727
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
2663 if (rewind_flags & ZPOOL_NEVER_REWIND) { |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2664 nvlist_free(config); |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2665 return (load_error); |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2666 } |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2667 |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2668 if (state == SPA_LOAD_RECOVER) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2669 /* Price of rolling back is discarding txgs, including log */ |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
2670 spa_set_log_state(spa, SPA_LOG_CLEAR); |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2671 } else { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2672 /* |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2673 * If we aren't rolling back save the load info from our first |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2674 * import attempt so that we can restore it after attempting |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2675 * to rewind. |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2676 */ |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2677 loadinfo = spa->spa_load_info; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2678 spa->spa_load_info = fnvlist_alloc(); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2679 } |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2680 |
11727
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
2681 spa->spa_load_max_txg = spa->spa_last_ubsync_txg; |
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
2682 safe_rewind_txg = spa->spa_last_ubsync_txg - TXG_DEFER_SIZE; |
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
2683 min_txg = (rewind_flags & ZPOOL_EXTREME_REWIND) ? |
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
2684 TXG_INITIAL : safe_rewind_txg; |
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
2685 |
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
2686 /* |
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
2687 * Continue as long as we're finding errors, we're still within |
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
2688 * the acceptable rewind range, and we're still finding uberblocks |
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
2689 */ |
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
2690 while (rewind_error && spa->spa_uberblock.ub_txg >= min_txg && |
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
2691 spa->spa_uberblock.ub_txg <= spa->spa_load_max_txg) { |
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
2692 if (spa->spa_load_max_txg < safe_rewind_txg) |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2693 spa->spa_extreme_rewind = B_TRUE; |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2694 rewind_error = spa_load_retry(spa, state, mosconfig); |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2695 } |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2696 |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2697 spa->spa_extreme_rewind = B_FALSE; |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2698 spa->spa_load_max_txg = UINT64_MAX; |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2699 |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2700 if (config && (rewind_error || state != SPA_LOAD_RECOVER)) |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2701 spa_config_set(spa, config); |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2702 |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2703 if (state == SPA_LOAD_RECOVER) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2704 ASSERT3P(loadinfo, ==, NULL); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2705 return (rewind_error); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2706 } else { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2707 /* Store the rewind info as part of the initial load info */ |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2708 fnvlist_add_nvlist(loadinfo, ZPOOL_CONFIG_REWIND_INFO, |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2709 spa->spa_load_info); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2710 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2711 /* Restore the initial load info */ |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2712 fnvlist_free(spa->spa_load_info); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2713 spa->spa_load_info = loadinfo; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2714 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2715 return (load_error); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2716 } |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2717 } |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2718 |
789 | 2719 /* |
2720 * Pool Open/Import | |
2721 * | |
2722 * The import case is identical to an open except that the configuration is sent | |
2723 * down from userland, instead of grabbed from the configuration cache. For the | |
2724 * case of an open, the pool configuration will exist in the | |
4451 | 2725 * POOL_STATE_UNINITIALIZED state. |
789 | 2726 * |
2727 * The stats information (gen/count/ustats) is used to gather vdev statistics at | |
2728 * the same time open the pool, without having to keep around the spa_t in some | |
2729 * ambiguous state. | |
2730 */ | |
2731 static int | |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2732 spa_open_common(const char *pool, spa_t **spapp, void *tag, nvlist_t *nvpolicy, |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2733 nvlist_t **config) |
789 | 2734 { |
2735 spa_t *spa; | |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2736 spa_load_state_t state = SPA_LOAD_OPEN; |
789 | 2737 int error; |
2738 int locked = B_FALSE; | |
2739 | |
2740 *spapp = NULL; | |
2741 | |
2742 /* | |
2743 * As disgusting as this is, we need to support recursive calls to this | |
2744 * function because dsl_dir_open() is called during spa_load(), and ends | |
2745 * up calling spa_open() again. The real fix is to figure out how to | |
2746 * avoid dsl_dir_open() calling this in the first place. | |
2747 */ | |
2748 if (mutex_owner(&spa_namespace_lock) != curthread) { | |
2749 mutex_enter(&spa_namespace_lock); | |
2750 locked = B_TRUE; | |
2751 } | |
2752 | |
2753 if ((spa = spa_lookup(pool)) == NULL) { | |
2754 if (locked) | |
2755 mutex_exit(&spa_namespace_lock); | |
2756 return (ENOENT); | |
2757 } | |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2758 |
789 | 2759 if (spa->spa_state == POOL_STATE_UNINITIALIZED) { |
11819
8b1fd81afb05
6929453 panic in zfs-test hotspare_replace_003_pos
Tim Haley <Tim.Haley@Sun.COM>
parents:
11817
diff
changeset
|
2760 zpool_rewind_policy_t policy; |
8b1fd81afb05
6929453 panic in zfs-test hotspare_replace_003_pos
Tim Haley <Tim.Haley@Sun.COM>
parents:
11817
diff
changeset
|
2761 |
8b1fd81afb05
6929453 panic in zfs-test hotspare_replace_003_pos
Tim Haley <Tim.Haley@Sun.COM>
parents:
11817
diff
changeset
|
2762 zpool_get_rewind_policy(nvpolicy ? nvpolicy : spa->spa_config, |
8b1fd81afb05
6929453 panic in zfs-test hotspare_replace_003_pos
Tim Haley <Tim.Haley@Sun.COM>
parents:
11817
diff
changeset
|
2763 &policy); |
8b1fd81afb05
6929453 panic in zfs-test hotspare_replace_003_pos
Tim Haley <Tim.Haley@Sun.COM>
parents:
11817
diff
changeset
|
2764 if (policy.zrp_request & ZPOOL_DO_REWIND) |
8b1fd81afb05
6929453 panic in zfs-test hotspare_replace_003_pos
Tim Haley <Tim.Haley@Sun.COM>
parents:
11817
diff
changeset
|
2765 state = SPA_LOAD_RECOVER; |
789 | 2766 |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
2767 spa_activate(spa, spa_mode_global); |
789 | 2768 |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2769 if (state != SPA_LOAD_RECOVER) |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2770 spa->spa_last_ubsync_txg = spa->spa_load_txg = 0; |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2771 |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2772 error = spa_load_best(spa, state, B_FALSE, policy.zrp_txg, |
11727
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
2773 policy.zrp_request); |
789 | 2774 |
2775 if (error == EBADF) { | |
2776 /* | |
1986
628267397204
6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents:
1807
diff
changeset
|
2777 * 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
|
2778 * 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
|
2779 * 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
|
2780 * 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
|
2781 * we should remove the pool from the namespace. |
789 | 2782 */ |
2783 spa_unload(spa); | |
2784 spa_deactivate(spa); | |
6643
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
2785 spa_config_sync(spa, B_TRUE, B_TRUE); |
789 | 2786 spa_remove(spa); |
2787 if (locked) | |
2788 mutex_exit(&spa_namespace_lock); | |
2789 return (ENOENT); | |
1544 | 2790 } |
2791 | |
2792 if (error) { | |
789 | 2793 /* |
2794 * We can't open the pool, but we still have useful | |
2795 * information: the state of each vdev after the | |
2796 * attempted vdev_open(). Return this to the user. | |
2797 */ | |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2798 if (config != NULL && spa->spa_config) { |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2799 VERIFY(nvlist_dup(spa->spa_config, config, |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2800 KM_SLEEP) == 0); |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2801 VERIFY(nvlist_add_nvlist(*config, |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2802 ZPOOL_CONFIG_LOAD_INFO, |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2803 spa->spa_load_info) == 0); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2804 } |
789 | 2805 spa_unload(spa); |
2806 spa_deactivate(spa); | |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2807 spa->spa_last_open_failed = error; |
789 | 2808 if (locked) |
2809 mutex_exit(&spa_namespace_lock); | |
2810 *spapp = NULL; | |
2811 return (error); | |
2812 } | |
2813 } | |
2814 | |
2815 spa_open_ref(spa, tag); | |
4451 | 2816 |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2817 if (config != NULL) |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2818 *config = spa_config_generate(spa, NULL, -1ULL, B_TRUE); |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2819 |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2820 /* |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2821 * If we've recovered the pool, pass back any information we |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2822 * gathered while doing the load. |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2823 */ |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2824 if (state == SPA_LOAD_RECOVER) { |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2825 VERIFY(nvlist_add_nvlist(*config, ZPOOL_CONFIG_LOAD_INFO, |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2826 spa->spa_load_info) == 0); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2827 } |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
2828 |
11026
e8e10df16a8f
6899159 injection isn't trashing pools
Tim Haley <Tim.Haley@Sun.COM>
parents:
11022
diff
changeset
|
2829 if (locked) { |
e8e10df16a8f
6899159 injection isn't trashing pools
Tim Haley <Tim.Haley@Sun.COM>
parents:
11022
diff
changeset
|
2830 spa->spa_last_open_failed = 0; |
e8e10df16a8f
6899159 injection isn't trashing pools
Tim Haley <Tim.Haley@Sun.COM>
parents:
11022
diff
changeset
|
2831 spa->spa_last_ubsync_txg = 0; |
e8e10df16a8f
6899159 injection isn't trashing pools
Tim Haley <Tim.Haley@Sun.COM>
parents:
11022
diff
changeset
|
2832 spa->spa_load_txg = 0; |
789 | 2833 mutex_exit(&spa_namespace_lock); |
11026
e8e10df16a8f
6899159 injection isn't trashing pools
Tim Haley <Tim.Haley@Sun.COM>
parents:
11022
diff
changeset
|
2834 } |
789 | 2835 |
2836 *spapp = spa; | |
2837 | |
2838 return (0); | |
2839 } | |
2840 | |
2841 int | |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2842 spa_open_rewind(const char *name, spa_t **spapp, void *tag, nvlist_t *policy, |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2843 nvlist_t **config) |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2844 { |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2845 return (spa_open_common(name, spapp, tag, policy, config)); |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2846 } |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2847 |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2848 int |
789 | 2849 spa_open(const char *name, spa_t **spapp, void *tag) |
2850 { | |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
2851 return (spa_open_common(name, spapp, tag, NULL, NULL)); |
789 | 2852 } |
2853 | |
1544 | 2854 /* |
2855 * Lookup the given spa_t, incrementing the inject count in the process, | |
2856 * preventing it from being exported or destroyed. | |
2857 */ | |
2858 spa_t * | |
2859 spa_inject_addref(char *name) | |
2860 { | |
2861 spa_t *spa; | |
2862 | |
2863 mutex_enter(&spa_namespace_lock); | |
2864 if ((spa = spa_lookup(name)) == NULL) { | |
2865 mutex_exit(&spa_namespace_lock); | |
2866 return (NULL); | |
2867 } | |
2868 spa->spa_inject_ref++; | |
2869 mutex_exit(&spa_namespace_lock); | |
2870 | |
2871 return (spa); | |
2872 } | |
2873 | |
2874 void | |
2875 spa_inject_delref(spa_t *spa) | |
2876 { | |
2877 mutex_enter(&spa_namespace_lock); | |
2878 spa->spa_inject_ref--; | |
2879 mutex_exit(&spa_namespace_lock); | |
2880 } | |
2881 | |
5450 | 2882 /* |
2883 * Add spares device information to the nvlist. | |
2884 */ | |
2082 | 2885 static void |
2886 spa_add_spares(spa_t *spa, nvlist_t *config) | |
2887 { | |
2888 nvlist_t **spares; | |
2889 uint_t i, nspares; | |
2890 nvlist_t *nvroot; | |
2891 uint64_t guid; | |
2892 vdev_stat_t *vs; | |
2893 uint_t vsc; | |
3377
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
2894 uint64_t pool; |
2082 | 2895 |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
2896 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
|
2897 |
5450 | 2898 if (spa->spa_spares.sav_count == 0) |
2082 | 2899 return; |
2900 | |
2901 VERIFY(nvlist_lookup_nvlist(config, | |
2902 ZPOOL_CONFIG_VDEV_TREE, &nvroot) == 0); | |
5450 | 2903 VERIFY(nvlist_lookup_nvlist_array(spa->spa_spares.sav_config, |
2082 | 2904 ZPOOL_CONFIG_SPARES, &spares, &nspares) == 0); |
2905 if (nspares != 0) { | |
2906 VERIFY(nvlist_add_nvlist_array(nvroot, | |
2907 ZPOOL_CONFIG_SPARES, spares, nspares) == 0); | |
2908 VERIFY(nvlist_lookup_nvlist_array(nvroot, | |
2909 ZPOOL_CONFIG_SPARES, &spares, &nspares) == 0); | |
2910 | |
2911 /* | |
2912 * Go through and find any spares which have since been | |
2913 * repurposed as an active spare. If this is the case, update | |
2914 * their status appropriately. | |
2915 */ | |
2916 for (i = 0; i < nspares; i++) { | |
2917 VERIFY(nvlist_lookup_uint64(spares[i], | |
2918 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
|
2919 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
|
2920 pool != 0ULL) { |
2082 | 2921 VERIFY(nvlist_lookup_uint64_array( |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
2922 spares[i], ZPOOL_CONFIG_VDEV_STATS, |
2082 | 2923 (uint64_t **)&vs, &vsc) == 0); |
2924 vs->vs_state = VDEV_STATE_CANT_OPEN; | |
2925 vs->vs_aux = VDEV_AUX_SPARED; | |
2926 } | |
2927 } | |
2928 } | |
2929 } | |
2930 | |
5450 | 2931 /* |
2932 * Add l2cache device information to the nvlist, including vdev stats. | |
2933 */ | |
2934 static void | |
2935 spa_add_l2cache(spa_t *spa, nvlist_t *config) | |
2936 { | |
2937 nvlist_t **l2cache; | |
2938 uint_t i, j, nl2cache; | |
2939 nvlist_t *nvroot; | |
2940 uint64_t guid; | |
2941 vdev_t *vd; | |
2942 vdev_stat_t *vs; | |
2943 uint_t vsc; | |
2944 | |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
2945 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
|
2946 |
5450 | 2947 if (spa->spa_l2cache.sav_count == 0) |
2948 return; | |
2949 | |
2950 VERIFY(nvlist_lookup_nvlist(config, | |
2951 ZPOOL_CONFIG_VDEV_TREE, &nvroot) == 0); | |
2952 VERIFY(nvlist_lookup_nvlist_array(spa->spa_l2cache.sav_config, | |
2953 ZPOOL_CONFIG_L2CACHE, &l2cache, &nl2cache) == 0); | |
2954 if (nl2cache != 0) { | |
2955 VERIFY(nvlist_add_nvlist_array(nvroot, | |
2956 ZPOOL_CONFIG_L2CACHE, l2cache, nl2cache) == 0); | |
2957 VERIFY(nvlist_lookup_nvlist_array(nvroot, | |
2958 ZPOOL_CONFIG_L2CACHE, &l2cache, &nl2cache) == 0); | |
2959 | |
2960 /* | |
2961 * Update level 2 cache device stats. | |
2962 */ | |
2963 | |
2964 for (i = 0; i < nl2cache; i++) { | |
2965 VERIFY(nvlist_lookup_uint64(l2cache[i], | |
2966 ZPOOL_CONFIG_GUID, &guid) == 0); | |
2967 | |
2968 vd = NULL; | |
2969 for (j = 0; j < spa->spa_l2cache.sav_count; j++) { | |
2970 if (guid == | |
2971 spa->spa_l2cache.sav_vdevs[j]->vdev_guid) { | |
2972 vd = spa->spa_l2cache.sav_vdevs[j]; | |
2973 break; | |
2974 } | |
2975 } | |
2976 ASSERT(vd != NULL); | |
2977 | |
2978 VERIFY(nvlist_lookup_uint64_array(l2cache[i], | |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
2979 ZPOOL_CONFIG_VDEV_STATS, (uint64_t **)&vs, &vsc) |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
2980 == 0); |
5450 | 2981 vdev_get_stats(vd, vs); |
2982 } | |
2983 } | |
2984 } | |
2985 | |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2986 static void |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2987 spa_add_feature_stats(spa_t *spa, nvlist_t *config) |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2988 { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2989 nvlist_t *features; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2990 zap_cursor_t zc; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2991 zap_attribute_t za; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2992 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2993 ASSERT(spa_config_held(spa, SCL_CONFIG, RW_READER)); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2994 VERIFY(nvlist_alloc(&features, NV_UNIQUE_NAME, KM_SLEEP) == 0); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2995 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2996 if (spa->spa_feat_for_read_obj != 0) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2997 for (zap_cursor_init(&zc, spa->spa_meta_objset, |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2998 spa->spa_feat_for_read_obj); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
2999 zap_cursor_retrieve(&zc, &za) == 0; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3000 zap_cursor_advance(&zc)) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3001 ASSERT(za.za_integer_length == sizeof (uint64_t) && |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3002 za.za_num_integers == 1); |
13765
9410cf539b11
backout 3006: causes 3046 (panics after mounting root)
Richard Lowe <richlowe@richlowe.net>
parents:
13764
diff
changeset
|
3003 VERIFY3U(0, ==, nvlist_add_uint64(features, za.za_name, |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3004 za.za_first_integer)); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3005 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3006 zap_cursor_fini(&zc); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3007 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3008 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3009 if (spa->spa_feat_for_write_obj != 0) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3010 for (zap_cursor_init(&zc, spa->spa_meta_objset, |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3011 spa->spa_feat_for_write_obj); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3012 zap_cursor_retrieve(&zc, &za) == 0; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3013 zap_cursor_advance(&zc)) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3014 ASSERT(za.za_integer_length == sizeof (uint64_t) && |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3015 za.za_num_integers == 1); |
13765
9410cf539b11
backout 3006: causes 3046 (panics after mounting root)
Richard Lowe <richlowe@richlowe.net>
parents:
13764
diff
changeset
|
3016 VERIFY3U(0, ==, nvlist_add_uint64(features, za.za_name, |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3017 za.za_first_integer)); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3018 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3019 zap_cursor_fini(&zc); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3020 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3021 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3022 VERIFY(nvlist_add_nvlist(config, ZPOOL_CONFIG_FEATURE_STATS, |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3023 features) == 0); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3024 nvlist_free(features); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3025 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3026 |
789 | 3027 int |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3028 spa_get_stats(const char *name, nvlist_t **config, |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3029 char *altroot, size_t buflen) |
789 | 3030 { |
3031 int error; | |
3032 spa_t *spa; | |
3033 | |
3034 *config = NULL; | |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
3035 error = spa_open_common(name, &spa, FTAG, NULL, config); |
789 | 3036 |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3037 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
|
3038 /* |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3039 * 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
|
3040 * 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
|
3041 * self-inconsistent. |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3042 */ |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3043 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
|
3044 |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3045 if (*config != NULL) { |
12829
0336e913b141
6937608 ZFS DE should ignore ereports prior to pool import
Tim Haley <Tim.Haley@Sun.COM>
parents:
12600
diff
changeset
|
3046 uint64_t loadtimes[2]; |
0336e913b141
6937608 ZFS DE should ignore ereports prior to pool import
Tim Haley <Tim.Haley@Sun.COM>
parents:
12600
diff
changeset
|
3047 |
0336e913b141
6937608 ZFS DE should ignore ereports prior to pool import
Tim Haley <Tim.Haley@Sun.COM>
parents:
12600
diff
changeset
|
3048 loadtimes[0] = spa->spa_loaded_ts.tv_sec; |
0336e913b141
6937608 ZFS DE should ignore ereports prior to pool import
Tim Haley <Tim.Haley@Sun.COM>
parents:
12600
diff
changeset
|
3049 loadtimes[1] = spa->spa_loaded_ts.tv_nsec; |
0336e913b141
6937608 ZFS DE should ignore ereports prior to pool import
Tim Haley <Tim.Haley@Sun.COM>
parents:
12600
diff
changeset
|
3050 VERIFY(nvlist_add_uint64_array(*config, |
0336e913b141
6937608 ZFS DE should ignore ereports prior to pool import
Tim Haley <Tim.Haley@Sun.COM>
parents:
12600
diff
changeset
|
3051 ZPOOL_CONFIG_LOADED_TIME, loadtimes, 2) == 0); |
0336e913b141
6937608 ZFS DE should ignore ereports prior to pool import
Tim Haley <Tim.Haley@Sun.COM>
parents:
12600
diff
changeset
|
3052 |
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
|
3053 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
|
3054 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
|
3055 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
|
3056 |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3057 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
|
3058 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
|
3059 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
|
3060 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
|
3061 |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3062 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
|
3063 spa_add_l2cache(spa, *config); |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3064 spa_add_feature_stats(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
|
3065 } |
2082 | 3066 } |
3067 | |
1544 | 3068 /* |
3069 * We want to get the alternate root even for faulted pools, so we cheat | |
3070 * and call spa_lookup() directly. | |
3071 */ | |
3072 if (altroot) { | |
3073 if (spa == NULL) { | |
3074 mutex_enter(&spa_namespace_lock); | |
3075 spa = spa_lookup(name); | |
3076 if (spa) | |
3077 spa_altroot(spa, altroot, buflen); | |
3078 else | |
3079 altroot[0] = '\0'; | |
3080 spa = NULL; | |
3081 mutex_exit(&spa_namespace_lock); | |
3082 } else { | |
3083 spa_altroot(spa, altroot, buflen); | |
3084 } | |
3085 } | |
3086 | |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3087 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
|
3088 spa_config_exit(spa, SCL_CONFIG, FTAG); |
789 | 3089 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
|
3090 } |
789 | 3091 |
3092 return (error); | |
3093 } | |
3094 | |
3095 /* | |
5450 | 3096 * Validate that the auxiliary device array is well formed. We must have an |
3097 * array of nvlists, each which describes a valid leaf vdev. If this is an | |
3098 * import (mode is VDEV_ALLOC_SPARE), then we allow corrupted spares to be | |
3099 * specified, as long as they are well-formed. | |
2082 | 3100 */ |
3101 static int | |
5450 | 3102 spa_validate_aux_devs(spa_t *spa, nvlist_t *nvroot, uint64_t crtxg, int mode, |
3103 spa_aux_vdev_t *sav, const char *config, uint64_t version, | |
3104 vdev_labeltype_t label) | |
2082 | 3105 { |
5450 | 3106 nvlist_t **dev; |
3107 uint_t i, ndev; | |
2082 | 3108 vdev_t *vd; |
3109 int error; | |
3110 | |
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
|
3111 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
|
3112 |
2082 | 3113 /* |
5450 | 3114 * It's acceptable to have no devs specified. |
2082 | 3115 */ |
5450 | 3116 if (nvlist_lookup_nvlist_array(nvroot, config, &dev, &ndev) != 0) |
2082 | 3117 return (0); |
3118 | |
5450 | 3119 if (ndev == 0) |
2082 | 3120 return (EINVAL); |
3121 | |
3122 /* | |
5450 | 3123 * Make sure the pool is formatted with a version that supports this |
3124 * device type. | |
2082 | 3125 */ |
5450 | 3126 if (spa_version(spa) < version) |
2082 | 3127 return (ENOTSUP); |
3128 | |
3377
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
3129 /* |
5450 | 3130 * 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
|
3131 * checking. |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
3132 */ |
5450 | 3133 sav->sav_pending = dev; |
3134 sav->sav_npending = ndev; | |
3135 | |
3136 for (i = 0; i < ndev; i++) { | |
3137 if ((error = spa_config_parse(spa, &vd, dev[i], NULL, 0, | |
2082 | 3138 mode)) != 0) |
3377
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
3139 goto out; |
2082 | 3140 |
3141 if (!vd->vdev_ops->vdev_op_leaf) { | |
3142 vdev_free(vd); | |
3377
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
3143 error = EINVAL; |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
3144 goto out; |
2082 | 3145 } |
3146 | |
5450 | 3147 /* |
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
|
3148 * 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
|
3149 * kernel context. For user-level testing, we allow it. |
5450 | 3150 */ |
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
|
3151 #ifdef _KERNEL |
5450 | 3152 if ((strcmp(config, ZPOOL_CONFIG_L2CACHE) == 0) && |
3153 strcmp(vd->vdev_ops->vdev_op_type, VDEV_TYPE_DISK) != 0) { | |
3154 error = ENOTBLK; | |
13574
d0fde6cacaac
1951 leaking a vdev when removing an l2cache device
George Wilson <george.wilson@delphix.com>
parents:
13573
diff
changeset
|
3155 vdev_free(vd); |
5450 | 3156 goto out; |
3157 } | |
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
|
3158 #endif |
2082 | 3159 vd->vdev_top = vd; |
3377
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
3160 |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
3161 if ((error = vdev_open(vd)) == 0 && |
5450 | 3162 (error = vdev_label_init(vd, crtxg, label)) == 0) { |
3163 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
|
3164 vd->vdev_guid) == 0); |
2082 | 3165 } |
3166 | |
3167 vdev_free(vd); | |
3377
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
3168 |
5450 | 3169 if (error && |
3170 (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
|
3171 goto out; |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
3172 else |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
3173 error = 0; |
2082 | 3174 } |
3175 | |
3377
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
3176 out: |
5450 | 3177 sav->sav_pending = NULL; |
3178 sav->sav_npending = 0; | |
3377
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
3179 return (error); |
2082 | 3180 } |
3181 | |
5450 | 3182 static int |
3183 spa_validate_aux(spa_t *spa, nvlist_t *nvroot, uint64_t crtxg, int mode) | |
3184 { | |
3185 int error; | |
3186 | |
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
|
3187 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
|
3188 |
5450 | 3189 if ((error = spa_validate_aux_devs(spa, nvroot, crtxg, mode, |
3190 &spa->spa_spares, ZPOOL_CONFIG_SPARES, SPA_VERSION_SPARES, | |
3191 VDEV_LABEL_SPARE)) != 0) { | |
3192 return (error); | |
3193 } | |
3194 | |
3195 return (spa_validate_aux_devs(spa, nvroot, crtxg, mode, | |
3196 &spa->spa_l2cache, ZPOOL_CONFIG_L2CACHE, SPA_VERSION_L2CACHE, | |
3197 VDEV_LABEL_L2CACHE)); | |
3198 } | |
3199 | |
3200 static void | |
3201 spa_set_aux_vdevs(spa_aux_vdev_t *sav, nvlist_t **devs, int ndevs, | |
3202 const char *config) | |
3203 { | |
3204 int i; | |
3205 | |
3206 if (sav->sav_config != NULL) { | |
3207 nvlist_t **olddevs; | |
3208 uint_t oldndevs; | |
3209 nvlist_t **newdevs; | |
3210 | |
3211 /* | |
3212 * Generate new dev list by concatentating with the | |
3213 * current dev list. | |
3214 */ | |
3215 VERIFY(nvlist_lookup_nvlist_array(sav->sav_config, config, | |
3216 &olddevs, &oldndevs) == 0); | |
3217 | |
3218 newdevs = kmem_alloc(sizeof (void *) * | |
3219 (ndevs + oldndevs), KM_SLEEP); | |
3220 for (i = 0; i < oldndevs; i++) | |
3221 VERIFY(nvlist_dup(olddevs[i], &newdevs[i], | |
3222 KM_SLEEP) == 0); | |
3223 for (i = 0; i < ndevs; i++) | |
3224 VERIFY(nvlist_dup(devs[i], &newdevs[i + oldndevs], | |
3225 KM_SLEEP) == 0); | |
3226 | |
3227 VERIFY(nvlist_remove(sav->sav_config, config, | |
3228 DATA_TYPE_NVLIST_ARRAY) == 0); | |
3229 | |
3230 VERIFY(nvlist_add_nvlist_array(sav->sav_config, | |
3231 config, newdevs, ndevs + oldndevs) == 0); | |
3232 for (i = 0; i < oldndevs + ndevs; i++) | |
3233 nvlist_free(newdevs[i]); | |
3234 kmem_free(newdevs, (oldndevs + ndevs) * sizeof (void *)); | |
3235 } else { | |
3236 /* | |
3237 * Generate a new dev list. | |
3238 */ | |
3239 VERIFY(nvlist_alloc(&sav->sav_config, NV_UNIQUE_NAME, | |
3240 KM_SLEEP) == 0); | |
3241 VERIFY(nvlist_add_nvlist_array(sav->sav_config, config, | |
3242 devs, ndevs) == 0); | |
3243 } | |
3244 } | |
3245 | |
3246 /* | |
3247 * Stop and drop level 2 ARC devices | |
3248 */ | |
3249 void | |
3250 spa_l2cache_drop(spa_t *spa) | |
3251 { | |
3252 vdev_t *vd; | |
3253 int i; | |
3254 spa_aux_vdev_t *sav = &spa->spa_l2cache; | |
3255 | |
3256 for (i = 0; i < sav->sav_count; i++) { | |
3257 uint64_t pool; | |
3258 | |
3259 vd = sav->sav_vdevs[i]; | |
3260 ASSERT(vd != NULL); | |
3261 | |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
3262 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
|
3263 pool != 0ULL && l2arc_vdev_present(vd)) |
5450 | 3264 l2arc_remove_vdev(vd); |
3265 } | |
3266 } | |
3267 | |
2082 | 3268 /* |
789 | 3269 * Pool Creation |
3270 */ | |
3271 int | |
5094 | 3272 spa_create(const char *pool, nvlist_t *nvroot, nvlist_t *props, |
13743
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
3273 nvlist_t *zplprops) |
789 | 3274 { |
3275 spa_t *spa; | |
5094 | 3276 char *altroot = NULL; |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
3277 vdev_t *rvd; |
789 | 3278 dsl_pool_t *dp; |
3279 dmu_tx_t *tx; | |
9816
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
3280 int error = 0; |
789 | 3281 uint64_t txg = TXG_INITIAL; |
5450 | 3282 nvlist_t **spares, **l2cache; |
3283 uint_t nspares, nl2cache; | |
12470
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
3284 uint64_t version, obj; |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3285 boolean_t has_features; |
789 | 3286 |
3287 /* | |
3288 * If this pool already exists, return failure. | |
3289 */ | |
3290 mutex_enter(&spa_namespace_lock); | |
3291 if (spa_lookup(pool) != NULL) { | |
3292 mutex_exit(&spa_namespace_lock); | |
3293 return (EEXIST); | |
3294 } | |
3295 | |
3296 /* | |
3297 * Allocate a new spa_t structure. | |
3298 */ | |
5094 | 3299 (void) nvlist_lookup_string(props, |
3300 zpool_prop_to_name(ZPOOL_PROP_ALTROOT), &altroot); | |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
3301 spa = spa_add(pool, NULL, altroot); |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
3302 spa_activate(spa, spa_mode_global); |
789 | 3303 |
5094 | 3304 if (props && (error = spa_prop_validate(spa, props))) { |
3305 spa_deactivate(spa); | |
3306 spa_remove(spa); | |
6643
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
3307 mutex_exit(&spa_namespace_lock); |
5094 | 3308 return (error); |
3309 } | |
3310 | |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3311 has_features = B_FALSE; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3312 for (nvpair_t *elem = nvlist_next_nvpair(props, NULL); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3313 elem != NULL; elem = nvlist_next_nvpair(props, elem)) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3314 if (zpool_prop_feature(nvpair_name(elem))) |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3315 has_features = B_TRUE; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3316 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3317 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3318 if (has_features || nvlist_lookup_uint64(props, |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3319 zpool_prop_to_name(ZPOOL_PROP_VERSION), &version) != 0) { |
5094 | 3320 version = SPA_VERSION; |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3321 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3322 ASSERT(SPA_VERSION_IS_SUPPORTED(version)); |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
3323 |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
3324 spa->spa_first_txg = txg; |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
3325 spa->spa_uberblock.ub_txg = txg - 1; |
5094 | 3326 spa->spa_uberblock.ub_version = version; |
789 | 3327 spa->spa_ubsync = spa->spa_uberblock; |
3328 | |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
3329 /* |
9234
bffdc4fc05c4
6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents:
9230
diff
changeset
|
3330 * 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
|
3331 */ |
9630
e25a03f552e0
6776104 "zfs import" deadlock between spa_unload() and spa_async_thread()
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
9616
diff
changeset
|
3332 spa->spa_async_zio_root = zio_root(spa, NULL, NULL, |
e25a03f552e0
6776104 "zfs import" deadlock between spa_unload() and spa_async_thread()
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
9616
diff
changeset
|
3333 ZIO_FLAG_CANFAIL | ZIO_FLAG_SPECULATIVE | ZIO_FLAG_GODFATHER); |
9234
bffdc4fc05c4
6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents:
9230
diff
changeset
|
3334 |
bffdc4fc05c4
6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents:
9230
diff
changeset
|
3335 /* |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
3336 * Create the root vdev. |
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
3337 */ |
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
|
3338 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
|
3339 |
2082 | 3340 error = spa_config_parse(spa, &rvd, nvroot, NULL, 0, VDEV_ALLOC_ADD); |
3341 | |
3342 ASSERT(error != 0 || rvd != NULL); | |
3343 ASSERT(error != 0 || spa->spa_root_vdev == rvd); | |
3344 | |
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
|
3345 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
|
3346 error = EINVAL; |
2082 | 3347 |
3348 if (error == 0 && | |
3349 (error = vdev_create(rvd, txg, B_FALSE)) == 0 && | |
5450 | 3350 (error = spa_validate_aux(spa, nvroot, txg, |
2082 | 3351 VDEV_ALLOC_ADD)) == 0) { |
9816
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
3352 for (int c = 0; c < rvd->vdev_children; c++) { |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
3353 vdev_metaslab_set_size(rvd->vdev_child[c]); |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
3354 vdev_expand(rvd->vdev_child[c], txg); |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
3355 } |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
3356 } |
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
3357 |
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
|
3358 spa_config_exit(spa, SCL_ALL, FTAG); |
789 | 3359 |
2082 | 3360 if (error != 0) { |
789 | 3361 spa_unload(spa); |
3362 spa_deactivate(spa); | |
3363 spa_remove(spa); | |
3364 mutex_exit(&spa_namespace_lock); | |
3365 return (error); | |
3366 } | |
3367 | |
2082 | 3368 /* |
3369 * Get the list of spares, if specified. | |
3370 */ | |
3371 if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES, | |
3372 &spares, &nspares) == 0) { | |
5450 | 3373 VERIFY(nvlist_alloc(&spa->spa_spares.sav_config, NV_UNIQUE_NAME, |
2082 | 3374 KM_SLEEP) == 0); |
5450 | 3375 VERIFY(nvlist_add_nvlist_array(spa->spa_spares.sav_config, |
2082 | 3376 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
|
3377 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); |
2082 | 3378 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
|
3379 spa_config_exit(spa, SCL_ALL, FTAG); |
5450 | 3380 spa->spa_spares.sav_sync = B_TRUE; |
3381 } | |
3382 | |
3383 /* | |
3384 * Get the list of level 2 cache devices, if specified. | |
3385 */ | |
3386 if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_L2CACHE, | |
3387 &l2cache, &nl2cache) == 0) { | |
3388 VERIFY(nvlist_alloc(&spa->spa_l2cache.sav_config, | |
3389 NV_UNIQUE_NAME, KM_SLEEP) == 0); | |
3390 VERIFY(nvlist_add_nvlist_array(spa->spa_l2cache.sav_config, | |
3391 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
|
3392 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); |
5450 | 3393 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
|
3394 spa_config_exit(spa, SCL_ALL, FTAG); |
5450 | 3395 spa->spa_l2cache.sav_sync = B_TRUE; |
2082 | 3396 } |
3397 | |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3398 spa->spa_is_initializing = B_TRUE; |
7184
9508660f9c27
PSARC 2008/223 Pool root file system properties via zpool(1M)
timh
parents:
7147
diff
changeset
|
3399 spa->spa_dsl_pool = dp = dsl_pool_create(spa, zplprops, txg); |
789 | 3400 spa->spa_meta_objset = dp->dp_meta_objset; |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3401 spa->spa_is_initializing = B_FALSE; |
789 | 3402 |
10956
0c81acaaf614
6897693 deduplication can only go so far
George Wilson <George.Wilson@Sun.COM>
parents:
10950
diff
changeset
|
3403 /* |
0c81acaaf614
6897693 deduplication can only go so far
George Wilson <George.Wilson@Sun.COM>
parents:
10950
diff
changeset
|
3404 * Create DDTs (dedup tables). |
0c81acaaf614
6897693 deduplication can only go so far
George Wilson <George.Wilson@Sun.COM>
parents:
10950
diff
changeset
|
3405 */ |
0c81acaaf614
6897693 deduplication can only go so far
George Wilson <George.Wilson@Sun.COM>
parents:
10950
diff
changeset
|
3406 ddt_create(spa); |
0c81acaaf614
6897693 deduplication can only go so far
George Wilson <George.Wilson@Sun.COM>
parents:
10950
diff
changeset
|
3407 |
0c81acaaf614
6897693 deduplication can only go so far
George Wilson <George.Wilson@Sun.COM>
parents:
10950
diff
changeset
|
3408 spa_update_dspace(spa); |
0c81acaaf614
6897693 deduplication can only go so far
George Wilson <George.Wilson@Sun.COM>
parents:
10950
diff
changeset
|
3409 |
789 | 3410 tx = dmu_tx_create_assigned(dp, txg); |
3411 | |
3412 /* | |
3413 * Create the pool config object. | |
3414 */ | |
3415 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
|
3416 DMU_OT_PACKED_NVLIST, SPA_CONFIG_BLOCKSIZE, |
789 | 3417 DMU_OT_PACKED_NVLIST_SIZE, sizeof (uint64_t), tx); |
3418 | |
1544 | 3419 if (zap_add(spa->spa_meta_objset, |
789 | 3420 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_CONFIG, |
1544 | 3421 sizeof (uint64_t), 1, &spa->spa_config_object, tx) != 0) { |
3422 cmn_err(CE_PANIC, "failed to add pool config"); | |
3423 } | |
789 | 3424 |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3425 if (spa_version(spa) >= SPA_VERSION_FEATURES) |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3426 spa_feature_create_zap_objects(spa, tx); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3427 |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
3428 if (zap_add(spa->spa_meta_objset, |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
3429 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_CREATION_VERSION, |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
3430 sizeof (uint64_t), 1, &version, tx) != 0) { |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
3431 cmn_err(CE_PANIC, "failed to add pool version"); |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
3432 } |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
3433 |
5094 | 3434 /* Newly created pools with the right version are always deflated. */ |
3435 if (version >= SPA_VERSION_RAIDZ_DEFLATE) { | |
3436 spa->spa_deflate = TRUE; | |
3437 if (zap_add(spa->spa_meta_objset, | |
3438 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_DEFLATE, | |
3439 sizeof (uint64_t), 1, &spa->spa_deflate, tx) != 0) { | |
3440 cmn_err(CE_PANIC, "failed to add deflate"); | |
3441 } | |
2082 | 3442 } |
3443 | |
789 | 3444 /* |
12470
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
3445 * Create the deferred-free bpobj. Turn off compression |
789 | 3446 * because sync-to-convergence takes longer if the blocksize |
3447 * keeps changing. | |
3448 */ | |
12470
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
3449 obj = bpobj_alloc(spa->spa_meta_objset, 1 << 14, tx); |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
3450 dmu_object_set_compress(spa->spa_meta_objset, obj, |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
3451 ZIO_COMPRESS_OFF, tx); |
1544 | 3452 if (zap_add(spa->spa_meta_objset, |
12470
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
3453 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_SYNC_BPOBJ, |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
3454 sizeof (uint64_t), 1, &obj, tx) != 0) { |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
3455 cmn_err(CE_PANIC, "failed to add bpobj"); |
1544 | 3456 } |
13765
9410cf539b11
backout 3006: causes 3046 (panics after mounting root)
Richard Lowe <richlowe@richlowe.net>
parents:
13764
diff
changeset
|
3457 VERIFY3U(0, ==, bpobj_open(&spa->spa_deferred_bpobj, |
12470
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
3458 spa->spa_meta_objset, obj)); |
789 | 3459 |
2926 | 3460 /* |
3461 * Create the pool's history object. | |
3462 */ | |
5094 | 3463 if (version >= SPA_VERSION_ZPOOL_HISTORY) |
3464 spa_history_create_obj(spa, tx); | |
3465 | |
3466 /* | |
3467 * Set pool properties. | |
3468 */ | |
3469 spa->spa_bootfs = zpool_prop_default_numeric(ZPOOL_PROP_BOOTFS); | |
3470 spa->spa_delegation = zpool_prop_default_numeric(ZPOOL_PROP_DELEGATION); | |
5329 | 3471 spa->spa_failmode = zpool_prop_default_numeric(ZPOOL_PROP_FAILUREMODE); |
9816
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
3472 spa->spa_autoexpand = zpool_prop_default_numeric(ZPOOL_PROP_AUTOEXPAND); |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
3473 |
8525
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
3474 if (props != NULL) { |
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
3475 spa_configfile_set(spa, props, B_FALSE); |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
3476 spa_sync_props(spa, props, tx); |
8525
e0e0e525d0f8
6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
8242
diff
changeset
|
3477 } |
2926 | 3478 |
789 | 3479 dmu_tx_commit(tx); |
3480 | |
3481 spa->spa_sync_on = B_TRUE; | |
3482 txg_sync_start(spa->spa_dsl_pool); | |
3483 | |
3484 /* | |
3485 * We explicitly wait for the first transaction to complete so that our | |
3486 * bean counters are appropriately updated. | |
3487 */ | |
3488 txg_wait_synced(spa->spa_dsl_pool, txg); | |
3489 | |
6643
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
3490 spa_config_sync(spa, B_FALSE, B_TRUE); |
789 | 3491 |
13743
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
3492 spa_history_log_version(spa, "create"); |
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
|
3493 |
8667
5c308a17eb7c
6795440 Assertion failure in spa_close()
George Wilson <George.Wilson@Sun.COM>
parents:
8662
diff
changeset
|
3494 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
|
3495 |
789 | 3496 mutex_exit(&spa_namespace_lock); |
3497 | |
3498 return (0); | |
3499 } | |
3500 | |
6423 | 3501 #ifdef _KERNEL |
3502 /* | |
9790
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3503 * Get the root pool information from the root disk, then import the root pool |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3504 * during the system boot up time. |
6423 | 3505 */ |
9790
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3506 extern int vdev_disk_read_rootlabel(char *, char *, nvlist_t **); |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3507 |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3508 static nvlist_t * |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3509 spa_generate_rootconf(char *devpath, char *devid, uint64_t *guid) |
6423 | 3510 { |
9790
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3511 nvlist_t *config; |
6423 | 3512 nvlist_t *nvtop, *nvroot; |
3513 uint64_t pgid; | |
3514 | |
9790
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3515 if (vdev_disk_read_rootlabel(devpath, devid, &config) != 0) |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3516 return (NULL); |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3517 |
6423 | 3518 /* |
3519 * Add this top-level vdev to the child array. | |
3520 */ | |
9790
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3521 VERIFY(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3522 &nvtop) == 0); |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3523 VERIFY(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID, |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3524 &pgid) == 0); |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3525 VERIFY(nvlist_lookup_uint64(config, ZPOOL_CONFIG_GUID, guid) == 0); |
6423 | 3526 |
3527 /* | |
3528 * Put this pool's top-level vdevs into a root vdev. | |
3529 */ | |
3530 VERIFY(nvlist_alloc(&nvroot, NV_UNIQUE_NAME, KM_SLEEP) == 0); | |
9790
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3531 VERIFY(nvlist_add_string(nvroot, ZPOOL_CONFIG_TYPE, |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3532 VDEV_TYPE_ROOT) == 0); |
6423 | 3533 VERIFY(nvlist_add_uint64(nvroot, ZPOOL_CONFIG_ID, 0ULL) == 0); |
3534 VERIFY(nvlist_add_uint64(nvroot, ZPOOL_CONFIG_GUID, pgid) == 0); | |
3535 VERIFY(nvlist_add_nvlist_array(nvroot, ZPOOL_CONFIG_CHILDREN, | |
3536 &nvtop, 1) == 0); | |
3537 | |
3538 /* | |
3539 * Replace the existing vdev_tree with the new root vdev in | |
3540 * this pool's configuration (remove the old, add the new). | |
3541 */ | |
3542 VERIFY(nvlist_add_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, nvroot) == 0); | |
3543 nvlist_free(nvroot); | |
9790
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3544 return (config); |
6423 | 3545 } |
3546 | |
3547 /* | |
9790
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3548 * Walk the vdev tree and see if we can find a device with "better" |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3549 * configuration. A configuration is "better" if the label on that |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3550 * device has a more recent txg. |
6423 | 3551 */ |
9790
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3552 static void |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3553 spa_alt_rootvdev(vdev_t *vd, vdev_t **avd, uint64_t *txg) |
7147
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
3554 { |
9816
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
3555 for (int c = 0; c < vd->vdev_children; c++) |
9790
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3556 spa_alt_rootvdev(vd->vdev_child[c], avd, txg); |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3557 |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3558 if (vd->vdev_ops->vdev_op_leaf) { |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3559 nvlist_t *label; |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3560 uint64_t label_txg; |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3561 |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3562 if (vdev_disk_read_rootlabel(vd->vdev_physpath, vd->vdev_devid, |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3563 &label) != 0) |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3564 return; |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3565 |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3566 VERIFY(nvlist_lookup_uint64(label, ZPOOL_CONFIG_POOL_TXG, |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3567 &label_txg) == 0); |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3568 |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3569 /* |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3570 * Do we have a better boot device? |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3571 */ |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3572 if (label_txg > *txg) { |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3573 *txg = label_txg; |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3574 *avd = vd; |
7147
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
3575 } |
9790
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3576 nvlist_free(label); |
7147
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
3577 } |
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
3578 } |
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
3579 |
6423 | 3580 /* |
3581 * Import a root pool. | |
3582 * | |
7147
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
3583 * 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
|
3584 * 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
|
3585 * The GRUB "findroot" command will return the vdev we should boot. |
6423 | 3586 * |
3587 * For Sparc, devpath_list consists the physpath name of the booting device | |
3588 * no matter the rootpool is a single device pool or a mirrored pool. | |
3589 * e.g. | |
3590 * "/pci@1f,0/ide@d/disk@0,0:a" | |
3591 */ | |
3592 int | |
7147
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
3593 spa_import_rootpool(char *devpath, char *devid) |
6423 | 3594 { |
9790
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3595 spa_t *spa; |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3596 vdev_t *rvd, *bvd, *avd = NULL; |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3597 nvlist_t *config, *nvtop; |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3598 uint64_t guid, txg; |
6423 | 3599 char *pname; |
3600 int error; | |
3601 | |
3602 /* | |
9790
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3603 * Read the label from the boot device and generate a configuration. |
6423 | 3604 */ |
10822 | 3605 config = spa_generate_rootconf(devpath, devid, &guid); |
3606 #if defined(_OBP) && defined(_KERNEL) | |
3607 if (config == NULL) { | |
3608 if (strstr(devpath, "/iscsi/ssd") != NULL) { | |
3609 /* iscsi boot */ | |
3610 get_iscsi_bootpath_phy(devpath); | |
3611 config = spa_generate_rootconf(devpath, devid, &guid); | |
3612 } | |
3613 } | |
3614 #endif | |
3615 if (config == NULL) { | |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3616 cmn_err(CE_NOTE, "Cannot read the pool label from '%s'", |
9790
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3617 devpath); |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3618 return (EIO); |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3619 } |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3620 |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3621 VERIFY(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME, |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3622 &pname) == 0); |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3623 VERIFY(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_TXG, &txg) == 0); |
6423 | 3624 |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3625 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
|
3626 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
|
3627 /* |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3628 * 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
|
3629 * 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
|
3630 */ |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3631 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
|
3632 } |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3633 |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
3634 spa = spa_add(pname, config, NULL); |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3635 spa->spa_is_root = B_TRUE; |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3636 spa->spa_import_flags = ZFS_IMPORT_VERBATIM; |
9790
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3637 |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3638 /* |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3639 * Build up a vdev tree based on the boot device's label config. |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3640 */ |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3641 VERIFY(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3642 &nvtop) == 0); |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3643 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3644 error = spa_config_parse(spa, &rvd, nvtop, NULL, 0, |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3645 VDEV_ALLOC_ROOTPOOL); |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3646 spa_config_exit(spa, SCL_ALL, FTAG); |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3647 if (error) { |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3648 mutex_exit(&spa_namespace_lock); |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3649 nvlist_free(config); |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3650 cmn_err(CE_NOTE, "Can not parse the config for pool '%s'", |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3651 pname); |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3652 return (error); |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3653 } |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3654 |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3655 /* |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3656 * Get the boot vdev. |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3657 */ |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3658 if ((bvd = vdev_lookup_by_guid(rvd, guid)) == NULL) { |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3659 cmn_err(CE_NOTE, "Can not find the boot vdev for guid %llu", |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3660 (u_longlong_t)guid); |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3661 error = ENOENT; |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3662 goto out; |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3663 } |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3664 |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3665 /* |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3666 * Determine if there is a better boot device. |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3667 */ |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3668 avd = bvd; |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3669 spa_alt_rootvdev(rvd, &avd, &txg); |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3670 if (avd != bvd) { |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3671 cmn_err(CE_NOTE, "The boot device is 'degraded'. Please " |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3672 "try booting from '%s'", avd->vdev_path); |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3673 error = EINVAL; |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3674 goto out; |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3675 } |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3676 |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3677 /* |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3678 * If the boot device is part of a spare vdev then ensure that |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3679 * we're booting off the active spare. |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3680 */ |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3681 if (bvd->vdev_parent->vdev_ops == &vdev_spare_ops && |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3682 !bvd->vdev_isspare) { |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3683 cmn_err(CE_NOTE, "The boot device is currently spared. Please " |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3684 "try booting from '%s'", |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
3685 bvd->vdev_parent-> |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
3686 vdev_child[bvd->vdev_parent->vdev_children - 1]->vdev_path); |
9790
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3687 error = EINVAL; |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3688 goto out; |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3689 } |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3690 |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3691 error = 0; |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3692 out: |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3693 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3694 vdev_free(rvd); |
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3695 spa_config_exit(spa, SCL_ALL, FTAG); |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3696 mutex_exit(&spa_namespace_lock); |
6423 | 3697 |
9790
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3698 nvlist_free(config); |
6423 | 3699 return (error); |
3700 } | |
9790
e276ee006ff6
6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents:
9725
diff
changeset
|
3701 |
6423 | 3702 #endif |
3703 | |
3704 /* | |
3705 * Import a non-root pool into the system. | |
3706 */ | |
3707 int | |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3708 spa_import(const char *pool, nvlist_t *config, nvlist_t *props, uint64_t flags) |
6423 | 3709 { |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3710 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
|
3711 char *altroot = NULL; |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
3712 spa_load_state_t state = SPA_LOAD_IMPORT; |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
3713 zpool_rewind_policy_t policy; |
13061
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
3714 uint64_t mode = spa_mode_global; |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
3715 uint64_t readonly = B_FALSE; |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3716 int error; |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3717 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
|
3718 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
|
3719 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
|
3720 |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3721 /* |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3722 * 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
|
3723 */ |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3724 mutex_enter(&spa_namespace_lock); |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
3725 if (spa_lookup(pool) != NULL) { |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3726 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
|
3727 return (EEXIST); |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3728 } |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3729 |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3730 /* |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3731 * 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
|
3732 */ |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3733 (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
|
3734 zpool_prop_to_name(ZPOOL_PROP_ALTROOT), &altroot); |
13061
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
3735 (void) nvlist_lookup_uint64(props, |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
3736 zpool_prop_to_name(ZPOOL_PROP_READONLY), &readonly); |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
3737 if (readonly) |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
3738 mode = FREAD; |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
3739 spa = spa_add(pool, config, altroot); |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3740 spa->spa_import_flags = flags; |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3741 |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3742 /* |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3743 * Verbatim import - Take a pool and insert it into the namespace |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3744 * as if it had been loaded at boot. |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3745 */ |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3746 if (spa->spa_import_flags & ZFS_IMPORT_VERBATIM) { |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3747 if (props != NULL) |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3748 spa_configfile_set(spa, props, B_FALSE); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3749 |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3750 spa_config_sync(spa, B_FALSE, B_TRUE); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3751 |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3752 mutex_exit(&spa_namespace_lock); |
13743
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
3753 spa_history_log_version(spa, "import"); |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3754 |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3755 return (0); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3756 } |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3757 |
13061
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
3758 spa_activate(spa, mode); |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3759 |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3760 /* |
9630
e25a03f552e0
6776104 "zfs import" deadlock between spa_unload() and spa_async_thread()
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
9616
diff
changeset
|
3761 * Don't start async tasks until we know everything is healthy. |
e25a03f552e0
6776104 "zfs import" deadlock between spa_unload() and spa_async_thread()
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
9616
diff
changeset
|
3762 */ |
e25a03f552e0
6776104 "zfs import" deadlock between spa_unload() and spa_async_thread()
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
9616
diff
changeset
|
3763 spa_async_suspend(spa); |
e25a03f552e0
6776104 "zfs import" deadlock between spa_unload() and spa_async_thread()
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
9616
diff
changeset
|
3764 |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3765 zpool_get_rewind_policy(config, &policy); |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3766 if (policy.zrp_request & ZPOOL_DO_REWIND) |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3767 state = SPA_LOAD_RECOVER; |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3768 |
9630
e25a03f552e0
6776104 "zfs import" deadlock between spa_unload() and spa_async_thread()
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
9616
diff
changeset
|
3769 /* |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3770 * 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
|
3771 * 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
|
3772 * 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
|
3773 */ |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
3774 if (state != SPA_LOAD_RECOVER) |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
3775 spa->spa_last_ubsync_txg = spa->spa_load_txg = 0; |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3776 |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
3777 error = spa_load_best(spa, state, B_TRUE, policy.zrp_txg, |
11727
497d03ab2824
6900971 zdb rewind behavior needs to be revisited
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11619
diff
changeset
|
3778 policy.zrp_request); |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
3779 |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
3780 /* |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3781 * Propagate anything learned while loading the pool and pass it |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3782 * back to caller (i.e. rewind info, missing devices, etc). |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
3783 */ |
12961
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3784 VERIFY(nvlist_add_nvlist(config, ZPOOL_CONFIG_LOAD_INFO, |
b521d551715f
6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents:
12877
diff
changeset
|
3785 spa->spa_load_info) == 0); |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3786 |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3787 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
|
3788 /* |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3789 * 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
|
3790 * 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
|
3791 */ |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3792 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
|
3793 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
|
3794 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
|
3795 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
|
3796 } |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3797 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
|
3798 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
|
3799 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
|
3800 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
|
3801 } |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3802 |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3803 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
|
3804 &nvroot) == 0); |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3805 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
|
3806 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
|
3807 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
|
3808 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
|
3809 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
|
3810 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
|
3811 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
|
3812 |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3813 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
|
3814 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
|
3815 |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3816 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
|
3817 (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
|
3818 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
|
3819 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
|
3820 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
|
3821 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
|
3822 return (error); |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3823 } |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3824 |
12600
25763e25fe19
6951283 hotspare_import_001_pos FAILs unless doing a sync before detach
Lin Ling <Lin.Ling@Sun.COM>
parents:
12470
diff
changeset
|
3825 spa_async_resume(spa); |
25763e25fe19
6951283 hotspare_import_001_pos FAILs unless doing a sync before detach
Lin Ling <Lin.Ling@Sun.COM>
parents:
12470
diff
changeset
|
3826 |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3827 /* |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3828 * 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
|
3829 * 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
|
3830 */ |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3831 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
|
3832 &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
|
3833 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
|
3834 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
|
3835 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
|
3836 else |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3837 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
|
3838 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
|
3839 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
|
3840 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
|
3841 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
|
3842 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
|
3843 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
|
3844 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
|
3845 } |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3846 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
|
3847 &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
|
3848 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
|
3849 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
|
3850 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
|
3851 else |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3852 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
|
3853 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
|
3854 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
|
3855 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
|
3856 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
|
3857 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
|
3858 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
|
3859 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
|
3860 } |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3861 |
10672
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
3862 /* |
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
3863 * Check for any removed devices. |
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
3864 */ |
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
3865 if (spa->spa_autoreplace) { |
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
3866 spa_aux_check_removed(&spa->spa_spares); |
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
3867 spa_aux_check_removed(&spa->spa_l2cache); |
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
3868 } |
cee5a0f557db
6836743 zfs_ioc_pool_set_props() leaks nvlist if configfile is only property
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10594
diff
changeset
|
3869 |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3870 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
|
3871 /* |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3872 * 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
|
3873 */ |
10100
4a6965f6bef8
6856634 snv_117 not booting: zfs_parse_bootfs: error2
Lin Ling <Lin.Ling@Sun.COM>
parents:
10000
diff
changeset
|
3874 spa_config_update(spa, SPA_CONFIG_UPDATE_POOL); |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3875 } |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3876 |
9816
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
3877 /* |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
3878 * It's possible that the pool was expanded while it was exported. |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
3879 * We kick off an async task to handle this for us. |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
3880 */ |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
3881 spa_async_request(spa, SPA_ASYNC_AUTOEXPAND); |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
3882 |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3883 mutex_exit(&spa_namespace_lock); |
13743
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
3884 spa_history_log_version(spa, "import"); |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3885 |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3886 return (0); |
6643
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
3887 } |
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
3888 |
789 | 3889 nvlist_t * |
3890 spa_tryimport(nvlist_t *tryconfig) | |
3891 { | |
3892 nvlist_t *config = NULL; | |
3893 char *poolname; | |
3894 spa_t *spa; | |
3895 uint64_t state; | |
8680
005fe27123ba
6786321 panic on spa_tryimport() a corrupted pool
Lin Ling <Lin.Ling@Sun.COM>
parents:
8667
diff
changeset
|
3896 int error; |
789 | 3897 |
3898 if (nvlist_lookup_string(tryconfig, ZPOOL_CONFIG_POOL_NAME, &poolname)) | |
3899 return (NULL); | |
3900 | |
3901 if (nvlist_lookup_uint64(tryconfig, ZPOOL_CONFIG_POOL_STATE, &state)) | |
3902 return (NULL); | |
3903 | |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
3904 /* |
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
3905 * Create and initialize the spa structure. |
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
3906 */ |
789 | 3907 mutex_enter(&spa_namespace_lock); |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
3908 spa = spa_add(TRYIMPORT_NAME, tryconfig, NULL); |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
3909 spa_activate(spa, FREAD); |
789 | 3910 |
3911 /* | |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
3912 * Pass off the heavy lifting to spa_load(). |
1732 | 3913 * Pass TRUE for mosconfig because the user-supplied config |
3914 * is actually the one to trust when doing an import. | |
789 | 3915 */ |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
3916 error = spa_load(spa, SPA_LOAD_TRYIMPORT, SPA_IMPORT_EXISTING, B_TRUE); |
789 | 3917 |
3918 /* | |
3919 * If 'tryconfig' was at least parsable, return the current config. | |
3920 */ | |
3921 if (spa->spa_root_vdev != NULL) { | |
3922 config = spa_config_generate(spa, NULL, -1ULL, B_TRUE); | |
3923 VERIFY(nvlist_add_string(config, ZPOOL_CONFIG_POOL_NAME, | |
3924 poolname) == 0); | |
3925 VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_POOL_STATE, | |
3926 state) == 0); | |
3975
6674f5d79069
6282725 hostname/hostid should be stored in the label
ek110237
parents:
3912
diff
changeset
|
3927 VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_TIMESTAMP, |
6674f5d79069
6282725 hostname/hostid should be stored in the label
ek110237
parents:
3912
diff
changeset
|
3928 spa->spa_uberblock.ub_timestamp) == 0); |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3929 VERIFY(nvlist_add_nvlist(config, ZPOOL_CONFIG_LOAD_INFO, |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
3930 spa->spa_load_info) == 0); |
2082 | 3931 |
3932 /* | |
6423 | 3933 * If the bootfs property exists on this pool then we |
3934 * copy it out so that external consumers can tell which | |
3935 * pools are bootable. | |
3936 */ | |
8680
005fe27123ba
6786321 panic on spa_tryimport() a corrupted pool
Lin Ling <Lin.Ling@Sun.COM>
parents:
8667
diff
changeset
|
3937 if ((!error || error == EEXIST) && spa->spa_bootfs) { |
6423 | 3938 char *tmpname = kmem_alloc(MAXPATHLEN, KM_SLEEP); |
3939 | |
3940 /* | |
3941 * We have to play games with the name since the | |
3942 * pool was opened as TRYIMPORT_NAME. | |
3943 */ | |
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
|
3944 if (dsl_dsobj_to_dsname(spa_name(spa), |
6423 | 3945 spa->spa_bootfs, tmpname) == 0) { |
3946 char *cp; | |
3947 char *dsname = kmem_alloc(MAXPATHLEN, KM_SLEEP); | |
3948 | |
3949 cp = strchr(tmpname, '/'); | |
3950 if (cp == NULL) { | |
3951 (void) strlcpy(dsname, tmpname, | |
3952 MAXPATHLEN); | |
3953 } else { | |
3954 (void) snprintf(dsname, MAXPATHLEN, | |
3955 "%s/%s", poolname, ++cp); | |
3956 } | |
3957 VERIFY(nvlist_add_string(config, | |
3958 ZPOOL_CONFIG_BOOTFS, dsname) == 0); | |
3959 kmem_free(dsname, MAXPATHLEN); | |
3960 } | |
3961 kmem_free(tmpname, MAXPATHLEN); | |
3962 } | |
3963 | |
3964 /* | |
5450 | 3965 * Add the list of hot spares and level 2 cache devices. |
2082 | 3966 */ |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
3967 spa_config_enter(spa, SCL_CONFIG, FTAG, RW_READER); |
2082 | 3968 spa_add_spares(spa, config); |
5450 | 3969 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
|
3970 spa_config_exit(spa, SCL_CONFIG, FTAG); |
789 | 3971 } |
3972 | |
3973 spa_unload(spa); | |
3974 spa_deactivate(spa); | |
3975 spa_remove(spa); | |
3976 mutex_exit(&spa_namespace_lock); | |
3977 | |
3978 return (config); | |
3979 } | |
3980 | |
3981 /* | |
3982 * Pool export/destroy | |
3983 * | |
3984 * The act of destroying or exporting a pool is very simple. We make sure there | |
3985 * is no more pending I/O and any references to the pool are gone. Then, we | |
3986 * 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
|
3987 * 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
|
3988 * we don't sync the labels or remove the configuration cache. |
789 | 3989 */ |
3990 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
|
3991 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
|
3992 boolean_t force, boolean_t hardforce) |
789 | 3993 { |
3994 spa_t *spa; | |
3995 | |
1775
e51e26b432c0
6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents:
1760
diff
changeset
|
3996 if (oldconfig) |
e51e26b432c0
6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents:
1760
diff
changeset
|
3997 *oldconfig = NULL; |
e51e26b432c0
6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents:
1760
diff
changeset
|
3998 |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
3999 if (!(spa_mode_global & FWRITE)) |
789 | 4000 return (EROFS); |
4001 | |
4002 mutex_enter(&spa_namespace_lock); | |
4003 if ((spa = spa_lookup(pool)) == NULL) { | |
4004 mutex_exit(&spa_namespace_lock); | |
4005 return (ENOENT); | |
4006 } | |
4007 | |
4008 /* | |
1544 | 4009 * Put a hold on the pool, drop the namespace lock, stop async tasks, |
4010 * reacquire the namespace lock, and see if we can export. | |
4011 */ | |
4012 spa_open_ref(spa, FTAG); | |
4013 mutex_exit(&spa_namespace_lock); | |
4014 spa_async_suspend(spa); | |
4015 mutex_enter(&spa_namespace_lock); | |
4016 spa_close(spa, FTAG); | |
4017 | |
4018 /* | |
789 | 4019 * The pool will be in core if it's openable, |
4020 * in which case we can modify its state. | |
4021 */ | |
4022 if (spa->spa_state != POOL_STATE_UNINITIALIZED && spa->spa_sync_on) { | |
4023 /* | |
4024 * Objsets may be open only because they're dirty, so we | |
4025 * have to force it to sync before checking spa_refcnt. | |
4026 */ | |
4027 txg_wait_synced(spa->spa_dsl_pool, 0); | |
4028 | |
1544 | 4029 /* |
4030 * A pool cannot be exported or destroyed if there are active | |
4031 * references. If we are resetting a pool, allow references by | |
4032 * fault injection handlers. | |
4033 */ | |
4034 if (!spa_refcount_zero(spa) || | |
4035 (spa->spa_inject_ref != 0 && | |
4036 new_state != POOL_STATE_UNINITIALIZED)) { | |
4037 spa_async_resume(spa); | |
789 | 4038 mutex_exit(&spa_namespace_lock); |
4039 return (EBUSY); | |
4040 } | |
4041 | |
4042 /* | |
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
|
4043 * 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
|
4044 * 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
|
4045 * 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
|
4046 * 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
|
4047 */ |
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
|
4048 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
|
4049 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
|
4050 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
|
4051 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
|
4052 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
|
4053 } |
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
|
4054 |
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
|
4055 /* |
789 | 4056 * We want this to be reflected on every label, |
4057 * so mark them all dirty. spa_unload() will do the | |
4058 * final sync that pushes these changes out. | |
4059 */ | |
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
|
4060 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
|
4061 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); |
1544 | 4062 spa->spa_state = new_state; |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
4063 spa->spa_final_txg = spa_last_synced_txg(spa) + |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
4064 TXG_DEFER_SIZE + 1; |
1544 | 4065 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
|
4066 spa_config_exit(spa, SCL_ALL, FTAG); |
1544 | 4067 } |
789 | 4068 } |
4069 | |
4451 | 4070 spa_event_notify(spa, NULL, ESC_ZFS_POOL_DESTROY); |
4071 | |
789 | 4072 if (spa->spa_state != POOL_STATE_UNINITIALIZED) { |
4073 spa_unload(spa); | |
4074 spa_deactivate(spa); | |
4075 } | |
4076 | |
1775
e51e26b432c0
6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents:
1760
diff
changeset
|
4077 if (oldconfig && spa->spa_config) |
e51e26b432c0
6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents:
1760
diff
changeset
|
4078 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
|
4079 |
1544 | 4080 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
|
4081 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
|
4082 spa_config_sync(spa, B_TRUE, B_TRUE); |
1544 | 4083 spa_remove(spa); |
4084 } | |
789 | 4085 mutex_exit(&spa_namespace_lock); |
4086 | |
4087 return (0); | |
4088 } | |
4089 | |
4090 /* | |
4091 * Destroy a storage pool. | |
4092 */ | |
4093 int | |
4094 spa_destroy(char *pool) | |
4095 { | |
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
|
4096 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
|
4097 B_FALSE, B_FALSE)); |
789 | 4098 } |
4099 | |
4100 /* | |
4101 * Export a storage pool. | |
4102 */ | |
4103 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
|
4104 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
|
4105 boolean_t hardforce) |
789 | 4106 { |
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
|
4107 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
|
4108 force, hardforce)); |
789 | 4109 } |
4110 | |
4111 /* | |
1544 | 4112 * Similar to spa_export(), this unloads the spa_t without actually removing it |
4113 * from the namespace in any way. | |
4114 */ | |
4115 int | |
4116 spa_reset(char *pool) | |
4117 { | |
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
|
4118 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
|
4119 B_FALSE, B_FALSE)); |
1544 | 4120 } |
4121 | |
4122 /* | |
789 | 4123 * ========================================================================== |
4124 * Device manipulation | |
4125 * ========================================================================== | |
4126 */ | |
4127 | |
4128 /* | |
4527 | 4129 * Add a device to a storage pool. |
789 | 4130 */ |
4131 int | |
4132 spa_vdev_add(spa_t *spa, nvlist_t *nvroot) | |
4133 { | |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
4134 uint64_t txg, id; |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
4135 int error; |
789 | 4136 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
|
4137 vdev_t *vd, *tvd; |
5450 | 4138 nvlist_t **spares, **l2cache; |
4139 uint_t nspares, nl2cache; | |
789 | 4140 |
13061
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
4141 ASSERT(spa_writeable(spa)); |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
4142 |
789 | 4143 txg = spa_vdev_enter(spa); |
4144 | |
2082 | 4145 if ((error = spa_config_parse(spa, &vd, nvroot, NULL, 0, |
4146 VDEV_ALLOC_ADD)) != 0) | |
4147 return (spa_vdev_exit(spa, NULL, txg, error)); | |
4148 | |
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
|
4149 spa->spa_pending_vdev = vd; /* spa_vdev_exit() will clear this */ |
789 | 4150 |
5450 | 4151 if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES, &spares, |
4152 &nspares) != 0) | |
2082 | 4153 nspares = 0; |
4154 | |
5450 | 4155 if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_L2CACHE, &l2cache, |
4156 &nl2cache) != 0) | |
4157 nl2cache = 0; | |
4158 | |
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
|
4159 if (vd->vdev_children == 0 && nspares == 0 && nl2cache == 0) |
2082 | 4160 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
|
4161 |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
4162 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
|
4163 (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
|
4164 return (spa_vdev_exit(spa, vd, txg, error)); |
2082 | 4165 |
3377
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
4166 /* |
5450 | 4167 * We must validate the spares and l2cache devices after checking the |
4168 * 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
|
4169 */ |
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
|
4170 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
|
4171 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
|
4172 |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
4173 /* |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
4174 * 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
|
4175 */ |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
4176 for (int c = 0; c < vd->vdev_children; c++) { |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
4177 |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
4178 /* |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
4179 * Set the vdev id to the first hole, if one exists. |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
4180 */ |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
4181 for (id = 0; id < rvd->vdev_children; id++) { |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
4182 if (rvd->vdev_child[id]->vdev_ishole) { |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
4183 vdev_free(rvd->vdev_child[id]); |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
4184 break; |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
4185 } |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
4186 } |
3377
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
4187 tvd = vd->vdev_child[c]; |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
4188 vdev_remove_child(vd, tvd); |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
4189 tvd->vdev_id = id; |
3377
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
4190 vdev_add_child(rvd, tvd); |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
4191 vdev_config_dirty(tvd); |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
4192 } |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
4193 |
2082 | 4194 if (nspares != 0) { |
5450 | 4195 spa_set_aux_vdevs(&spa->spa_spares, spares, nspares, |
4196 ZPOOL_CONFIG_SPARES); | |
2082 | 4197 spa_load_spares(spa); |
5450 | 4198 spa->spa_spares.sav_sync = B_TRUE; |
4199 } | |
4200 | |
4201 if (nl2cache != 0) { | |
4202 spa_set_aux_vdevs(&spa->spa_l2cache, l2cache, nl2cache, | |
4203 ZPOOL_CONFIG_L2CACHE); | |
4204 spa_load_l2cache(spa); | |
4205 spa->spa_l2cache.sav_sync = B_TRUE; | |
789 | 4206 } |
4207 | |
4208 /* | |
1585
4ad213e858a9
6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents:
1544
diff
changeset
|
4209 * 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
|
4210 * 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
|
4211 * 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
|
4212 * 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
|
4213 * 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
|
4214 * 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
|
4215 * 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
|
4216 * |
4ad213e858a9
6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents:
1544
diff
changeset
|
4217 * 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
|
4218 * 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
|
4219 * steps will be completed the next time we load the pool. |
789 | 4220 */ |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
4221 (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
|
4222 |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
4223 mutex_enter(&spa_namespace_lock); |
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
4224 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
|
4225 mutex_exit(&spa_namespace_lock); |
789 | 4226 |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
4227 return (0); |
789 | 4228 } |
4229 | |
4230 /* | |
4231 * Attach a device to a mirror. The arguments are the path to any device | |
4232 * in the mirror, and the nvroot for the new device. If the path specifies | |
4233 * a device that is not mirrored, we automatically insert the mirror vdev. | |
4234 * | |
4235 * If 'replacing' is specified, the new device is intended to replace the | |
4236 * existing device; in this case the two devices are made into their own | |
4451 | 4237 * mirror using the 'replacing' vdev, which is functionally identical to |
789 | 4238 * the mirror vdev (it actually reuses all the same ops) but has a few |
4239 * extra rules: you can't attach to it after it's been created, and upon | |
4240 * completion of resilvering, the first disk (the one being replaced) | |
4241 * is automatically detached. | |
4242 */ | |
4243 int | |
1544 | 4244 spa_vdev_attach(spa_t *spa, uint64_t guid, nvlist_t *nvroot, int replacing) |
789 | 4245 { |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
4246 uint64_t txg, dtl_max_txg; |
789 | 4247 vdev_t *rvd = spa->spa_root_vdev; |
4248 vdev_t *oldvd, *newvd, *newrootvd, *pvd, *tvd; | |
2082 | 4249 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
|
4250 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
|
4251 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
|
4252 int error; |
789 | 4253 |
13061
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
4254 ASSERT(spa_writeable(spa)); |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
4255 |
789 | 4256 txg = spa_vdev_enter(spa); |
4257 | |
6643
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
4258 oldvd = spa_lookup_by_guid(spa, guid, B_FALSE); |
789 | 4259 |
4260 if (oldvd == NULL) | |
4261 return (spa_vdev_exit(spa, NULL, txg, ENODEV)); | |
4262 | |
1585
4ad213e858a9
6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents:
1544
diff
changeset
|
4263 if (!oldvd->vdev_ops->vdev_op_leaf) |
4ad213e858a9
6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents:
1544
diff
changeset
|
4264 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
|
4265 |
789 | 4266 pvd = oldvd->vdev_parent; |
4267 | |
2082 | 4268 if ((error = spa_config_parse(spa, &newrootvd, nvroot, NULL, 0, |
13574
d0fde6cacaac
1951 leaking a vdev when removing an l2cache device
George Wilson <george.wilson@delphix.com>
parents:
13573
diff
changeset
|
4269 VDEV_ALLOC_ATTACH)) != 0) |
4451 | 4270 return (spa_vdev_exit(spa, NULL, txg, EINVAL)); |
4271 | |
4272 if (newrootvd->vdev_children != 1) | |
789 | 4273 return (spa_vdev_exit(spa, newrootvd, txg, EINVAL)); |
4274 | |
4275 newvd = newrootvd->vdev_child[0]; | |
4276 | |
4277 if (!newvd->vdev_ops->vdev_op_leaf) | |
4278 return (spa_vdev_exit(spa, newrootvd, txg, EINVAL)); | |
4279 | |
2082 | 4280 if ((error = vdev_create(newrootvd, txg, replacing)) != 0) |
789 | 4281 return (spa_vdev_exit(spa, newrootvd, txg, error)); |
4282 | |
4527 | 4283 /* |
4284 * Spares can't replace logs | |
4285 */ | |
7326
a3c803100a09
6713886 hot spares of mirrored log devices should not be allowed
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
7313
diff
changeset
|
4286 if (oldvd->vdev_top->vdev_islog && newvd->vdev_isspare) |
4527 | 4287 return (spa_vdev_exit(spa, newrootvd, txg, ENOTSUP)); |
4288 | |
2082 | 4289 if (!replacing) { |
4290 /* | |
4291 * For attach, the only allowable parent is a mirror or the root | |
4292 * vdev. | |
4293 */ | |
4294 if (pvd->vdev_ops != &vdev_mirror_ops && | |
4295 pvd->vdev_ops != &vdev_root_ops) | |
4296 return (spa_vdev_exit(spa, newrootvd, txg, ENOTSUP)); | |
4297 | |
4298 pvops = &vdev_mirror_ops; | |
4299 } else { | |
4300 /* | |
4301 * Active hot spares can only be replaced by inactive hot | |
4302 * spares. | |
4303 */ | |
4304 if (pvd->vdev_ops == &vdev_spare_ops && | |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4305 oldvd->vdev_isspare && |
2082 | 4306 !spa_has_spare(spa, newvd->vdev_guid)) |
4307 return (spa_vdev_exit(spa, newrootvd, txg, ENOTSUP)); | |
4308 | |
4309 /* | |
4310 * If the source is a hot spare, and the parent isn't already a | |
4311 * 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
|
4312 * 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
|
4313 * 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
|
4314 * 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
|
4315 * non-spare). |
2082 | 4316 */ |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4317 if (pvd->vdev_ops == &vdev_replacing_ops && |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4318 spa_version(spa) < SPA_VERSION_MULTI_REPLACE) { |
2082 | 4319 return (spa_vdev_exit(spa, newrootvd, txg, ENOTSUP)); |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4320 } else if (pvd->vdev_ops == &vdev_spare_ops && |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4321 newvd->vdev_isspare != oldvd->vdev_isspare) { |
3377
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
4322 return (spa_vdev_exit(spa, newrootvd, txg, ENOTSUP)); |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4323 } |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4324 |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4325 if (newvd->vdev_isspare) |
2082 | 4326 pvops = &vdev_spare_ops; |
4327 else | |
4328 pvops = &vdev_replacing_ops; | |
4329 } | |
4330 | |
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
|
4331 /* |
9816
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
4332 * Make sure the new device is big enough. |
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
|
4333 */ |
9816
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
4334 if (newvd->vdev_asize < vdev_get_min_asize(oldvd)) |
789 | 4335 return (spa_vdev_exit(spa, newrootvd, txg, EOVERFLOW)); |
4336 | |
1732 | 4337 /* |
4338 * The new device cannot have a higher alignment requirement | |
4339 * than the top-level vdev. | |
4340 */ | |
4341 if (newvd->vdev_ashift > oldvd->vdev_top->vdev_ashift) | |
789 | 4342 return (spa_vdev_exit(spa, newrootvd, txg, EDOM)); |
4343 | |
4344 /* | |
4345 * If this is an in-place replacement, update oldvd's path and devid | |
4346 * to make it distinguishable from newvd, and unopenable from now on. | |
4347 */ | |
4348 if (strcmp(oldvd->vdev_path, newvd->vdev_path) == 0) { | |
4349 spa_strfree(oldvd->vdev_path); | |
4350 oldvd->vdev_path = kmem_alloc(strlen(newvd->vdev_path) + 5, | |
4351 KM_SLEEP); | |
4352 (void) sprintf(oldvd->vdev_path, "%s/%s", | |
4353 newvd->vdev_path, "old"); | |
4354 if (oldvd->vdev_devid != NULL) { | |
4355 spa_strfree(oldvd->vdev_devid); | |
4356 oldvd->vdev_devid = NULL; | |
4357 } | |
4358 } | |
4359 | |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4360 /* mark the device being resilvered */ |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4361 newvd->vdev_resilvering = B_TRUE; |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4362 |
789 | 4363 /* |
2082 | 4364 * If the parent is not a mirror, or if we're replacing, insert the new |
4365 * mirror/replacing/spare vdev above oldvd. | |
789 | 4366 */ |
4367 if (pvd->vdev_ops != pvops) | |
4368 pvd = vdev_add_parent(oldvd, pvops); | |
4369 | |
4370 ASSERT(pvd->vdev_top->vdev_parent == rvd); | |
4371 ASSERT(pvd->vdev_ops == pvops); | |
4372 ASSERT(oldvd->vdev_parent == pvd); | |
4373 | |
4374 /* | |
4375 * Extract the new device from its root and add it to pvd. | |
4376 */ | |
4377 vdev_remove_child(newrootvd, newvd); | |
4378 newvd->vdev_id = pvd->vdev_children; | |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
4379 newvd->vdev_crtxg = oldvd->vdev_crtxg; |
789 | 4380 vdev_add_child(pvd, newvd); |
4381 | |
4382 tvd = newvd->vdev_top; | |
4383 ASSERT(pvd->vdev_top == tvd); | |
4384 ASSERT(tvd->vdev_parent == rvd); | |
4385 | |
4386 vdev_config_dirty(tvd); | |
4387 | |
4388 /* | |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
4389 * Set newvd's DTL to [TXG_INITIAL, dtl_max_txg) so that we account |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
4390 * for any dmu_sync-ed blocks. It will propagate upward when |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
4391 * spa_vdev_exit() calls vdev_dtl_reassess(). |
789 | 4392 */ |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
4393 dtl_max_txg = txg + TXG_CONCURRENT_STATES; |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
4394 |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
4395 vdev_dtl_dirty(newvd, DTL_MISSING, TXG_INITIAL, |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
4396 dtl_max_txg - TXG_INITIAL); |
789 | 4397 |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
4398 if (newvd->vdev_isspare) { |
3377
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
4399 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
|
4400 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
|
4401 } |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
4402 |
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
|
4403 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
|
4404 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
|
4405 newvd_isspare = newvd->vdev_isspare; |
1544 | 4406 |
789 | 4407 /* |
4408 * Mark newvd's DTL dirty in this txg. | |
4409 */ | |
1732 | 4410 vdev_dirty(tvd, VDD_DTL, newvd, txg); |
789 | 4411 |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
4412 /* |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
4413 * Restart the resilver |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
4414 */ |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
4415 dsl_resilver_restart(spa->spa_dsl_pool, dtl_max_txg); |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
4416 |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
4417 /* |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
4418 * Commit the config |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
4419 */ |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
4420 (void) spa_vdev_exit(spa, newrootvd, dtl_max_txg, 0); |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
4421 |
13743
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
4422 spa_history_log_internal(spa, "vdev attach", NULL, |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
4423 "%s vdev=%s %s vdev=%s", |
9946
86a051e72232
6842809 zfs history needs to record system info on import/create
Mark J Musante <Mark.Musante@Sun.COM>
parents:
9816
diff
changeset
|
4424 replacing && newvd_isspare ? "spare in" : |
86a051e72232
6842809 zfs history needs to record system info on import/create
Mark J Musante <Mark.Musante@Sun.COM>
parents:
9816
diff
changeset
|
4425 replacing ? "replace" : "attach", newvdpath, |
86a051e72232
6842809 zfs history needs to record system info on import/create
Mark J Musante <Mark.Musante@Sun.COM>
parents:
9816
diff
changeset
|
4426 replacing ? "for" : "to", oldvdpath); |
7313
99e2110471bb
6734585 zpool history should log when a spare device becomes active
Eric Kustarz <Eric.Kustarz@Sun.COM>
parents:
7294
diff
changeset
|
4427 |
99e2110471bb
6734585 zpool history should log when a spare device becomes active
Eric Kustarz <Eric.Kustarz@Sun.COM>
parents:
7294
diff
changeset
|
4428 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
|
4429 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
|
4430 |
12877
08987220809a
6668666 zpool command should put a bootblock on a disk added as a mirror of a root pool vdev
Lori Alt <lori.alt@oracle.com>
parents:
12829
diff
changeset
|
4431 if (spa->spa_bootfs) |
08987220809a
6668666 zpool command should put a bootblock on a disk added as a mirror of a root pool vdev
Lori Alt <lori.alt@oracle.com>
parents:
12829
diff
changeset
|
4432 spa_event_notify(spa, newvd, ESC_ZFS_BOOTFS_VDEV_ATTACH); |
08987220809a
6668666 zpool command should put a bootblock on a disk added as a mirror of a root pool vdev
Lori Alt <lori.alt@oracle.com>
parents:
12829
diff
changeset
|
4433 |
789 | 4434 return (0); |
4435 } | |
4436 | |
4437 /* | |
4438 * Detach a device from a mirror or replacing vdev. | |
4439 * If 'replace_done' is specified, only detach if the parent | |
4440 * is a replacing vdev. | |
4441 */ | |
4442 int | |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
4443 spa_vdev_detach(spa_t *spa, uint64_t guid, uint64_t pguid, int replace_done) |
789 | 4444 { |
4445 uint64_t txg; | |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
4446 int error; |
789 | 4447 vdev_t *rvd = spa->spa_root_vdev; |
4448 vdev_t *vd, *pvd, *cvd, *tvd; | |
2082 | 4449 boolean_t unspare = B_FALSE; |
13952
7a22d0770fc8
3522 zfs module should not allow uninitialized variables
George Wilson <george.wilson@delphix.com>
parents:
13941
diff
changeset
|
4450 uint64_t unspare_guid = 0; |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4451 char *vdpath; |
789 | 4452 |
13061
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
4453 ASSERT(spa_writeable(spa)); |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
4454 |
789 | 4455 txg = spa_vdev_enter(spa); |
4456 | |
6643
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
4457 vd = spa_lookup_by_guid(spa, guid, B_FALSE); |
789 | 4458 |
4459 if (vd == NULL) | |
4460 return (spa_vdev_exit(spa, NULL, txg, ENODEV)); | |
4461 | |
1585
4ad213e858a9
6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents:
1544
diff
changeset
|
4462 if (!vd->vdev_ops->vdev_op_leaf) |
4ad213e858a9
6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents:
1544
diff
changeset
|
4463 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
|
4464 |
789 | 4465 pvd = vd->vdev_parent; |
4466 | |
4467 /* | |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
4468 * 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
|
4469 * 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
|
4470 * 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
|
4471 * 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
|
4472 * 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
|
4473 * 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
|
4474 * 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
|
4475 * 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
|
4476 * 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
|
4477 * 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
|
4478 * 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
|
4479 */ |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
4480 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
|
4481 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
|
4482 |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
4483 /* |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4484 * Only 'replacing' or 'spare' vdevs can be replaced. |
789 | 4485 */ |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4486 if (replace_done && pvd->vdev_ops != &vdev_replacing_ops && |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4487 pvd->vdev_ops != &vdev_spare_ops) |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4488 return (spa_vdev_exit(spa, NULL, txg, ENOTSUP)); |
2082 | 4489 |
4490 ASSERT(pvd->vdev_ops != &vdev_spare_ops || | |
4577 | 4491 spa_version(spa) >= SPA_VERSION_SPARES); |
789 | 4492 |
4493 /* | |
2082 | 4494 * Only mirror, replacing, and spare vdevs support detach. |
789 | 4495 */ |
4496 if (pvd->vdev_ops != &vdev_replacing_ops && | |
2082 | 4497 pvd->vdev_ops != &vdev_mirror_ops && |
4498 pvd->vdev_ops != &vdev_spare_ops) | |
789 | 4499 return (spa_vdev_exit(spa, NULL, txg, ENOTSUP)); |
4500 | |
4501 /* | |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
4502 * 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
|
4503 * we cannot safely detach it. |
789 | 4504 */ |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
4505 if (vdev_dtl_required(vd)) |
789 | 4506 return (spa_vdev_exit(spa, NULL, txg, EBUSY)); |
4507 | |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
4508 ASSERT(pvd->vdev_children >= 2); |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
4509 |
789 | 4510 /* |
6673
be079d6124af
6697301 deadlock between ZFS and devfs can hang system
eschrock
parents:
6643
diff
changeset
|
4511 * 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
|
4512 * 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
|
4513 * 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
|
4514 */ |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4515 if (pvd->vdev_ops == &vdev_replacing_ops && vd->vdev_id > 0 && |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4516 vd->vdev_path != NULL) { |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4517 size_t len = strlen(vd->vdev_path); |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4518 |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4519 for (int c = 0; c < pvd->vdev_children; c++) { |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4520 cvd = pvd->vdev_child[c]; |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4521 |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4522 if (cvd == vd || cvd->vdev_path == NULL) |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4523 continue; |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4524 |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4525 if (strncmp(cvd->vdev_path, vd->vdev_path, len) == 0 && |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4526 strcmp(cvd->vdev_path + len, "/old") == 0) { |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4527 spa_strfree(cvd->vdev_path); |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4528 cvd->vdev_path = spa_strdup(vd->vdev_path); |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4529 break; |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4530 } |
6673
be079d6124af
6697301 deadlock between ZFS and devfs can hang system
eschrock
parents:
6643
diff
changeset
|
4531 } |
be079d6124af
6697301 deadlock between ZFS and devfs can hang system
eschrock
parents:
6643
diff
changeset
|
4532 } |
be079d6124af
6697301 deadlock between ZFS and devfs can hang system
eschrock
parents:
6643
diff
changeset
|
4533 |
be079d6124af
6697301 deadlock between ZFS and devfs can hang system
eschrock
parents:
6643
diff
changeset
|
4534 /* |
2082 | 4535 * If we are detaching the original disk from a spare, then it implies |
4536 * that the spare should become a real disk, and be removed from the | |
4537 * active spare list for the pool. | |
4538 */ | |
4539 if (pvd->vdev_ops == &vdev_spare_ops && | |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4540 vd->vdev_id == 0 && |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4541 pvd->vdev_child[pvd->vdev_children - 1]->vdev_isspare) |
2082 | 4542 unspare = B_TRUE; |
4543 | |
4544 /* | |
789 | 4545 * Erase the disk labels so the disk can be used for other things. |
4546 * This must be done after all other error cases are handled, | |
4547 * but before we disembowel vd (so we can still do I/O to it). | |
4548 * But if we can't do it, don't treat the error as fatal -- | |
4549 * it may be that the unwritability of the disk is the reason | |
4550 * it's being detached! | |
4551 */ | |
3377
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
4552 error = vdev_label_init(vd, 0, VDEV_LABEL_REMOVE); |
789 | 4553 |
4554 /* | |
4555 * Remove vd from its parent and compact the parent's children. | |
4556 */ | |
4557 vdev_remove_child(pvd, vd); | |
4558 vdev_compact_children(pvd); | |
4559 | |
4560 /* | |
4561 * Remember one of the remaining children so we can get tvd below. | |
4562 */ | |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4563 cvd = pvd->vdev_child[pvd->vdev_children - 1]; |
789 | 4564 |
4565 /* | |
2082 | 4566 * 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
|
4567 * 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
|
4568 * 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
|
4569 * 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
|
4570 * 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
|
4571 * 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
|
4572 * the subsequent attempt to spa_vdev_remove(unspare_guid) would fail. |
2082 | 4573 */ |
4574 if (unspare) { | |
4575 ASSERT(cvd->vdev_isspare); | |
3377
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
4576 spa_spare_remove(cvd); |
2082 | 4577 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
|
4578 (void) spa_vdev_remove(spa, unspare_guid, B_TRUE); |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4579 cvd->vdev_unspare = B_TRUE; |
2082 | 4580 } |
4581 | |
4582 /* | |
789 | 4583 * If the parent mirror/replacing vdev only has one child, |
4584 * the parent is no longer needed. Remove it from the tree. | |
4585 */ | |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4586 if (pvd->vdev_children == 1) { |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4587 if (pvd->vdev_ops == &vdev_spare_ops) |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4588 cvd->vdev_unspare = B_FALSE; |
789 | 4589 vdev_remove_parent(cvd); |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4590 cvd->vdev_resilvering = B_FALSE; |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4591 } |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4592 |
789 | 4593 |
4594 /* | |
4595 * We don't set tvd until now because the parent we just removed | |
4596 * may have been the previous top-level vdev. | |
4597 */ | |
4598 tvd = cvd->vdev_top; | |
4599 ASSERT(tvd->vdev_parent == rvd); | |
4600 | |
4601 /* | |
3377
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
4602 * Reevaluate the parent vdev state. |
789 | 4603 */ |
4451 | 4604 vdev_propagate_state(cvd); |
789 | 4605 |
4606 /* | |
9816
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
4607 * If the 'autoexpand' property is set on the pool then automatically |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
4608 * try to expand the size of the pool. For example if the device we |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
4609 * just detached was smaller than the others, it may be possible to |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
4610 * add metaslabs (i.e. grow the pool). We need to reopen the vdev |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
4611 * first so that we can obtain the updated sizes of the leaf vdevs. |
789 | 4612 */ |
9816
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
4613 if (spa->spa_autoexpand) { |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
4614 vdev_reopen(tvd); |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
4615 vdev_expand(tvd, txg); |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
4616 } |
789 | 4617 |
4618 vdev_config_dirty(tvd); | |
4619 | |
4620 /* | |
3377
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
4621 * 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
|
4622 * 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
|
4623 * 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
|
4624 * prevent vd from being accessed after it's freed. |
789 | 4625 */ |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4626 vdpath = spa_strdup(vd->vdev_path); |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
4627 for (int t = 0; t < TXG_SIZE; t++) |
789 | 4628 (void) txg_list_remove_this(&tvd->vdev_dtl_list, vd, t); |
1732 | 4629 vd->vdev_detached = B_TRUE; |
4630 vdev_dirty(tvd, VDD_DTL, vd, txg); | |
789 | 4631 |
4451 | 4632 spa_event_notify(spa, vd, ESC_ZFS_VDEV_REMOVE); |
4633 | |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4634 /* hang on to the spa before we release the lock */ |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4635 spa_open_ref(spa, FTAG); |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4636 |
2082 | 4637 error = spa_vdev_exit(spa, vd, txg, 0); |
4638 | |
13743
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
4639 spa_history_log_internal(spa, "detach", NULL, |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4640 "vdev=%s", vdpath); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4641 spa_strfree(vdpath); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4642 |
2082 | 4643 /* |
3377
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
4644 * 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
|
4645 * 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
|
4646 * list of every other pool. |
2082 | 4647 */ |
4648 if (unspare) { | |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4649 spa_t *altspa = NULL; |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4650 |
2082 | 4651 mutex_enter(&spa_namespace_lock); |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4652 while ((altspa = spa_next(altspa)) != NULL) { |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4653 if (altspa->spa_state != POOL_STATE_ACTIVE || |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4654 altspa == spa) |
2082 | 4655 continue; |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4656 |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4657 spa_open_ref(altspa, FTAG); |
7793
4dbbc0a3f135
6755897 recursive mutex enter in spa_vdev_enter when running test suite
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7754
diff
changeset
|
4658 mutex_exit(&spa_namespace_lock); |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4659 (void) spa_vdev_remove(altspa, 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
|
4660 mutex_enter(&spa_namespace_lock); |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4661 spa_close(altspa, FTAG); |
2082 | 4662 } |
4663 mutex_exit(&spa_namespace_lock); | |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4664 |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4665 /* search the rest of the vdevs for spares to remove */ |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4666 spa_vdev_resilver_done(spa); |
2082 | 4667 } |
4668 | |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4669 /* all done with the spa; OK to release */ |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4670 mutex_enter(&spa_namespace_lock); |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4671 spa_close(spa, FTAG); |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4672 mutex_exit(&spa_namespace_lock); |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
4673 |
2082 | 4674 return (error); |
4675 } | |
4676 | |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4677 /* |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4678 * Split a set of devices from their mirrors, and create a new pool from them. |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4679 */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4680 int |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4681 spa_vdev_split_mirror(spa_t *spa, char *newname, nvlist_t *config, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4682 nvlist_t *props, boolean_t exp) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4683 { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4684 int error = 0; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4685 uint64_t txg, *glist; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4686 spa_t *newspa; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4687 uint_t c, children, lastlog; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4688 nvlist_t **child, *nvl, *tmp; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4689 dmu_tx_t *tx; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4690 char *altroot = NULL; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4691 vdev_t *rvd, **vml = NULL; /* vdev modify list */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4692 boolean_t activate_slog; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4693 |
13061
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
4694 ASSERT(spa_writeable(spa)); |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4695 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4696 txg = spa_vdev_enter(spa); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4697 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4698 /* clear the log and flush everything up to now */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4699 activate_slog = spa_passivate_log(spa); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4700 (void) spa_vdev_config_exit(spa, NULL, txg, 0, FTAG); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4701 error = spa_offline_log(spa); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4702 txg = spa_vdev_config_enter(spa); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4703 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4704 if (activate_slog) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4705 spa_activate_log(spa); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4706 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4707 if (error != 0) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4708 return (spa_vdev_exit(spa, NULL, txg, error)); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4709 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4710 /* check new spa name before going any further */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4711 if (spa_lookup(newname) != NULL) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4712 return (spa_vdev_exit(spa, NULL, txg, EEXIST)); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4713 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4714 /* |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4715 * scan through all the children to ensure they're all mirrors |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4716 */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4717 if (nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, &nvl) != 0 || |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4718 nvlist_lookup_nvlist_array(nvl, ZPOOL_CONFIG_CHILDREN, &child, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4719 &children) != 0) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4720 return (spa_vdev_exit(spa, NULL, txg, EINVAL)); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4721 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4722 /* first, check to ensure we've got the right child count */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4723 rvd = spa->spa_root_vdev; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4724 lastlog = 0; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4725 for (c = 0; c < rvd->vdev_children; c++) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4726 vdev_t *vd = rvd->vdev_child[c]; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4727 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4728 /* don't count the holes & logs as children */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4729 if (vd->vdev_islog || vd->vdev_ishole) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4730 if (lastlog == 0) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4731 lastlog = c; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4732 continue; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4733 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4734 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4735 lastlog = 0; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4736 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4737 if (children != (lastlog != 0 ? lastlog : rvd->vdev_children)) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4738 return (spa_vdev_exit(spa, NULL, txg, EINVAL)); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4739 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4740 /* next, ensure no spare or cache devices are part of the split */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4741 if (nvlist_lookup_nvlist(nvl, ZPOOL_CONFIG_SPARES, &tmp) == 0 || |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4742 nvlist_lookup_nvlist(nvl, ZPOOL_CONFIG_L2CACHE, &tmp) == 0) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4743 return (spa_vdev_exit(spa, NULL, txg, EINVAL)); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4744 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4745 vml = kmem_zalloc(children * sizeof (vdev_t *), KM_SLEEP); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4746 glist = kmem_zalloc(children * sizeof (uint64_t), KM_SLEEP); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4747 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4748 /* then, loop over each vdev and validate it */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4749 for (c = 0; c < children; c++) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4750 uint64_t is_hole = 0; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4751 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4752 (void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_HOLE, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4753 &is_hole); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4754 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4755 if (is_hole != 0) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4756 if (spa->spa_root_vdev->vdev_child[c]->vdev_ishole || |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4757 spa->spa_root_vdev->vdev_child[c]->vdev_islog) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4758 continue; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4759 } else { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4760 error = EINVAL; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4761 break; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4762 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4763 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4764 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4765 /* which disk is going to be split? */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4766 if (nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_GUID, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4767 &glist[c]) != 0) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4768 error = EINVAL; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4769 break; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4770 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4771 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4772 /* look it up in the spa */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4773 vml[c] = spa_lookup_by_guid(spa, glist[c], B_FALSE); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4774 if (vml[c] == NULL) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4775 error = ENODEV; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4776 break; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4777 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4778 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4779 /* make sure there's nothing stopping the split */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4780 if (vml[c]->vdev_parent->vdev_ops != &vdev_mirror_ops || |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4781 vml[c]->vdev_islog || |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4782 vml[c]->vdev_ishole || |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4783 vml[c]->vdev_isspare || |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4784 vml[c]->vdev_isl2cache || |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4785 !vdev_writeable(vml[c]) || |
11497
69b45e632792
6698011 zfs incorrectly reports file systems as children when attempting a rename
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11422
diff
changeset
|
4786 vml[c]->vdev_children != 0 || |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4787 vml[c]->vdev_state != VDEV_STATE_HEALTHY || |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4788 c != spa->spa_root_vdev->vdev_child[c]->vdev_id) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4789 error = EINVAL; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4790 break; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4791 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4792 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4793 if (vdev_dtl_required(vml[c])) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4794 error = EBUSY; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4795 break; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4796 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4797 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4798 /* we need certain info from the top level */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4799 VERIFY(nvlist_add_uint64(child[c], ZPOOL_CONFIG_METASLAB_ARRAY, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4800 vml[c]->vdev_top->vdev_ms_array) == 0); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4801 VERIFY(nvlist_add_uint64(child[c], ZPOOL_CONFIG_METASLAB_SHIFT, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4802 vml[c]->vdev_top->vdev_ms_shift) == 0); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4803 VERIFY(nvlist_add_uint64(child[c], ZPOOL_CONFIG_ASIZE, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4804 vml[c]->vdev_top->vdev_asize) == 0); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4805 VERIFY(nvlist_add_uint64(child[c], ZPOOL_CONFIG_ASHIFT, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4806 vml[c]->vdev_top->vdev_ashift) == 0); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4807 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4808 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4809 if (error != 0) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4810 kmem_free(vml, children * sizeof (vdev_t *)); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4811 kmem_free(glist, children * sizeof (uint64_t)); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4812 return (spa_vdev_exit(spa, NULL, txg, error)); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4813 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4814 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4815 /* stop writers from using the disks */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4816 for (c = 0; c < children; c++) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4817 if (vml[c] != NULL) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4818 vml[c]->vdev_offline = B_TRUE; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4819 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4820 vdev_reopen(spa->spa_root_vdev); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4821 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4822 /* |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4823 * Temporarily record the splitting vdevs in the spa config. This |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4824 * will disappear once the config is regenerated. |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4825 */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4826 VERIFY(nvlist_alloc(&nvl, NV_UNIQUE_NAME, KM_SLEEP) == 0); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4827 VERIFY(nvlist_add_uint64_array(nvl, ZPOOL_CONFIG_SPLIT_LIST, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4828 glist, children) == 0); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4829 kmem_free(glist, children * sizeof (uint64_t)); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4830 |
11864
2f59639f6ea4
6923241 'zpool split' set dedupditto as invalid value cause device offline
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11826
diff
changeset
|
4831 mutex_enter(&spa->spa_props_lock); |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4832 VERIFY(nvlist_add_nvlist(spa->spa_config, ZPOOL_CONFIG_SPLIT, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4833 nvl) == 0); |
11864
2f59639f6ea4
6923241 'zpool split' set dedupditto as invalid value cause device offline
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11826
diff
changeset
|
4834 mutex_exit(&spa->spa_props_lock); |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4835 spa->spa_config_splitting = nvl; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4836 vdev_config_dirty(spa->spa_root_vdev); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4837 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4838 /* configure and create the new pool */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4839 VERIFY(nvlist_add_string(config, ZPOOL_CONFIG_POOL_NAME, newname) == 0); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4840 VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_POOL_STATE, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4841 exp ? POOL_STATE_EXPORTED : POOL_STATE_ACTIVE) == 0); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4842 VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_VERSION, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4843 spa_version(spa)) == 0); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4844 VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_POOL_TXG, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4845 spa->spa_config_txg) == 0); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4846 VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_POOL_GUID, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4847 spa_generate_guid(NULL)) == 0); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4848 (void) nvlist_lookup_string(props, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4849 zpool_prop_to_name(ZPOOL_PROP_ALTROOT), &altroot); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4850 |
11497
69b45e632792
6698011 zfs incorrectly reports file systems as children when attempting a rename
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11422
diff
changeset
|
4851 /* add the new pool to the namespace */ |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4852 newspa = spa_add(newname, config, altroot); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4853 newspa->spa_config_txg = spa->spa_config_txg; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4854 spa_set_log_state(newspa, SPA_LOG_CLEAR); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4855 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4856 /* release the spa config lock, retaining the namespace lock */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4857 spa_vdev_config_exit(spa, NULL, txg, 0, FTAG); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4858 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4859 if (zio_injection_enabled) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4860 zio_handle_panic_injection(spa, FTAG, 1); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4861 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4862 spa_activate(newspa, spa_mode_global); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4863 spa_async_suspend(newspa); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4864 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4865 /* create the new pool from the disks of the original pool */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4866 error = spa_load(newspa, SPA_LOAD_IMPORT, SPA_IMPORT_ASSEMBLE, B_TRUE); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4867 if (error) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4868 goto out; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4869 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4870 /* if that worked, generate a real config for the new pool */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4871 if (newspa->spa_root_vdev != NULL) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4872 VERIFY(nvlist_alloc(&newspa->spa_config_splitting, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4873 NV_UNIQUE_NAME, KM_SLEEP) == 0); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4874 VERIFY(nvlist_add_uint64(newspa->spa_config_splitting, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4875 ZPOOL_CONFIG_SPLIT_GUID, spa_guid(spa)) == 0); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4876 spa_config_set(newspa, spa_config_generate(newspa, NULL, -1ULL, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4877 B_TRUE)); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4878 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4879 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4880 /* set the props */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4881 if (props != NULL) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4882 spa_configfile_set(newspa, props, B_FALSE); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4883 error = spa_prop_set(newspa, props); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4884 if (error) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4885 goto out; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4886 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4887 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4888 /* flush everything */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4889 txg = spa_vdev_config_enter(newspa); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4890 vdev_config_dirty(newspa->spa_root_vdev); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4891 (void) spa_vdev_config_exit(newspa, NULL, txg, 0, FTAG); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4892 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4893 if (zio_injection_enabled) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4894 zio_handle_panic_injection(spa, FTAG, 2); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4895 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4896 spa_async_resume(newspa); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4897 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4898 /* finally, update the original pool's config */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4899 txg = spa_vdev_config_enter(spa); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4900 tx = dmu_tx_create_dd(spa_get_dsl(spa)->dp_mos_dir); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4901 error = dmu_tx_assign(tx, TXG_WAIT); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4902 if (error != 0) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4903 dmu_tx_abort(tx); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4904 for (c = 0; c < children; c++) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4905 if (vml[c] != NULL) { |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4906 vdev_split(vml[c]); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4907 if (error == 0) |
13743
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
4908 spa_history_log_internal(spa, "detach", tx, |
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
4909 "vdev=%s", vml[c]->vdev_path); |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4910 vdev_free(vml[c]); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4911 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4912 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4913 vdev_config_dirty(spa->spa_root_vdev); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4914 spa->spa_config_splitting = NULL; |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4915 nvlist_free(nvl); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4916 if (error == 0) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4917 dmu_tx_commit(tx); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4918 (void) spa_vdev_exit(spa, NULL, txg, 0); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4919 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4920 if (zio_injection_enabled) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4921 zio_handle_panic_injection(spa, FTAG, 3); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4922 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4923 /* split is complete; log a history record */ |
13743
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
4924 spa_history_log_internal(newspa, "split", NULL, |
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
4925 "from pool %s", spa_name(spa)); |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4926 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4927 kmem_free(vml, children * sizeof (vdev_t *)); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4928 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4929 /* if we're not going to mount the filesystems in userland, export */ |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4930 if (exp) |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4931 error = spa_export_common(newname, POOL_STATE_EXPORTED, NULL, |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4932 B_FALSE, B_FALSE); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4933 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4934 return (error); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4935 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4936 out: |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4937 spa_unload(newspa); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4938 spa_deactivate(newspa); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4939 spa_remove(newspa); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4940 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4941 txg = spa_vdev_config_enter(spa); |
11864
2f59639f6ea4
6923241 'zpool split' set dedupditto as invalid value cause device offline
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11826
diff
changeset
|
4942 |
2f59639f6ea4
6923241 'zpool split' set dedupditto as invalid value cause device offline
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11826
diff
changeset
|
4943 /* re-online all offlined disks */ |
2f59639f6ea4
6923241 'zpool split' set dedupditto as invalid value cause device offline
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11826
diff
changeset
|
4944 for (c = 0; c < children; c++) { |
2f59639f6ea4
6923241 'zpool split' set dedupditto as invalid value cause device offline
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11826
diff
changeset
|
4945 if (vml[c] != NULL) |
2f59639f6ea4
6923241 'zpool split' set dedupditto as invalid value cause device offline
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11826
diff
changeset
|
4946 vml[c]->vdev_offline = B_FALSE; |
2f59639f6ea4
6923241 'zpool split' set dedupditto as invalid value cause device offline
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11826
diff
changeset
|
4947 } |
2f59639f6ea4
6923241 'zpool split' set dedupditto as invalid value cause device offline
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11826
diff
changeset
|
4948 vdev_reopen(spa->spa_root_vdev); |
2f59639f6ea4
6923241 'zpool split' set dedupditto as invalid value cause device offline
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11826
diff
changeset
|
4949 |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4950 nvlist_free(spa->spa_config_splitting); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4951 spa->spa_config_splitting = NULL; |
11497
69b45e632792
6698011 zfs incorrectly reports file systems as children when attempting a rename
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11422
diff
changeset
|
4952 (void) spa_vdev_exit(spa, NULL, txg, error); |
11422
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4953 |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4954 kmem_free(vml, children * sizeof (vdev_t *)); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4955 return (error); |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4956 } |
42768837421d
PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents:
11173
diff
changeset
|
4957 |
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
|
4958 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
|
4959 spa_nvlist_lookup_by_guid(nvlist_t **nvpp, int count, uint64_t target_guid) |
2082 | 4960 { |
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
|
4961 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
|
4962 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
|
4963 |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
4964 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
|
4965 &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
|
4966 |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
4967 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
|
4968 return (nvpp[i]); |
2082 | 4969 } |
4970 | |
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
|
4971 return (NULL); |
5450 | 4972 } |
4973 | |
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
|
4974 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
|
4975 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
|
4976 nvlist_t *dev_to_remove) |
5450 | 4977 { |
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
|
4978 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
|
4979 |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
4980 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
|
4981 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
|
4982 |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
4983 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
|
4984 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
|
4985 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
|
4986 VERIFY(nvlist_dup(dev[i], &newdev[j++], KM_SLEEP) == 0); |
5450 | 4987 } |
4988 | |
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
|
4989 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
|
4990 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
|
4991 |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
4992 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
|
4993 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
|
4994 |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
4995 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
|
4996 kmem_free(newdev, (count - 1) * sizeof (void *)); |
5450 | 4997 } |
4998 | |
4999 /* | |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5000 * Evacuate the device. |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5001 */ |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5002 static int |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5003 spa_vdev_remove_evacuate(spa_t *spa, vdev_t *vd) |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5004 { |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5005 uint64_t txg; |
10974
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5006 int error = 0; |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5007 |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5008 ASSERT(MUTEX_HELD(&spa_namespace_lock)); |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5009 ASSERT(spa_config_held(spa, SCL_ALL, RW_WRITER) == 0); |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5010 ASSERT(vd == vd->vdev_top); |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5011 |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5012 /* |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5013 * Evacuate the device. We don't hold the config lock as writer |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5014 * since we need to do I/O but we do keep the |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5015 * spa_namespace_lock held. Once this completes the device |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5016 * should no longer have any blocks allocated on it. |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5017 */ |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5018 if (vd->vdev_islog) { |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5019 if (vd->vdev_stat.vs_alloc != 0) |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5020 error = spa_offline_log(spa); |
10974
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5021 } else { |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5022 error = ENOTSUP; |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5023 } |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5024 |
10974
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5025 if (error) |
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5026 return (error); |
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5027 |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5028 /* |
10974
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5029 * The evacuation succeeded. Remove any remaining MOS metadata |
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5030 * associated with this vdev, and wait for these changes to sync. |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5031 */ |
13805
e3a9ae14a119
3006 VERIFY[S,U,P] and ASSERT[S,U,P] frequently check if first argument is zero
Madhav Suresh <madhav.suresh@delphix.com>
parents:
13777
diff
changeset
|
5032 ASSERT0(vd->vdev_stat.vs_alloc); |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5033 txg = spa_vdev_config_enter(spa); |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5034 vd->vdev_removing = B_TRUE; |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5035 vdev_dirty(vd, 0, NULL, txg); |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5036 vdev_config_dirty(vd); |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5037 spa_vdev_config_exit(spa, NULL, txg, 0, FTAG); |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5038 |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5039 return (0); |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5040 } |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5041 |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5042 /* |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5043 * Complete the removal by cleaning up the namespace. |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5044 */ |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5045 static void |
10974
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5046 spa_vdev_remove_from_namespace(spa_t *spa, vdev_t *vd) |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5047 { |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5048 vdev_t *rvd = spa->spa_root_vdev; |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5049 uint64_t id = vd->vdev_id; |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5050 boolean_t last_vdev = (id == (rvd->vdev_children - 1)); |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5051 |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5052 ASSERT(MUTEX_HELD(&spa_namespace_lock)); |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5053 ASSERT(spa_config_held(spa, SCL_ALL, RW_WRITER) == SCL_ALL); |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5054 ASSERT(vd == vd->vdev_top); |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5055 |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5056 /* |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5057 * Only remove any devices which are empty. |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5058 */ |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5059 if (vd->vdev_stat.vs_alloc != 0) |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5060 return; |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5061 |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5062 (void) vdev_label_init(vd, 0, VDEV_LABEL_REMOVE); |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5063 |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5064 if (list_link_active(&vd->vdev_state_dirty_node)) |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5065 vdev_state_clean(vd); |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5066 if (list_link_active(&vd->vdev_config_dirty_node)) |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5067 vdev_config_clean(vd); |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5068 |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5069 vdev_free(vd); |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5070 |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5071 if (last_vdev) { |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5072 vdev_compact_children(rvd); |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5073 } else { |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5074 vd = vdev_alloc_common(spa, id, 0, &vdev_hole_ops); |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5075 vdev_add_child(rvd, vd); |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5076 } |
12352
7e55397422a9
6950285 race between removing a top-level vdev and updating the vdev labels
Lin Ling <Lin.Ling@Sun.COM>
parents:
12318
diff
changeset
|
5077 vdev_config_dirty(rvd); |
7e55397422a9
6950285 race between removing a top-level vdev and updating the vdev labels
Lin Ling <Lin.Ling@Sun.COM>
parents:
12318
diff
changeset
|
5078 |
7e55397422a9
6950285 race between removing a top-level vdev and updating the vdev labels
Lin Ling <Lin.Ling@Sun.COM>
parents:
12318
diff
changeset
|
5079 /* |
7e55397422a9
6950285 race between removing a top-level vdev and updating the vdev labels
Lin Ling <Lin.Ling@Sun.COM>
parents:
12318
diff
changeset
|
5080 * Reassess the health of our root vdev. |
7e55397422a9
6950285 race between removing a top-level vdev and updating the vdev labels
Lin Ling <Lin.Ling@Sun.COM>
parents:
12318
diff
changeset
|
5081 */ |
7e55397422a9
6950285 race between removing a top-level vdev and updating the vdev labels
Lin Ling <Lin.Ling@Sun.COM>
parents:
12318
diff
changeset
|
5082 vdev_reopen(rvd); |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5083 } |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5084 |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5085 /* |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5086 * Remove a device from the pool - |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5087 * |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5088 * Removing a device from the vdev namespace requires several steps |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5089 * and can take a significant amount of time. As a result we use |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5090 * the spa_vdev_config_[enter/exit] functions which allow us to |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5091 * grab and release the spa_config_lock while still holding the namespace |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5092 * lock. During each step the configuration is synced out. |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5093 */ |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5094 |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5095 /* |
5450 | 5096 * Remove a device from the pool. Currently, this supports removing only hot |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5097 * spares, slogs, and level 2 ARC devices. |
5450 | 5098 */ |
5099 int | |
5100 spa_vdev_remove(spa_t *spa, uint64_t guid, boolean_t unspare) | |
5101 { | |
5102 vdev_t *vd; | |
10974
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5103 metaslab_group_t *mg; |
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
|
5104 nvlist_t **spares, **l2cache, *nv; |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5105 uint64_t txg = 0; |
5450 | 5106 uint_t nspares, nl2cache; |
5107 int error = 0; | |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5108 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
|
5109 |
13061
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
5110 ASSERT(spa_writeable(spa)); |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
5111 |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5112 if (!locked) |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5113 txg = spa_vdev_enter(spa); |
5450 | 5114 |
6643
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
5115 vd = spa_lookup_by_guid(spa, guid, B_FALSE); |
5450 | 5116 |
5117 if (spa->spa_spares.sav_vdevs != NULL && | |
5118 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
|
5119 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
|
5120 (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
|
5121 /* |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
5122 * 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
|
5123 * 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
|
5124 */ |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
5125 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
|
5126 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
|
5127 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
|
5128 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
|
5129 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
|
5130 } 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
|
5131 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
|
5132 } |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
5133 } else if (spa->spa_l2cache.sav_vdevs != NULL && |
5450 | 5134 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
|
5135 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
|
5136 (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
|
5137 /* |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
5138 * 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
|
5139 */ |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
5140 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
|
5141 ZPOOL_CONFIG_L2CACHE, l2cache, nl2cache, nv); |
5450 | 5142 spa_load_l2cache(spa); |
5143 spa->spa_l2cache.sav_sync = B_TRUE; | |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5144 } else if (vd != NULL && vd->vdev_islog) { |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5145 ASSERT(!locked); |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5146 ASSERT(vd == vd->vdev_top); |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5147 |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5148 /* |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5149 * XXX - Once we have bp-rewrite this should |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5150 * become the common case. |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5151 */ |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5152 |
10974
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5153 mg = vd->vdev_mg; |
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5154 |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5155 /* |
10974
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5156 * Stop allocating from this vdev. |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5157 */ |
10974
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5158 metaslab_group_passivate(mg); |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5159 |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5160 /* |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5161 * Wait for the youngest allocations and frees to sync, |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5162 * and then wait for the deferral of those frees to finish. |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5163 */ |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5164 spa_vdev_config_exit(spa, NULL, |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5165 txg + TXG_CONCURRENT_STATES + TXG_DEFER_SIZE, 0, FTAG); |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5166 |
10974
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5167 /* |
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5168 * Attempt to evacuate the vdev. |
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5169 */ |
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5170 error = spa_vdev_remove_evacuate(spa, vd); |
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5171 |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5172 txg = spa_vdev_config_enter(spa); |
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5173 |
10974
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5174 /* |
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5175 * If we couldn't evacuate the vdev, unwind. |
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5176 */ |
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5177 if (error) { |
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5178 metaslab_group_activate(mg); |
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5179 return (spa_vdev_exit(spa, NULL, txg, error)); |
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5180 } |
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5181 |
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5182 /* |
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5183 * Clean up the vdev namespace. |
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5184 */ |
32d689ba6466
6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10956
diff
changeset
|
5185 spa_vdev_remove_from_namespace(spa, vd); |
10594
986cb68d2347
6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents:
10575
diff
changeset
|
5186 |
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
|
5187 } 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
|
5188 /* |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
5189 * 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
|
5190 */ |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
5191 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
|
5192 } 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
|
5193 /* |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
5194 * 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
|
5195 */ |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
5196 error = ENOENT; |
5450 | 5197 } |
2082 | 5198 |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5199 if (!locked) |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5200 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
|
5201 |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5202 return (error); |
789 | 5203 } |
5204 | |
5205 /* | |
4451 | 5206 * Find any device that's done replacing, or a vdev marked 'unspare' that's |
5207 * current spared, so we can detach it. | |
789 | 5208 */ |
1544 | 5209 static vdev_t * |
4451 | 5210 spa_vdev_resilver_done_hunt(vdev_t *vd) |
789 | 5211 { |
1544 | 5212 vdev_t *newvd, *oldvd; |
9816
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5213 |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5214 for (int c = 0; c < vd->vdev_children; c++) { |
4451 | 5215 oldvd = spa_vdev_resilver_done_hunt(vd->vdev_child[c]); |
1544 | 5216 if (oldvd != NULL) |
5217 return (oldvd); | |
5218 } | |
789 | 5219 |
4451 | 5220 /* |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5221 * Check for a completed replacement. We always consider the first |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5222 * vdev in the list to be the oldest vdev, and the last one to be |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5223 * the newest (see spa_vdev_attach() for how that works). In |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5224 * the case where the newest vdev is faulted, we will not automatically |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5225 * remove it after a resilver completes. This is OK as it will require |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5226 * user intervention to determine which disk the admin wishes to keep. |
4451 | 5227 */ |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5228 if (vd->vdev_ops == &vdev_replacing_ops) { |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5229 ASSERT(vd->vdev_children > 1); |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5230 |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5231 newvd = vd->vdev_child[vd->vdev_children - 1]; |
1544 | 5232 oldvd = vd->vdev_child[0]; |
789 | 5233 |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5234 if (vdev_dtl_empty(newvd, DTL_MISSING) && |
11820
c69aaf82df80
6915289 check for completed replacement in spa_vdev_resilver_done_hunt() in incomplete
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11819
diff
changeset
|
5235 vdev_dtl_empty(newvd, DTL_OUTAGE) && |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5236 !vdev_dtl_required(oldvd)) |
1544 | 5237 return (oldvd); |
5238 } | |
789 | 5239 |
4451 | 5240 /* |
5241 * Check for a completed resilver with the 'unspare' flag set. | |
5242 */ | |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5243 if (vd->vdev_ops == &vdev_spare_ops) { |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5244 vdev_t *first = vd->vdev_child[0]; |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5245 vdev_t *last = vd->vdev_child[vd->vdev_children - 1]; |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5246 |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5247 if (last->vdev_unspare) { |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5248 oldvd = first; |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5249 newvd = last; |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5250 } else if (first->vdev_unspare) { |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5251 oldvd = last; |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5252 newvd = first; |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5253 } else { |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5254 oldvd = NULL; |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5255 } |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5256 |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5257 if (oldvd != NULL && |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5258 vdev_dtl_empty(newvd, DTL_MISSING) && |
11820
c69aaf82df80
6915289 check for completed replacement in spa_vdev_resilver_done_hunt() in incomplete
Victor Latushkin <Victor.Latushkin@Sun.COM>
parents:
11819
diff
changeset
|
5259 vdev_dtl_empty(newvd, DTL_OUTAGE) && |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5260 !vdev_dtl_required(oldvd)) |
4451 | 5261 return (oldvd); |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5262 |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5263 /* |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5264 * If there are more than two spares attached to a disk, |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5265 * and those spares are not required, then we want to |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5266 * attempt to free them up now so that they can be used |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5267 * by other pools. Once we're back down to a single |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5268 * disk+spare, we stop removing them. |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5269 */ |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5270 if (vd->vdev_children > 2) { |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5271 newvd = vd->vdev_child[1]; |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5272 |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5273 if (newvd->vdev_isspare && last->vdev_isspare && |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5274 vdev_dtl_empty(last, DTL_MISSING) && |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5275 vdev_dtl_empty(last, DTL_OUTAGE) && |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5276 !vdev_dtl_required(newvd)) |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5277 return (newvd); |
4451 | 5278 } |
5279 } | |
5280 | |
1544 | 5281 return (NULL); |
789 | 5282 } |
5283 | |
1544 | 5284 static void |
4451 | 5285 spa_vdev_resilver_done(spa_t *spa) |
789 | 5286 { |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5287 vdev_t *vd, *pvd, *ppvd; |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5288 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
|
5289 |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5290 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); |
789 | 5291 |
4451 | 5292 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
|
5293 pvd = vd->vdev_parent; |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5294 ppvd = pvd->vdev_parent; |
1544 | 5295 guid = vd->vdev_guid; |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5296 pguid = pvd->vdev_guid; |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5297 ppguid = ppvd->vdev_guid; |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5298 sguid = 0; |
2082 | 5299 /* |
5300 * If we have just finished replacing a hot spared device, then | |
5301 * we need to detach the parent's first child (the original hot | |
5302 * spare) as well. | |
5303 */ | |
13049
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5304 if (ppvd->vdev_ops == &vdev_spare_ops && pvd->vdev_id == 0 && |
2511753a6599
6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12961
diff
changeset
|
5305 ppvd->vdev_children == 2) { |
2082 | 5306 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
|
5307 sguid = ppvd->vdev_child[1]->vdev_guid; |
2082 | 5308 } |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5309 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
|
5310 if (spa_vdev_detach(spa, guid, pguid, B_TRUE) != 0) |
1544 | 5311 return; |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5312 if (sguid && spa_vdev_detach(spa, sguid, ppguid, B_TRUE) != 0) |
2082 | 5313 return; |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5314 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); |
789 | 5315 } |
5316 | |
8241
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5317 spa_config_exit(spa, SCL_ALL, FTAG); |
789 | 5318 } |
5319 | |
5320 /* | |
11041
5534d19ab5c3
6879915 spa_vdev_setpath can suspend holding spa_namespace_lock
Eric Taylor <Eric.Taylor@Sun.COM>
parents:
11026
diff
changeset
|
5321 * Update the stored path or FRU for this vdev. |
1354
81359ee1ee63
6362672 import gets confused about overlapping slices
eschrock
parents:
1175
diff
changeset
|
5322 */ |
81359ee1ee63
6362672 import gets confused about overlapping slices
eschrock
parents:
1175
diff
changeset
|
5323 int |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
5324 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
|
5325 boolean_t ispath) |
1354
81359ee1ee63
6362672 import gets confused about overlapping slices
eschrock
parents:
1175
diff
changeset
|
5326 { |
6643
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
5327 vdev_t *vd; |
11817
b27edb6d5047
6929202 "zpool status" command hang when all the disks in a pool failed.
George Wilson <George.Wilson@Sun.COM>
parents:
11810
diff
changeset
|
5328 boolean_t sync = B_FALSE; |
11041
5534d19ab5c3
6879915 spa_vdev_setpath can suspend holding spa_namespace_lock
Eric Taylor <Eric.Taylor@Sun.COM>
parents:
11026
diff
changeset
|
5329 |
13061
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
5330 ASSERT(spa_writeable(spa)); |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
5331 |
11041
5534d19ab5c3
6879915 spa_vdev_setpath can suspend holding spa_namespace_lock
Eric Taylor <Eric.Taylor@Sun.COM>
parents:
11026
diff
changeset
|
5332 spa_vdev_state_enter(spa, SCL_ALL); |
1354
81359ee1ee63
6362672 import gets confused about overlapping slices
eschrock
parents:
1175
diff
changeset
|
5333 |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
5334 if ((vd = spa_lookup_by_guid(spa, guid, B_TRUE)) == NULL) |
11041
5534d19ab5c3
6879915 spa_vdev_setpath can suspend holding spa_namespace_lock
Eric Taylor <Eric.Taylor@Sun.COM>
parents:
11026
diff
changeset
|
5335 return (spa_vdev_state_exit(spa, NULL, ENOENT)); |
1354
81359ee1ee63
6362672 import gets confused about overlapping slices
eschrock
parents:
1175
diff
changeset
|
5336 |
1585
4ad213e858a9
6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents:
1544
diff
changeset
|
5337 if (!vd->vdev_ops->vdev_op_leaf) |
11041
5534d19ab5c3
6879915 spa_vdev_setpath can suspend holding spa_namespace_lock
Eric Taylor <Eric.Taylor@Sun.COM>
parents:
11026
diff
changeset
|
5338 return (spa_vdev_state_exit(spa, NULL, ENOTSUP)); |
1585
4ad213e858a9
6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents:
1544
diff
changeset
|
5339 |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
5340 if (ispath) { |
11817
b27edb6d5047
6929202 "zpool status" command hang when all the disks in a pool failed.
George Wilson <George.Wilson@Sun.COM>
parents:
11810
diff
changeset
|
5341 if (strcmp(value, vd->vdev_path) != 0) { |
b27edb6d5047
6929202 "zpool status" command hang when all the disks in a pool failed.
George Wilson <George.Wilson@Sun.COM>
parents:
11810
diff
changeset
|
5342 spa_strfree(vd->vdev_path); |
b27edb6d5047
6929202 "zpool status" command hang when all the disks in a pool failed.
George Wilson <George.Wilson@Sun.COM>
parents:
11810
diff
changeset
|
5343 vd->vdev_path = spa_strdup(value); |
b27edb6d5047
6929202 "zpool status" command hang when all the disks in a pool failed.
George Wilson <George.Wilson@Sun.COM>
parents:
11810
diff
changeset
|
5344 sync = B_TRUE; |
b27edb6d5047
6929202 "zpool status" command hang when all the disks in a pool failed.
George Wilson <George.Wilson@Sun.COM>
parents:
11810
diff
changeset
|
5345 } |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
5346 } else { |
11817
b27edb6d5047
6929202 "zpool status" command hang when all the disks in a pool failed.
George Wilson <George.Wilson@Sun.COM>
parents:
11810
diff
changeset
|
5347 if (vd->vdev_fru == NULL) { |
b27edb6d5047
6929202 "zpool status" command hang when all the disks in a pool failed.
George Wilson <George.Wilson@Sun.COM>
parents:
11810
diff
changeset
|
5348 vd->vdev_fru = spa_strdup(value); |
b27edb6d5047
6929202 "zpool status" command hang when all the disks in a pool failed.
George Wilson <George.Wilson@Sun.COM>
parents:
11810
diff
changeset
|
5349 sync = B_TRUE; |
b27edb6d5047
6929202 "zpool status" command hang when all the disks in a pool failed.
George Wilson <George.Wilson@Sun.COM>
parents:
11810
diff
changeset
|
5350 } else if (strcmp(value, vd->vdev_fru) != 0) { |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
5351 spa_strfree(vd->vdev_fru); |
11817
b27edb6d5047
6929202 "zpool status" command hang when all the disks in a pool failed.
George Wilson <George.Wilson@Sun.COM>
parents:
11810
diff
changeset
|
5352 vd->vdev_fru = spa_strdup(value); |
b27edb6d5047
6929202 "zpool status" command hang when all the disks in a pool failed.
George Wilson <George.Wilson@Sun.COM>
parents:
11810
diff
changeset
|
5353 sync = B_TRUE; |
b27edb6d5047
6929202 "zpool status" command hang when all the disks in a pool failed.
George Wilson <George.Wilson@Sun.COM>
parents:
11810
diff
changeset
|
5354 } |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
5355 } |
1354
81359ee1ee63
6362672 import gets confused about overlapping slices
eschrock
parents:
1175
diff
changeset
|
5356 |
11817
b27edb6d5047
6929202 "zpool status" command hang when all the disks in a pool failed.
George Wilson <George.Wilson@Sun.COM>
parents:
11810
diff
changeset
|
5357 return (spa_vdev_state_exit(spa, sync ? vd : NULL, 0)); |
1354
81359ee1ee63
6362672 import gets confused about overlapping slices
eschrock
parents:
1175
diff
changeset
|
5358 } |
81359ee1ee63
6362672 import gets confused about overlapping slices
eschrock
parents:
1175
diff
changeset
|
5359 |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
5360 int |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
5361 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
|
5362 { |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
5363 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
|
5364 } |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
5365 |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
5366 int |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
5367 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
|
5368 { |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
5369 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
|
5370 } |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
5371 |
1354
81359ee1ee63
6362672 import gets confused about overlapping slices
eschrock
parents:
1175
diff
changeset
|
5372 /* |
789 | 5373 * ========================================================================== |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5374 * SPA Scanning |
789 | 5375 * ========================================================================== |
5376 */ | |
5377 | |
7046
361307ae060d
6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents:
7042
diff
changeset
|
5378 int |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5379 spa_scan_stop(spa_t *spa) |
789 | 5380 { |
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
|
5381 ASSERT(spa_config_held(spa, SCL_ALL, RW_WRITER) == 0); |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5382 if (dsl_scan_resilvering(spa->spa_dsl_pool)) |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5383 return (EBUSY); |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5384 return (dsl_scan_cancel(spa->spa_dsl_pool)); |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5385 } |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5386 |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5387 int |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5388 spa_scan(spa_t *spa, pool_scan_func_t func) |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5389 { |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5390 ASSERT(spa_config_held(spa, SCL_ALL, RW_WRITER) == 0); |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5391 |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5392 if (func >= POOL_SCAN_FUNCS || func == POOL_SCAN_NONE) |
789 | 5393 return (ENOTSUP); |
5394 | |
5395 /* | |
7046
361307ae060d
6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents:
7042
diff
changeset
|
5396 * 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
|
5397 * writeable leaf device, we have nothing to do. |
789 | 5398 */ |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5399 if (func == POOL_SCAN_RESILVER && |
7046
361307ae060d
6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents:
7042
diff
changeset
|
5400 !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
|
5401 spa_async_request(spa, SPA_ASYNC_RESILVER_DONE); |
1544 | 5402 return (0); |
5403 } | |
789 | 5404 |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5405 return (dsl_scan(spa->spa_dsl_pool, func)); |
789 | 5406 } |
5407 | |
1544 | 5408 /* |
5409 * ========================================================================== | |
5410 * SPA async task processing | |
5411 * ========================================================================== | |
5412 */ | |
5413 | |
5414 static void | |
4451 | 5415 spa_async_remove(spa_t *spa, vdev_t *vd) |
789 | 5416 { |
7361
e7d1b928b483
6715111 A removed L2ARC device should show status REMOVED
Brendan Gregg - Sun Microsystems <Brendan.Gregg@Sun.COM>
parents:
7326
diff
changeset
|
5417 if (vd->vdev_remove_wanted) { |
12247
5bcd281629f8
6911420 ZFS device removal detection should work with SCSAv3
George Wilson <George.Wilson@Sun.COM>
parents:
11932
diff
changeset
|
5418 vd->vdev_remove_wanted = B_FALSE; |
5bcd281629f8
6911420 ZFS device removal detection should work with SCSAv3
George Wilson <George.Wilson@Sun.COM>
parents:
11932
diff
changeset
|
5419 vd->vdev_delayed_close = B_FALSE; |
7361
e7d1b928b483
6715111 A removed L2ARC device should show status REMOVED
Brendan Gregg - Sun Microsystems <Brendan.Gregg@Sun.COM>
parents:
7326
diff
changeset
|
5420 vdev_set_state(vd, B_FALSE, VDEV_STATE_REMOVED, VDEV_AUX_NONE); |
10575
2a8816c5173b
6882196 resource.* events shouldn't be posted during spa_tryimport()
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10342
diff
changeset
|
5421 |
2a8816c5173b
6882196 resource.* events shouldn't be posted during spa_tryimport()
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10342
diff
changeset
|
5422 /* |
2a8816c5173b
6882196 resource.* events shouldn't be posted during spa_tryimport()
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10342
diff
changeset
|
5423 * We want to clear the stats, but we don't want to do a full |
2a8816c5173b
6882196 resource.* events shouldn't be posted during spa_tryimport()
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10342
diff
changeset
|
5424 * vdev_clear() as that will cause us to throw away |
2a8816c5173b
6882196 resource.* events shouldn't be posted during spa_tryimport()
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10342
diff
changeset
|
5425 * degraded/faulted state as well as attempt to reopen the |
2a8816c5173b
6882196 resource.* events shouldn't be posted during spa_tryimport()
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10342
diff
changeset
|
5426 * device, all of which is a waste. |
2a8816c5173b
6882196 resource.* events shouldn't be posted during spa_tryimport()
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10342
diff
changeset
|
5427 */ |
2a8816c5173b
6882196 resource.* events shouldn't be posted during spa_tryimport()
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10342
diff
changeset
|
5428 vd->vdev_stat.vs_read_errors = 0; |
2a8816c5173b
6882196 resource.* events shouldn't be posted during spa_tryimport()
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10342
diff
changeset
|
5429 vd->vdev_stat.vs_write_errors = 0; |
2a8816c5173b
6882196 resource.* events shouldn't be posted during spa_tryimport()
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10342
diff
changeset
|
5430 vd->vdev_stat.vs_checksum_errors = 0; |
2a8816c5173b
6882196 resource.* events shouldn't be posted during spa_tryimport()
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
10342
diff
changeset
|
5431 |
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
|
5432 vdev_state_dirty(vd->vdev_top); |
1544 | 5433 } |
7361
e7d1b928b483
6715111 A removed L2ARC device should show status REMOVED
Brendan Gregg - Sun Microsystems <Brendan.Gregg@Sun.COM>
parents:
7326
diff
changeset
|
5434 |
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
|
5435 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
|
5436 spa_async_remove(spa, vd->vdev_child[c]); |
1544 | 5437 } |
5438 | |
5439 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
|
5440 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
|
5441 { |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
5442 if (vd->vdev_probe_wanted) { |
12247
5bcd281629f8
6911420 ZFS device removal detection should work with SCSAv3
George Wilson <George.Wilson@Sun.COM>
parents:
11932
diff
changeset
|
5443 vd->vdev_probe_wanted = 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
|
5444 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
|
5445 } |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
5446 |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
5447 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
|
5448 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
|
5449 } |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
5450 |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
5451 static void |
9816
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5452 spa_async_autoexpand(spa_t *spa, vdev_t *vd) |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5453 { |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5454 sysevent_id_t eid; |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5455 nvlist_t *attr; |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5456 char *physpath; |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5457 |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5458 if (!spa->spa_autoexpand) |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5459 return; |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5460 |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5461 for (int c = 0; c < vd->vdev_children; c++) { |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5462 vdev_t *cvd = vd->vdev_child[c]; |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5463 spa_async_autoexpand(spa, cvd); |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5464 } |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5465 |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5466 if (!vd->vdev_ops->vdev_op_leaf || vd->vdev_physpath == NULL) |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5467 return; |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5468 |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5469 physpath = kmem_zalloc(MAXPATHLEN, KM_SLEEP); |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5470 (void) snprintf(physpath, MAXPATHLEN, "/devices%s", vd->vdev_physpath); |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5471 |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5472 VERIFY(nvlist_alloc(&attr, NV_UNIQUE_NAME, KM_SLEEP) == 0); |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5473 VERIFY(nvlist_add_string(attr, DEV_PHYS_PATH, physpath) == 0); |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5474 |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5475 (void) ddi_log_sysevent(zfs_dip, SUNW_VENDOR, EC_DEV_STATUS, |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5476 ESC_DEV_DLE, attr, &eid, DDI_SLEEP); |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5477 |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5478 nvlist_free(attr); |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5479 kmem_free(physpath, MAXPATHLEN); |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5480 } |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5481 |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5482 static void |
1544 | 5483 spa_async_thread(spa_t *spa) |
5484 { | |
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
|
5485 int tasks; |
1544 | 5486 |
5487 ASSERT(spa->spa_sync_on); | |
789 | 5488 |
1544 | 5489 mutex_enter(&spa->spa_async_lock); |
5490 tasks = spa->spa_async_tasks; | |
5491 spa->spa_async_tasks = 0; | |
5492 mutex_exit(&spa->spa_async_lock); | |
5493 | |
5494 /* | |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
5495 * 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
|
5496 */ |
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
5497 if (tasks & SPA_ASYNC_CONFIG_UPDATE) { |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5498 uint64_t old_space, new_space; |
9816
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5499 |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
5500 mutex_enter(&spa_namespace_lock); |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5501 old_space = metaslab_class_get_space(spa_normal_class(spa)); |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
5502 spa_config_update(spa, SPA_CONFIG_UPDATE_POOL); |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5503 new_space = metaslab_class_get_space(spa_normal_class(spa)); |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
5504 mutex_exit(&spa_namespace_lock); |
9816
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5505 |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5506 /* |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5507 * If the pool grew as a result of the config update, |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5508 * then log an internal history event. |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5509 */ |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5510 if (new_space != old_space) { |
13743
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
5511 spa_history_log_internal(spa, "vdev online", NULL, |
9946
86a051e72232
6842809 zfs history needs to record system info on import/create
Mark J Musante <Mark.Musante@Sun.COM>
parents:
9816
diff
changeset
|
5512 "pool '%s' size: %llu(+%llu)", |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5513 spa_name(spa), new_space, new_space - old_space); |
9816
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5514 } |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
5515 } |
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
5516 |
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
5517 /* |
4451 | 5518 * See if any devices need to be marked REMOVED. |
1544 | 5519 */ |
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
|
5520 if (tasks & SPA_ASYNC_REMOVE) { |
10685
931790026ac6
6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents:
10672
diff
changeset
|
5521 spa_vdev_state_enter(spa, SCL_NONE); |
4451 | 5522 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
|
5523 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
|
5524 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
|
5525 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
|
5526 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
|
5527 (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
|
5528 } |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
5529 |
9816
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5530 if ((tasks & SPA_ASYNC_AUTOEXPAND) && !spa_suspended(spa)) { |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5531 spa_config_enter(spa, SCL_CONFIG, FTAG, RW_READER); |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5532 spa_async_autoexpand(spa, spa->spa_root_vdev); |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5533 spa_config_exit(spa, SCL_CONFIG, FTAG); |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5534 } |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5535 |
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
|
5536 /* |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
5537 * 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
|
5538 */ |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
5539 if (tasks & SPA_ASYNC_PROBE) { |
10685
931790026ac6
6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents:
10672
diff
changeset
|
5540 spa_vdev_state_enter(spa, SCL_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
|
5541 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
|
5542 (void) spa_vdev_state_exit(spa, NULL, 0); |
4451 | 5543 } |
1544 | 5544 |
5545 /* | |
5546 * If any devices are done replacing, detach them. | |
5547 */ | |
4451 | 5548 if (tasks & SPA_ASYNC_RESILVER_DONE) |
5549 spa_vdev_resilver_done(spa); | |
789 | 5550 |
1544 | 5551 /* |
5552 * Kick off a resilver. | |
5553 */ | |
7046
361307ae060d
6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents:
7042
diff
changeset
|
5554 if (tasks & SPA_ASYNC_RESILVER) |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5555 dsl_resilver_restart(spa->spa_dsl_pool, 0); |
1544 | 5556 |
5557 /* | |
5558 * Let the world know that we're done. | |
5559 */ | |
5560 mutex_enter(&spa->spa_async_lock); | |
5561 spa->spa_async_thread = NULL; | |
5562 cv_broadcast(&spa->spa_async_cv); | |
5563 mutex_exit(&spa->spa_async_lock); | |
5564 thread_exit(); | |
5565 } | |
5566 | |
5567 void | |
5568 spa_async_suspend(spa_t *spa) | |
5569 { | |
5570 mutex_enter(&spa->spa_async_lock); | |
5571 spa->spa_async_suspended++; | |
5572 while (spa->spa_async_thread != NULL) | |
5573 cv_wait(&spa->spa_async_cv, &spa->spa_async_lock); | |
5574 mutex_exit(&spa->spa_async_lock); | |
5575 } | |
5576 | |
5577 void | |
5578 spa_async_resume(spa_t *spa) | |
5579 { | |
5580 mutex_enter(&spa->spa_async_lock); | |
5581 ASSERT(spa->spa_async_suspended != 0); | |
5582 spa->spa_async_suspended--; | |
5583 mutex_exit(&spa->spa_async_lock); | |
5584 } | |
5585 | |
5586 static void | |
5587 spa_async_dispatch(spa_t *spa) | |
5588 { | |
5589 mutex_enter(&spa->spa_async_lock); | |
5590 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
|
5591 spa->spa_async_thread == NULL && |
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
5592 rootdir != NULL && !vn_is_readonly(rootdir)) |
1544 | 5593 spa->spa_async_thread = thread_create(NULL, 0, |
5594 spa_async_thread, spa, 0, &p0, TS_RUN, maxclsyspri); | |
5595 mutex_exit(&spa->spa_async_lock); | |
5596 } | |
5597 | |
5598 void | |
5599 spa_async_request(spa_t *spa, int task) | |
5600 { | |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5601 zfs_dbgmsg("spa=%s async request task=%u", spa->spa_name, task); |
1544 | 5602 mutex_enter(&spa->spa_async_lock); |
5603 spa->spa_async_tasks |= task; | |
5604 mutex_exit(&spa->spa_async_lock); | |
789 | 5605 } |
5606 | |
5607 /* | |
5608 * ========================================================================== | |
5609 * SPA syncing routines | |
5610 * ========================================================================== | |
5611 */ | |
12470
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5612 |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5613 static int |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5614 bpobj_enqueue_cb(void *arg, const blkptr_t *bp, dmu_tx_t *tx) |
789 | 5615 { |
12470
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5616 bpobj_t *bpo = arg; |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5617 bpobj_enqueue(bpo, bp, tx); |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5618 return (0); |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5619 } |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5620 |
12470
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5621 static int |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5622 spa_free_sync_cb(void *arg, const blkptr_t *bp, dmu_tx_t *tx) |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5623 { |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5624 zio_t *zio = arg; |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5625 |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5626 zio_nowait(zio_free_sync(zio, zio->io_spa, dmu_tx_get_txg(tx), bp, |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5627 zio->io_flags)); |
12470
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5628 return (0); |
789 | 5629 } |
5630 | |
5631 static void | |
2082 | 5632 spa_sync_nvlist(spa_t *spa, uint64_t obj, nvlist_t *nv, dmu_tx_t *tx) |
5633 { | |
5634 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
|
5635 size_t bufsize; |
2082 | 5636 size_t nvsize = 0; |
5637 dmu_buf_t *db; | |
5638 | |
5639 VERIFY(nvlist_size(nv, &nvsize, NV_ENCODE_XDR) == 0); | |
5640 | |
7497
f6c6be3b6154
6733970 assertion failure in dbuf_dirty() via spa_sync_nvlist()
Tim Haley <Tim.Haley@Sun.COM>
parents:
7377
diff
changeset
|
5641 /* |
f6c6be3b6154
6733970 assertion failure in dbuf_dirty() via spa_sync_nvlist()
Tim Haley <Tim.Haley@Sun.COM>
parents:
7377
diff
changeset
|
5642 * 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
|
5643 * 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
|
5644 * 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
|
5645 */ |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5646 bufsize = P2ROUNDUP((uint64_t)nvsize, SPA_CONFIG_BLOCKSIZE); |
7497
f6c6be3b6154
6733970 assertion failure in dbuf_dirty() via spa_sync_nvlist()
Tim Haley <Tim.Haley@Sun.COM>
parents:
7377
diff
changeset
|
5647 packed = kmem_alloc(bufsize, KM_SLEEP); |
2082 | 5648 |
5649 VERIFY(nvlist_pack(nv, &packed, &nvsize, NV_ENCODE_XDR, | |
5650 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
|
5651 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
|
5652 |
f6c6be3b6154
6733970 assertion failure in dbuf_dirty() via spa_sync_nvlist()
Tim Haley <Tim.Haley@Sun.COM>
parents:
7377
diff
changeset
|
5653 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
|
5654 |
f6c6be3b6154
6733970 assertion failure in dbuf_dirty() via spa_sync_nvlist()
Tim Haley <Tim.Haley@Sun.COM>
parents:
7377
diff
changeset
|
5655 kmem_free(packed, bufsize); |
2082 | 5656 |
5657 VERIFY(0 == dmu_bonus_hold(spa->spa_meta_objset, obj, FTAG, &db)); | |
5658 dmu_buf_will_dirty(db, tx); | |
5659 *(uint64_t *)db->db_data = nvsize; | |
5660 dmu_buf_rele(db, FTAG); | |
5661 } | |
5662 | |
5663 static void | |
5450 | 5664 spa_sync_aux_dev(spa_t *spa, spa_aux_vdev_t *sav, dmu_tx_t *tx, |
5665 const char *config, const char *entry) | |
2082 | 5666 { |
5667 nvlist_t *nvroot; | |
5450 | 5668 nvlist_t **list; |
2082 | 5669 int i; |
5670 | |
5450 | 5671 if (!sav->sav_sync) |
2082 | 5672 return; |
5673 | |
5674 /* | |
5450 | 5675 * Update the MOS nvlist describing the list of available devices. |
5676 * spa_validate_aux() will have already made sure this nvlist is | |
4451 | 5677 * valid and the vdevs are labeled appropriately. |
2082 | 5678 */ |
5450 | 5679 if (sav->sav_object == 0) { |
5680 sav->sav_object = dmu_object_alloc(spa->spa_meta_objset, | |
5681 DMU_OT_PACKED_NVLIST, 1 << 14, DMU_OT_PACKED_NVLIST_SIZE, | |
5682 sizeof (uint64_t), tx); | |
2082 | 5683 VERIFY(zap_update(spa->spa_meta_objset, |
5450 | 5684 DMU_POOL_DIRECTORY_OBJECT, entry, sizeof (uint64_t), 1, |
5685 &sav->sav_object, tx) == 0); | |
2082 | 5686 } |
5687 | |
5688 VERIFY(nvlist_alloc(&nvroot, NV_UNIQUE_NAME, KM_SLEEP) == 0); | |
5450 | 5689 if (sav->sav_count == 0) { |
5690 VERIFY(nvlist_add_nvlist_array(nvroot, config, NULL, 0) == 0); | |
2082 | 5691 } else { |
5450 | 5692 list = kmem_alloc(sav->sav_count * sizeof (void *), KM_SLEEP); |
5693 for (i = 0; i < sav->sav_count; i++) | |
5694 list[i] = vdev_config_generate(spa, sav->sav_vdevs[i], | |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5695 B_FALSE, VDEV_CONFIG_L2CACHE); |
5450 | 5696 VERIFY(nvlist_add_nvlist_array(nvroot, config, list, |
5697 sav->sav_count) == 0); | |
5698 for (i = 0; i < sav->sav_count; i++) | |
5699 nvlist_free(list[i]); | |
5700 kmem_free(list, sav->sav_count * sizeof (void *)); | |
2082 | 5701 } |
5702 | |
5450 | 5703 spa_sync_nvlist(spa, sav->sav_object, nvroot, tx); |
2926 | 5704 nvlist_free(nvroot); |
2082 | 5705 |
5450 | 5706 sav->sav_sync = B_FALSE; |
2082 | 5707 } |
5708 | |
5709 static void | |
789 | 5710 spa_sync_config_object(spa_t *spa, dmu_tx_t *tx) |
5711 { | |
5712 nvlist_t *config; | |
5713 | |
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
|
5714 if (list_is_empty(&spa->spa_config_dirty_list)) |
789 | 5715 return; |
5716 | |
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
|
5717 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
|
5718 |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
5719 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
|
5720 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
|
5721 |
13886
e3261d03efbf
3349 zpool upgrade -V bumps the on disk version number, but leaves the in core version
George Wilson <george.wilson@delphix.com>
parents:
13879
diff
changeset
|
5722 /* |
e3261d03efbf
3349 zpool upgrade -V bumps the on disk version number, but leaves the in core version
George Wilson <george.wilson@delphix.com>
parents:
13879
diff
changeset
|
5723 * If we're upgrading the spa version then make sure that |
e3261d03efbf
3349 zpool upgrade -V bumps the on disk version number, but leaves the in core version
George Wilson <george.wilson@delphix.com>
parents:
13879
diff
changeset
|
5724 * the config object gets updated with the correct version. |
e3261d03efbf
3349 zpool upgrade -V bumps the on disk version number, but leaves the in core version
George Wilson <george.wilson@delphix.com>
parents:
13879
diff
changeset
|
5725 */ |
e3261d03efbf
3349 zpool upgrade -V bumps the on disk version number, but leaves the in core version
George Wilson <george.wilson@delphix.com>
parents:
13879
diff
changeset
|
5726 if (spa->spa_ubsync.ub_version < spa->spa_uberblock.ub_version) |
e3261d03efbf
3349 zpool upgrade -V bumps the on disk version number, but leaves the in core version
George Wilson <george.wilson@delphix.com>
parents:
13879
diff
changeset
|
5727 fnvlist_add_uint64(config, ZPOOL_CONFIG_VERSION, |
e3261d03efbf
3349 zpool upgrade -V bumps the on disk version number, but leaves the in core version
George Wilson <george.wilson@delphix.com>
parents:
13879
diff
changeset
|
5728 spa->spa_uberblock.ub_version); |
e3261d03efbf
3349 zpool upgrade -V bumps the on disk version number, but leaves the in core version
George Wilson <george.wilson@delphix.com>
parents:
13879
diff
changeset
|
5729 |
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
|
5730 spa_config_exit(spa, SCL_STATE, FTAG); |
789 | 5731 |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
5732 if (spa->spa_config_syncing) |
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
5733 nvlist_free(spa->spa_config_syncing); |
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
5734 spa->spa_config_syncing = config; |
789 | 5735 |
2082 | 5736 spa_sync_nvlist(spa, spa->spa_config_object, config, tx); |
789 | 5737 } |
5738 | |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5739 static void |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5740 spa_sync_version(void *arg1, void *arg2, dmu_tx_t *tx) |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5741 { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5742 spa_t *spa = arg1; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5743 uint64_t version = *(uint64_t *)arg2; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5744 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5745 /* |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5746 * Setting the version is special cased when first creating the pool. |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5747 */ |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5748 ASSERT(tx->tx_txg != TXG_INITIAL); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5749 |
13970
c9a5683da38e
3543 Feature flags causes assertion in spa.c to miss certain cases
Richard Yao <ryao@gentoo.org>
parents:
13958
diff
changeset
|
5750 ASSERT(SPA_VERSION_IS_SUPPORTED(version)); |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5751 ASSERT(version >= spa_version(spa)); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5752 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5753 spa->spa_uberblock.ub_version = version; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5754 vdev_config_dirty(spa->spa_root_vdev); |
13743
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
5755 spa_history_log_internal(spa, "set", tx, "version=%lld", version); |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5756 } |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5757 |
5094 | 5758 /* |
5759 * Set zpool properties. | |
5760 */ | |
3912 | 5761 static void |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
5762 spa_sync_props(void *arg1, void *arg2, dmu_tx_t *tx) |
3912 | 5763 { |
5764 spa_t *spa = arg1; | |
5094 | 5765 objset_t *mos = spa->spa_meta_objset; |
3912 | 5766 nvlist_t *nvp = arg2; |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5767 nvpair_t *elem = NULL; |
5094 | 5768 |
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
|
5769 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
|
5770 |
5094 | 5771 while ((elem = nvlist_next_nvpair(nvp, elem))) { |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5772 uint64_t intval; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5773 char *strval, *fname; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5774 zpool_prop_t prop; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5775 const char *propname; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5776 zprop_type_t proptype; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5777 zfeature_info_t *feature; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5778 |
5094 | 5779 switch (prop = zpool_name_to_prop(nvpair_name(elem))) { |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5780 case ZPROP_INVAL: |
5094 | 5781 /* |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5782 * We checked this earlier in spa_prop_validate(). |
5094 | 5783 */ |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5784 ASSERT(zpool_prop_feature(nvpair_name(elem))); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5785 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5786 fname = strchr(nvpair_name(elem), '@') + 1; |
13765
9410cf539b11
backout 3006: causes 3046 (panics after mounting root)
Richard Lowe <richlowe@richlowe.net>
parents:
13764
diff
changeset
|
5787 VERIFY3U(0, ==, zfeature_lookup_name(fname, &feature)); |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5788 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5789 spa_feature_enable(spa, feature, tx); |
13743
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
5790 spa_history_log_internal(spa, "set", tx, |
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
5791 "%s=enabled", nvpair_name(elem)); |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5792 break; |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5793 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5794 case ZPOOL_PROP_VERSION: |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5795 VERIFY(nvpair_value_uint64(elem, &intval) == 0); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5796 /* |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5797 * The version is synced seperatly before other |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5798 * properties and should be correct by now. |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5799 */ |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5800 ASSERT3U(spa_version(spa), >=, intval); |
5094 | 5801 break; |
5802 | |
5803 case ZPOOL_PROP_ALTROOT: | |
5804 /* | |
5805 * 'altroot' is a non-persistent property. It should | |
5806 * have been set temporarily at creation or import time. | |
5807 */ | |
5808 ASSERT(spa->spa_root != NULL); | |
5809 break; | |
5810 | |
13061
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
5811 case ZPOOL_PROP_READONLY: |
5363 | 5812 case ZPOOL_PROP_CACHEFILE: |
5094 | 5813 /* |
13061
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
5814 * 'readonly' and 'cachefile' are also non-persisitent |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
5815 * properties. |
5094 | 5816 */ |
4543 | 5817 break; |
13525
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
5818 case ZPOOL_PROP_COMMENT: |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
5819 VERIFY(nvpair_value_string(elem, &strval) == 0); |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
5820 if (spa->spa_comment != NULL) |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
5821 spa_strfree(spa->spa_comment); |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
5822 spa->spa_comment = spa_strdup(strval); |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
5823 /* |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
5824 * We need to dirty the configuration on all the vdevs |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
5825 * so that their labels get updated. It's unnecessary |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
5826 * to do this for pool creation since the vdev's |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
5827 * configuratoin has already been dirtied. |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
5828 */ |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
5829 if (tx->tx_txg != TXG_INITIAL) |
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
5830 vdev_config_dirty(spa->spa_root_vdev); |
13743
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
5831 spa_history_log_internal(spa, "set", tx, |
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
5832 "%s=%s", nvpair_name(elem), strval); |
13525
7059b67f1bc2
1693 persistent 'comment' field for a zpool
Dan McDonald <danmcd@nexenta.com>
parents:
13514
diff
changeset
|
5833 break; |
5094 | 5834 default: |
5835 /* | |
5836 * Set pool property values in the poolprops mos object. | |
5837 */ | |
5838 if (spa->spa_pool_props_object == 0) { | |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5839 spa->spa_pool_props_object = |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5840 zap_create_link(mos, DMU_OT_POOL_PROPS, |
5094 | 5841 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_PROPS, |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5842 tx); |
5094 | 5843 } |
5844 | |
5845 /* normalize the property name */ | |
5846 propname = zpool_prop_to_name(prop); | |
5847 proptype = zpool_prop_get_type(prop); | |
5848 | |
5849 if (nvpair_type(elem) == DATA_TYPE_STRING) { | |
5850 ASSERT(proptype == PROP_TYPE_STRING); | |
5851 VERIFY(nvpair_value_string(elem, &strval) == 0); | |
5852 VERIFY(zap_update(mos, | |
5853 spa->spa_pool_props_object, propname, | |
5854 1, strlen(strval) + 1, strval, tx) == 0); | |
13743
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
5855 spa_history_log_internal(spa, "set", tx, |
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
5856 "%s=%s", nvpair_name(elem), strval); |
5094 | 5857 } else if (nvpair_type(elem) == DATA_TYPE_UINT64) { |
5858 VERIFY(nvpair_value_uint64(elem, &intval) == 0); | |
5859 | |
5860 if (proptype == PROP_TYPE_INDEX) { | |
5861 const char *unused; | |
5862 VERIFY(zpool_prop_index_to_string( | |
5863 prop, intval, &unused) == 0); | |
5864 } | |
5865 VERIFY(zap_update(mos, | |
5866 spa->spa_pool_props_object, propname, | |
5867 8, 1, &intval, tx) == 0); | |
13743
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
5868 spa_history_log_internal(spa, "set", tx, |
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
13700
diff
changeset
|
5869 "%s=%lld", nvpair_name(elem), intval); |
5094 | 5870 } else { |
5871 ASSERT(0); /* not allowed */ | |
5872 } | |
5873 | |
5329 | 5874 switch (prop) { |
5875 case ZPOOL_PROP_DELEGATION: | |
5094 | 5876 spa->spa_delegation = intval; |
5329 | 5877 break; |
5878 case ZPOOL_PROP_BOOTFS: | |
5094 | 5879 spa->spa_bootfs = intval; |
5329 | 5880 break; |
5881 case ZPOOL_PROP_FAILUREMODE: | |
5882 spa->spa_failmode = intval; | |
5883 break; | |
9816
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5884 case ZPOOL_PROP_AUTOEXPAND: |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5885 spa->spa_autoexpand = intval; |
12318
a036286976a0
6907687 zfs pool is not automatically fixed when disk are brought back online or after boot
Eric Taylor <Eric.Taylor@Sun.COM>
parents:
12296
diff
changeset
|
5886 if (tx->tx_txg != TXG_INITIAL) |
a036286976a0
6907687 zfs pool is not automatically fixed when disk are brought back online or after boot
Eric Taylor <Eric.Taylor@Sun.COM>
parents:
12296
diff
changeset
|
5887 spa_async_request(spa, |
a036286976a0
6907687 zfs pool is not automatically fixed when disk are brought back online or after boot
Eric Taylor <Eric.Taylor@Sun.COM>
parents:
12296
diff
changeset
|
5888 SPA_ASYNC_AUTOEXPAND); |
9816
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
5889 break; |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5890 case ZPOOL_PROP_DEDUPDITTO: |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5891 spa->spa_dedup_ditto = intval; |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5892 break; |
5329 | 5893 default: |
5894 break; | |
5895 } | |
3912 | 5896 } |
5094 | 5897 |
3912 | 5898 } |
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
|
5899 |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
5900 mutex_exit(&spa->spa_props_lock); |
3912 | 5901 } |
5902 | |
789 | 5903 /* |
12470
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5904 * Perform one-time upgrade on-disk changes. spa_version() does not |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5905 * reflect the new version this txg, so there must be no changes this |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5906 * txg to anything that the upgrade code depends on after it executes. |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5907 * Therefore this must be called after dsl_pool_sync() does the sync |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5908 * tasks. |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5909 */ |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5910 static void |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5911 spa_sync_upgrades(spa_t *spa, dmu_tx_t *tx) |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5912 { |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5913 dsl_pool_t *dp = spa->spa_dsl_pool; |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5914 |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5915 ASSERT(spa->spa_sync_pass == 1); |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5916 |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5917 if (spa->spa_ubsync.ub_version < SPA_VERSION_ORIGIN && |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5918 spa->spa_uberblock.ub_version >= SPA_VERSION_ORIGIN) { |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5919 dsl_pool_create_origin(dp, tx); |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5920 |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5921 /* Keeping the origin open increases spa_minref */ |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5922 spa->spa_minref += 3; |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5923 } |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5924 |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5925 if (spa->spa_ubsync.ub_version < SPA_VERSION_NEXT_CLONES && |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5926 spa->spa_uberblock.ub_version >= SPA_VERSION_NEXT_CLONES) { |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5927 dsl_pool_upgrade_clones(dp, tx); |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5928 } |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5929 |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5930 if (spa->spa_ubsync.ub_version < SPA_VERSION_DIR_CLONES && |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5931 spa->spa_uberblock.ub_version >= SPA_VERSION_DIR_CLONES) { |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5932 dsl_pool_upgrade_dir_clones(dp, tx); |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5933 |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5934 /* Keeping the freedir open increases spa_minref */ |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5935 spa->spa_minref += 3; |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5936 } |
13700
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5937 |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5938 if (spa->spa_ubsync.ub_version < SPA_VERSION_FEATURES && |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5939 spa->spa_uberblock.ub_version >= SPA_VERSION_FEATURES) { |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5940 spa_feature_create_zap_objects(spa, tx); |
2889e2596bd6
2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents:
13605
diff
changeset
|
5941 } |
12470
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5942 } |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5943 |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5944 /* |
789 | 5945 * Sync the specified transaction group. New blocks may be dirtied as |
5946 * part of the process, so we iterate until it converges. | |
5947 */ | |
5948 void | |
5949 spa_sync(spa_t *spa, uint64_t txg) | |
5950 { | |
5951 dsl_pool_t *dp = spa->spa_dsl_pool; | |
5952 objset_t *mos = spa->spa_meta_objset; | |
12470
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
5953 bpobj_t *defer_bpo = &spa->spa_deferred_bpobj; |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
5954 bplist_t *free_bpl = &spa->spa_free_bplist[txg & TXG_MASK]; |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
5955 vdev_t *rvd = spa->spa_root_vdev; |
789 | 5956 vdev_t *vd; |
5957 dmu_tx_t *tx; | |
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
|
5958 int error; |
789 | 5959 |
13061
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
5960 VERIFY(spa_writeable(spa)); |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
5961 |
789 | 5962 /* |
5963 * Lock out configuration changes. | |
5964 */ | |
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
|
5965 spa_config_enter(spa, SCL_CONFIG, FTAG, RW_READER); |
789 | 5966 |
5967 spa->spa_syncing_txg = txg; | |
5968 spa->spa_sync_pass = 0; | |
5969 | |
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
|
5970 /* |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
5971 * 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
|
5972 * 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
|
5973 */ |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
5974 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
|
5975 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
|
5976 /* |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5977 * 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
|
5978 * 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
|
5979 * 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
|
5980 * 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
|
5981 * into the root vdev tree. |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5982 */ |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5983 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
|
5984 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
|
5985 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
|
5986 vdev_state_clean(vd); |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5987 vdev_config_dirty(vd); |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5988 } |
5a60f16123ba
6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
8211
diff
changeset
|
5989 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
|
5990 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
|
5991 } |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
5992 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
|
5993 |
2082 | 5994 tx = dmu_tx_create_assigned(dp, txg); |
5995 | |
13869
921a99998bb4
3246 ZFS I/O deadman thread
George.Wilson <george.wilson@delphix.com>
parents:
13805
diff
changeset
|
5996 spa->spa_sync_starttime = gethrtime(); |
921a99998bb4
3246 ZFS I/O deadman thread
George.Wilson <george.wilson@delphix.com>
parents:
13805
diff
changeset
|
5997 VERIFY(cyclic_reprogram(spa->spa_deadman_cycid, |
921a99998bb4
3246 ZFS I/O deadman thread
George.Wilson <george.wilson@delphix.com>
parents:
13805
diff
changeset
|
5998 spa->spa_sync_starttime + spa->spa_deadman_synctime)); |
921a99998bb4
3246 ZFS I/O deadman thread
George.Wilson <george.wilson@delphix.com>
parents:
13805
diff
changeset
|
5999 |
2082 | 6000 /* |
4577 | 6001 * If we are upgrading to SPA_VERSION_RAIDZ_DEFLATE this txg, |
2082 | 6002 * set spa_deflate if we have no raid-z vdevs. |
6003 */ | |
4577 | 6004 if (spa->spa_ubsync.ub_version < SPA_VERSION_RAIDZ_DEFLATE && |
6005 spa->spa_uberblock.ub_version >= SPA_VERSION_RAIDZ_DEFLATE) { | |
2082 | 6006 int i; |
6007 | |
6008 for (i = 0; i < rvd->vdev_children; i++) { | |
6009 vd = rvd->vdev_child[i]; | |
6010 if (vd->vdev_deflate_ratio != SPA_MINBLOCKSIZE) | |
6011 break; | |
6012 } | |
6013 if (i == rvd->vdev_children) { | |
6014 spa->spa_deflate = TRUE; | |
6015 VERIFY(0 == zap_add(spa->spa_meta_objset, | |
6016 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_DEFLATE, | |
6017 sizeof (uint64_t), 1, &spa->spa_deflate, tx)); | |
6018 } | |
6019 } | |
6020 | |
789 | 6021 /* |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
6022 * If anything has changed in this txg, or if someone is waiting |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
6023 * for this txg to sync (eg, spa_vdev_remove()), push the |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
6024 * deferred frees from the previous txg. If not, leave them |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
6025 * alone so that we don't generate work on an otherwise idle |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
6026 * system. |
789 | 6027 */ |
6028 if (!txg_list_empty(&dp->dp_dirty_datasets, txg) || | |
2329
e640bebc73b3
6446569 deferred list is hooked on flintstone vitamins
ek110237
parents:
2199
diff
changeset
|
6029 !txg_list_empty(&dp->dp_dirty_dirs, txg) || |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
6030 !txg_list_empty(&dp->dp_sync_tasks, txg) || |
12470
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
6031 ((dsl_scan_active(dp->dp_scan) || |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
6032 txg_sync_waiting(dp)) && !spa_shutting_down(spa))) { |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
6033 zio_t *zio = zio_root(spa, NULL, NULL, 0); |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
6034 VERIFY3U(bpobj_iterate(defer_bpo, |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
6035 spa_free_sync_cb, zio, tx), ==, 0); |
13805
e3a9ae14a119
3006 VERIFY[S,U,P] and ASSERT[S,U,P] frequently check if first argument is zero
Madhav Suresh <madhav.suresh@delphix.com>
parents:
13777
diff
changeset
|
6036 VERIFY0(zio_wait(zio)); |
12470
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
6037 } |
789 | 6038 |
6039 /* | |
6040 * Iterate to convergence. | |
6041 */ | |
6042 do { | |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
6043 int pass = ++spa->spa_sync_pass; |
789 | 6044 |
6045 spa_sync_config_object(spa, tx); | |
5450 | 6046 spa_sync_aux_dev(spa, &spa->spa_spares, tx, |
6047 ZPOOL_CONFIG_SPARES, DMU_POOL_SPARES); | |
6048 spa_sync_aux_dev(spa, &spa->spa_l2cache, tx, | |
6049 ZPOOL_CONFIG_L2CACHE, DMU_POOL_L2CACHE); | |
1544 | 6050 spa_errlog_sync(spa, txg); |
789 | 6051 dsl_pool_sync(dp, txg); |
6052 | |
13879
4eac7a87eff2
3329 spa_sync() spends 10-20% of its time in spa_free_sync_cb()
George Wilson <george.wilson@delphix.com>
parents:
13869
diff
changeset
|
6053 if (pass < zfs_sync_pass_deferred_free) { |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
6054 zio_t *zio = zio_root(spa, NULL, NULL, 0); |
12470
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
6055 bplist_iterate(free_bpl, spa_free_sync_cb, |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
6056 zio, tx); |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
6057 VERIFY(zio_wait(zio) == 0); |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
6058 } else { |
12470
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
6059 bplist_iterate(free_bpl, bpobj_enqueue_cb, |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
6060 defer_bpo, tx); |
789 | 6061 } |
6062 | |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
6063 ddt_sync(spa, txg); |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12247
diff
changeset
|
6064 dsl_scan_sync(dp, tx); |
11619
d3fb7ae6fe56
6909744 dedup should be set to off when a ZVOL is dumpified
George Wilson <George.Wilson@Sun.COM>
parents:
11497
diff
changeset
|
6065 |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
6066 while (vd = txg_list_remove(&spa->spa_vdev_txg_list, txg)) |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
6067 vdev_sync(vd, txg); |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
6068 |
12470
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
6069 if (pass == 1) |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
6070 spa_sync_upgrades(spa, tx); |
54258108784b
6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
12450
diff
changeset
|
6071 |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
6072 } while (dmu_objset_is_dirty(mos, txg)); |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
6073 |
789 | 6074 /* |
6075 * Rewrite the vdev configuration (which includes the uberblock) | |
6076 * to commit the transaction group. | |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
6077 * |
5688
c0b02c8fd2c0
6640580 spa_get_random() is insanely slow in userland
bonwick
parents:
5621
diff
changeset
|
6078 * 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
|
6079 * 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
|
6080 * 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
|
6081 * If there *are* dirty vdevs, sync the uberblock to all vdevs. |
789 | 6082 */ |
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
|
6083 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
|
6084 /* |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
6085 * 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
|
6086 * 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
|
6087 */ |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
6088 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
|
6089 |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
6090 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
|
6091 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
|
6092 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
|
6093 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
|
6094 int c0 = spa_get_random(children); |
9816
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
6095 |
847676ec1c5b
PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents:
9790
diff
changeset
|
6096 for (int c = 0; c < children; c++) { |
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
|
6097 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
|
6098 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
|
6099 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
|
6100 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
|
6101 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
|
6102 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
|
6103 } |
9725
0bf7402e8022
6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9701
diff
changeset
|
6104 error = vdev_config_sync(svd, svdcount, txg, B_FALSE); |
0bf7402e8022
6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9701
diff
changeset
|
6105 if (error != 0) |
0bf7402e8022
6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9701
diff
changeset
|
6106 error = vdev_config_sync(svd, svdcount, txg, |
0bf7402e8022
6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9701
diff
changeset
|
6107 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
|
6108 } 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
|
6109 error = vdev_config_sync(rvd->vdev_child, |
9725
0bf7402e8022
6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9701
diff
changeset
|
6110 rvd->vdev_children, txg, B_FALSE); |
0bf7402e8022
6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9701
diff
changeset
|
6111 if (error != 0) |
0bf7402e8022
6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9701
diff
changeset
|
6112 error = vdev_config_sync(rvd->vdev_child, |
0bf7402e8022
6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9701
diff
changeset
|
6113 rvd->vdev_children, txg, B_TRUE); |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
6114 } |
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
|
6115 |
13777
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
6116 if (error == 0) |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
6117 spa->spa_last_synced_guid = rvd->vdev_guid; |
b1e53580146d
3090 vdev_reopen() during reguid causes vdev to be treated as corrupt
George Wilson <george.wilson@delphix.com>
parents:
13765
diff
changeset
|
6118 |
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
|
6119 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
|
6120 |
b80e4842ad54
6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
7706
diff
changeset
|
6121 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
|
6122 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
|
6123 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
|
6124 zio_resume_wait(spa); |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
6125 } |
2082 | 6126 dmu_tx_commit(tx); |
6127 | |
13869
921a99998bb4
3246 ZFS I/O deadman thread
George.Wilson <george.wilson@delphix.com>
parents:
13805
diff
changeset
|
6128 VERIFY(cyclic_reprogram(spa->spa_deadman_cycid, CY_INFINITY)); |
921a99998bb4
3246 ZFS I/O deadman thread
George.Wilson <george.wilson@delphix.com>
parents:
13805
diff
changeset
|
6129 |
1635
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
6130 /* |
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
6131 * Clear the dirty config list. |
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
6132 */ |
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
|
6133 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
|
6134 vdev_config_clean(vd); |
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
6135 |
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
6136 /* |
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
6137 * 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
|
6138 * 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
|
6139 */ |
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
6140 if (spa->spa_config_syncing != NULL) { |
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
6141 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
|
6142 spa->spa_config_txg = txg; |
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
6143 spa->spa_config_syncing = NULL; |
0ab1193d47cb
6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents:
1601
diff
changeset
|
6144 } |
789 | 6145 |
6146 spa->spa_ubsync = spa->spa_uberblock; | |
6147 | |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
6148 dsl_pool_sync_done(dp, txg); |
789 | 6149 |
6150 /* | |
6151 * Update usable space statistics. | |
6152 */ | |
6153 while (vd = txg_list_remove(&spa->spa_vdev_txg_list, TXG_CLEAN(txg))) | |
6154 vdev_sync_done(vd, txg); | |
6155 | |
10956
0c81acaaf614
6897693 deduplication can only go so far
George Wilson <George.Wilson@Sun.COM>
parents:
10950
diff
changeset
|
6156 spa_update_dspace(spa); |
0c81acaaf614
6897693 deduplication can only go so far
George Wilson <George.Wilson@Sun.COM>
parents:
10950
diff
changeset
|
6157 |
789 | 6158 /* |
6159 * It had better be the case that we didn't dirty anything | |
2082 | 6160 * since vdev_config_sync(). |
789 | 6161 */ |
6162 ASSERT(txg_list_empty(&dp->dp_dirty_datasets, txg)); | |
6163 ASSERT(txg_list_empty(&dp->dp_dirty_dirs, txg)); | |
6164 ASSERT(txg_list_empty(&spa->spa_vdev_txg_list, txg)); | |
10922
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
6165 |
e2081f502306
PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents:
10921
diff
changeset
|
6166 spa->spa_sync_pass = 0; |
789 | 6167 |
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
|
6168 spa_config_exit(spa, SCL_CONFIG, FTAG); |
1544 | 6169 |
10921
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
6170 spa_handle_ignored_writes(spa); |
8aac17999e4d
PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents:
10822
diff
changeset
|
6171 |
1544 | 6172 /* |
6173 * If any async tasks have been requested, kick them off. | |
6174 */ | |
6175 spa_async_dispatch(spa); | |
789 | 6176 } |
6177 | |
6178 /* | |
6179 * Sync all pools. We don't want to hold the namespace lock across these | |
6180 * operations, so we take a reference on the spa_t and drop the lock during the | |
6181 * sync. | |
6182 */ | |
6183 void | |
6184 spa_sync_allpools(void) | |
6185 { | |
6186 spa_t *spa = NULL; | |
6187 mutex_enter(&spa_namespace_lock); | |
6188 while ((spa = spa_next(spa)) != NULL) { | |
13061
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
6189 if (spa_state(spa) != POOL_STATE_ACTIVE || |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
6190 !spa_writeable(spa) || spa_suspended(spa)) |
789 | 6191 continue; |
6192 spa_open_ref(spa, FTAG); | |
6193 mutex_exit(&spa_namespace_lock); | |
6194 txg_wait_synced(spa_get_dsl(spa), 0); | |
6195 mutex_enter(&spa_namespace_lock); | |
6196 spa_close(spa, FTAG); | |
6197 } | |
6198 mutex_exit(&spa_namespace_lock); | |
6199 } | |
6200 | |
6201 /* | |
6202 * ========================================================================== | |
6203 * Miscellaneous routines | |
6204 * ========================================================================== | |
6205 */ | |
6206 | |
6207 /* | |
6208 * Remove all pools in the system. | |
6209 */ | |
6210 void | |
6211 spa_evict_all(void) | |
6212 { | |
6213 spa_t *spa; | |
6214 | |
6215 /* | |
6216 * Remove all cached state. All pools should be closed now, | |
6217 * so every spa in the AVL tree should be unreferenced. | |
6218 */ | |
6219 mutex_enter(&spa_namespace_lock); | |
6220 while ((spa = spa_next(NULL)) != NULL) { | |
6221 /* | |
1544 | 6222 * Stop async tasks. The async thread may need to detach |
6223 * a device that's been replaced, which requires grabbing | |
6224 * spa_namespace_lock, so we must drop it here. | |
789 | 6225 */ |
6226 spa_open_ref(spa, FTAG); | |
6227 mutex_exit(&spa_namespace_lock); | |
1544 | 6228 spa_async_suspend(spa); |
4808 | 6229 mutex_enter(&spa_namespace_lock); |
789 | 6230 spa_close(spa, FTAG); |
6231 | |
6232 if (spa->spa_state != POOL_STATE_UNINITIALIZED) { | |
6233 spa_unload(spa); | |
6234 spa_deactivate(spa); | |
6235 } | |
6236 spa_remove(spa); | |
6237 } | |
6238 mutex_exit(&spa_namespace_lock); | |
6239 } | |
1544 | 6240 |
6241 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
|
6242 spa_lookup_by_guid(spa_t *spa, uint64_t guid, boolean_t aux) |
1544 | 6243 { |
6643
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
6244 vdev_t *vd; |
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
6245 int i; |
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
6246 |
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
6247 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
|
6248 return (vd); |
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
6249 |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
6250 if (aux) { |
6643
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
6251 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
|
6252 vd = spa->spa_l2cache.sav_vdevs[i]; |
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
6253 if (vd->vdev_guid == guid) |
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
6254 return (vd); |
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
6255 } |
9425
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
6256 |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
6257 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
|
6258 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
|
6259 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
|
6260 return (vd); |
e7ffacaec3a8
6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents:
9276
diff
changeset
|
6261 } |
6643
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
6262 } |
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
6263 |
3a34b0dbb107
6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents:
6615
diff
changeset
|
6264 return (NULL); |
1544 | 6265 } |
1760 | 6266 |
6267 void | |
5094 | 6268 spa_upgrade(spa_t *spa, uint64_t version) |
1760 | 6269 { |
13061
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
6270 ASSERT(spa_writeable(spa)); |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
13049
diff
changeset
|
6271 |
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
|
6272 spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); |
1760 | 6273 |
6274 /* | |
6275 * This should only be called for a non-faulted pool, and since a | |
6276 * future version would result in an unopenable pool, this shouldn't be | |
6277 * possible. | |
6278 */ | |
13970
c9a5683da38e
3543 Feature flags causes assertion in spa.c to miss certain cases
Richard Yao <ryao@gentoo.org>
parents:
13958
diff
changeset
|
6279 ASSERT(SPA_VERSION_IS_SUPPORTED(spa->spa_uberblock.ub_version)); |
5094 | 6280 ASSERT(version >= spa->spa_uberblock.ub_version); |
6281 | |
6282 spa->spa_uberblock.ub_version = version; | |
1760 | 6283 vdev_config_dirty(spa->spa_root_vdev); |
6284 | |
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
|
6285 spa_config_exit(spa, SCL_ALL, FTAG); |
2082 | 6286 |
6287 txg_wait_synced(spa_get_dsl(spa), 0); | |
1760 | 6288 } |
2082 | 6289 |
6290 boolean_t | |
6291 spa_has_spare(spa_t *spa, uint64_t guid) | |
6292 { | |
6293 int i; | |
3377
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
6294 uint64_t spareguid; |
5450 | 6295 spa_aux_vdev_t *sav = &spa->spa_spares; |
6296 | |
6297 for (i = 0; i < sav->sav_count; i++) | |
6298 if (sav->sav_vdevs[i]->vdev_guid == guid) | |
2082 | 6299 return (B_TRUE); |
6300 | |
5450 | 6301 for (i = 0; i < sav->sav_npending; i++) { |
6302 if (nvlist_lookup_uint64(sav->sav_pending[i], ZPOOL_CONFIG_GUID, | |
6303 &spareguid) == 0 && spareguid == guid) | |
3377
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
6304 return (B_TRUE); |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
6305 } |
a2fa338530c1
6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents:
3290
diff
changeset
|
6306 |
2082 | 6307 return (B_FALSE); |
6308 } | |
3912 | 6309 |
4451 | 6310 /* |
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
|
6311 * 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
|
6312 * 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
|
6313 */ |
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
|
6314 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
|
6315 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
|
6316 { |
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
|
6317 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
|
6318 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
|
6319 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
|
6320 |
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
|
6321 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
|
6322 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
|
6323 &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
|
6324 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
|
6325 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
|
6326 } |
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
|
6327 |
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
|
6328 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
|
6329 } |
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
|
6330 |
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
|
6331 /* |
4451 | 6332 * Post a sysevent corresponding to the given event. The 'name' must be one of |
6333 * the event definitions in sys/sysevent/eventdefs.h. The payload will be | |
6334 * filled in from the spa and (optionally) the vdev. This doesn't do anything | |
6335 * in the userland libzpool, as we don't want consumers to misinterpret ztest | |
6336 * or zdb as real changes. | |
6337 */ | |
6338 void | |
6339 spa_event_notify(spa_t *spa, vdev_t *vd, const char *name) | |
6340 { | |
6341 #ifdef _KERNEL | |
6342 sysevent_t *ev; | |
6343 sysevent_attr_list_t *attr = NULL; | |
6344 sysevent_value_t value; | |
6345 sysevent_id_t eid; | |
6346 | |
6347 ev = sysevent_alloc(EC_ZFS, (char *)name, SUNW_KERN_PUB "zfs", | |
6348 SE_SLEEP); | |
6349 | |
6350 value.value_type = SE_DATA_TYPE_STRING; | |
6351 value.value.sv_string = spa_name(spa); | |
6352 if (sysevent_add_attr(&attr, ZFS_EV_POOL_NAME, &value, SE_SLEEP) != 0) | |
6353 goto done; | |
6354 | |
6355 value.value_type = SE_DATA_TYPE_UINT64; | |
6356 value.value.sv_uint64 = spa_guid(spa); | |
6357 if (sysevent_add_attr(&attr, ZFS_EV_POOL_GUID, &value, SE_SLEEP) != 0) | |
6358 goto done; | |
6359 | |
6360 if (vd) { | |
6361 value.value_type = SE_DATA_TYPE_UINT64; | |
6362 value.value.sv_uint64 = vd->vdev_guid; | |
6363 if (sysevent_add_attr(&attr, ZFS_EV_VDEV_GUID, &value, | |
6364 SE_SLEEP) != 0) | |
6365 goto done; | |
6366 | |
6367 if (vd->vdev_path) { | |
6368 value.value_type = SE_DATA_TYPE_STRING; | |
6369 value.value.sv_string = vd->vdev_path; | |
6370 if (sysevent_add_attr(&attr, ZFS_EV_VDEV_PATH, | |
6371 &value, SE_SLEEP) != 0) | |
6372 goto done; | |
6373 } | |
6374 } | |
6375 | |
5756
05eb4c1ff492
6585441 spa_event_notify() doesn't pass its attributes
eschrock
parents:
5688
diff
changeset
|
6376 if (sysevent_attach_attributes(ev, attr) != 0) |
05eb4c1ff492
6585441 spa_event_notify() doesn't pass its attributes
eschrock
parents:
5688
diff
changeset
|
6377 goto done; |
05eb4c1ff492
6585441 spa_event_notify() doesn't pass its attributes
eschrock
parents:
5688
diff
changeset
|
6378 attr = NULL; |
05eb4c1ff492
6585441 spa_event_notify() doesn't pass its attributes
eschrock
parents:
5688
diff
changeset
|
6379 |
4451 | 6380 (void) log_sysevent(ev, SE_SLEEP, &eid); |
6381 | |
6382 done: | |
6383 if (attr) | |
6384 sysevent_free_attr(attr); | |
6385 sysevent_free(ev); | |
6386 #endif | |
6387 } |