usr/src/uts/common/fs/zfs/sys/spa.h
author ahrens
Mon, 07 Jul 2008 13:39:21 -0700
changeset 7046 361307ae060d
parent 6987 877c018eb06c
child 7147 1e1d75c88283
permissions -rw-r--r--
6343667 scrub/resilver has to start over when a snapshot is taken 6343693 'zpool status' gives delayed start for 'zpool scrub' 6670746 scrub on degraded pool return the status of 'resilver completed'? 6675685 DTL entries are lost resulting in checksum errors 6706404 get_history_one() can dereference off end of hist_event_table[] 6715414 assertion failed: ds->ds_owner != tag in dsl_dataset_rele() 6716437 ztest gets SEGV in arc_released() 6722838 bfu does not update grub
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     1
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     2
 * CDDL HEADER START
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     3
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
     5
 * Common Development and Distribution License (the "License").
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
     6
 * You may not use this file except in compliance with the License.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     7
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    11
 * and limitations under the License.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    12
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    18
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    19
 * CDDL HEADER END
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    20
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    21
/*
5810
9253e5eac38c 6649150 add kstats to the vdev cache
ek110237
parents: 5450
diff changeset
    22
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    23
 * Use is subject to license terms.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    24
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    25
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    26
#ifndef _SYS_SPA_H
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    27
#define	_SYS_SPA_H
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    28
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    29
#pragma ident	"%Z%%M%	%I%	%E% SMI"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    30
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    31
#include <sys/avl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    32
#include <sys/zfs_context.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    33
#include <sys/nvpair.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    34
#include <sys/sysmacros.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    35
#include <sys/types.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    36
#include <sys/fs/zfs.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    37
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    38
#ifdef	__cplusplus
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    39
extern "C" {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    40
#endif
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    41
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    42
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    43
 * Forward references that lots of things need.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    44
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    45
typedef struct spa spa_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    46
typedef struct vdev vdev_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    47
typedef struct metaslab metaslab_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    48
typedef struct zilog zilog_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    49
typedef struct traverse_handle traverse_handle_t;
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
    50
typedef struct spa_aux_vdev spa_aux_vdev_t;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    51
struct dsl_pool;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    52
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    53
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    54
 * General-purpose 32-bit and 64-bit bitfield encodings.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    55
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    56
#define	BF32_DECODE(x, low, len)	P2PHASE((x) >> (low), 1U << (len))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    57
#define	BF64_DECODE(x, low, len)	P2PHASE((x) >> (low), 1ULL << (len))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    58
#define	BF32_ENCODE(x, low, len)	(P2PHASE((x), 1U << (len)) << (low))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    59
#define	BF64_ENCODE(x, low, len)	(P2PHASE((x), 1ULL << (len)) << (low))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    60
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    61
#define	BF32_GET(x, low, len)		BF32_DECODE(x, low, len)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    62
#define	BF64_GET(x, low, len)		BF64_DECODE(x, low, len)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    63
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    64
#define	BF32_SET(x, low, len, val)	\
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2676
diff changeset
    65
	((x) ^= BF32_ENCODE((x >> low) ^ (val), low, len))
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    66
#define	BF64_SET(x, low, len, val)	\
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2676
diff changeset
    67
	((x) ^= BF64_ENCODE((x >> low) ^ (val), low, len))
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    68
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    69
#define	BF32_GET_SB(x, low, len, shift, bias)	\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    70
	((BF32_GET(x, low, len) + (bias)) << (shift))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    71
#define	BF64_GET_SB(x, low, len, shift, bias)	\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    72
	((BF64_GET(x, low, len) + (bias)) << (shift))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    73
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    74
#define	BF32_SET_SB(x, low, len, shift, bias, val)	\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    75
	BF32_SET(x, low, len, ((val) >> (shift)) - (bias))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    76
#define	BF64_SET_SB(x, low, len, shift, bias, val)	\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    77
	BF64_SET(x, low, len, ((val) >> (shift)) - (bias))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    78
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    79
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    80
 * We currently support nine block sizes, from 512 bytes to 128K.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    81
 * We could go higher, but the benefits are near-zero and the cost
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    82
 * of COWing a giant block to modify one byte would become excessive.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    83
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    84
#define	SPA_MINBLOCKSHIFT	9
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    85
#define	SPA_MAXBLOCKSHIFT	17
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    86
#define	SPA_MINBLOCKSIZE	(1ULL << SPA_MINBLOCKSHIFT)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    87
#define	SPA_MAXBLOCKSIZE	(1ULL << SPA_MAXBLOCKSHIFT)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    88
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    89
#define	SPA_BLOCKSIZES		(SPA_MAXBLOCKSHIFT - SPA_MINBLOCKSHIFT + 1)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    90
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    91
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    92
 * The DVA size encodings for LSIZE and PSIZE support blocks up to 32MB.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    93
 * The ASIZE encoding should be at least 64 times larger (6 more bits)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    94
 * to support up to 4-way RAID-Z mirror mode with worst-case gang block
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    95
 * overhead, three DVAs per bp, plus one more bit in case we do anything
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    96
 * else that expands the ASIZE.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    97
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    98
#define	SPA_LSIZEBITS		16	/* LSIZE up to 32M (2^16 * 512)	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    99
#define	SPA_PSIZEBITS		16	/* PSIZE up to 32M (2^16 * 512)	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   100
#define	SPA_ASIZEBITS		24	/* ASIZE up to 64 times larger	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   101
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   102
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   103
 * All SPA data is represented by 128-bit data virtual addresses (DVAs).
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   104
 * The members of the dva_t should be considered opaque outside the SPA.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   105
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   106
typedef struct dva {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   107
	uint64_t	dva_word[2];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   108
} dva_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   109
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   110
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   111
 * Each block has a 256-bit checksum -- strong enough for cryptographic hashes.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   112
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   113
typedef struct zio_cksum {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   114
	uint64_t	zc_word[4];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   115
} zio_cksum_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   116
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   117
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   118
 * Each block is described by its DVAs, time of birth, checksum, etc.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   119
 * The word-by-word, bit-by-bit layout of the blkptr is as follows:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   120
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   121
 *	64	56	48	40	32	24	16	8	0
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   122
 *	+-------+-------+-------+-------+-------+-------+-------+-------+
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   123
 * 0	|		vdev1		| GRID  |	  ASIZE		|
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   124
 *	+-------+-------+-------+-------+-------+-------+-------+-------+
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   125
 * 1	|G|			 offset1				|
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   126
 *	+-------+-------+-------+-------+-------+-------+-------+-------+
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   127
 * 2	|		vdev2		| GRID  |	  ASIZE		|
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   128
 *	+-------+-------+-------+-------+-------+-------+-------+-------+
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   129
 * 3	|G|			 offset2				|
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   130
 *	+-------+-------+-------+-------+-------+-------+-------+-------+
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   131
 * 4	|		vdev3		| GRID  |	  ASIZE		|
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   132
 *	+-------+-------+-------+-------+-------+-------+-------+-------+
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   133
 * 5	|G|			 offset3				|
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   134
 *	+-------+-------+-------+-------+-------+-------+-------+-------+
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   135
 * 6	|E| lvl | type	| cksum | comp	|     PSIZE	|     LSIZE	|
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   136
 *	+-------+-------+-------+-------+-------+-------+-------+-------+
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   137
 * 7	|			padding					|
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   138
 *	+-------+-------+-------+-------+-------+-------+-------+-------+
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   139
 * 8	|			padding					|
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   140
 *	+-------+-------+-------+-------+-------+-------+-------+-------+
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   141
 * 9	|			padding					|
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   142
 *	+-------+-------+-------+-------+-------+-------+-------+-------+
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   143
 * a	|			birth txg				|
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   144
 *	+-------+-------+-------+-------+-------+-------+-------+-------+
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   145
 * b	|			fill count				|
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   146
 *	+-------+-------+-------+-------+-------+-------+-------+-------+
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   147
 * c	|			checksum[0]				|
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   148
 *	+-------+-------+-------+-------+-------+-------+-------+-------+
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   149
 * d	|			checksum[1]				|
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   150
 *	+-------+-------+-------+-------+-------+-------+-------+-------+
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   151
 * e	|			checksum[2]				|
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   152
 *	+-------+-------+-------+-------+-------+-------+-------+-------+
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   153
 * f	|			checksum[3]				|
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   154
 *	+-------+-------+-------+-------+-------+-------+-------+-------+
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   155
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   156
 * Legend:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   157
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   158
 * vdev		virtual device ID
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   159
 * offset	offset into virtual device
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   160
 * LSIZE	logical size
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   161
 * PSIZE	physical size (after compression)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   162
 * ASIZE	allocated size (including RAID-Z parity and gang block headers)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   163
 * GRID		RAID-Z layout information (reserved for future use)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   164
 * cksum	checksum function
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   165
 * comp		compression function
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   166
 * G		gang block indicator
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   167
 * E		endianness
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   168
 * type		DMU object type
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   169
 * lvl		level of indirection
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   170
 * birth txg	transaction group in which the block was born
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   171
 * fill count	number of non-zero blocks under this bp
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   172
 * checksum[4]	256-bit checksum of the data this bp describes
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   173
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   174
typedef struct blkptr {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   175
	dva_t		blk_dva[3];	/* 128-bit Data Virtual Address	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   176
	uint64_t	blk_prop;	/* size, compression, type, etc	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   177
	uint64_t	blk_pad[3];	/* Extra space for the future	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   178
	uint64_t	blk_birth;	/* transaction group at birth	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   179
	uint64_t	blk_fill;	/* fill count			*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   180
	zio_cksum_t	blk_cksum;	/* 256-bit checksum		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   181
} blkptr_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   182
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   183
#define	SPA_BLKPTRSHIFT	7		/* blkptr_t is 128 bytes	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   184
#define	SPA_DVAS_PER_BP	3		/* Number of DVAs in a bp	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   185
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   186
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   187
 * Macros to get and set fields in a bp or DVA.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   188
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   189
#define	DVA_GET_ASIZE(dva)	\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   190
	BF64_GET_SB((dva)->dva_word[0], 0, 24, SPA_MINBLOCKSHIFT, 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   191
#define	DVA_SET_ASIZE(dva, x)	\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   192
	BF64_SET_SB((dva)->dva_word[0], 0, 24, SPA_MINBLOCKSHIFT, 0, x)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   193
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   194
#define	DVA_GET_GRID(dva)	BF64_GET((dva)->dva_word[0], 24, 8)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   195
#define	DVA_SET_GRID(dva, x)	BF64_SET((dva)->dva_word[0], 24, 8, x)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   196
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   197
#define	DVA_GET_VDEV(dva)	BF64_GET((dva)->dva_word[0], 32, 32)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   198
#define	DVA_SET_VDEV(dva, x)	BF64_SET((dva)->dva_word[0], 32, 32, x)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   199
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   200
#define	DVA_GET_OFFSET(dva)	\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   201
	BF64_GET_SB((dva)->dva_word[1], 0, 63, SPA_MINBLOCKSHIFT, 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   202
#define	DVA_SET_OFFSET(dva, x)	\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   203
	BF64_SET_SB((dva)->dva_word[1], 0, 63, SPA_MINBLOCKSHIFT, 0, x)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   204
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   205
#define	DVA_GET_GANG(dva)	BF64_GET((dva)->dva_word[1], 63, 1)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   206
#define	DVA_SET_GANG(dva, x)	BF64_SET((dva)->dva_word[1], 63, 1, x)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   207
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   208
#define	BP_GET_LSIZE(bp)	\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   209
	(BP_IS_HOLE(bp) ? 0 : \
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   210
	BF64_GET_SB((bp)->blk_prop, 0, 16, SPA_MINBLOCKSHIFT, 1))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   211
#define	BP_SET_LSIZE(bp, x)	\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   212
	BF64_SET_SB((bp)->blk_prop, 0, 16, SPA_MINBLOCKSHIFT, 1, x)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   213
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   214
#define	BP_GET_PSIZE(bp)	\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   215
	BF64_GET_SB((bp)->blk_prop, 16, 16, SPA_MINBLOCKSHIFT, 1)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   216
#define	BP_SET_PSIZE(bp, x)	\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   217
	BF64_SET_SB((bp)->blk_prop, 16, 16, SPA_MINBLOCKSHIFT, 1, x)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   218
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   219
#define	BP_GET_COMPRESS(bp)	BF64_GET((bp)->blk_prop, 32, 8)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   220
#define	BP_SET_COMPRESS(bp, x)	BF64_SET((bp)->blk_prop, 32, 8, x)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   221
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   222
#define	BP_GET_CHECKSUM(bp)	BF64_GET((bp)->blk_prop, 40, 8)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   223
#define	BP_SET_CHECKSUM(bp, x)	BF64_SET((bp)->blk_prop, 40, 8, x)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   224
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   225
#define	BP_GET_TYPE(bp)		BF64_GET((bp)->blk_prop, 48, 8)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   226
#define	BP_SET_TYPE(bp, x)	BF64_SET((bp)->blk_prop, 48, 8, x)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   227
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   228
#define	BP_GET_LEVEL(bp)	BF64_GET((bp)->blk_prop, 56, 5)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   229
#define	BP_SET_LEVEL(bp, x)	BF64_SET((bp)->blk_prop, 56, 5, x)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   230
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   231
#define	BP_GET_BYTEORDER(bp)	(0 - BF64_GET((bp)->blk_prop, 63, 1))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   232
#define	BP_SET_BYTEORDER(bp, x)	BF64_SET((bp)->blk_prop, 63, 1, x)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   233
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   234
#define	BP_GET_ASIZE(bp)	\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   235
	(DVA_GET_ASIZE(&(bp)->blk_dva[0]) + DVA_GET_ASIZE(&(bp)->blk_dva[1]) + \
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1807
diff changeset
   236
		DVA_GET_ASIZE(&(bp)->blk_dva[2]))
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1807
diff changeset
   237
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1807
diff changeset
   238
#define	BP_GET_UCSIZE(bp) \
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1807
diff changeset
   239
	((BP_GET_LEVEL(bp) > 0 || dmu_ot[BP_GET_TYPE(bp)].ot_metadata) ? \
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1807
diff changeset
   240
	BP_GET_PSIZE(bp) : BP_GET_LSIZE(bp));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   241
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
   242
#define	BP_GET_NDVAS(bp)	\
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
   243
	(!!DVA_GET_ASIZE(&(bp)->blk_dva[0]) + \
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
   244
	!!DVA_GET_ASIZE(&(bp)->blk_dva[1]) + \
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
   245
	!!DVA_GET_ASIZE(&(bp)->blk_dva[2]))
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
   246
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
   247
#define	BP_COUNT_GANG(bp)	\
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
   248
	(DVA_GET_GANG(&(bp)->blk_dva[0]) + \
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
   249
	DVA_GET_GANG(&(bp)->blk_dva[1]) + \
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
   250
	DVA_GET_GANG(&(bp)->blk_dva[2]))
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
   251
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   252
#define	DVA_EQUAL(dva1, dva2)	\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   253
	((dva1)->dva_word[1] == (dva2)->dva_word[1] && \
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   254
	(dva1)->dva_word[0] == (dva2)->dva_word[0])
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   255
3093
71525e4187d5 6490569 verify arc bufs are not modified when they shouldn't be
ahrens
parents: 2926
diff changeset
   256
#define	ZIO_CHECKSUM_EQUAL(zc1, zc2) \
71525e4187d5 6490569 verify arc bufs are not modified when they shouldn't be
ahrens
parents: 2926
diff changeset
   257
	(0 == (((zc1).zc_word[0] - (zc2).zc_word[0]) | \
71525e4187d5 6490569 verify arc bufs are not modified when they shouldn't be
ahrens
parents: 2926
diff changeset
   258
	((zc1).zc_word[1] - (zc2).zc_word[1]) | \
71525e4187d5 6490569 verify arc bufs are not modified when they shouldn't be
ahrens
parents: 2926
diff changeset
   259
	((zc1).zc_word[2] - (zc2).zc_word[2]) | \
71525e4187d5 6490569 verify arc bufs are not modified when they shouldn't be
ahrens
parents: 2926
diff changeset
   260
	((zc1).zc_word[3] - (zc2).zc_word[3])))
71525e4187d5 6490569 verify arc bufs are not modified when they shouldn't be
ahrens
parents: 2926
diff changeset
   261
71525e4187d5 6490569 verify arc bufs are not modified when they shouldn't be
ahrens
parents: 2926
diff changeset
   262
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   263
#define	DVA_IS_VALID(dva)	(DVA_GET_ASIZE(dva) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   264
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   265
#define	ZIO_SET_CHECKSUM(zcp, w0, w1, w2, w3)	\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   266
{						\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   267
	(zcp)->zc_word[0] = w0;			\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   268
	(zcp)->zc_word[1] = w1;			\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   269
	(zcp)->zc_word[2] = w2;			\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   270
	(zcp)->zc_word[3] = w3;			\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   271
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   272
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
   273
#define	BP_IDENTITY(bp)		(&(bp)->blk_dva[0])
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
   274
#define	BP_IS_GANG(bp)		DVA_GET_GANG(BP_IDENTITY(bp))
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   275
#define	BP_IS_HOLE(bp)		((bp)->blk_birth == 0)
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
   276
#define	BP_IS_OLDER(bp, txg)	(!BP_IS_HOLE(bp) && (bp)->blk_birth < (txg))
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   277
5329
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
   278
#define	BP_ZERO_DVAS(bp)			\
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   279
{						\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   280
	(bp)->blk_dva[0].dva_word[0] = 0;	\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   281
	(bp)->blk_dva[0].dva_word[1] = 0;	\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   282
	(bp)->blk_dva[1].dva_word[0] = 0;	\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   283
	(bp)->blk_dva[1].dva_word[1] = 0;	\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   284
	(bp)->blk_dva[2].dva_word[0] = 0;	\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   285
	(bp)->blk_dva[2].dva_word[1] = 0;	\
5329
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
   286
	(bp)->blk_birth = 0;			\
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
   287
}
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
   288
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
   289
#define	BP_ZERO(bp)				\
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
   290
{						\
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
   291
	BP_ZERO_DVAS(bp)			\
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   292
	(bp)->blk_prop = 0;			\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   293
	(bp)->blk_pad[0] = 0;			\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   294
	(bp)->blk_pad[1] = 0;			\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   295
	(bp)->blk_pad[2] = 0;			\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   296
	(bp)->blk_fill = 0;			\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   297
	ZIO_SET_CHECKSUM(&(bp)->blk_cksum, 0, 0, 0, 0);	\
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   298
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   299
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   300
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   301
 * Note: the byteorder is either 0 or -1, both of which are palindromes.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   302
 * This simplifies the endianness handling a bit.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   303
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   304
#ifdef _BIG_ENDIAN
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   305
#define	ZFS_HOST_BYTEORDER	(0ULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   306
#else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   307
#define	ZFS_HOST_BYTEORDER	(-1ULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   308
#endif
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   309
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   310
#define	BP_SHOULD_BYTESWAP(bp)	(BP_GET_BYTEORDER(bp) != ZFS_HOST_BYTEORDER)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   311
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
   312
#define	BP_SPRINTF_LEN	320
896
f5270e6bd04d 6348089 panic in dbuf_remove_ref
maybee
parents: 789
diff changeset
   313
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   314
#include <sys/dmu.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   315
3290
256464cbb73c 4894692 caching data in heap inflates crash dump
johansen
parents: 3093
diff changeset
   316
#define	BP_GET_BUFC_TYPE(bp)						\
256464cbb73c 4894692 caching data in heap inflates crash dump
johansen
parents: 3093
diff changeset
   317
	(((BP_GET_LEVEL(bp) > 0) || (dmu_ot[BP_GET_TYPE(bp)].ot_metadata)) ? \
256464cbb73c 4894692 caching data in heap inflates crash dump
johansen
parents: 3093
diff changeset
   318
	ARC_BUFC_METADATA : ARC_BUFC_DATA);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   319
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   320
 * Routines found in spa.c
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   321
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   322
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   323
/* state manipulation functions */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   324
extern int spa_open(const char *pool, spa_t **, void *tag);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   325
extern int spa_get_stats(const char *pool, nvlist_t **config,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   326
    char *altroot, size_t buflen);
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4715
diff changeset
   327
