Print this page
2882 implement libzfs_core
2883 changing "canmount" property to "on" should not always remount dataset
2900 "zfs snapshot" should be able to create multiple, arbitrary snapshots at once
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Chris Siden <christopher.siden@delphix.com>
Reviewed by: Garrett D'Amore <garrett@damore.org>
Reviewed by: Bill Pijewski <wdp@joyent.com>
Reviewed by: Dan Kruchinin <dan.kruchinin@gmail.com>
Split |
Close |
Expand all |
Collapse all |
--- old/usr/src/uts/common/fs/zfs/sys/spa.h
+++ new/usr/src/uts/common/fs/zfs/sys/spa.h
1 1 /*
2 2 * CDDL HEADER START
3 3 *
4 4 * The contents of this file are subject to the terms of the
5 5 * Common Development and Distribution License (the "License").
6 6 * You may not use this file except in compliance with the License.
7 7 *
8 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 9 * or http://www.opensolaris.org/os/licensing.
10 10 * See the License for the specific language governing permissions
11 11 * and limitations under the License.
12 12 *
13 13 * When distributing Covered Code, include this CDDL HEADER in each
14 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 15 * If applicable, add the following below this CDDL HEADER, with the
16 16 * fields enclosed by brackets "[]" replaced with your own identifying
17 17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 18 *
19 19 * CDDL HEADER END
20 20 */
21 21 /*
22 22 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
23 23 * Copyright (c) 2012 by Delphix. All rights reserved.
24 24 * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
25 25 */
26 26
27 27 #ifndef _SYS_SPA_H
28 28 #define _SYS_SPA_H
29 29
30 30 #include <sys/avl.h>
31 31 #include <sys/zfs_context.h>
32 32 #include <sys/nvpair.h>
33 33 #include <sys/sysmacros.h>
34 34 #include <sys/types.h>
35 35 #include <sys/fs/zfs.h>
36 36
37 37 #ifdef __cplusplus
38 38 extern "C" {
39 39 #endif
40 40
41 41 /*
42 42 * Forward references that lots of things need.
43 43 */
44 44 typedef struct spa spa_t;
↓ open down ↓ |
44 lines elided |
↑ open up ↑ |
45 45 typedef struct vdev vdev_t;
46 46 typedef struct metaslab metaslab_t;
47 47 typedef struct metaslab_group metaslab_group_t;
48 48 typedef struct metaslab_class metaslab_class_t;
49 49 typedef struct zio zio_t;
50 50 typedef struct zilog zilog_t;
51 51 typedef struct spa_aux_vdev spa_aux_vdev_t;
52 52 typedef struct ddt ddt_t;
53 53 typedef struct ddt_entry ddt_entry_t;
54 54 struct dsl_pool;
55 +struct dsl_dataset;
55 56
56 57 /*
57 58 * General-purpose 32-bit and 64-bit bitfield encodings.
58 59 */
59 60 #define BF32_DECODE(x, low, len) P2PHASE((x) >> (low), 1U << (len))
60 61 #define BF64_DECODE(x, low, len) P2PHASE((x) >> (low), 1ULL << (len))
61 62 #define BF32_ENCODE(x, low, len) (P2PHASE((x), 1U << (len)) << (low))
62 63 #define BF64_ENCODE(x, low, len) (P2PHASE((x), 1ULL << (len)) << (low))
63 64
64 65 #define BF32_GET(x, low, len) BF32_DECODE(x, low, len)
65 66 #define BF64_GET(x, low, len) BF64_DECODE(x, low, len)
66 67
67 68 #define BF32_SET(x, low, len, val) \
68 69 ((x) ^= BF32_ENCODE((x >> low) ^ (val), low, len))
69 70 #define BF64_SET(x, low, len, val) \
70 71 ((x) ^= BF64_ENCODE((x >> low) ^ (val), low, len))
71 72
72 73 #define BF32_GET_SB(x, low, len, shift, bias) \
73 74 ((BF32_GET(x, low, len) + (bias)) << (shift))
74 75 #define BF64_GET_SB(x, low, len, shift, bias) \
75 76 ((BF64_GET(x, low, len) + (bias)) << (shift))
76 77
77 78 #define BF32_SET_SB(x, low, len, shift, bias, val) \
78 79 BF32_SET(x, low, len, ((val) >> (shift)) - (bias))
79 80 #define BF64_SET_SB(x, low, len, shift, bias, val) \
80 81 BF64_SET(x, low, len, ((val) >> (shift)) - (bias))
81 82
82 83 /*
83 84 * We currently support nine block sizes, from 512 bytes to 128K.
84 85 * We could go higher, but the benefits are near-zero and the cost
85 86 * of COWing a giant block to modify one byte would become excessive.
86 87 */
87 88 #define SPA_MINBLOCKSHIFT 9
88 89 #define SPA_MAXBLOCKSHIFT 17
89 90 #define SPA_MINBLOCKSIZE (1ULL << SPA_MINBLOCKSHIFT)
90 91 #define SPA_MAXBLOCKSIZE (1ULL << SPA_MAXBLOCKSHIFT)
91 92
92 93 #define SPA_BLOCKSIZES (SPA_MAXBLOCKSHIFT - SPA_MINBLOCKSHIFT + 1)
93 94
94 95 /*
95 96 * Size of block to hold the configuration data (a packed nvlist)
96 97 */
97 98 #define SPA_CONFIG_BLOCKSIZE (1ULL << 14)
98 99
99 100 /*
100 101 * The DVA size encodings for LSIZE and PSIZE support blocks up to 32MB.
101 102 * The ASIZE encoding should be at least 64 times larger (6 more bits)
102 103 * to support up to 4-way RAID-Z mirror mode with worst-case gang block
103 104 * overhead, three DVAs per bp, plus one more bit in case we do anything
104 105 * else that expands the ASIZE.
105 106 */
106 107 #define SPA_LSIZEBITS 16 /* LSIZE up to 32M (2^16 * 512) */
107 108 #define SPA_PSIZEBITS 16 /* PSIZE up to 32M (2^16 * 512) */
108 109 #define SPA_ASIZEBITS 24 /* ASIZE up to 64 times larger */
109 110
110 111 /*
111 112 * All SPA data is represented by 128-bit data virtual addresses (DVAs).
112 113 * The members of the dva_t should be considered opaque outside the SPA.
113 114 */
114 115 typedef struct dva {
115 116 uint64_t dva_word[2];
116 117 } dva_t;
117 118
118 119 /*
119 120 * Each block has a 256-bit checksum -- strong enough for cryptographic hashes.
120 121 */
121 122 typedef struct zio_cksum {
122 123 uint64_t zc_word[4];
123 124 } zio_cksum_t;
124 125
125 126 /*
126 127 * Each block is described by its DVAs, time of birth, checksum, etc.
127 128 * The word-by-word, bit-by-bit layout of the blkptr is as follows:
128 129 *
129 130 * 64 56 48 40 32 24 16 8 0
130 131 * +-------+-------+-------+-------+-------+-------+-------+-------+
131 132 * 0 | vdev1 | GRID | ASIZE |
132 133 * +-------+-------+-------+-------+-------+-------+-------+-------+
133 134 * 1 |G| offset1 |
134 135 * +-------+-------+-------+-------+-------+-------+-------+-------+
135 136 * 2 | vdev2 | GRID | ASIZE |
136 137 * +-------+-------+-------+-------+-------+-------+-------+-------+
137 138 * 3 |G| offset2 |
138 139 * +-------+-------+-------+-------+-------+-------+-------+-------+
139 140 * 4 | vdev3 | GRID | ASIZE |
140 141 * +-------+-------+-------+-------+-------+-------+-------+-------+
141 142 * 5 |G| offset3 |
142 143 * +-------+-------+-------+-------+-------+-------+-------+-------+
143 144 * 6 |BDX|lvl| type | cksum | comp | PSIZE | LSIZE |
144 145 * +-------+-------+-------+-------+-------+-------+-------+-------+
145 146 * 7 | padding |
146 147 * +-------+-------+-------+-------+-------+-------+-------+-------+
147 148 * 8 | padding |
148 149 * +-------+-------+-------+-------+-------+-------+-------+-------+
149 150 * 9 | physical birth txg |
150 151 * +-------+-------+-------+-------+-------+-------+-------+-------+
151 152 * a | logical birth txg |
152 153 * +-------+-------+-------+-------+-------+-------+-------+-------+
153 154 * b | fill count |
154 155 * +-------+-------+-------+-------+-------+-------+-------+-------+
155 156 * c | checksum[0] |
156 157 * +-------+-------+-------+-------+-------+-------+-------+-------+
157 158 * d | checksum[1] |
158 159 * +-------+-------+-------+-------+-------+-------+-------+-------+
159 160 * e | checksum[2] |
160 161 * +-------+-------+-------+-------+-------+-------+-------+-------+
161 162 * f | checksum[3] |
162 163 * +-------+-------+-------+-------+-------+-------+-------+-------+
163 164 *
164 165 * Legend:
165 166 *
166 167 * vdev virtual device ID
167 168 * offset offset into virtual device
168 169 * LSIZE logical size
169 170 * PSIZE physical size (after compression)
170 171 * ASIZE allocated size (including RAID-Z parity and gang block headers)
171 172 * GRID RAID-Z layout information (reserved for future use)
172 173 * cksum checksum function
173 174 * comp compression function
174 175 * G gang block indicator
175 176 * B byteorder (endianness)
176 177 * D dedup
177 178 * X unused
178 179 * lvl level of indirection
179 180 * type DMU object type
180 181 * phys birth txg of block allocation; zero if same as logical birth txg
181 182 * log. birth transaction group in which the block was logically born
182 183 * fill count number of non-zero blocks under this bp
183 184 * checksum[4] 256-bit checksum of the data this bp describes
184 185 */
185 186 #define SPA_BLKPTRSHIFT 7 /* blkptr_t is 128 bytes */
186 187 #define SPA_DVAS_PER_BP 3 /* Number of DVAs in a bp */
187 188
188 189 typedef struct blkptr {
189 190 dva_t blk_dva[SPA_DVAS_PER_BP]; /* Data Virtual Addresses */
190 191 uint64_t blk_prop; /* size, compression, type, etc */
191 192 uint64_t blk_pad[2]; /* Extra space for the future */
192 193 uint64_t blk_phys_birth; /* txg when block was allocated */
193 194 uint64_t blk_birth; /* transaction group at birth */
194 195 uint64_t blk_fill; /* fill count */
195 196 zio_cksum_t blk_cksum; /* 256-bit checksum */
196 197 } blkptr_t;
197 198
198 199 /*
199 200 * Macros to get and set fields in a bp or DVA.
200 201 */
201 202 #define DVA_GET_ASIZE(dva) \
202 203 BF64_GET_SB((dva)->dva_word[0], 0, 24, SPA_MINBLOCKSHIFT, 0)
203 204 #define DVA_SET_ASIZE(dva, x) \
204 205 BF64_SET_SB((dva)->dva_word[0], 0, 24, SPA_MINBLOCKSHIFT, 0, x)
205 206
206 207 #define DVA_GET_GRID(dva) BF64_GET((dva)->dva_word[0], 24, 8)
207 208 #define DVA_SET_GRID(dva, x) BF64_SET((dva)->dva_word[0], 24, 8, x)
208 209
209 210 #define DVA_GET_VDEV(dva) BF64_GET((dva)->dva_word[0], 32, 32)
210 211 #define DVA_SET_VDEV(dva, x) BF64_SET((dva)->dva_word[0], 32, 32, x)
211 212
212 213 #define DVA_GET_OFFSET(dva) \
213 214 BF64_GET_SB((dva)->dva_word[1], 0, 63, SPA_MINBLOCKSHIFT, 0)
214 215 #define DVA_SET_OFFSET(dva, x) \
215 216 BF64_SET_SB((dva)->dva_word[1], 0, 63, SPA_MINBLOCKSHIFT, 0, x)
216 217
217 218 #define DVA_GET_GANG(dva) BF64_GET((dva)->dva_word[1], 63, 1)
218 219 #define DVA_SET_GANG(dva, x) BF64_SET((dva)->dva_word[1], 63, 1, x)
219 220
220 221 #define BP_GET_LSIZE(bp) \
221 222 BF64_GET_SB((bp)->blk_prop, 0, 16, SPA_MINBLOCKSHIFT, 1)
222 223 #define BP_SET_LSIZE(bp, x) \
223 224 BF64_SET_SB((bp)->blk_prop, 0, 16, SPA_MINBLOCKSHIFT, 1, x)
224 225
225 226 #define BP_GET_PSIZE(bp) \
226 227 BF64_GET_SB((bp)->blk_prop, 16, 16, SPA_MINBLOCKSHIFT, 1)
227 228 #define BP_SET_PSIZE(bp, x) \
228 229 BF64_SET_SB((bp)->blk_prop, 16, 16, SPA_MINBLOCKSHIFT, 1, x)
229 230
230 231 #define BP_GET_COMPRESS(bp) BF64_GET((bp)->blk_prop, 32, 8)
231 232 #define BP_SET_COMPRESS(bp, x) BF64_SET((bp)->blk_prop, 32, 8, x)
232 233
233 234 #define BP_GET_CHECKSUM(bp) BF64_GET((bp)->blk_prop, 40, 8)
234 235 #define BP_SET_CHECKSUM(bp, x) BF64_SET((bp)->blk_prop, 40, 8, x)
235 236
236 237 #define BP_GET_TYPE(bp) BF64_GET((bp)->blk_prop, 48, 8)
237 238 #define BP_SET_TYPE(bp, x) BF64_SET((bp)->blk_prop, 48, 8, x)
238 239
239 240 #define BP_GET_LEVEL(bp) BF64_GET((bp)->blk_prop, 56, 5)
240 241 #define BP_SET_LEVEL(bp, x) BF64_SET((bp)->blk_prop, 56, 5, x)
241 242
242 243 #define BP_GET_PROP_BIT_61(bp) BF64_GET((bp)->blk_prop, 61, 1)
243 244 #define BP_SET_PROP_BIT_61(bp, x) BF64_SET((bp)->blk_prop, 61, 1, x)
244 245
245 246 #define BP_GET_DEDUP(bp) BF64_GET((bp)->blk_prop, 62, 1)
246 247 #define BP_SET_DEDUP(bp, x) BF64_SET((bp)->blk_prop, 62, 1, x)
247 248
248 249 #define BP_GET_BYTEORDER(bp) (0 - BF64_GET((bp)->blk_prop, 63, 1))
249 250 #define BP_SET_BYTEORDER(bp, x) BF64_SET((bp)->blk_prop, 63, 1, x)
250 251
251 252 #define BP_PHYSICAL_BIRTH(bp) \
252 253 ((bp)->blk_phys_birth ? (bp)->blk_phys_birth : (bp)->blk_birth)
253 254
254 255 #define BP_SET_BIRTH(bp, logical, physical) \
255 256 { \
256 257 (bp)->blk_birth = (logical); \
257 258 (bp)->blk_phys_birth = ((logical) == (physical) ? 0 : (physical)); \
258 259 }
259 260
260 261 #define BP_GET_ASIZE(bp) \
261 262 (DVA_GET_ASIZE(&(bp)->blk_dva[0]) + DVA_GET_ASIZE(&(bp)->blk_dva[1]) + \
262 263 DVA_GET_ASIZE(&(bp)->blk_dva[2]))
263 264
264 265 #define BP_GET_UCSIZE(bp) \
265 266 ((BP_GET_LEVEL(bp) > 0 || DMU_OT_IS_METADATA(BP_GET_TYPE(bp))) ? \
266 267 BP_GET_PSIZE(bp) : BP_GET_LSIZE(bp))
267 268
268 269 #define BP_GET_NDVAS(bp) \
269 270 (!!DVA_GET_ASIZE(&(bp)->blk_dva[0]) + \
270 271 !!DVA_GET_ASIZE(&(bp)->blk_dva[1]) + \
271 272 !!DVA_GET_ASIZE(&(bp)->blk_dva[2]))
272 273
273 274 #define BP_COUNT_GANG(bp) \
274 275 (DVA_GET_GANG(&(bp)->blk_dva[0]) + \
275 276 DVA_GET_GANG(&(bp)->blk_dva[1]) + \
276 277 DVA_GET_GANG(&(bp)->blk_dva[2]))
277 278
278 279 #define DVA_EQUAL(dva1, dva2) \
279 280 ((dva1)->dva_word[1] == (dva2)->dva_word[1] && \
280 281 (dva1)->dva_word[0] == (dva2)->dva_word[0])
281 282
282 283 #define BP_EQUAL(bp1, bp2) \
283 284 (BP_PHYSICAL_BIRTH(bp1) == BP_PHYSICAL_BIRTH(bp2) && \
284 285 DVA_EQUAL(&(bp1)->blk_dva[0], &(bp2)->blk_dva[0]) && \
285 286 DVA_EQUAL(&(bp1)->blk_dva[1], &(bp2)->blk_dva[1]) && \
286 287 DVA_EQUAL(&(bp1)->blk_dva[2], &(bp2)->blk_dva[2]))
287 288
288 289 #define ZIO_CHECKSUM_EQUAL(zc1, zc2) \
289 290 (0 == (((zc1).zc_word[0] - (zc2).zc_word[0]) | \
290 291 ((zc1).zc_word[1] - (zc2).zc_word[1]) | \
291 292 ((zc1).zc_word[2] - (zc2).zc_word[2]) | \
292 293 ((zc1).zc_word[3] - (zc2).zc_word[3])))
293 294
294 295 #define DVA_IS_VALID(dva) (DVA_GET_ASIZE(dva) != 0)
295 296
296 297 #define ZIO_SET_CHECKSUM(zcp, w0, w1, w2, w3) \
297 298 { \
298 299 (zcp)->zc_word[0] = w0; \
299 300 (zcp)->zc_word[1] = w1; \
300 301 (zcp)->zc_word[2] = w2; \
301 302 (zcp)->zc_word[3] = w3; \
302 303 }
303 304
304 305 #define BP_IDENTITY(bp) (&(bp)->blk_dva[0])
305 306 #define BP_IS_GANG(bp) DVA_GET_GANG(BP_IDENTITY(bp))
306 307 #define BP_IS_HOLE(bp) ((bp)->blk_birth == 0)
307 308
308 309 /* BP_IS_RAIDZ(bp) assumes no block compression */
309 310 #define BP_IS_RAIDZ(bp) (DVA_GET_ASIZE(&(bp)->blk_dva[0]) > \
310 311 BP_GET_PSIZE(bp))
311 312
312 313 #define BP_ZERO(bp) \
313 314 { \
314 315 (bp)->blk_dva[0].dva_word[0] = 0; \
315 316 (bp)->blk_dva[0].dva_word[1] = 0; \
316 317 (bp)->blk_dva[1].dva_word[0] = 0; \
317 318 (bp)->blk_dva[1].dva_word[1] = 0; \
318 319 (bp)->blk_dva[2].dva_word[0] = 0; \
319 320 (bp)->blk_dva[2].dva_word[1] = 0; \
320 321 (bp)->blk_prop = 0; \
321 322 (bp)->blk_pad[0] = 0; \
322 323 (bp)->blk_pad[1] = 0; \
323 324 (bp)->blk_phys_birth = 0; \
324 325 (bp)->blk_birth = 0; \
325 326 (bp)->blk_fill = 0; \
326 327 ZIO_SET_CHECKSUM(&(bp)->blk_cksum, 0, 0, 0, 0); \
327 328 }
328 329
329 330 /*
330 331 * Note: the byteorder is either 0 or -1, both of which are palindromes.
331 332 * This simplifies the endianness handling a bit.
332 333 */
333 334 #ifdef _BIG_ENDIAN
334 335 #define ZFS_HOST_BYTEORDER (0ULL)
335 336 #else
336 337 #define ZFS_HOST_BYTEORDER (-1ULL)
337 338 #endif
338 339
339 340 #define BP_SHOULD_BYTESWAP(bp) (BP_GET_BYTEORDER(bp) != ZFS_HOST_BYTEORDER)
340 341
341 342 #define BP_SPRINTF_LEN 320
342 343
343 344 /*
344 345 * This macro allows code sharing between zfs, libzpool, and mdb.
345 346 * 'func' is either snprintf() or mdb_snprintf().
346 347 * 'ws' (whitespace) can be ' ' for single-line format, '\n' for multi-line.
347 348 */
348 349 #define SPRINTF_BLKPTR(func, ws, buf, bp, type, checksum, compress) \
349 350 { \
350 351 static const char *copyname[] = \
351 352 { "zero", "single", "double", "triple" }; \
352 353 int size = BP_SPRINTF_LEN; \
353 354 int len = 0; \
354 355 int copies = 0; \
355 356 \
356 357 if (bp == NULL) { \
357 358 len = func(buf + len, size - len, "<NULL>"); \
358 359 } else if (BP_IS_HOLE(bp)) { \
359 360 len = func(buf + len, size - len, "<hole>"); \
360 361 } else { \
361 362 for (int d = 0; d < BP_GET_NDVAS(bp); d++) { \
362 363 const dva_t *dva = &bp->blk_dva[d]; \
363 364 if (DVA_IS_VALID(dva)) \
364 365 copies++; \
365 366 len += func(buf + len, size - len, \
366 367 "DVA[%d]=<%llu:%llx:%llx>%c", d, \
367 368 (u_longlong_t)DVA_GET_VDEV(dva), \
368 369 (u_longlong_t)DVA_GET_OFFSET(dva), \
369 370 (u_longlong_t)DVA_GET_ASIZE(dva), \
370 371 ws); \
371 372 } \
372 373 if (BP_IS_GANG(bp) && \
373 374 DVA_GET_ASIZE(&bp->blk_dva[2]) <= \
374 375 DVA_GET_ASIZE(&bp->blk_dva[1]) / 2) \
375 376 copies--; \
376 377 len += func(buf + len, size - len, \
377 378 "[L%llu %s] %s %s %s %s %s %s%c" \
378 379 "size=%llxL/%llxP birth=%lluL/%lluP fill=%llu%c" \
379 380 "cksum=%llx:%llx:%llx:%llx", \
380 381 (u_longlong_t)BP_GET_LEVEL(bp), \
381 382 type, \
382 383 checksum, \
383 384 compress, \
384 385 BP_GET_BYTEORDER(bp) == 0 ? "BE" : "LE", \
385 386 BP_IS_GANG(bp) ? "gang" : "contiguous", \
386 387 BP_GET_DEDUP(bp) ? "dedup" : "unique", \
387 388 copyname[copies], \
388 389 ws, \
389 390 (u_longlong_t)BP_GET_LSIZE(bp), \
390 391 (u_longlong_t)BP_GET_PSIZE(bp), \
391 392 (u_longlong_t)bp->blk_birth, \
392 393 (u_longlong_t)BP_PHYSICAL_BIRTH(bp), \
393 394 (u_longlong_t)bp->blk_fill, \
394 395 ws, \
395 396 (u_longlong_t)bp->blk_cksum.zc_word[0], \
396 397 (u_longlong_t)bp->blk_cksum.zc_word[1], \
397 398 (u_longlong_t)bp->blk_cksum.zc_word[2], \
398 399 (u_longlong_t)bp->blk_cksum.zc_word[3]); \
399 400 } \
400 401 ASSERT(len < size); \
401 402 }
402 403
403 404 #include <sys/dmu.h>
404 405
405 406 #define BP_GET_BUFC_TYPE(bp) \
406 407 (((BP_GET_LEVEL(bp) > 0) || (DMU_OT_IS_METADATA(BP_GET_TYPE(bp)))) ? \
407 408 ARC_BUFC_METADATA : ARC_BUFC_DATA)
408 409
409 410 typedef enum spa_import_type {
410 411 SPA_IMPORT_EXISTING,
↓ open down ↓ |
346 lines elided |
↑ open up ↑ |
411 412 SPA_IMPORT_ASSEMBLE
412 413 } spa_import_type_t;
413 414
414 415 /* state manipulation functions */
415 416 extern int spa_open(const char *pool, spa_t **, void *tag);
416 417 extern int spa_open_rewind(const char *pool, spa_t **, void *tag,
417 418 nvlist_t *policy, nvlist_t **config);
418 419 extern int spa_get_stats(const char *pool, nvlist_t **config, char *altroot,
419 420 size_t buflen);
420 421 extern int spa_create(const char *pool, nvlist_t *config, nvlist_t *props,
421 - const char *history_str, nvlist_t *zplprops);
422 + nvlist_t *zplprops);
422 423 extern int spa_import_rootpool(char *devpath, char *devid);
423 424 extern int spa_import(const char *pool, nvlist_t *config, nvlist_t *props,
424 425 uint64_t flags);
425 426 extern nvlist_t *spa_tryimport(nvlist_t *tryconfig);
426 427 extern int spa_destroy(char *pool);
427 428 extern int spa_export(char *pool, nvlist_t **oldconfig, boolean_t force,
428 429 boolean_t hardforce);
429 430 extern int spa_reset(char *pool);
430 431 extern void spa_async_request(spa_t *spa, int flag);
431 432 extern void spa_async_unrequest(spa_t *spa, int flag);
432 433 extern void spa_async_suspend(spa_t *spa);
433 434 extern void spa_async_resume(spa_t *spa);
434 435 extern spa_t *spa_inject_addref(char *pool);
435 436 extern void spa_inject_delref(spa_t *spa);
436 437 extern void spa_scan_stat_init(spa_t *spa);
437 438 extern int spa_scan_get_stats(spa_t *spa, pool_scan_stat_t *ps);
438 439
439 440 #define SPA_ASYNC_CONFIG_UPDATE 0x01
440 441 #define SPA_ASYNC_REMOVE 0x02
441 442 #define SPA_ASYNC_PROBE 0x04
442 443 #define SPA_ASYNC_RESILVER_DONE 0x08
443 444 #define SPA_ASYNC_RESILVER 0x10
444 445 #define SPA_ASYNC_AUTOEXPAND 0x20
445 446 #define SPA_ASYNC_REMOVE_DONE 0x40
446 447 #define SPA_ASYNC_REMOVE_STOP 0x80
447 448
448 449 /*
449 450 * Controls the behavior of spa_vdev_remove().
450 451 */
451 452 #define SPA_REMOVE_UNSPARE 0x01
452 453 #define SPA_REMOVE_DONE 0x02
453 454
454 455 /* device manipulation */
455 456 extern int spa_vdev_add(spa_t *spa, nvlist_t *nvroot);
456 457 extern int spa_vdev_attach(spa_t *spa, uint64_t guid, nvlist_t *nvroot,
457 458 int replacing);
458 459 extern int spa_vdev_detach(spa_t *spa, uint64_t guid, uint64_t pguid,
459 460 int replace_done);
460 461 extern int spa_vdev_remove(spa_t *spa, uint64_t guid, boolean_t unspare);
461 462 extern boolean_t spa_vdev_remove_active(spa_t *spa);
462 463 extern int spa_vdev_setpath(spa_t *spa, uint64_t guid, const char *newpath);
463 464 extern int spa_vdev_setfru(spa_t *spa, uint64_t guid, const char *newfru);
464 465 extern int spa_vdev_split_mirror(spa_t *spa, char *newname, nvlist_t *config,
465 466 nvlist_t *props, boolean_t exp);
466 467
467 468 /* spare state (which is global across all pools) */
468 469 extern void spa_spare_add(vdev_t *vd);
469 470 extern void spa_spare_remove(vdev_t *vd);
470 471 extern boolean_t spa_spare_exists(uint64_t guid, uint64_t *pool, int *refcnt);
471 472 extern void spa_spare_activate(vdev_t *vd);
472 473
473 474 /* L2ARC state (which is global across all pools) */
474 475 extern void spa_l2cache_add(vdev_t *vd);
475 476 extern void spa_l2cache_remove(vdev_t *vd);
476 477 extern boolean_t spa_l2cache_exists(uint64_t guid, uint64_t *pool);
477 478 extern void spa_l2cache_activate(vdev_t *vd);
478 479 extern void spa_l2cache_drop(spa_t *spa);
479 480
480 481 /* scanning */
481 482 extern int spa_scan(spa_t *spa, pool_scan_func_t func);
482 483 extern int spa_scan_stop(spa_t *spa);
483 484
484 485 /* spa syncing */
485 486 extern void spa_sync(spa_t *spa, uint64_t txg); /* only for DMU use */
486 487 extern void spa_sync_allpools(void);
487 488
488 489 /*
489 490 * DEFERRED_FREE must be large enough that regular blocks are not
490 491 * deferred. XXX so can't we change it back to 1?
491 492 */
492 493 #define SYNC_PASS_DEFERRED_FREE 2 /* defer frees after this pass */
493 494 #define SYNC_PASS_DONT_COMPRESS 4 /* don't compress after this pass */
494 495 #define SYNC_PASS_REWRITE 1 /* rewrite new bps after this pass */
495 496
496 497 /* spa namespace global mutex */
497 498 extern kmutex_t spa_namespace_lock;
498 499
499 500 /*
500 501 * SPA configuration functions in spa_config.c
501 502 */
502 503
503 504 #define SPA_CONFIG_UPDATE_POOL 0
504 505 #define SPA_CONFIG_UPDATE_VDEVS 1
505 506
506 507 extern void spa_config_sync(spa_t *, boolean_t, boolean_t);
507 508 extern void spa_config_load(void);
508 509 extern nvlist_t *spa_all_configs(uint64_t *);
509 510 extern void spa_config_set(spa_t *spa, nvlist_t *config);
510 511 extern nvlist_t *spa_config_generate(spa_t *spa, vdev_t *vd, uint64_t txg,
511 512 int getstats);
512 513 extern void spa_config_update(spa_t *spa, int what);
513 514
514 515 /*
515 516 * Miscellaneous SPA routines in spa_misc.c
516 517 */
517 518
518 519 /* Namespace manipulation */
519 520 extern spa_t *spa_lookup(const char *name);
520 521 extern spa_t *spa_add(const char *name, nvlist_t *config, const char *altroot);
521 522 extern void spa_remove(spa_t *spa);
522 523 extern spa_t *spa_next(spa_t *prev);
523 524
524 525 /* Refcount functions */
525 526 extern void spa_open_ref(spa_t *spa, void *tag);
526 527 extern void spa_close(spa_t *spa, void *tag);
527 528 extern boolean_t spa_refcount_zero(spa_t *spa);
528 529
529 530 #define SCL_NONE 0x00
530 531 #define SCL_CONFIG 0x01
531 532 #define SCL_STATE 0x02
532 533 #define SCL_L2ARC 0x04 /* hack until L2ARC 2.0 */
533 534 #define SCL_ALLOC 0x08
534 535 #define SCL_ZIO 0x10
535 536 #define SCL_FREE 0x20
536 537 #define SCL_VDEV 0x40
537 538 #define SCL_LOCKS 7
538 539 #define SCL_ALL ((1 << SCL_LOCKS) - 1)
539 540 #define SCL_STATE_ALL (SCL_STATE | SCL_L2ARC | SCL_ZIO)
540 541
541 542 /* Pool configuration locks */
542 543 extern int spa_config_tryenter(spa_t *spa, int locks, void *tag, krw_t rw);
543 544 extern void spa_config_enter(spa_t *spa, int locks, void *tag, krw_t rw);
544 545 extern void spa_config_exit(spa_t *spa, int locks, void *tag);
545 546 extern int spa_config_held(spa_t *spa, int locks, krw_t rw);
546 547
547 548 /* Pool vdev add/remove lock */
548 549 extern uint64_t spa_vdev_enter(spa_t *spa);
549 550 extern uint64_t spa_vdev_config_enter(spa_t *spa);
550 551 extern void spa_vdev_config_exit(spa_t *spa, vdev_t *vd, uint64_t txg,
551 552 int error, char *tag);
552 553 extern int spa_vdev_exit(spa_t *spa, vdev_t *vd, uint64_t txg, int error);
553 554
554 555 /* Pool vdev state change lock */
555 556 extern void spa_vdev_state_enter(spa_t *spa, int oplock);
556 557 extern int spa_vdev_state_exit(spa_t *spa, vdev_t *vd, int error);
557 558
558 559 /* Log state */
559 560 typedef enum spa_log_state {
560 561 SPA_LOG_UNKNOWN = 0, /* unknown log state */
561 562 SPA_LOG_MISSING, /* missing log(s) */
562 563 SPA_LOG_CLEAR, /* clear the log(s) */
563 564 SPA_LOG_GOOD, /* log(s) are good */
564 565 } spa_log_state_t;
565 566
566 567 extern spa_log_state_t spa_get_log_state(spa_t *spa);
567 568 extern void spa_set_log_state(spa_t *spa, spa_log_state_t state);
568 569 extern int spa_offline_log(spa_t *spa);
569 570
570 571 /* Log claim callback */
571 572 extern void spa_claim_notify(zio_t *zio);
572 573
573 574 /* Accessor functions */
574 575 extern boolean_t spa_shutting_down(spa_t *spa);
575 576 extern struct dsl_pool *spa_get_dsl(spa_t *spa);
576 577 extern boolean_t spa_is_initializing(spa_t *spa);
577 578 extern blkptr_t *spa_get_rootblkptr(spa_t *spa);
578 579 extern void spa_set_rootblkptr(spa_t *spa, const blkptr_t *bp);
579 580 extern void spa_altroot(spa_t *, char *, size_t);
580 581 extern int spa_sync_pass(spa_t *spa);
581 582 extern char *spa_name(spa_t *spa);
582 583 extern uint64_t spa_guid(spa_t *spa);
583 584 extern uint64_t spa_load_guid(spa_t *spa);
584 585 extern uint64_t spa_last_synced_txg(spa_t *spa);
585 586 extern uint64_t spa_first_txg(spa_t *spa);
586 587 extern uint64_t spa_syncing_txg(spa_t *spa);
587 588 extern uint64_t spa_version(spa_t *spa);
588 589 extern pool_state_t spa_state(spa_t *spa);
589 590 extern spa_load_state_t spa_load_state(spa_t *spa);
590 591 extern uint64_t spa_freeze_txg(spa_t *spa);
591 592 extern uint64_t spa_get_asize(spa_t *spa, uint64_t lsize);
592 593 extern uint64_t spa_get_dspace(spa_t *spa);
593 594 extern void spa_update_dspace(spa_t *spa);
594 595 extern uint64_t spa_version(spa_t *spa);
595 596 extern boolean_t spa_deflate(spa_t *spa);
596 597 extern metaslab_class_t *spa_normal_class(spa_t *spa);
597 598 extern metaslab_class_t *spa_log_class(spa_t *spa);
598 599 extern int spa_max_replication(spa_t *spa);
599 600 extern int spa_prev_software_version(spa_t *spa);
600 601 extern int spa_busy(void);
601 602 extern uint8_t spa_get_failmode(spa_t *spa);
602 603 extern boolean_t spa_suspended(spa_t *spa);
603 604 extern uint64_t spa_bootfs(spa_t *spa);
604 605 extern uint64_t spa_delegation(spa_t *spa);
605 606 extern objset_t *spa_meta_objset(spa_t *spa);
606 607
607 608 /* Miscellaneous support routines */
608 609 extern void spa_activate_mos_feature(spa_t *spa, const char *feature);
609 610 extern void spa_deactivate_mos_feature(spa_t *spa, const char *feature);
610 611 extern int spa_rename(const char *oldname, const char *newname);
611 612 extern spa_t *spa_by_guid(uint64_t pool_guid, uint64_t device_guid);
612 613 extern boolean_t spa_guid_exists(uint64_t pool_guid, uint64_t device_guid);
613 614 extern char *spa_strdup(const char *);
614 615 extern void spa_strfree(char *);
615 616 extern uint64_t spa_get_random(uint64_t range);
616 617 extern uint64_t spa_generate_guid(spa_t *spa);
617 618 extern void sprintf_blkptr(char *buf, const blkptr_t *bp);
618 619 extern void spa_freeze(spa_t *spa);
619 620 extern int spa_change_guid(spa_t *spa);
620 621 extern void spa_upgrade(spa_t *spa, uint64_t version);
621 622 extern void spa_evict_all(void);
622 623 extern vdev_t *spa_lookup_by_guid(spa_t *spa, uint64_t guid,
623 624 boolean_t l2cache);
624 625 extern boolean_t spa_has_spare(spa_t *, uint64_t guid);
↓ open down ↓ |
193 lines elided |
↑ open up ↑ |
625 626 extern uint64_t dva_get_dsize_sync(spa_t *spa, const dva_t *dva);
626 627 extern uint64_t bp_get_dsize_sync(spa_t *spa, const blkptr_t *bp);
627 628 extern uint64_t bp_get_dsize(spa_t *spa, const blkptr_t *bp);
628 629 extern boolean_t spa_has_slogs(spa_t *spa);
629 630 extern boolean_t spa_is_root(spa_t *spa);
630 631 extern boolean_t spa_writeable(spa_t *spa);
631 632
632 633 extern int spa_mode(spa_t *spa);
633 634 extern uint64_t strtonum(const char *str, char **nptr);
634 635
635 -/* history logging */
636 -typedef enum history_log_type {
637 - LOG_CMD_POOL_CREATE,
638 - LOG_CMD_NORMAL,
639 - LOG_INTERNAL
640 -} history_log_type_t;
641 -
642 -typedef struct history_arg {
643 - char *ha_history_str;
644 - history_log_type_t ha_log_type;
645 - history_internal_events_t ha_event;
646 - char *ha_zone;
647 - uid_t ha_uid;
648 -} history_arg_t;
649 -
650 636 extern char *spa_his_ievent_table[];
651 637
652 638 extern void spa_history_create_obj(spa_t *spa, dmu_tx_t *tx);
653 639 extern int spa_history_get(spa_t *spa, uint64_t *offset, uint64_t *len_read,
654 640 char *his_buf);
655 -extern int spa_history_log(spa_t *spa, const char *his_buf,
656 - history_log_type_t what);
657 -extern void spa_history_log_internal(history_internal_events_t event,
658 - spa_t *spa, dmu_tx_t *tx, const char *fmt, ...);
659 -extern void spa_history_log_version(spa_t *spa, history_internal_events_t evt);
641 +extern int spa_history_log(spa_t *spa, const char *his_buf);
642 +extern int spa_history_log_nvl(spa_t *spa, nvlist_t *nvl);
643 +extern void spa_history_log_version(spa_t *spa, const char *operation);
644 +extern void spa_history_log_internal(spa_t *spa, const char *operation,
645 + dmu_tx_t *tx, const char *fmt, ...);
646 +extern void spa_history_log_internal_ds(struct dsl_dataset *ds, const char *op,
647 + dmu_tx_t *tx, const char *fmt, ...);
648 +extern void spa_history_log_internal_dd(dsl_dir_t *dd, const char *operation,
649 + dmu_tx_t *tx, const char *fmt, ...);
660 650
661 651 /* error handling */
662 652 struct zbookmark;
663 653 extern void spa_log_error(spa_t *spa, zio_t *zio);
664 654 extern void zfs_ereport_post(const char *class, spa_t *spa, vdev_t *vd,
665 655 zio_t *zio, uint64_t stateoroffset, uint64_t length);
666 656 extern void zfs_post_remove(spa_t *spa, vdev_t *vd);
667 657 extern void zfs_post_state_change(spa_t *spa, vdev_t *vd);
668 658 extern void zfs_post_autoreplace(spa_t *spa, vdev_t *vd);
669 659 extern uint64_t spa_get_errlog_size(spa_t *spa);
670 660 extern int spa_get_errlog(spa_t *spa, void *uaddr, size_t *count);
671 661 extern void spa_errlog_rotate(spa_t *spa);
672 662 extern void spa_errlog_drain(spa_t *spa);
673 663 extern void spa_errlog_sync(spa_t *spa, uint64_t txg);
674 664 extern void spa_get_errlists(spa_t *spa, avl_tree_t *last, avl_tree_t *scrub);
675 665
676 666 /* vdev cache */
677 667 extern void vdev_cache_stat_init(void);
678 668 extern void vdev_cache_stat_fini(void);
679 669
680 670 /* Initialization and termination */
681 671 extern void spa_init(int flags);
682 672 extern void spa_fini(void);
683 673 extern void spa_boot_init();
684 674
685 675 /* properties */
686 676 extern int spa_prop_set(spa_t *spa, nvlist_t *nvp);
687 677 extern int spa_prop_get(spa_t *spa, nvlist_t **nvp);
688 678 extern void spa_prop_clear_bootfs(spa_t *spa, uint64_t obj, dmu_tx_t *tx);
689 679 extern void spa_configfile_set(spa_t *, nvlist_t *, boolean_t);
690 680
691 681 /* asynchronous event notification */
692 682 extern void spa_event_notify(spa_t *spa, vdev_t *vdev, const char *name);
693 683
694 684 #ifdef ZFS_DEBUG
695 685 #define dprintf_bp(bp, fmt, ...) do { \
696 686 if (zfs_flags & ZFS_DEBUG_DPRINTF) { \
697 687 char *__blkbuf = kmem_alloc(BP_SPRINTF_LEN, KM_SLEEP); \
698 688 sprintf_blkptr(__blkbuf, (bp)); \
699 689 dprintf(fmt " %s\n", __VA_ARGS__, __blkbuf); \
700 690 kmem_free(__blkbuf, BP_SPRINTF_LEN); \
701 691 } \
702 692 _NOTE(CONSTCOND) } while (0)
703 693 #else
704 694 #define dprintf_bp(bp, fmt, ...)
705 695 #endif
706 696
707 697 extern boolean_t spa_debug_enabled(spa_t *spa);
708 698 #define spa_dbgmsg(spa, ...) \
709 699 { \
710 700 if (spa_debug_enabled(spa)) \
711 701 zfs_dbgmsg(__VA_ARGS__); \
712 702 }
713 703
714 704 extern int spa_mode_global; /* mode, e.g. FREAD | FWRITE */
715 705
716 706 #ifdef __cplusplus
717 707 }
718 708 #endif
719 709
720 710 #endif /* _SYS_SPA_H */
↓ open down ↓ |
51 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX