]> git.proxmox.com Git - mirror_zfs-debian.git/blob - zfs/lib/libzcommon/include/sys/spa_impl.h
Remove stray stub kernel files which should be brought in my linux-kernel-module...
[mirror_zfs-debian.git] / zfs / lib / libzcommon / include / sys / spa_impl.h
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
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
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]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 */
25
26 #ifndef _SYS_SPA_IMPL_H
27 #define _SYS_SPA_IMPL_H
28
29 #pragma ident "@(#)spa_impl.h 1.17 07/11/27 SMI"
30
31 #include <sys/spa.h>
32 #include <sys/vdev.h>
33 #include <sys/metaslab.h>
34 #include <sys/dmu.h>
35 #include <sys/dsl_pool.h>
36 #include <sys/uberblock_impl.h>
37 #include <sys/zfs_context.h>
38 #include <sys/avl.h>
39 #include <sys/refcount.h>
40 #include <sys/bplist.h>
41
42 #ifdef __cplusplus
43 extern "C" {
44 #endif
45
46 typedef struct spa_error_entry {
47 zbookmark_t se_bookmark;
48 char *se_name;
49 avl_node_t se_avl;
50 } spa_error_entry_t;
51
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 */
58 } spa_history_phys_t;
59
60 struct spa_aux_vdev {
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 */
68 };
69
70 typedef struct spa_config_lock {
71 kmutex_t scl_lock;
72 kthread_t *scl_writer;
73 uint16_t scl_write_wanted;
74 kcondvar_t scl_cv;
75 refcount_t scl_count;
76 } spa_config_lock_t;
77
78 struct spa {
79 /*
80 * Fields protected by spa_namespace_lock.
81 */
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 */
161 /*
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.
166 */
167 spa_config_lock_t spa_config_lock; /* configuration changes */
168 refcount_t spa_refcount; /* number of opens */
169 };
170
171 extern const char *spa_config_dir;
172 extern kmutex_t spa_namespace_lock;
173
174 #ifdef __cplusplus
175 }
176 #endif
177
178 #endif /* _SYS_SPA_IMPL_H */