extern int spa_create(const char *pool, nvlist_t *config, nvlist_t *props,
4715
e8d212dda064 6535695 Panic: shpp->sh_eof == shpp->sh_pool_create_len, file: ../../common/fs/zfs/spa_history.c, line: 235
ek110237
parents: 4620
diff changeset
   328
    const char *history_str);
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5810
diff changeset
   329
extern void spa_check_rootconf(char *devpath, char **the_dev_p,
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5810
diff changeset
   330
    nvlist_t **the_conf_p, uint64_t *the_txg_p);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5810
diff changeset
   331
extern boolean_t spa_rootdev_validate(nvlist_t *nv);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5810
diff changeset
   332
extern int spa_import_rootpool(char *devpath);
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4715
diff changeset
   333
extern int spa_import(const char *pool, nvlist_t *config, nvlist_t *props);
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6423
diff changeset
   334
extern int spa_import_faulted(const char *, nvlist_t *, nvlist_t *);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   335
extern nvlist_t *spa_tryimport(nvlist_t *tryconfig);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   336
extern int spa_destroy(char *pool);
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
   337
extern int spa_export(char *pool, nvlist_t **oldconfig);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   338
extern int spa_reset(char *pool);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   339
extern void spa_async_request(spa_t *spa, int flag);
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6987
diff changeset
   340
