166
171
* cksum checksum function
167
172
* comp compression function
168
173
* G gang block indicator
174
* B byteorder (endianness)
177
* lvl level of indirection
170
178
* type DMU object type
171
* lvl level of indirection
172
* birth txg transaction group in which the block was born
179
* phys birth txg of block allocation; zero if same as logical birth txg
180
* log. birth transaction group in which the block was logically born
173
181
* fill count number of non-zero blocks under this bp
174
182
* checksum[4] 256-bit checksum of the data this bp describes
184
#define SPA_BLKPTRSHIFT 7 /* blkptr_t is 128 bytes */
185
#define SPA_DVAS_PER_BP 3 /* Number of DVAs in a bp */
176
187
typedef struct blkptr {
177
dva_t blk_dva[3]; /* 128-bit Data Virtual Address */
178
uint64_t blk_prop; /* size, compression, type, etc */
179
uint64_t blk_pad[3]; /* Extra space for the future */
180
uint64_t blk_birth; /* transaction group at birth */
181
uint64_t blk_fill; /* fill count */
182
zio_cksum_t blk_cksum; /* 256-bit checksum */
188
dva_t blk_dva[SPA_DVAS_PER_BP]; /* Data Virtual Addresses */
189
uint64_t blk_prop; /* size, compression, type, etc */
190
uint64_t blk_pad[2]; /* Extra space for the future */
191
uint64_t blk_phys_birth; /* txg when block was allocated */
192
uint64_t blk_birth; /* transaction group at birth */
193
uint64_t blk_fill; /* fill count */
194
zio_cksum_t blk_cksum; /* 256-bit checksum */
185
#define SPA_BLKPTRSHIFT 7 /* blkptr_t is 128 bytes */
186
#define SPA_DVAS_PER_BP 3 /* Number of DVAs in a bp */
189
198
* Macros to get and set fields in a bp or DVA.
208
217
#define DVA_SET_GANG(dva, x) BF64_SET((dva)->dva_word[1], 63, 1, x)
210
219
#define BP_GET_LSIZE(bp) \
211
(BP_IS_HOLE(bp) ? 0 : \
212
BF64_GET_SB((bp)->blk_prop, 0, 16, SPA_MINBLOCKSHIFT, 1))
220
BF64_GET_SB((bp)->blk_prop, 0, 16, SPA_MINBLOCKSHIFT, 1)
213
221
#define BP_SET_LSIZE(bp, x) \
214
222
BF64_SET_SB((bp)->blk_prop, 0, 16, SPA_MINBLOCKSHIFT, 1, x)
218
226
#define BP_SET_PSIZE(bp, x) \
219
227
BF64_SET_SB((bp)->blk_prop, 16, 16, SPA_MINBLOCKSHIFT, 1, x)
221
#define BP_GET_COMPRESS(bp) BF64_GET((bp)->blk_prop, 32, 8)
222
#define BP_SET_COMPRESS(bp, x) BF64_SET((bp)->blk_prop, 32, 8, x)
224
#define BP_GET_CHECKSUM(bp) BF64_GET((bp)->blk_prop, 40, 8)
225
#define BP_SET_CHECKSUM(bp, x) BF64_SET((bp)->blk_prop, 40, 8, x)
227
#define BP_GET_TYPE(bp) BF64_GET((bp)->blk_prop, 48, 8)
228
#define BP_SET_TYPE(bp, x) BF64_SET((bp)->blk_prop, 48, 8, x)
230
#define BP_GET_LEVEL(bp) BF64_GET((bp)->blk_prop, 56, 5)
231
#define BP_SET_LEVEL(bp, x) BF64_SET((bp)->blk_prop, 56, 5, x)
233
#define BP_GET_BYTEORDER(bp) (0 - BF64_GET((bp)->blk_prop, 63, 1))
234
#define BP_SET_BYTEORDER(bp, x) BF64_SET((bp)->blk_prop, 63, 1, x)
229
#define BP_GET_COMPRESS(bp) BF64_GET((bp)->blk_prop, 32, 8)
230
#define BP_SET_COMPRESS(bp, x) BF64_SET((bp)->blk_prop, 32, 8, x)
232
#define BP_GET_CHECKSUM(bp) BF64_GET((bp)->blk_prop, 40, 8)
233
#define BP_SET_CHECKSUM(bp, x) BF64_SET((bp)->blk_prop, 40, 8, x)
235
#define BP_GET_TYPE(bp) BF64_GET((bp)->blk_prop, 48, 8)
236
#define BP_SET_TYPE(bp, x) BF64_SET((bp)->blk_prop, 48, 8, x)
238
#define BP_GET_LEVEL(bp) BF64_GET((bp)->blk_prop, 56, 5)
239
#define BP_SET_LEVEL(bp, x) BF64_SET((bp)->blk_prop, 56, 5, x)
241
#define BP_GET_PROP_BIT_61(bp) BF64_GET((bp)->blk_prop, 61, 1)
242
#define BP_SET_PROP_BIT_61(bp, x) BF64_SET((bp)->blk_prop, 61, 1, x)
244
#define BP_GET_DEDUP(bp) BF64_GET((bp)->blk_prop, 62, 1)
245
#define BP_SET_DEDUP(bp, x) BF64_SET((bp)->blk_prop, 62, 1, x)
247
#define BP_GET_BYTEORDER(bp) (0 - BF64_GET((bp)->blk_prop, 63, 1))
248
#define BP_SET_BYTEORDER(bp, x) BF64_SET((bp)->blk_prop, 63, 1, x)
250
#define BP_PHYSICAL_BIRTH(bp) \
251
((bp)->blk_phys_birth ? (bp)->blk_phys_birth : (bp)->blk_birth)
253
#define BP_SET_BIRTH(bp, logical, physical) \
255
(bp)->blk_birth = (logical); \
256
(bp)->blk_phys_birth = ((logical) == (physical) ? 0 : (physical)); \
236
259
#define BP_GET_ASIZE(bp) \
237
260
(DVA_GET_ASIZE(&(bp)->blk_dva[0]) + DVA_GET_ASIZE(&(bp)->blk_dva[1]) + \
310
340
#define BP_SPRINTF_LEN 320
343
* This macro allows code sharing between zfs, libzpool, and mdb.
344
* 'func' is either snprintf() or mdb_snprintf().
345
* 'ws' (whitespace) can be ' ' for single-line format, '\n' for multi-line.
347
#define SPRINTF_BLKPTR(func, ws, buf, bp, type, checksum, compress) \
349
static const char *copyname[] = \
350
{ "zero", "single", "double", "triple" }; \
351
int size = BP_SPRINTF_LEN; \
356
len = func(buf + len, size - len, "<NULL>"); \
357
} else if (BP_IS_HOLE(bp)) { \
358
len = func(buf + len, size - len, "<hole>"); \
360
for (int d = 0; d < BP_GET_NDVAS(bp); d++) { \
361
const dva_t *dva = &bp->blk_dva[d]; \
362
if (DVA_IS_VALID(dva)) \
364
len += func(buf + len, size - len, \
365
"DVA[%d]=<%llu:%llx:%llx>%c", d, \
366
(u_longlong_t)DVA_GET_VDEV(dva), \
367
(u_longlong_t)DVA_GET_OFFSET(dva), \
368
(u_longlong_t)DVA_GET_ASIZE(dva), \
371
if (BP_IS_GANG(bp) && \
372
DVA_GET_ASIZE(&bp->blk_dva[2]) <= \
373
DVA_GET_ASIZE(&bp->blk_dva[1]) / 2) \
375
len += func(buf + len, size - len, \
376
"[L%llu %s] %s %s %s %s %s %s%c" \
377
"size=%llxL/%llxP birth=%lluL/%lluP fill=%llu%c" \
378
"cksum=%llx:%llx:%llx:%llx", \
379
(u_longlong_t)BP_GET_LEVEL(bp), \
383
BP_GET_BYTEORDER(bp) == 0 ? "BE" : "LE", \
384
BP_IS_GANG(bp) ? "gang" : "contiguous", \
385
BP_GET_DEDUP(bp) ? "dedup" : "unique", \
388
(u_longlong_t)BP_GET_LSIZE(bp), \
389
(u_longlong_t)BP_GET_PSIZE(bp), \
390
(u_longlong_t)bp->blk_birth, \
391
(u_longlong_t)BP_PHYSICAL_BIRTH(bp), \
392
(u_longlong_t)bp->blk_fill, \
394
(u_longlong_t)bp->blk_cksum.zc_word[0], \
395
(u_longlong_t)bp->blk_cksum.zc_word[1], \
396
(u_longlong_t)bp->blk_cksum.zc_word[2], \
397
(u_longlong_t)bp->blk_cksum.zc_word[3]); \
399
ASSERT(len < size); \
312
402
#include <sys/dmu.h>
314
404
#define BP_GET_BUFC_TYPE(bp) \
315
405
(((BP_GET_LEVEL(bp) > 0) || (dmu_ot[BP_GET_TYPE(bp)].ot_metadata)) ? \
316
406
ARC_BUFC_METADATA : ARC_BUFC_DATA);
318
* Routines found in spa.c
408
typedef enum spa_import_type {
321
413
/* state manipulation functions */
322
414
extern int spa_open(const char *pool, spa_t **, void *tag);
415
extern int spa_open_rewind(const char *pool, spa_t **, void *tag,
416
nvlist_t *policy, nvlist_t **config);
323
417
extern int spa_get_stats(const char *pool, nvlist_t **config,
324
418
char *altroot, size_t buflen);
325
419
extern int spa_create(const char *pool, nvlist_t *config, nvlist_t *props,
326
420
const char *history_str, nvlist_t *zplprops);
327
extern int spa_check_rootconf(char *devpath, char *devid,
328
nvlist_t **bestconf, uint64_t *besttxg);
329
extern boolean_t spa_rootdev_validate(nvlist_t *nv);
330
421
extern int spa_import_rootpool(char *devpath, char *devid);
331
422
extern int spa_import(const char *pool, nvlist_t *config, nvlist_t *props);
332
423
extern int spa_import_verbatim(const char *, nvlist_t *, nvlist_t *);
433
530
/* Pool vdev add/remove lock */
434
531
extern uint64_t spa_vdev_enter(spa_t *spa);
532
extern uint64_t spa_vdev_config_enter(spa_t *spa);
533
extern void spa_vdev_config_exit(spa_t *spa, vdev_t *vd, uint64_t txg,
534
int error, char *tag);
435
535
extern int spa_vdev_exit(spa_t *spa, vdev_t *vd, uint64_t txg, int error);
437
537
/* Pool vdev state change lock */
438
extern void spa_vdev_state_enter(spa_t *spa);
538
extern void spa_vdev_state_enter(spa_t *spa, int oplock);
439
539
extern int spa_vdev_state_exit(spa_t *spa, vdev_t *vd, int error);
542
typedef enum spa_log_state {
543
SPA_LOG_UNKNOWN = 0, /* unknown log state */
544
SPA_LOG_MISSING, /* missing log(s) */
545
SPA_LOG_CLEAR, /* clear the log(s) */
546
SPA_LOG_GOOD, /* log(s) are good */
549
extern spa_log_state_t spa_get_log_state(spa_t *spa);
550
extern void spa_set_log_state(spa_t *spa, spa_log_state_t state);
551
extern int spa_offline_log(spa_t *spa);
553
/* Log claim callback */
554
extern void spa_claim_notify(zio_t *zio);
441
556
/* Accessor functions */
442
557
extern boolean_t spa_shutting_down(spa_t *spa);
443
558
extern struct dsl_pool *spa_get_dsl(spa_t *spa);
449
564
extern uint64_t spa_guid(spa_t *spa);
450
565
extern uint64_t spa_last_synced_txg(spa_t *spa);
451
566
extern uint64_t spa_first_txg(spa_t *spa);
567
extern uint64_t spa_syncing_txg(spa_t *spa);
452
568
extern uint64_t spa_version(spa_t *spa);
453
569
extern pool_state_t spa_state(spa_t *spa);
570
extern spa_load_state_t spa_load_state(spa_t *spa);
454
571
extern uint64_t spa_freeze_txg(spa_t *spa);
455
extern uint64_t spa_get_alloc(spa_t *spa);
456
extern uint64_t spa_get_space(spa_t *spa);
572
extern uint64_t spa_get_asize(spa_t *spa, uint64_t lsize);
457
573
extern uint64_t spa_get_dspace(spa_t *spa);
458
extern uint64_t spa_get_asize(spa_t *spa, uint64_t lsize);
574
extern void spa_update_dspace(spa_t *spa);
459
575
extern uint64_t spa_version(spa_t *spa);
576
extern boolean_t spa_deflate(spa_t *spa);
577
extern metaslab_class_t *spa_normal_class(spa_t *spa);
578
extern metaslab_class_t *spa_log_class(spa_t *spa);
460
579
extern int spa_max_replication(spa_t *spa);
461
580
extern int spa_busy(void);
462
581
extern uint8_t spa_get_failmode(spa_t *spa);
463
582
extern boolean_t spa_suspended(spa_t *spa);
583
extern uint64_t spa_bootfs(spa_t *spa);
584
extern uint64_t spa_delegation(spa_t *spa);
585
extern objset_t *spa_meta_objset(spa_t *spa);
586
extern enum zio_checksum spa_dedup_checksum(spa_t *spa);
465
588
/* Miscellaneous support routines */
466
589
extern int spa_rename(const char *oldname, const char *newname);
468
591
extern char *spa_strdup(const char *);
469
592
extern void spa_strfree(char *);
470
593
extern uint64_t spa_get_random(uint64_t range);
471
extern void sprintf_blkptr(char *buf, int len, const blkptr_t *bp);
594
extern uint64_t spa_generate_guid(spa_t *spa);
595
extern void sprintf_blkptr(char *buf, const blkptr_t *bp);
472
596
extern void spa_freeze(spa_t *spa);
473
597
extern void spa_upgrade(spa_t *spa, uint64_t version);
474
598
extern void spa_evict_all(void);
475
599
extern vdev_t *spa_lookup_by_guid(spa_t *spa, uint64_t guid,
476
600
boolean_t l2cache);
477
601
extern boolean_t spa_has_spare(spa_t *, uint64_t guid);
478
extern uint64_t bp_get_dasize(spa_t *spa, const blkptr_t *bp);
602
extern uint64_t dva_get_dsize_sync(spa_t *spa, const dva_t *dva);
603
extern uint64_t bp_get_dsize_sync(spa_t *spa, const blkptr_t *bp);
604
extern uint64_t bp_get_dsize(spa_t *spa, const blkptr_t *bp);
479
605
extern boolean_t spa_has_slogs(spa_t *spa);
480
606
extern boolean_t spa_is_root(spa_t *spa);
481
607
extern boolean_t spa_writeable(spa_t *spa);
608
extern void spa_rewind_data_to_nvlist(spa_t *spa, nvlist_t *to);
482
610
extern int spa_mode(spa_t *spa);
611
extern uint64_t strtonum(const char *str, char **nptr);
484
613
/* history logging */
485
614
typedef enum history_log_type {
503
632
extern int spa_history_log(spa_t *spa, const char *his_buf,
504
633
history_log_type_t what);
505
void spa_history_internal_log(history_internal_events_t event, spa_t *spa,
506
dmu_tx_t *tx, cred_t *cr, const char *fmt, ...);
634
extern void spa_history_internal_log(history_internal_events_t event,
635
spa_t *spa, dmu_tx_t *tx, cred_t *cr, const char *fmt, ...);
636
extern void spa_history_log_version(spa_t *spa, history_internal_events_t evt);
508
638
/* error handling */
509
639
struct zbookmark;
511
extern void spa_log_error(spa_t *spa, struct zio *zio);
640
extern void spa_log_error(spa_t *spa, zio_t *zio);
512
641
extern void zfs_ereport_post(const char *class, spa_t *spa, vdev_t *vd,
513
struct zio *zio, uint64_t stateoroffset, uint64_t length);
642
zio_t *zio, uint64_t stateoroffset, uint64_t length);
514
643
extern void zfs_post_remove(spa_t *spa, vdev_t *vd);
644
extern void zfs_post_state_change(spa_t *spa, vdev_t *vd);
515
645
extern void zfs_post_autoreplace(spa_t *spa, vdev_t *vd);
516
646
extern uint64_t spa_get_errlog_size(spa_t *spa);
517
647
extern int spa_get_errlog(spa_t *spa, void *uaddr, size_t *count);