]>
Commit | Line | Data |
---|---|---|
34dc7c2f BB |
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 */ |