extern void spa_async_unrequest(spa_t *spa, int flag);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   341
extern void spa_async_suspend(spa_t *spa);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   342
extern void spa_async_resume(spa_t *spa);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   343
extern spa_t *spa_inject_addref(char *pool);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   344
extern void spa_inject_delref(spa_t *spa);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   345
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3912
diff changeset
   346
#define	SPA_ASYNC_REMOVE	0x01
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3912
diff changeset
   347
#define	SPA_ASYNC_RESILVER_DONE	0x02
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   348
#define	SPA_ASYNC_RESILVER	0x08
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1544
diff changeset
   349
#define	SPA_ASYNC_CONFIG_UPDATE	0x10
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   350
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   351
/* device manipulation */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   352
extern int spa_vdev_add(spa_t *spa, nvlist_t *nvroot);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   353
extern int spa_vdev_attach(spa_t *spa, uint64_t guid, nvlist_t *nvroot,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   354
    int replacing);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   355
extern int spa_vdev_detach(spa_t *spa, uint64_t guid, int replace_done);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1807
diff changeset
   356
extern int spa_vdev_remove(spa_t *spa, uint64_t guid, boolean_t unspare);
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 896
diff changeset
   357
extern int spa_vdev_setpath(spa_t *spa, uint64_t guid, const char *newpath);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   358
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1807
diff changeset
   359
