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.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 #ifndef _SYS_SPA_IMPL_H
27 #define _SYS_SPA_IMPL_H
29 #pragma ident "@(#)spa_impl.h 1.17 07/11/27 SMI"
33 #include <sys/metaslab.h>
35 #include <sys/dsl_pool.h>
36 #include <sys/uberblock_impl.h>
37 #include <sys/zfs_context.h>
39 #include <sys/refcount.h>
40 #include <sys/bplist.h>
46 typedef struct spa_error_entry
{
47 zbookmark_t se_bookmark
;
52 typedef struct spa_history_phys
{
53 uint64_t sh_pool_create_len
; /* ending offset of zpool create */
54 uint64_t sh_phys_max_off
; /* physical EOF */
55 uint64_t sh_bof
; /* logical BOF */
56 uint64_t sh_eof
; /* logical EOF */
57 uint64_t sh_records_lost
; /* num of records overwritten */
61 uint64_t sav_object
; /* MOS object for device list */
62 nvlist_t
*sav_config
; /* cached device config */
63 vdev_t
**sav_vdevs
; /* devices */
64 int sav_count
; /* number devices */
65 boolean_t sav_sync
; /* sync the device list */
66 nvlist_t
**sav_pending
; /* pending device additions */
67 uint_t sav_npending
; /* # pending devices */
70 typedef struct spa_config_lock
{
72 kthread_t
*scl_writer
;
73 uint16_t scl_write_wanted
;
80 * Fields protected by spa_namespace_lock.
82 char *spa_name
; /* pool name */
83 avl_node_t spa_avl
; /* node in spa_namespace_avl */
84 nvlist_t
*spa_config
; /* last synced config */
85 nvlist_t
*spa_config_syncing
; /* currently syncing config */
86 uint64_t spa_config_txg
; /* txg of last config change */
87 kmutex_t spa_config_cache_lock
; /* for spa_config RW_READER */
88 int spa_sync_pass
; /* iterate-to-convergence */
89 int spa_state
; /* pool state */
90 int spa_inject_ref
; /* injection references */
91 uint8_t spa_traverse_wanted
; /* traverse lock wanted */
92 uint8_t spa_sync_on
; /* sync threads are running */
93 spa_load_state_t spa_load_state
; /* current load operation */
94 taskq_t
*spa_zio_issue_taskq
[ZIO_TYPES
];
95 taskq_t
*spa_zio_intr_taskq
[ZIO_TYPES
];
96 dsl_pool_t
*spa_dsl_pool
;
97 metaslab_class_t
*spa_normal_class
; /* normal data class */
98 metaslab_class_t
*spa_log_class
; /* intent log data class */
99 uint64_t spa_first_txg
; /* first txg after spa_open() */
100 uint64_t spa_final_txg
; /* txg of export/destroy */
101 uint64_t spa_freeze_txg
; /* freeze pool at this txg */
102 objset_t
*spa_meta_objset
; /* copy of dp->dp_meta_objset */
103 txg_list_t spa_vdev_txg_list
; /* per-txg dirty vdev list */
104 vdev_t
*spa_root_vdev
; /* top-level vdev container */
105 uint64_t spa_load_guid
; /* initial guid for spa_load */
106 list_t spa_dirty_list
; /* vdevs with dirty labels */
107 spa_aux_vdev_t spa_spares
; /* hot spares */
108 spa_aux_vdev_t spa_l2cache
; /* L2ARC cache devices */
109 uint64_t spa_config_object
; /* MOS object for pool config */
110 uint64_t spa_syncing_txg
; /* txg currently syncing */
111 uint64_t spa_sync_bplist_obj
; /* object for deferred frees */
112 bplist_t spa_sync_bplist
; /* deferred-free bplist */
113 krwlock_t spa_traverse_lock
; /* traverse vs. spa_sync() */
114 uberblock_t spa_ubsync
; /* last synced uberblock */
115 uberblock_t spa_uberblock
; /* current uberblock */
116 kmutex_t spa_scrub_lock
; /* resilver/scrub lock */
117 kthread_t
*spa_scrub_thread
; /* scrub/resilver thread */
118 traverse_handle_t
*spa_scrub_th
; /* scrub traverse handle */
119 uint64_t spa_scrub_restart_txg
; /* need to restart */
120 uint64_t spa_scrub_mintxg
; /* min txg we'll scrub */
121 uint64_t spa_scrub_maxtxg
; /* max txg we'll scrub */
122 uint64_t spa_scrub_inflight
; /* in-flight scrub I/Os */
123 uint64_t spa_scrub_maxinflight
; /* max in-flight scrub I/Os */
124 uint64_t spa_scrub_errors
; /* scrub I/O error count */
125 int spa_scrub_suspended
; /* tell scrubber to suspend */
126 kcondvar_t spa_scrub_cv
; /* scrub thread state change */
127 kcondvar_t spa_scrub_io_cv
; /* scrub I/O completion */
128 uint8_t spa_scrub_stop
; /* tell scrubber to stop */
129 uint8_t spa_scrub_active
; /* active or suspended? */
130 uint8_t spa_scrub_type
; /* type of scrub we're doing */
131 uint8_t spa_scrub_finished
; /* indicator to rotate logs */
132 kmutex_t spa_async_lock
; /* protect async state */
133 kthread_t
*spa_async_thread
; /* thread doing async task */
134 int spa_async_suspended
; /* async tasks suspended */
135 kcondvar_t spa_async_cv
; /* wait for thread_exit() */
136 uint16_t spa_async_tasks
; /* async task mask */
137 char *spa_root
; /* alternate root directory */
138 kmutex_t spa_uberblock_lock
; /* vdev_uberblock_load_done() */
139 uint64_t spa_ena
; /* spa-wide ereport ENA */
140 boolean_t spa_last_open_failed
; /* true if last open faled */
141 kmutex_t spa_errlog_lock
; /* error log lock */
142 uint64_t spa_errlog_last
; /* last error log object */
143 uint64_t spa_errlog_scrub
; /* scrub error log object */
144 kmutex_t spa_errlist_lock
; /* error list/ereport lock */
145 avl_tree_t spa_errlist_last
; /* last error list */
146 avl_tree_t spa_errlist_scrub
; /* scrub error list */
147 uint64_t spa_deflate
; /* should we deflate? */
148 uint64_t spa_history
; /* history object */
149 kmutex_t spa_history_lock
; /* history lock */
150 vdev_t
*spa_pending_vdev
; /* pending vdev additions */
151 kmutex_t spa_props_lock
; /* property lock */
152 uint64_t spa_pool_props_object
; /* object for properties */
153 uint64_t spa_bootfs
; /* default boot filesystem */
154 boolean_t spa_delegation
; /* delegation on/off */
155 char *spa_config_dir
; /* cache file directory */
156 char *spa_config_file
; /* cache file name */
157 list_t spa_zio_list
; /* zio error list */
158 kcondvar_t spa_zio_cv
; /* resume I/O pipeline */
159 kmutex_t spa_zio_lock
; /* zio error lock */
160 uint8_t spa_failmode
; /* failure mode for the pool */
162 * spa_refcnt & spa_config_lock must be the last elements
163 * because refcount_t changes size based on compilation options.
164 * In order for the MDB module to function correctly, the other
165 * fields must remain in the same location.
167 spa_config_lock_t spa_config_lock
; /* configuration changes */
168 refcount_t spa_refcount
; /* number of opens */
171 extern const char *spa_config_dir
;
172 extern kmutex_t spa_namespace_lock
;
178 #endif /* _SYS_SPA_IMPL_H */