spa.h (254591) | spa.h (260150) |
---|---|
1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE --- 6 unchanged lines hidden (view full) --- 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 */ 21/* 22 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. | 1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE --- 6 unchanged lines hidden (view full) --- 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 */ 21/* 22 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. |
23 * Copyright (c) 2012 by Delphix. All rights reserved. | 23 * Copyright (c) 2013 by Delphix. All rights reserved. |
24 * Copyright 2011 Nexenta Systems, Inc. All rights reserved. 25 */ 26 27#ifndef _SYS_SPA_H 28#define _SYS_SPA_H 29 30#include <sys/avl.h> 31#include <sys/zfs_context.h> --- 28 unchanged lines hidden (view full) --- 60#define BF32_DECODE(x, low, len) P2PHASE((x) >> (low), 1U << (len)) 61#define BF64_DECODE(x, low, len) P2PHASE((x) >> (low), 1ULL << (len)) 62#define BF32_ENCODE(x, low, len) (P2PHASE((x), 1U << (len)) << (low)) 63#define BF64_ENCODE(x, low, len) (P2PHASE((x), 1ULL << (len)) << (low)) 64 65#define BF32_GET(x, low, len) BF32_DECODE(x, low, len) 66#define BF64_GET(x, low, len) BF64_DECODE(x, low, len) 67 | 24 * Copyright 2011 Nexenta Systems, Inc. All rights reserved. 25 */ 26 27#ifndef _SYS_SPA_H 28#define _SYS_SPA_H 29 30#include <sys/avl.h> 31#include <sys/zfs_context.h> --- 28 unchanged lines hidden (view full) --- 60#define BF32_DECODE(x, low, len) P2PHASE((x) >> (low), 1U << (len)) 61#define BF64_DECODE(x, low, len) P2PHASE((x) >> (low), 1ULL << (len)) 62#define BF32_ENCODE(x, low, len) (P2PHASE((x), 1U << (len)) << (low)) 63#define BF64_ENCODE(x, low, len) (P2PHASE((x), 1ULL << (len)) << (low)) 64 65#define BF32_GET(x, low, len) BF32_DECODE(x, low, len) 66#define BF64_GET(x, low, len) BF64_DECODE(x, low, len) 67 |
68#define BF32_SET(x, low, len, val) \ 69 ((x) ^= BF32_ENCODE((x >> low) ^ (val), low, len)) 70#define BF64_SET(x, low, len, val) \ 71 ((x) ^= BF64_ENCODE((x >> low) ^ (val), low, len)) | 68#define BF32_SET(x, low, len, val) do { \ 69 ASSERT3U(val, <, 1U << (len)); \ 70 ASSERT3U(low + len, <=, 32); \ 71 (x) ^= BF32_ENCODE((x >> low) ^ (val), low, len); \ 72_NOTE(CONSTCOND) } while (0) |
72 | 73 |
74#define BF64_SET(x, low, len, val) do { \ 75 ASSERT3U(val, <, 1ULL << (len)); \ 76 ASSERT3U(low + len, <=, 64); \ 77 ((x) ^= BF64_ENCODE((x >> low) ^ (val), low, len)); \ 78_NOTE(CONSTCOND) } while (0) 79 |
|
73#define BF32_GET_SB(x, low, len, shift, bias) \ 74 ((BF32_GET(x, low, len) + (bias)) << (shift)) 75#define BF64_GET_SB(x, low, len, shift, bias) \ 76 ((BF64_GET(x, low, len) + (bias)) << (shift)) 77 | 80#define BF32_GET_SB(x, low, len, shift, bias) \ 81 ((BF32_GET(x, low, len) + (bias)) << (shift)) 82#define BF64_GET_SB(x, low, len, shift, bias) \ 83 ((BF64_GET(x, low, len) + (bias)) << (shift)) 84 |
78#define BF32_SET_SB(x, low, len, shift, bias, val) \ 79 BF32_SET(x, low, len, ((val) >> (shift)) - (bias)) 80#define BF64_SET_SB(x, low, len, shift, bias, val) \ 81 BF64_SET(x, low, len, ((val) >> (shift)) - (bias)) | 85#define BF32_SET_SB(x, low, len, shift, bias, val) do { \ 86 ASSERT(IS_P2ALIGNED(val, 1U << shift)); \ 87 ASSERT3S((val) >> (shift), >=, bias); \ 88 BF32_SET(x, low, len, ((val) >> (shift)) - (bias)); \ 89_NOTE(CONSTCOND) } while (0) 90#define BF64_SET_SB(x, low, len, shift, bias, val) do { \ 91 ASSERT(IS_P2ALIGNED(val, 1ULL << shift)); \ 92 ASSERT3S((val) >> (shift), >=, bias); \ 93 BF64_SET(x, low, len, ((val) >> (shift)) - (bias)); \ 94_NOTE(CONSTCOND) } while (0) |
82 83/* 84 * We currently support nine block sizes, from 512 bytes to 128K. 85 * We could go higher, but the benefits are near-zero and the cost 86 * of COWing a giant block to modify one byte would become excessive. 87 */ 88#define SPA_MINBLOCKSHIFT 9 89#define SPA_MAXBLOCKSHIFT 17 --- 102 unchanged lines hidden (view full) --- 192 * phys birth txg of block allocation; zero if same as logical birth txg 193 * log. birth transaction group in which the block was logically born 194 * fill count number of non-zero blocks under this bp 195 * checksum[4] 256-bit checksum of the data this bp describes 196 */ 197#define SPA_BLKPTRSHIFT 7 /* blkptr_t is 128 bytes */ 198#define SPA_DVAS_PER_BP 3 /* Number of DVAs in a bp */ 199 | 95 96/* 97 * We currently support nine block sizes, from 512 bytes to 128K. 98 * We could go higher, but the benefits are near-zero and the cost 99 * of COWing a giant block to modify one byte would become excessive. 100 */ 101#define SPA_MINBLOCKSHIFT 9 102#define SPA_MAXBLOCKSHIFT 17 --- 102 unchanged lines hidden (view full) --- 205 * phys birth txg of block allocation; zero if same as logical birth txg 206 * log. birth transaction group in which the block was logically born 207 * fill count number of non-zero blocks under this bp 208 * checksum[4] 256-bit checksum of the data this bp describes 209 */ 210#define SPA_BLKPTRSHIFT 7 /* blkptr_t is 128 bytes */ 211#define SPA_DVAS_PER_BP 3 /* Number of DVAs in a bp */ 212 |
213/* 214 * A block is a hole when it has either 1) never been written to, or 215 * 2) is zero-filled. In both cases, ZFS can return all zeroes for all reads 216 * without physically allocating disk space. Holes are represented in the 217 * blkptr_t structure by zeroed blk_dva. Correct checking for holes is 218 * done through the BP_IS_HOLE macro. For holes, the logical size, level, 219 * DMU object type, and birth times are all also stored for holes that 220 * were written to at some point (i.e. were punched after having been filled). 221 */ |
|
200typedef struct blkptr { 201 dva_t blk_dva[SPA_DVAS_PER_BP]; /* Data Virtual Addresses */ 202 uint64_t blk_prop; /* size, compression, type, etc */ 203 uint64_t blk_pad[2]; /* Extra space for the future */ 204 uint64_t blk_phys_birth; /* txg when block was allocated */ 205 uint64_t blk_birth; /* transaction group at birth */ 206 uint64_t blk_fill; /* fill count */ 207 zio_cksum_t blk_cksum; /* 256-bit checksum */ 208} blkptr_t; 209 210/* 211 * Macros to get and set fields in a bp or DVA. 212 */ 213#define DVA_GET_ASIZE(dva) \ | 222typedef struct blkptr { 223 dva_t blk_dva[SPA_DVAS_PER_BP]; /* Data Virtual Addresses */ 224 uint64_t blk_prop; /* size, compression, type, etc */ 225 uint64_t blk_pad[2]; /* Extra space for the future */ 226 uint64_t blk_phys_birth; /* txg when block was allocated */ 227 uint64_t blk_birth; /* transaction group at birth */ 228 uint64_t blk_fill; /* fill count */ 229 zio_cksum_t blk_cksum; /* 256-bit checksum */ 230} blkptr_t; 231 232/* 233 * Macros to get and set fields in a bp or DVA. 234 */ 235#define DVA_GET_ASIZE(dva) \ |
214 BF64_GET_SB((dva)->dva_word[0], 0, 24, SPA_MINBLOCKSHIFT, 0) | 236 BF64_GET_SB((dva)->dva_word[0], 0, SPA_ASIZEBITS, SPA_MINBLOCKSHIFT, 0) |
215#define DVA_SET_ASIZE(dva, x) \ | 237#define DVA_SET_ASIZE(dva, x) \ |
216 BF64_SET_SB((dva)->dva_word[0], 0, 24, SPA_MINBLOCKSHIFT, 0, x) | 238 BF64_SET_SB((dva)->dva_word[0], 0, SPA_ASIZEBITS, \ 239 SPA_MINBLOCKSHIFT, 0, x) |
217 218#define DVA_GET_GRID(dva) BF64_GET((dva)->dva_word[0], 24, 8) 219#define DVA_SET_GRID(dva, x) BF64_SET((dva)->dva_word[0], 24, 8, x) 220 221#define DVA_GET_VDEV(dva) BF64_GET((dva)->dva_word[0], 32, 32) 222#define DVA_SET_VDEV(dva, x) BF64_SET((dva)->dva_word[0], 32, 32, x) 223 224#define DVA_GET_OFFSET(dva) \ 225 BF64_GET_SB((dva)->dva_word[1], 0, 63, SPA_MINBLOCKSHIFT, 0) 226#define DVA_SET_OFFSET(dva, x) \ 227 BF64_SET_SB((dva)->dva_word[1], 0, 63, SPA_MINBLOCKSHIFT, 0, x) 228 229#define DVA_GET_GANG(dva) BF64_GET((dva)->dva_word[1], 63, 1) 230#define DVA_SET_GANG(dva, x) BF64_SET((dva)->dva_word[1], 63, 1, x) 231 232#define BP_GET_LSIZE(bp) \ | 240 241#define DVA_GET_GRID(dva) BF64_GET((dva)->dva_word[0], 24, 8) 242#define DVA_SET_GRID(dva, x) BF64_SET((dva)->dva_word[0], 24, 8, x) 243 244#define DVA_GET_VDEV(dva) BF64_GET((dva)->dva_word[0], 32, 32) 245#define DVA_SET_VDEV(dva, x) BF64_SET((dva)->dva_word[0], 32, 32, x) 246 247#define DVA_GET_OFFSET(dva) \ 248 BF64_GET_SB((dva)->dva_word[1], 0, 63, SPA_MINBLOCKSHIFT, 0) 249#define DVA_SET_OFFSET(dva, x) \ 250 BF64_SET_SB((dva)->dva_word[1], 0, 63, SPA_MINBLOCKSHIFT, 0, x) 251 252#define DVA_GET_GANG(dva) BF64_GET((dva)->dva_word[1], 63, 1) 253#define DVA_SET_GANG(dva, x) BF64_SET((dva)->dva_word[1], 63, 1, x) 254 255#define BP_GET_LSIZE(bp) \ |
233 BF64_GET_SB((bp)->blk_prop, 0, 16, SPA_MINBLOCKSHIFT, 1) | 256 BF64_GET_SB((bp)->blk_prop, 0, SPA_LSIZEBITS, SPA_MINBLOCKSHIFT, 1) |
234#define BP_SET_LSIZE(bp, x) \ | 257#define BP_SET_LSIZE(bp, x) \ |
235 BF64_SET_SB((bp)->blk_prop, 0, 16, SPA_MINBLOCKSHIFT, 1, x) | 258 BF64_SET_SB((bp)->blk_prop, 0, SPA_LSIZEBITS, SPA_MINBLOCKSHIFT, 1, x) |
236 237#define BP_GET_PSIZE(bp) \ | 259 260#define BP_GET_PSIZE(bp) \ |
238 BF64_GET_SB((bp)->blk_prop, 16, 16, SPA_MINBLOCKSHIFT, 1) | 261 BF64_GET_SB((bp)->blk_prop, 16, SPA_PSIZEBITS, SPA_MINBLOCKSHIFT, 1) |
239#define BP_SET_PSIZE(bp, x) \ | 262#define BP_SET_PSIZE(bp, x) \ |
240 BF64_SET_SB((bp)->blk_prop, 16, 16, SPA_MINBLOCKSHIFT, 1, x) | 263 BF64_SET_SB((bp)->blk_prop, 16, SPA_PSIZEBITS, SPA_MINBLOCKSHIFT, 1, x) |
241 242#define BP_GET_COMPRESS(bp) BF64_GET((bp)->blk_prop, 32, 8) 243#define BP_SET_COMPRESS(bp, x) BF64_SET((bp)->blk_prop, 32, 8, x) 244 245#define BP_GET_CHECKSUM(bp) BF64_GET((bp)->blk_prop, 40, 8) 246#define BP_SET_CHECKSUM(bp, x) BF64_SET((bp)->blk_prop, 40, 8, x) 247 248#define BP_GET_TYPE(bp) BF64_GET((bp)->blk_prop, 48, 8) 249#define BP_SET_TYPE(bp, x) BF64_SET((bp)->blk_prop, 48, 8, x) 250 251#define BP_GET_LEVEL(bp) BF64_GET((bp)->blk_prop, 56, 5) 252#define BP_SET_LEVEL(bp, x) BF64_SET((bp)->blk_prop, 56, 5, x) 253 254#define BP_GET_PROP_BIT_61(bp) BF64_GET((bp)->blk_prop, 61, 1) 255#define BP_SET_PROP_BIT_61(bp, x) BF64_SET((bp)->blk_prop, 61, 1, x) 256 257#define BP_GET_DEDUP(bp) BF64_GET((bp)->blk_prop, 62, 1) 258#define BP_SET_DEDUP(bp, x) BF64_SET((bp)->blk_prop, 62, 1, x) 259 | 264 265#define BP_GET_COMPRESS(bp) BF64_GET((bp)->blk_prop, 32, 8) 266#define BP_SET_COMPRESS(bp, x) BF64_SET((bp)->blk_prop, 32, 8, x) 267 268#define BP_GET_CHECKSUM(bp) BF64_GET((bp)->blk_prop, 40, 8) 269#define BP_SET_CHECKSUM(bp, x) BF64_SET((bp)->blk_prop, 40, 8, x) 270 271#define BP_GET_TYPE(bp) BF64_GET((bp)->blk_prop, 48, 8) 272#define BP_SET_TYPE(bp, x) BF64_SET((bp)->blk_prop, 48, 8, x) 273 274#define BP_GET_LEVEL(bp) BF64_GET((bp)->blk_prop, 56, 5) 275#define BP_SET_LEVEL(bp, x) BF64_SET((bp)->blk_prop, 56, 5, x) 276 277#define BP_GET_PROP_BIT_61(bp) BF64_GET((bp)->blk_prop, 61, 1) 278#define BP_SET_PROP_BIT_61(bp, x) BF64_SET((bp)->blk_prop, 61, 1, x) 279 280#define BP_GET_DEDUP(bp) BF64_GET((bp)->blk_prop, 62, 1) 281#define BP_SET_DEDUP(bp, x) BF64_SET((bp)->blk_prop, 62, 1, x) 282 |
260#define BP_GET_BYTEORDER(bp) (0 - BF64_GET((bp)->blk_prop, 63, 1)) | 283#define BP_GET_BYTEORDER(bp) BF64_GET((bp)->blk_prop, 63, 1) |
261#define BP_SET_BYTEORDER(bp, x) BF64_SET((bp)->blk_prop, 63, 1, x) 262 263#define BP_PHYSICAL_BIRTH(bp) \ 264 ((bp)->blk_phys_birth ? (bp)->blk_phys_birth : (bp)->blk_birth) 265 266#define BP_SET_BIRTH(bp, logical, physical) \ 267{ \ 268 (bp)->blk_birth = (logical); \ --- 41 unchanged lines hidden (view full) --- 310 (zcp)->zc_word[0] = w0; \ 311 (zcp)->zc_word[1] = w1; \ 312 (zcp)->zc_word[2] = w2; \ 313 (zcp)->zc_word[3] = w3; \ 314} 315 316#define BP_IDENTITY(bp) (&(bp)->blk_dva[0]) 317#define BP_IS_GANG(bp) DVA_GET_GANG(BP_IDENTITY(bp)) | 284#define BP_SET_BYTEORDER(bp, x) BF64_SET((bp)->blk_prop, 63, 1, x) 285 286#define BP_PHYSICAL_BIRTH(bp) \ 287 ((bp)->blk_phys_birth ? (bp)->blk_phys_birth : (bp)->blk_birth) 288 289#define BP_SET_BIRTH(bp, logical, physical) \ 290{ \ 291 (bp)->blk_birth = (logical); \ --- 41 unchanged lines hidden (view full) --- 333 (zcp)->zc_word[0] = w0; \ 334 (zcp)->zc_word[1] = w1; \ 335 (zcp)->zc_word[2] = w2; \ 336 (zcp)->zc_word[3] = w3; \ 337} 338 339#define BP_IDENTITY(bp) (&(bp)->blk_dva[0]) 340#define BP_IS_GANG(bp) DVA_GET_GANG(BP_IDENTITY(bp)) |
318#define BP_IS_HOLE(bp) ((bp)->blk_birth == 0) | 341#define DVA_IS_EMPTY(dva) ((dva)->dva_word[0] == 0ULL && \ 342 (dva)->dva_word[1] == 0ULL) 343#define BP_IS_HOLE(bp) DVA_IS_EMPTY(BP_IDENTITY(bp)) |
319 320/* BP_IS_RAIDZ(bp) assumes no block compression */ 321#define BP_IS_RAIDZ(bp) (DVA_GET_ASIZE(&(bp)->blk_dva[0]) > \ 322 BP_GET_PSIZE(bp)) 323 324#define BP_ZERO(bp) \ 325{ \ 326 (bp)->blk_dva[0].dva_word[0] = 0; \ --- 6 unchanged lines hidden (view full) --- 333 (bp)->blk_pad[0] = 0; \ 334 (bp)->blk_pad[1] = 0; \ 335 (bp)->blk_phys_birth = 0; \ 336 (bp)->blk_birth = 0; \ 337 (bp)->blk_fill = 0; \ 338 ZIO_SET_CHECKSUM(&(bp)->blk_cksum, 0, 0, 0, 0); \ 339} 340 | 344 345/* BP_IS_RAIDZ(bp) assumes no block compression */ 346#define BP_IS_RAIDZ(bp) (DVA_GET_ASIZE(&(bp)->blk_dva[0]) > \ 347 BP_GET_PSIZE(bp)) 348 349#define BP_ZERO(bp) \ 350{ \ 351 (bp)->blk_dva[0].dva_word[0] = 0; \ --- 6 unchanged lines hidden (view full) --- 358 (bp)->blk_pad[0] = 0; \ 359 (bp)->blk_pad[1] = 0; \ 360 (bp)->blk_phys_birth = 0; \ 361 (bp)->blk_birth = 0; \ 362 (bp)->blk_fill = 0; \ 363 ZIO_SET_CHECKSUM(&(bp)->blk_cksum, 0, 0, 0, 0); \ 364} 365 |
341/* 342 * Note: the byteorder is either 0 or -1, both of which are palindromes. 343 * This simplifies the endianness handling a bit. 344 */ | |
345#if BYTE_ORDER == _BIG_ENDIAN 346#define ZFS_HOST_BYTEORDER (0ULL) 347#else | 366#if BYTE_ORDER == _BIG_ENDIAN 367#define ZFS_HOST_BYTEORDER (0ULL) 368#else |
348#define ZFS_HOST_BYTEORDER (-1ULL) | 369#define ZFS_HOST_BYTEORDER (1ULL) |
349#endif 350 351#define BP_SHOULD_BYTESWAP(bp) (BP_GET_BYTEORDER(bp) != ZFS_HOST_BYTEORDER) 352 353#define BP_SPRINTF_LEN 320 354 355/* 356 * This macro allows code sharing between zfs, libzpool, and mdb. 357 * 'func' is either snprintf() or mdb_snprintf(). 358 * 'ws' (whitespace) can be ' ' for single-line format, '\n' for multi-line. 359 */ | 370#endif 371 372#define BP_SHOULD_BYTESWAP(bp) (BP_GET_BYTEORDER(bp) != ZFS_HOST_BYTEORDER) 373 374#define BP_SPRINTF_LEN 320 375 376/* 377 * This macro allows code sharing between zfs, libzpool, and mdb. 378 * 'func' is either snprintf() or mdb_snprintf(). 379 * 'ws' (whitespace) can be ' ' for single-line format, '\n' for multi-line. 380 */ |
360#define SPRINTF_BLKPTR(func, ws, buf, bp, type, checksum, compress) \ | 381#define SNPRINTF_BLKPTR(func, ws, buf, size, bp, type, checksum, compress) \ |
361{ \ 362 static const char *copyname[] = \ 363 { "zero", "single", "double", "triple" }; \ | 382{ \ 383 static const char *copyname[] = \ 384 { "zero", "single", "double", "triple" }; \ |
364 int size = BP_SPRINTF_LEN; \ | |
365 int len = 0; \ 366 int copies = 0; \ 367 \ 368 if (bp == NULL) { \ | 385 int len = 0; \ 386 int copies = 0; \ 387 \ 388 if (bp == NULL) { \ |
369 len = func(buf + len, size - len, " | 389 len += func(buf + len, size - len, "<NULL>"); \ |
370 } else if (BP_IS_HOLE(bp)) { \ | 390 } else if (BP_IS_HOLE(bp)) { \ |
371 len = func(buf + len, size - len, " | 391 len += func(buf + len, size - len, "<hole>"); \ 392 if (bp->blk_birth > 0) { \ 393 len += func(buf + len, size - len, \ 394 " birth=%lluL", \ 395 (u_longlong_t)bp->blk_birth); \ 396 } \ |
372 } else { \ 373 for (int d = 0; d < BP_GET_NDVAS(bp); d++) { \ 374 const dva_t *dva = &bp->blk_dva[d]; \ 375 if (DVA_IS_VALID(dva)) \ 376 copies++; \ 377 len += func(buf + len, size - len, \ 378 "DVA[%d]=<%llu:%llx:%llx>%c", d, \ 379 (u_longlong_t)DVA_GET_VDEV(dva), \ --- 229 unchanged lines hidden (view full) --- 609extern uint8_t spa_get_failmode(spa_t *spa); 610extern boolean_t spa_suspended(spa_t *spa); 611extern uint64_t spa_bootfs(spa_t *spa); 612extern uint64_t spa_delegation(spa_t *spa); 613extern objset_t *spa_meta_objset(spa_t *spa); 614extern uint64_t spa_deadman_synctime(spa_t *spa); 615 616/* Miscellaneous support routines */ | 397 } else { \ 398 for (int d = 0; d < BP_GET_NDVAS(bp); d++) { \ 399 const dva_t *dva = &bp->blk_dva[d]; \ 400 if (DVA_IS_VALID(dva)) \ 401 copies++; \ 402 len += func(buf + len, size - len, \ 403 "DVA[%d]=<%llu:%llx:%llx>%c", d, \ 404 (u_longlong_t)DVA_GET_VDEV(dva), \ --- 229 unchanged lines hidden (view full) --- 634extern uint8_t spa_get_failmode(spa_t *spa); 635extern boolean_t spa_suspended(spa_t *spa); 636extern uint64_t spa_bootfs(spa_t *spa); 637extern uint64_t spa_delegation(spa_t *spa); 638extern objset_t *spa_meta_objset(spa_t *spa); 639extern uint64_t spa_deadman_synctime(spa_t *spa); 640 641/* Miscellaneous support routines */ |
617extern void spa_activate_mos_feature(spa_t *spa, const char *feature); | 642extern void spa_activate_mos_feature(spa_t *spa, const char *feature, 643 dmu_tx_t *tx); |
618extern void spa_deactivate_mos_feature(spa_t *spa, const char *feature); 619extern int spa_rename(const char *oldname, const char *newname); 620extern spa_t *spa_by_guid(uint64_t pool_guid, uint64_t device_guid); 621extern boolean_t spa_guid_exists(uint64_t pool_guid, uint64_t device_guid); 622extern char *spa_strdup(const char *); 623extern void spa_strfree(char *); 624extern uint64_t spa_get_random(uint64_t range); 625extern uint64_t spa_generate_guid(spa_t *spa); | 644extern void spa_deactivate_mos_feature(spa_t *spa, const char *feature); 645extern int spa_rename(const char *oldname, const char *newname); 646extern spa_t *spa_by_guid(uint64_t pool_guid, uint64_t device_guid); 647extern boolean_t spa_guid_exists(uint64_t pool_guid, uint64_t device_guid); 648extern char *spa_strdup(const char *); 649extern void spa_strfree(char *); 650extern uint64_t spa_get_random(uint64_t range); 651extern uint64_t spa_generate_guid(spa_t *spa); |
626extern void sprintf_blkptr(char *buf, const blkptr_t *bp); | 652extern void snprintf_blkptr(char *buf, size_t buflen, const blkptr_t *bp); |
627extern void spa_freeze(spa_t *spa); 628extern int spa_change_guid(spa_t *spa); 629extern void spa_upgrade(spa_t *spa, uint64_t version); 630extern void spa_evict_all(void); 631extern vdev_t *spa_lookup_by_guid(spa_t *spa, uint64_t guid, 632 boolean_t l2cache); 633extern boolean_t spa_has_spare(spa_t *, uint64_t guid); 634extern uint64_t dva_get_dsize_sync(spa_t *spa, const dva_t *dva); --- 52 unchanged lines hidden (view full) --- 687extern void spa_prop_clear_bootfs(spa_t *spa, uint64_t obj, dmu_tx_t *tx); 688extern void spa_configfile_set(spa_t *, nvlist_t *, boolean_t); 689 690/* asynchronous event notification */ 691extern void spa_event_notify(spa_t *spa, vdev_t *vdev, const char *name); 692 693#ifdef ZFS_DEBUG 694#define dprintf_bp(bp, fmt, ...) do { \ | 653extern void spa_freeze(spa_t *spa); 654extern int spa_change_guid(spa_t *spa); 655extern void spa_upgrade(spa_t *spa, uint64_t version); 656extern void spa_evict_all(void); 657extern vdev_t *spa_lookup_by_guid(spa_t *spa, uint64_t guid, 658 boolean_t l2cache); 659extern boolean_t spa_has_spare(spa_t *, uint64_t guid); 660extern uint64_t dva_get_dsize_sync(spa_t *spa, const dva_t *dva); --- 52 unchanged lines hidden (view full) --- 713extern void spa_prop_clear_bootfs(spa_t *spa, uint64_t obj, dmu_tx_t *tx); 714extern void spa_configfile_set(spa_t *, nvlist_t *, boolean_t); 715 716/* asynchronous event notification */ 717extern void spa_event_notify(spa_t *spa, vdev_t *vdev, const char *name); 718 719#ifdef ZFS_DEBUG 720#define dprintf_bp(bp, fmt, ...) do { \ |
695 if (zfs_flags & ZFS_DEBUG_DPRINTF) { \ | 721 if (zfs_flags & ZFS_DEBUG_DPRINTF) { \ |
696 char *__blkbuf = kmem_alloc(BP_SPRINTF_LEN, KM_SLEEP); \ | 722 char *__blkbuf = kmem_alloc(BP_SPRINTF_LEN, KM_SLEEP); \ |
697 sprintf_blkptr(__blkbuf, (bp)); \ | 723 snprintf_blkptr(__blkbuf, BP_SPRINTF_LEN, (bp)); \ |
698 dprintf(fmt " %s\n", __VA_ARGS__, __blkbuf); \ 699 kmem_free(__blkbuf, BP_SPRINTF_LEN); \ 700 } \ 701_NOTE(CONSTCOND) } while (0) 702#else 703#define dprintf_bp(bp, fmt, ...) 704#endif 705 --- 14 unchanged lines hidden --- | 724 dprintf(fmt " %s\n", __VA_ARGS__, __blkbuf); \ 725 kmem_free(__blkbuf, BP_SPRINTF_LEN); \ 726 } \ 727_NOTE(CONSTCOND) } while (0) 728#else 729#define dprintf_bp(bp, fmt, ...) 730#endif 731 --- 14 unchanged lines hidden --- |