/* spare state (which is global across all pools) */
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
   360
extern void spa_spare_add(vdev_t *vd);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
   361
extern void spa_spare_remove(vdev_t *vd);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
   362
extern boolean_t spa_spare_exists(uint64_t guid, uint64_t *pool);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3290
diff changeset
   363
extern void spa_spare_activate(vdev_t *vd);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1807
diff changeset
   364
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
   365
/* L2ARC state (which is global across all pools) */
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
   366
extern void spa_l2cache_add(vdev_t *vd);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
   367
extern void spa_l2cache_remove(vdev_t *vd);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
   368
extern boolean_t spa_l2cache_exists(uint64_t guid, uint64_t *pool);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
   369
extern void spa_l2cache_activate(vdev_t *vd);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
   370
extern void spa_l2cache_drop(spa_t *spa);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
   371
extern void spa_l2cache_space_update(vdev_t *vd, int64_t space, int64_t alloc);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5363
diff changeset
   372
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   373
/* scrubbing */
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6987
diff changeset
   374
extern int spa_scrub(spa_t *spa, pool_scrub_type_t type);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   375
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   376
/* spa syncing */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   377
extern void spa_sync(spa_t *spa, uint64_t txg); /* only for DMU use */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   378
extern void spa_sync_allpools(void);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   379
6987
877c018eb06c 6628282 arc_stats.arcstat_l2_writes_sent.value.ui64) == (arc_stats.arcstat_l2_writes_done.value.ui64)
brendan
parents: 6673
diff changeset
   380
/* spa namespace global mutex */
877c018eb06c 6628282 arc_stats.arcstat_l2_writes_sent.value.ui64) == (arc_stats.arcstat_l2_writes_done.value.ui64)
brendan
parents: 6673
diff changeset
   381
extern kmutex_t spa_namespace_lock;
877c018eb06c 6628282 arc_stats.arcstat_l2_writes_sent.value.ui64) == (arc_stats.arcstat_l2_writes_done.value.ui64)
brendan
parents: 6673
diff changeset
   382
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   383
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   384
 * SPA configuration functions in spa_config.c
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   385
 */
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1544
diff changeset
   386
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1544
diff changeset
   387
#define	SPA_CONFIG_UPDATE_POOL	0
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1544
diff changeset
   388
#define	SPA_CONFIG_UPDATE_VDEVS	1
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1544
diff changeset
   389
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6423
diff changeset
   390
extern void spa_config_sync(spa_t *, boolean_t, boolean_t);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   391
extern void spa_config_load(void);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   392
extern nvlist_t *spa_all_configs(uint64_t *);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   393
extern void spa_config_set(spa_t *spa, nvlist_t *config);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   394
extern nvlist_t *spa_config_generate(spa_t *spa, vdev_t *vd, uint64_t txg,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   395
    int getstats);
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1544
diff changeset
   396
extern void spa_config_update(spa_t *spa, int what);
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5810
diff changeset
   397
extern void spa_config_update_common(spa_t *spa, int what, boolean_t isroot);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   398
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   399
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   400
 * Miscellaneous SPA routines in spa_misc.c
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   401
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   402
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   403
/* Namespace manipulation */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   404
extern spa_t *spa_lookup(const char *name);
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1544
diff changeset
   405
extern spa_t *spa_add(const char *name, const char *altroot);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   406
extern void spa_remove(spa_t *spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   407
extern spa_t *spa_next(spa_t *prev);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   408
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   409
/* Refcount functions */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   410
extern void spa_open_ref(spa_t *spa, void *tag);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   411
extern void spa_close(spa_t *spa, void *tag);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   412
extern boolean_t spa_refcount_zero(spa_t *spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   413
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   414
/* Pool configuration lock */
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   415
extern void spa_config_enter(spa_t *spa, krw_t rw, void *tag);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   416
extern void spa_config_exit(spa_t *spa, void *tag);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   417
extern boolean_t spa_config_held(spa_t *spa, krw_t rw);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   418
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   419
/* Pool vdev add/remove lock */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   420
extern uint64_t spa_vdev_enter(spa_t *spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   421
extern int spa_vdev_exit(spa_t *spa, vdev_t *vd, uint64_t txg, int error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   422
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   423
/* Accessor functions */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   424
extern krwlock_t *spa_traverse_rwlock(spa_t *spa);
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6987
diff changeset
   425
extern boolean_t spa_traverse_wanted(spa_t *spa);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   426
extern struct dsl_pool *spa_get_dsl(spa_t *spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   427
extern blkptr_t *spa_get_rootblkptr(spa_t *spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   428
extern void spa_set_rootblkptr(spa_t *spa, const blkptr_t *bp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   429
extern void spa_altroot(spa_t *, char *, size_t);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   430
extern int spa_sync_pass(spa_t *spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   431
extern char *spa_name(spa_t *spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   432
extern uint64_t spa_guid(spa_t *spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   433
extern uint64_t spa_last_synced_txg(spa_t *spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   434
extern uint64_t spa_first_txg(spa_t *spa);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1807
diff changeset
   435
extern uint64_t spa_version(spa_t *spa);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   436
extern int spa_state(spa_t *spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   437
extern uint64_t spa_freeze_txg(spa_t *spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   438
extern uint64_t spa_get_alloc(spa_t *spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   439
extern uint64_t spa_get_space(spa_t *spa);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1807
diff changeset
   440
extern uint64_t spa_get_dspace(spa_t *spa);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   441
extern uint64_t spa_get_asize(spa_t *spa, uint64_t lsize);
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
   442
extern uint64_t spa_version(spa_t *spa);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
   443
extern int spa_max_replication(spa_t *spa);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   444
extern int spa_busy(void);
5329
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
   445
extern uint8_t spa_get_failmode(spa_t *spa);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   446
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   447
/* Miscellaneous support routines */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   448
extern int spa_rename(const char *oldname, const char *newname);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   449
extern boolean_t spa_guid_exists(uint64_t pool_guid, uint64_t device_guid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   450
extern char *spa_strdup(const char *);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   451
extern void spa_strfree(char *);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   452
extern uint64_t spa_get_random(uint64_t range);
1807
35c8b566d7af 6410711 intent log blocks don't get invited to pool parties
bonwick
parents: 1775
diff changeset
   453
extern void sprintf_blkptr(char *buf, int len, const blkptr_t *bp);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   454
extern void spa_freeze(spa_t *spa);
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4715
diff changeset
   455
extern void spa_upgrade(spa_t *spa, uint64_t version);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   456
extern void spa_evict_all(void);
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6423
diff changeset
   457
extern vdev_t *spa_lookup_by_guid(spa_t *spa, uint64_t guid,
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6423
diff changeset
   458
    boolean_t l2cache);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1807
diff changeset
   459
extern boolean_t spa_has_spare(spa_t *, uint64_t guid);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1807
diff changeset
   460
extern uint64_t bp_get_dasize(spa_t *spa, const blkptr_t *bp);
4620
4895df7f426f 6574298 slog still uses main pool for dmu_sync()
perrin
parents: 4543
diff changeset
   461
extern boolean_t spa_has_slogs(spa_t *spa);
6673
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6643
diff changeset
   462
extern boolean_t spa_is_root(spa_t *spa);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   463
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
   464
/* history logging */
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
   465
typedef enum history_log_type {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
   466
	LOG_CMD_POOL_CREATE,
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
   467
	LOG_CMD_NORMAL,
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
   468
	LOG_INTERNAL
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
   469
} history_log_type_t;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
   470
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
   471
typedef struct history_arg {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
   472
	const char *ha_history_str;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
   473
	history_log_type_t ha_log_type;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
   474
	history_internal_events_t ha_event;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
   475
	char ha_zone[MAXPATHLEN];
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
   476
} history_arg_t;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
   477
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
   478
extern char *spa_his_ievent_table[];
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
   479
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
   480
extern void spa_history_create_obj(spa_t *spa, dmu_tx_t *tx);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
   481
extern int spa_history_get(spa_t *spa, uint64_t *offset, uint64_t *len_read,
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
   482
    char *his_buf);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
   483
extern int spa_history_log(spa_t *spa, const char *his_buf,
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
   484
    history_log_type_t what);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
   485
void spa_history_internal_log(history_internal_events_t event, spa_t *spa,
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4527
diff changeset
   486
    dmu_tx_t *tx, cred_t *cr, const char *fmt, ...);
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2856
diff changeset
   487
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   488
/* error handling */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   489
struct zbookmark;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   490
struct zio;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   491
extern void spa_log_error(spa_t *spa, struct zio *zio);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   492
extern void zfs_ereport_post(const char *class, spa_t *spa, vdev_t *vd,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   493
    struct zio *zio, uint64_t stateoroffset, uint64_t length);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3912
diff changeset
   494
extern void zfs_post_remove(spa_t *spa, vdev_t *vd);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3912
diff changeset
   495
extern void zfs_post_autoreplace(spa_t *spa, vdev_t *vd);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   496
extern uint64_t spa_get_errlog_size(spa_t *spa);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   497
extern int spa_get_errlog(spa_t *spa, void *uaddr, size_t *count);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   498
extern void spa_errlog_rotate(spa_t *spa);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   499
extern void spa_errlog_drain(spa_t *spa);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   500
extern void spa_errlog_sync(spa_t *spa, uint64_t txg);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1354
diff changeset
   501
extern void spa_get_errlists(spa_t *spa, avl_tree_t *last, avl_tree_t *scrub);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   502
5810
9253e5eac38c 6649150 add kstats to the vdev cache
ek110237
parents: 5450
diff changeset
   503
/* vdev cache */
9253e5eac38c 6649150 add kstats to the vdev cache
ek110237
parents: 5450
diff changeset
   504
extern void vdev_cache_stat_init(void);
9253e5eac38c 6649150 add kstats to the vdev cache
ek110237
parents: 5450
diff changeset
   505
extern void vdev_cache_stat_fini(void);
9253e5eac38c 6649150 add kstats to the vdev cache
ek110237
parents: 5450
diff changeset
   506
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   507
/* Initialization and termination */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   508
extern void spa_init(int flags);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   509
extern void spa_fini(void);
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5810
diff changeset
   510
extern void spa_boot_init();
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   511
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3700
diff changeset
   512
/* properties */
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4715
diff changeset
   513
extern int spa_prop_set(spa_t *spa, nvlist_t *nvp);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4715
diff changeset
   514
extern int spa_prop_get(spa_t *spa, nvlist_t **nvp);
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4715
diff changeset
   515
extern void spa_prop_clear_bootfs(spa_t *spa, uint64_t obj, dmu_tx_t *tx);
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3700
diff changeset
   516
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3912
diff changeset
   517
/* asynchronous event notification */
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3912
diff changeset
   518
extern void spa_event_notify(spa_t *spa, vdev_t *vdev, const char *name);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3912
diff changeset
   519
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   520
#ifdef ZFS_DEBUG
3700
3a7e0afcf1b4 6523936 BAD TRAP: type=8 (#df Double fault) rp=fec266f8 addr=0
ek110237
parents: 3697
diff changeset
   521
#define	dprintf_bp(bp, fmt, ...) do {				\
3a7e0afcf1b4 6523936 BAD TRAP: type=8 (#df Double fault) rp=fec266f8 addr=0
ek110237
parents: 3697
diff changeset
   522
	if (zfs_flags & ZFS_DEBUG_DPRINTF) { 			\
3a7e0afcf1b4 6523936 BAD TRAP: type=8 (#df Double fault) rp=fec266f8 addr=0
ek110237
parents: 3697
diff changeset
   523
	char *__blkbuf = kmem_alloc(BP_SPRINTF_LEN, KM_SLEEP);	\
3a7e0afcf1b4 6523936 BAD TRAP: type=8 (#df Double fault) rp=fec266f8 addr=0
ek110237
parents: 3697
diff changeset
   524
	sprintf_blkptr(__blkbuf, BP_SPRINTF_LEN, (bp));		\
3a7e0afcf1b4 6523936 BAD TRAP: type=8 (#df Double fault) rp=fec266f8 addr=0
ek110237
parents: 3697
diff changeset
   525
	dprintf(fmt " %s\n", __VA_ARGS__, __blkbuf);		\
3a7e0afcf1b4 6523936 BAD TRAP: type=8 (#df Double fault) rp=fec266f8 addr=0
ek110237
parents: 3697
diff changeset
   526
	kmem_free(__blkbuf, BP_SPRINTF_LEN);			\
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   527
	} \
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   528
_NOTE(CONSTCOND) } while (0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   529
#else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   530
#define	dprintf_bp(bp, fmt, ...)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   531
#endif
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   532
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   533
extern int spa_mode;			/* mode, e.g. FREAD | FWRITE */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   534
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   535
#ifdef	__cplusplus
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   536
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   537
#endif
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   538
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   539
#endif	/* _SYS_SPA_H */