1*22ce4affSfengbojiang /*
2*22ce4affSfengbojiang  * CDDL HEADER START
3*22ce4affSfengbojiang  *
4*22ce4affSfengbojiang  * The contents of this file are subject to the terms of the
5*22ce4affSfengbojiang  * Common Development and Distribution License (the "License").
6*22ce4affSfengbojiang  * You may not use this file except in compliance with the License.
7*22ce4affSfengbojiang  *
8*22ce4affSfengbojiang  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*22ce4affSfengbojiang  * or http://www.opensolaris.org/os/licensing.
10*22ce4affSfengbojiang  * See the License for the specific language governing permissions
11*22ce4affSfengbojiang  * and limitations under the License.
12*22ce4affSfengbojiang  *
13*22ce4affSfengbojiang  * When distributing Covered Code, include this CDDL HEADER in each
14*22ce4affSfengbojiang  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*22ce4affSfengbojiang  * If applicable, add the following below this CDDL HEADER, with the
16*22ce4affSfengbojiang  * fields enclosed by brackets "[]" replaced with your own identifying
17*22ce4affSfengbojiang  * information: Portions Copyright [yyyy] [name of copyright owner]
18*22ce4affSfengbojiang  *
19*22ce4affSfengbojiang  * CDDL HEADER END
20*22ce4affSfengbojiang  */
21*22ce4affSfengbojiang /*
22*22ce4affSfengbojiang  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
23*22ce4affSfengbojiang  * Copyright (c) 2011, 2020 by Delphix. All rights reserved.
24*22ce4affSfengbojiang  * Copyright (c) 2017, Intel Corporation.
25*22ce4affSfengbojiang  */
26*22ce4affSfengbojiang 
27*22ce4affSfengbojiang #ifndef _SYS_VDEV_IMPL_H
28*22ce4affSfengbojiang #define	_SYS_VDEV_IMPL_H
29*22ce4affSfengbojiang 
30*22ce4affSfengbojiang #include <sys/avl.h>
31*22ce4affSfengbojiang #include <sys/bpobj.h>
32*22ce4affSfengbojiang #include <sys/dmu.h>
33*22ce4affSfengbojiang #include <sys/metaslab.h>
34*22ce4affSfengbojiang #include <sys/nvpair.h>
35*22ce4affSfengbojiang #include <sys/space_map.h>
36*22ce4affSfengbojiang #include <sys/vdev.h>
37*22ce4affSfengbojiang #include <sys/dkio.h>
38*22ce4affSfengbojiang #include <sys/uberblock_impl.h>
39*22ce4affSfengbojiang #include <sys/vdev_indirect_mapping.h>
40*22ce4affSfengbojiang #include <sys/vdev_indirect_births.h>
41*22ce4affSfengbojiang #include <sys/vdev_rebuild.h>
42*22ce4affSfengbojiang #include <sys/vdev_removal.h>
43*22ce4affSfengbojiang #include <sys/zfs_ratelimit.h>
44*22ce4affSfengbojiang 
45*22ce4affSfengbojiang #ifdef	__cplusplus
46*22ce4affSfengbojiang extern "C" {
47*22ce4affSfengbojiang #endif
48*22ce4affSfengbojiang 
49*22ce4affSfengbojiang /*
50*22ce4affSfengbojiang  * Virtual device descriptors.
51*22ce4affSfengbojiang  *
52*22ce4affSfengbojiang  * All storage pool operations go through the virtual device framework,
53*22ce4affSfengbojiang  * which provides data replication and I/O scheduling.
54*22ce4affSfengbojiang  */
55*22ce4affSfengbojiang 
56*22ce4affSfengbojiang /*
57*22ce4affSfengbojiang  * Forward declarations that lots of things need.
58*22ce4affSfengbojiang  */
59*22ce4affSfengbojiang typedef struct vdev_queue vdev_queue_t;
60*22ce4affSfengbojiang typedef struct vdev_cache vdev_cache_t;
61*22ce4affSfengbojiang typedef struct vdev_cache_entry vdev_cache_entry_t;
62*22ce4affSfengbojiang struct abd;
63*22ce4affSfengbojiang 
64*22ce4affSfengbojiang extern int zfs_vdev_queue_depth_pct;
65*22ce4affSfengbojiang extern int zfs_vdev_def_queue_depth;
66*22ce4affSfengbojiang extern uint32_t zfs_vdev_async_write_max_active;
67*22ce4affSfengbojiang 
68*22ce4affSfengbojiang /*
69*22ce4affSfengbojiang  * Virtual device operations
70*22ce4affSfengbojiang  */
71*22ce4affSfengbojiang typedef int	vdev_init_func_t(spa_t *spa, nvlist_t *nv, void **tsd);
72*22ce4affSfengbojiang typedef void	vdev_fini_func_t(vdev_t *vd);
73*22ce4affSfengbojiang typedef int	vdev_open_func_t(vdev_t *vd, uint64_t *size, uint64_t *max_size,
74*22ce4affSfengbojiang     uint64_t *ashift, uint64_t *pshift);
75*22ce4affSfengbojiang typedef void	vdev_close_func_t(vdev_t *vd);
76*22ce4affSfengbojiang typedef uint64_t vdev_asize_func_t(vdev_t *vd, uint64_t psize);
77*22ce4affSfengbojiang typedef uint64_t vdev_min_asize_func_t(vdev_t *vd);
78*22ce4affSfengbojiang typedef uint64_t vdev_min_alloc_func_t(vdev_t *vd);
79*22ce4affSfengbojiang typedef void	vdev_io_start_func_t(zio_t *zio);
80*22ce4affSfengbojiang typedef void	vdev_io_done_func_t(zio_t *zio);
81*22ce4affSfengbojiang typedef void	vdev_state_change_func_t(vdev_t *vd, int, int);
82*22ce4affSfengbojiang typedef boolean_t vdev_need_resilver_func_t(vdev_t *vd, const dva_t *dva,
83*22ce4affSfengbojiang     size_t psize, uint64_t phys_birth);
84*22ce4affSfengbojiang typedef void	vdev_hold_func_t(vdev_t *vd);
85*22ce4affSfengbojiang typedef void	vdev_rele_func_t(vdev_t *vd);
86*22ce4affSfengbojiang 
87*22ce4affSfengbojiang typedef void	vdev_remap_cb_t(uint64_t inner_offset, vdev_t *vd,
88*22ce4affSfengbojiang     uint64_t offset, uint64_t size, void *arg);
89*22ce4affSfengbojiang typedef void	vdev_remap_func_t(vdev_t *vd, uint64_t offset, uint64_t size,
90*22ce4affSfengbojiang     vdev_remap_cb_t callback, void *arg);
91*22ce4affSfengbojiang /*
92*22ce4affSfengbojiang  * Given a target vdev, translates the logical range "in" to the physical
93*22ce4affSfengbojiang  * range "res"
94*22ce4affSfengbojiang  */
95*22ce4affSfengbojiang typedef void vdev_xlation_func_t(vdev_t *cvd, const range_seg64_t *logical,
96*22ce4affSfengbojiang     range_seg64_t *physical, range_seg64_t *remain);
97*22ce4affSfengbojiang typedef uint64_t vdev_rebuild_asize_func_t(vdev_t *vd, uint64_t start,
98*22ce4affSfengbojiang     uint64_t size, uint64_t max_segment);
99*22ce4affSfengbojiang typedef void vdev_metaslab_init_func_t(vdev_t *vd, uint64_t *startp,
100*22ce4affSfengbojiang     uint64_t *sizep);
101*22ce4affSfengbojiang typedef void vdev_config_generate_func_t(vdev_t *vd, nvlist_t *nv);
102*22ce4affSfengbojiang typedef uint64_t vdev_nparity_func_t(vdev_t *vd);
103*22ce4affSfengbojiang typedef uint64_t vdev_ndisks_func_t(vdev_t *vd);
104*22ce4affSfengbojiang 
105*22ce4affSfengbojiang typedef const struct vdev_ops {
106*22ce4affSfengbojiang 	vdev_init_func_t		*vdev_op_init;
107*22ce4affSfengbojiang 	vdev_fini_func_t		*vdev_op_fini;
108*22ce4affSfengbojiang 	vdev_open_func_t		*vdev_op_open;
109*22ce4affSfengbojiang 	vdev_close_func_t		*vdev_op_close;
110*22ce4affSfengbojiang 	vdev_asize_func_t		*vdev_op_asize;
111*22ce4affSfengbojiang 	vdev_min_asize_func_t		*vdev_op_min_asize;
112*22ce4affSfengbojiang 	vdev_min_alloc_func_t		*vdev_op_min_alloc;
113*22ce4affSfengbojiang 	vdev_io_start_func_t		*vdev_op_io_start;
114*22ce4affSfengbojiang 	vdev_io_done_func_t		*vdev_op_io_done;
115*22ce4affSfengbojiang 	vdev_state_change_func_t	*vdev_op_state_change;
116*22ce4affSfengbojiang 	vdev_need_resilver_func_t	*vdev_op_need_resilver;
117*22ce4affSfengbojiang 	vdev_hold_func_t		*vdev_op_hold;
118*22ce4affSfengbojiang 	vdev_rele_func_t		*vdev_op_rele;
119*22ce4affSfengbojiang 	vdev_remap_func_t		*vdev_op_remap;
120*22ce4affSfengbojiang 	vdev_xlation_func_t		*vdev_op_xlate;
121*22ce4affSfengbojiang 	vdev_rebuild_asize_func_t	*vdev_op_rebuild_asize;
122*22ce4affSfengbojiang 	vdev_metaslab_init_func_t	*vdev_op_metaslab_init;
123*22ce4affSfengbojiang 	vdev_config_generate_func_t	*vdev_op_config_generate;
124*22ce4affSfengbojiang 	vdev_nparity_func_t		*vdev_op_nparity;
125*22ce4affSfengbojiang 	vdev_ndisks_func_t		*vdev_op_ndisks;
126*22ce4affSfengbojiang 	char				vdev_op_type[16];
127*22ce4affSfengbojiang 	boolean_t			vdev_op_leaf;
128*22ce4affSfengbojiang } vdev_ops_t;
129*22ce4affSfengbojiang 
130*22ce4affSfengbojiang /*
131*22ce4affSfengbojiang  * Virtual device properties
132*22ce4affSfengbojiang  */
133*22ce4affSfengbojiang struct vdev_cache_entry {
134*22ce4affSfengbojiang 	struct abd	*ve_abd;
135*22ce4affSfengbojiang 	uint64_t	ve_offset;
136*22ce4affSfengbojiang 	clock_t		ve_lastused;
137*22ce4affSfengbojiang 	avl_node_t	ve_offset_node;
138*22ce4affSfengbojiang 	avl_node_t	ve_lastused_node;
139*22ce4affSfengbojiang 	uint32_t	ve_hits;
140*22ce4affSfengbojiang 	uint16_t	ve_missed_update;
141*22ce4affSfengbojiang 	zio_t		*ve_fill_io;
142*22ce4affSfengbojiang };
143*22ce4affSfengbojiang 
144*22ce4affSfengbojiang struct vdev_cache {
145*22ce4affSfengbojiang 	avl_tree_t	vc_offset_tree;
146*22ce4affSfengbojiang 	avl_tree_t	vc_lastused_tree;
147*22ce4affSfengbojiang 	kmutex_t	vc_lock;
148*22ce4affSfengbojiang };
149*22ce4affSfengbojiang 
150*22ce4affSfengbojiang typedef struct vdev_queue_class {
151*22ce4affSfengbojiang 	uint32_t	vqc_active;
152*22ce4affSfengbojiang 
153*22ce4affSfengbojiang 	/*
154*22ce4affSfengbojiang 	 * Sorted by offset or timestamp, depending on if the queue is
155*22ce4affSfengbojiang 	 * LBA-ordered vs FIFO.
156*22ce4affSfengbojiang 	 */
157*22ce4affSfengbojiang 	avl_tree_t	vqc_queued_tree;
158*22ce4affSfengbojiang } vdev_queue_class_t;
159*22ce4affSfengbojiang 
160*22ce4affSfengbojiang struct vdev_queue {
161*22ce4affSfengbojiang 	vdev_t		*vq_vdev;
162*22ce4affSfengbojiang 	vdev_queue_class_t vq_class[ZIO_PRIORITY_NUM_QUEUEABLE];
163*22ce4affSfengbojiang 	avl_tree_t	vq_active_tree;
164*22ce4affSfengbojiang 	avl_tree_t	vq_read_offset_tree;
165*22ce4affSfengbojiang 	avl_tree_t	vq_write_offset_tree;
166*22ce4affSfengbojiang 	avl_tree_t	vq_trim_offset_tree;
167*22ce4affSfengbojiang 	uint64_t	vq_last_offset;
168*22ce4affSfengbojiang 	zio_priority_t	vq_last_prio;	/* Last sent I/O priority. */
169*22ce4affSfengbojiang 	uint32_t	vq_ia_active;	/* Active interactive I/Os. */
170*22ce4affSfengbojiang 	uint32_t	vq_nia_credit;	/* Non-interactive I/Os credit. */
171*22ce4affSfengbojiang 	hrtime_t	vq_io_complete_ts; /* time last i/o completed */
172*22ce4affSfengbojiang 	hrtime_t	vq_io_delta_ts;
173*22ce4affSfengbojiang 	zio_t		vq_io_search; /* used as local for stack reduction */
174*22ce4affSfengbojiang 	kmutex_t	vq_lock;
175*22ce4affSfengbojiang };
176*22ce4affSfengbojiang 
177*22ce4affSfengbojiang typedef enum vdev_alloc_bias {
178*22ce4affSfengbojiang 	VDEV_BIAS_NONE,
179*22ce4affSfengbojiang 	VDEV_BIAS_LOG,		/* dedicated to ZIL data (SLOG) */
180*22ce4affSfengbojiang 	VDEV_BIAS_SPECIAL,	/* dedicated to ddt, metadata, and small blks */
181*22ce4affSfengbojiang 	VDEV_BIAS_DEDUP		/* dedicated to dedup metadata */
182*22ce4affSfengbojiang } vdev_alloc_bias_t;
183*22ce4affSfengbojiang 
184*22ce4affSfengbojiang 
185*22ce4affSfengbojiang /*
186*22ce4affSfengbojiang  * On-disk indirect vdev state.
187*22ce4affSfengbojiang  *
188*22ce4affSfengbojiang  * An indirect vdev is described exclusively in the MOS config of a pool.
189*22ce4affSfengbojiang  * The config for an indirect vdev includes several fields, which are
190*22ce4affSfengbojiang  * accessed in memory by a vdev_indirect_config_t.
191*22ce4affSfengbojiang  */
192*22ce4affSfengbojiang typedef struct vdev_indirect_config {
193*22ce4affSfengbojiang 	/*
194*22ce4affSfengbojiang 	 * Object (in MOS) which contains the indirect mapping. This object
195*22ce4affSfengbojiang 	 * contains an array of vdev_indirect_mapping_entry_phys_t ordered by
196*22ce4affSfengbojiang 	 * vimep_src. The bonus buffer for this object is a
197*22ce4affSfengbojiang 	 * vdev_indirect_mapping_phys_t. This object is allocated when a vdev
198*22ce4affSfengbojiang 	 * removal is initiated.
199*22ce4affSfengbojiang 	 *
200*22ce4affSfengbojiang 	 * Note that this object can be empty if none of the data on the vdev
201*22ce4affSfengbojiang 	 * has been copied yet.
202*22ce4affSfengbojiang 	 */
203*22ce4affSfengbojiang 	uint64_t	vic_mapping_object;
204*22ce4affSfengbojiang 
205*22ce4affSfengbojiang 	/*
206*22ce4affSfengbojiang 	 * Object (in MOS) which contains the birth times for the mapping
207*22ce4affSfengbojiang 	 * entries. This object contains an array of
208*22ce4affSfengbojiang 	 * vdev_indirect_birth_entry_phys_t sorted by vibe_offset. The bonus
209*22ce4affSfengbojiang 	 * buffer for this object is a vdev_indirect_birth_phys_t. This object
210*22ce4affSfengbojiang 	 * is allocated when a vdev removal is initiated.
211*22ce4affSfengbojiang 	 *
212*22ce4affSfengbojiang 	 * Note that this object can be empty if none of the vdev has yet been
213*22ce4affSfengbojiang 	 * copied.
214*22ce4affSfengbojiang 	 */
215*22ce4affSfengbojiang 	uint64_t	vic_births_object;
216*22ce4affSfengbojiang 
217*22ce4affSfengbojiang 	/*
218*22ce4affSfengbojiang 	 * This is the vdev ID which was removed previous to this vdev, or
219*22ce4affSfengbojiang 	 * UINT64_MAX if there are no previously removed vdevs.
220*22ce4affSfengbojiang 	 */
221*22ce4affSfengbojiang 	uint64_t	vic_prev_indirect_vdev;
222*22ce4affSfengbojiang } vdev_indirect_config_t;
223*22ce4affSfengbojiang 
224*22ce4affSfengbojiang /*
225*22ce4affSfengbojiang  * Virtual device descriptor
226*22ce4affSfengbojiang  */
227*22ce4affSfengbojiang struct vdev {
228*22ce4affSfengbojiang 	/*
229*22ce4affSfengbojiang 	 * Common to all vdev types.
230*22ce4affSfengbojiang 	 */
231*22ce4affSfengbojiang 	uint64_t	vdev_id;	/* child number in vdev parent	*/
232*22ce4affSfengbojiang 	uint64_t	vdev_guid;	/* unique ID for this vdev	*/
233*22ce4affSfengbojiang 	uint64_t	vdev_guid_sum;	/* self guid + all child guids	*/
234*22ce4affSfengbojiang 	uint64_t	vdev_orig_guid;	/* orig. guid prior to remove	*/
235*22ce4affSfengbojiang 	uint64_t	vdev_asize;	/* allocatable device capacity	*/
236*22ce4affSfengbojiang 	uint64_t	vdev_min_asize;	/* min acceptable asize		*/
237*22ce4affSfengbojiang 	uint64_t	vdev_max_asize;	/* max acceptable asize		*/
238*22ce4affSfengbojiang 	uint64_t	vdev_ashift;	/* block alignment shift	*/
239*22ce4affSfengbojiang 
240*22ce4affSfengbojiang 	/*
241*22ce4affSfengbojiang 	 * Logical block alignment shift
242*22ce4affSfengbojiang 	 *
243*22ce4affSfengbojiang 	 * The smallest sized/aligned I/O supported by the device.
244*22ce4affSfengbojiang 	 */
245*22ce4affSfengbojiang 	uint64_t	vdev_logical_ashift;
246*22ce4affSfengbojiang 	/*
247*22ce4affSfengbojiang 	 * Physical block alignment shift
248*22ce4affSfengbojiang 	 *
249*22ce4affSfengbojiang 	 * The device supports logical I/Os with vdev_logical_ashift
250*22ce4affSfengbojiang 	 * size/alignment, but optimum performance will be achieved by
251*22ce4affSfengbojiang 	 * aligning/sizing requests to vdev_physical_ashift.  Smaller
252*22ce4affSfengbojiang 	 * requests may be inflated or incur device level read-modify-write
253*22ce4affSfengbojiang 	 * operations.
254*22ce4affSfengbojiang 	 *
255*22ce4affSfengbojiang 	 * May be 0 to indicate no preference (i.e. use vdev_logical_ashift).
256*22ce4affSfengbojiang 	 */
257*22ce4affSfengbojiang 	uint64_t	vdev_physical_ashift;
258*22ce4affSfengbojiang 	uint64_t	vdev_state;	/* see VDEV_STATE_* #defines	*/
259*22ce4affSfengbojiang 	uint64_t	vdev_prevstate;	/* used when reopening a vdev	*/
260*22ce4affSfengbojiang 	vdev_ops_t	*vdev_ops;	/* vdev operations		*/
261*22ce4affSfengbojiang 	spa_t		*vdev_spa;	/* spa for this vdev		*/
262*22ce4affSfengbojiang 	void		*vdev_tsd;	/* type-specific data		*/
263*22ce4affSfengbojiang 	vdev_t		*vdev_top;	/* top-level vdev		*/
264*22ce4affSfengbojiang 	vdev_t		*vdev_parent;	/* parent vdev			*/
265*22ce4affSfengbojiang 	vdev_t		**vdev_child;	/* array of children		*/
266*22ce4affSfengbojiang 	uint64_t	vdev_children;	/* number of children		*/
267*22ce4affSfengbojiang 	vdev_stat_t	vdev_stat;	/* virtual device statistics	*/
268*22ce4affSfengbojiang 	vdev_stat_ex_t	vdev_stat_ex;	/* extended statistics		*/
269*22ce4affSfengbojiang 	boolean_t	vdev_expanding;	/* expand the vdev?		*/
270*22ce4affSfengbojiang 	boolean_t	vdev_reopening;	/* reopen in progress?		*/
271*22ce4affSfengbojiang 	boolean_t	vdev_nonrot;	/* true if solid state		*/
272*22ce4affSfengbojiang 	int		vdev_open_error; /* error on last open		*/
273*22ce4affSfengbojiang 	kthread_t	*vdev_open_thread; /* thread opening children	*/
274*22ce4affSfengbojiang 	uint64_t	vdev_crtxg;	/* txg when top-level was added */
275*22ce4affSfengbojiang 
276*22ce4affSfengbojiang 	/*
277*22ce4affSfengbojiang 	 * Top-level vdev state.
278*22ce4affSfengbojiang 	 */
279*22ce4affSfengbojiang 	uint64_t	vdev_ms_array;	/* metaslab array object	*/
280*22ce4affSfengbojiang 	uint64_t	vdev_ms_shift;	/* metaslab size shift		*/
281*22ce4affSfengbojiang 	uint64_t	vdev_ms_count;	/* number of metaslabs		*/
282*22ce4affSfengbojiang 	metaslab_group_t *vdev_mg;	/* metaslab group		*/
283*22ce4affSfengbojiang 	metaslab_t	**vdev_ms;	/* metaslab array		*/
284*22ce4affSfengbojiang 	uint64_t	vdev_pending_fastwrite; /* allocated fastwrites */
285*22ce4affSfengbojiang 	txg_list_t	vdev_ms_list;	/* per-txg dirty metaslab lists	*/
286*22ce4affSfengbojiang 	txg_list_t	vdev_dtl_list;	/* per-txg dirty DTL lists	*/
287*22ce4affSfengbojiang 	txg_node_t	vdev_txg_node;	/* per-txg dirty vdev linkage	*/
288*22ce4affSfengbojiang 	boolean_t	vdev_remove_wanted; /* async remove wanted?	*/
289*22ce4affSfengbojiang 	boolean_t	vdev_probe_wanted; /* async probe wanted?	*/
290*22ce4affSfengbojiang 	list_node_t	vdev_config_dirty_node; /* config dirty list	*/
291*22ce4affSfengbojiang 	list_node_t	vdev_state_dirty_node; /* state dirty list	*/
292*22ce4affSfengbojiang 	uint64_t	vdev_deflate_ratio; /* deflation ratio (x512)	*/
293*22ce4affSfengbojiang 	uint64_t	vdev_islog;	/* is an intent log device	*/
294*22ce4affSfengbojiang 	uint64_t	vdev_removing;	/* device is being removed?	*/
295*22ce4affSfengbojiang 	boolean_t	vdev_ishole;	/* is a hole in the namespace	*/
296*22ce4affSfengbojiang 	uint64_t	vdev_top_zap;
297*22ce4affSfengbojiang 	vdev_alloc_bias_t vdev_alloc_bias; /* metaslab allocation bias	*/
298*22ce4affSfengbojiang 
299*22ce4affSfengbojiang 	/* pool checkpoint related */
300*22ce4affSfengbojiang 	space_map_t	*vdev_checkpoint_sm;	/* contains reserved blocks */
301*22ce4affSfengbojiang 
302*22ce4affSfengbojiang 	/* Initialize related */
303*22ce4affSfengbojiang 	boolean_t	vdev_initialize_exit_wanted;
304*22ce4affSfengbojiang 	vdev_initializing_state_t	vdev_initialize_state;
305*22ce4affSfengbojiang 	list_node_t	vdev_initialize_node;
306*22ce4affSfengbojiang 	kthread_t	*vdev_initialize_thread;
307*22ce4affSfengbojiang 	/* Protects vdev_initialize_thread and vdev_initialize_state. */
308*22ce4affSfengbojiang 	kmutex_t	vdev_initialize_lock;
309*22ce4affSfengbojiang 	kcondvar_t	vdev_initialize_cv;
310*22ce4affSfengbojiang 	uint64_t	vdev_initialize_offset[TXG_SIZE];
311*22ce4affSfengbojiang 	uint64_t	vdev_initialize_last_offset;
312*22ce4affSfengbojiang 	range_tree_t	*vdev_initialize_tree;	/* valid while initializing */
313*22ce4affSfengbojiang 	uint64_t	vdev_initialize_bytes_est;
314*22ce4affSfengbojiang 	uint64_t	vdev_initialize_bytes_done;
315*22ce4affSfengbojiang 	uint64_t	vdev_initialize_action_time;	/* start and end time */
316*22ce4affSfengbojiang 
317*22ce4affSfengbojiang 	/* TRIM related */
318*22ce4affSfengbojiang 	boolean_t	vdev_trim_exit_wanted;
319*22ce4affSfengbojiang 	boolean_t	vdev_autotrim_exit_wanted;
320*22ce4affSfengbojiang 	vdev_trim_state_t	vdev_trim_state;
321*22ce4affSfengbojiang 	list_node_t	vdev_trim_node;
322*22ce4affSfengbojiang 	kmutex_t	vdev_autotrim_lock;
323*22ce4affSfengbojiang 	kcondvar_t	vdev_autotrim_cv;
324*22ce4affSfengbojiang 	kthread_t	*vdev_autotrim_thread;
325*22ce4affSfengbojiang 	/* Protects vdev_trim_thread and vdev_trim_state. */
326*22ce4affSfengbojiang 	kmutex_t	vdev_trim_lock;
327*22ce4affSfengbojiang 	kcondvar_t	vdev_trim_cv;
328*22ce4affSfengbojiang 	kthread_t	*vdev_trim_thread;
329*22ce4affSfengbojiang 	uint64_t	vdev_trim_offset[TXG_SIZE];
330*22ce4affSfengbojiang 	uint64_t	vdev_trim_last_offset;
331*22ce4affSfengbojiang 	uint64_t	vdev_trim_bytes_est;
332*22ce4affSfengbojiang 	uint64_t	vdev_trim_bytes_done;
333*22ce4affSfengbojiang 	uint64_t	vdev_trim_rate;		/* requested rate (bytes/sec) */
334*22ce4affSfengbojiang 	uint64_t	vdev_trim_partial;	/* requested partial TRIM */
335*22ce4affSfengbojiang 	uint64_t	vdev_trim_secure;	/* requested secure TRIM */
336*22ce4affSfengbojiang 	uint64_t	vdev_trim_action_time;	/* start and end time */
337*22ce4affSfengbojiang 
338*22ce4affSfengbojiang 	/* Rebuild related */
339*22ce4affSfengbojiang 	boolean_t	vdev_rebuilding;
340*22ce4affSfengbojiang 	boolean_t	vdev_rebuild_exit_wanted;
341*22ce4affSfengbojiang 	boolean_t	vdev_rebuild_cancel_wanted;
342*22ce4affSfengbojiang 	boolean_t	vdev_rebuild_reset_wanted;
343*22ce4affSfengbojiang 	kmutex_t	vdev_rebuild_lock;
344*22ce4affSfengbojiang 	kcondvar_t	vdev_rebuild_cv;
345*22ce4affSfengbojiang 	kthread_t	*vdev_rebuild_thread;
346*22ce4affSfengbojiang 	vdev_rebuild_t	vdev_rebuild_config;
347*22ce4affSfengbojiang 
348*22ce4affSfengbojiang 	/* For limiting outstanding I/Os (initialize, TRIM) */
349*22ce4affSfengbojiang 	kmutex_t	vdev_initialize_io_lock;
350*22ce4affSfengbojiang 	kcondvar_t	vdev_initialize_io_cv;
351*22ce4affSfengbojiang 	uint64_t	vdev_initialize_inflight;
352*22ce4affSfengbojiang 	kmutex_t	vdev_trim_io_lock;
353*22ce4affSfengbojiang 	kcondvar_t	vdev_trim_io_cv;
354*22ce4affSfengbojiang 	uint64_t	vdev_trim_inflight[3];
355*22ce4affSfengbojiang 
356*22ce4affSfengbojiang 	/*
357*22ce4affSfengbojiang 	 * Values stored in the config for an indirect or removing vdev.
358*22ce4affSfengbojiang 	 */
359*22ce4affSfengbojiang 	vdev_indirect_config_t	vdev_indirect_config;
360*22ce4affSfengbojiang 
361*22ce4affSfengbojiang 	/*
362*22ce4affSfengbojiang 	 * The vdev_indirect_rwlock protects the vdev_indirect_mapping
363*22ce4affSfengbojiang 	 * pointer from changing on indirect vdevs (when it is condensed).
364*22ce4affSfengbojiang 	 * Note that removing (not yet indirect) vdevs have different
365*22ce4affSfengbojiang 	 * access patterns (the mapping is not accessed from open context,
366*22ce4affSfengbojiang 	 * e.g. from zio_read) and locking strategy (e.g. svr_lock).
367*22ce4affSfengbojiang 	 */
368*22ce4affSfengbojiang 	krwlock_t vdev_indirect_rwlock;
369*22ce4affSfengbojiang 	vdev_indirect_mapping_t *vdev_indirect_mapping;
370*22ce4affSfengbojiang 	vdev_indirect_births_t *vdev_indirect_births;
371*22ce4affSfengbojiang 
372*22ce4affSfengbojiang 	/*
373*22ce4affSfengbojiang 	 * In memory data structures used to manage the obsolete sm, for
374*22ce4affSfengbojiang 	 * indirect or removing vdevs.
375*22ce4affSfengbojiang 	 *
376*22ce4affSfengbojiang 	 * The vdev_obsolete_segments is the in-core record of the segments
377*22ce4affSfengbojiang 	 * that are no longer referenced anywhere in the pool (due to
378*22ce4affSfengbojiang 	 * being freed or remapped and not referenced by any snapshots).
379*22ce4affSfengbojiang 	 * During a sync, segments are added to vdev_obsolete_segments
380*22ce4affSfengbojiang 	 * via vdev_indirect_mark_obsolete(); at the end of each sync
381*22ce4affSfengbojiang 	 * pass, this is appended to vdev_obsolete_sm via
382*22ce4affSfengbojiang 	 * vdev_indirect_sync_obsolete().  The vdev_obsolete_lock
383*22ce4affSfengbojiang 	 * protects against concurrent modifications of vdev_obsolete_segments
384*22ce4affSfengbojiang 	 * from multiple zio threads.
385*22ce4affSfengbojiang 	 */
386*22ce4affSfengbojiang 	kmutex_t	vdev_obsolete_lock;
387*22ce4affSfengbojiang 	range_tree_t	*vdev_obsolete_segments;
388*22ce4affSfengbojiang 	space_map_t	*vdev_obsolete_sm;
389*22ce4affSfengbojiang 
390*22ce4affSfengbojiang 	/*
391*22ce4affSfengbojiang 	 * Protects the vdev_scan_io_queue field itself as well as the
392*22ce4affSfengbojiang 	 * structure's contents (when present).
393*22ce4affSfengbojiang 	 */
394*22ce4affSfengbojiang 	kmutex_t			vdev_scan_io_queue_lock;
395*22ce4affSfengbojiang 	struct dsl_scan_io_queue	*vdev_scan_io_queue;
396*22ce4affSfengbojiang 
397*22ce4affSfengbojiang 	/*
398*22ce4affSfengbojiang 	 * Leaf vdev state.
399*22ce4affSfengbojiang 	 */
400*22ce4affSfengbojiang 	range_tree_t	*vdev_dtl[DTL_TYPES]; /* dirty time logs	*/
401*22ce4affSfengbojiang 	space_map_t	*vdev_dtl_sm;	/* dirty time log space map	*/
402*22ce4affSfengbojiang 	txg_node_t	vdev_dtl_node;	/* per-txg dirty DTL linkage	*/
403*22ce4affSfengbojiang 	uint64_t	vdev_dtl_object; /* DTL object			*/
404*22ce4affSfengbojiang 	uint64_t	vdev_psize;	/* physical device capacity	*/
405*22ce4affSfengbojiang 	uint64_t	vdev_wholedisk;	/* true if this is a whole disk */
406*22ce4affSfengbojiang 	uint64_t	vdev_offline;	/* persistent offline state	*/
407*22ce4affSfengbojiang 	uint64_t	vdev_faulted;	/* persistent faulted state	*/
408*22ce4affSfengbojiang 	uint64_t	vdev_degraded;	/* persistent degraded state	*/
409*22ce4affSfengbojiang 	uint64_t	vdev_removed;	/* persistent removed state	*/
410*22ce4affSfengbojiang 	uint64_t	vdev_resilver_txg; /* persistent resilvering state */
411*22ce4affSfengbojiang 	uint64_t	vdev_rebuild_txg; /* persistent rebuilding state */
412*22ce4affSfengbojiang 	char		*vdev_path;	/* vdev path (if any)		*/
413*22ce4affSfengbojiang 	char		*vdev_devid;	/* vdev devid (if any)		*/
414*22ce4affSfengbojiang 	char		*vdev_physpath;	/* vdev device path (if any)	*/
415*22ce4affSfengbojiang 	char		*vdev_enc_sysfs_path;	/* enclosure sysfs path */
416*22ce4affSfengbojiang 	char		*vdev_fru;	/* physical FRU location	*/
417*22ce4affSfengbojiang 	uint64_t	vdev_not_present; /* not present during import	*/
418*22ce4affSfengbojiang 	uint64_t	vdev_unspare;	/* unspare when resilvering done */
419*22ce4affSfengbojiang 	boolean_t	vdev_nowritecache; /* true if flushwritecache failed */
420*22ce4affSfengbojiang 	boolean_t	vdev_has_trim;	/* TRIM is supported		*/
421*22ce4affSfengbojiang 	boolean_t	vdev_has_securetrim; /* secure TRIM is supported */
422*22ce4affSfengbojiang 	boolean_t	vdev_checkremove; /* temporary online test	*/
423*22ce4affSfengbojiang 	boolean_t	vdev_forcefault; /* force online fault		*/
424*22ce4affSfengbojiang 	boolean_t	vdev_splitting;	/* split or repair in progress  */
425*22ce4affSfengbojiang 	boolean_t	vdev_delayed_close; /* delayed device close?	*/
426*22ce4affSfengbojiang 	boolean_t	vdev_tmpoffline; /* device taken offline temporarily? */
427*22ce4affSfengbojiang 	boolean_t	vdev_detached;	/* device detached?		*/
428*22ce4affSfengbojiang 	boolean_t	vdev_cant_read;	/* vdev is failing all reads	*/
429*22ce4affSfengbojiang 	boolean_t	vdev_cant_write; /* vdev is failing all writes	*/
430*22ce4affSfengbojiang 	boolean_t	vdev_isspare;	/* was a hot spare		*/
431*22ce4affSfengbojiang 	boolean_t	vdev_isl2cache;	/* was a l2cache device		*/
432*22ce4affSfengbojiang 	boolean_t	vdev_copy_uberblocks;  /* post expand copy uberblocks */
433*22ce4affSfengbojiang 	boolean_t	vdev_resilver_deferred;  /* resilver deferred */
434*22ce4affSfengbojiang 	vdev_queue_t	vdev_queue;	/* I/O deadline schedule queue	*/
435*22ce4affSfengbojiang 	vdev_cache_t	vdev_cache;	/* physical block cache		*/
436*22ce4affSfengbojiang 	spa_aux_vdev_t	*vdev_aux;	/* for l2cache and spares vdevs	*/
437*22ce4affSfengbojiang 	zio_t		*vdev_probe_zio; /* root of current probe	*/
438*22ce4affSfengbojiang 	vdev_aux_t	vdev_label_aux;	/* on-disk aux state		*/
439*22ce4affSfengbojiang 	uint64_t	vdev_leaf_zap;
440*22ce4affSfengbojiang 	hrtime_t	vdev_mmp_pending; /* 0 if write finished	*/
441*22ce4affSfengbojiang 	uint64_t	vdev_mmp_kstat_id;	/* to find kstat entry */
442*22ce4affSfengbojiang 	uint64_t	vdev_expansion_time;	/* vdev's last expansion time */
443*22ce4affSfengbojiang 	list_node_t	vdev_leaf_node;		/* leaf vdev list */
444*22ce4affSfengbojiang 
445*22ce4affSfengbojiang 	/*
446*22ce4affSfengbojiang 	 * For DTrace to work in userland (libzpool) context, these fields must
447*22ce4affSfengbojiang 	 * remain at the end of the structure.  DTrace will use the kernel's
448*22ce4affSfengbojiang 	 * CTF definition for 'struct vdev', and since the size of a kmutex_t is
449*22ce4affSfengbojiang 	 * larger in userland, the offsets for the rest of the fields would be
450*22ce4affSfengbojiang 	 * incorrect.
451*22ce4affSfengbojiang 	 */
452*22ce4affSfengbojiang 	kmutex_t	vdev_dtl_lock;	/* vdev_dtl_{map,resilver}	*/
453*22ce4affSfengbojiang 	kmutex_t	vdev_stat_lock;	/* vdev_stat			*/
454*22ce4affSfengbojiang 	kmutex_t	vdev_probe_lock; /* protects vdev_probe_zio	*/
455*22ce4affSfengbojiang 
456*22ce4affSfengbojiang 	/*
457*22ce4affSfengbojiang 	 * We rate limit ZIO delay and ZIO checksum events, since they
458*22ce4affSfengbojiang 	 * can flood ZED with tons of events when a drive is acting up.
459*22ce4affSfengbojiang 	 */
460*22ce4affSfengbojiang 	zfs_ratelimit_t vdev_delay_rl;
461*22ce4affSfengbojiang 	zfs_ratelimit_t vdev_checksum_rl;
462*22ce4affSfengbojiang };
463*22ce4affSfengbojiang 
464*22ce4affSfengbojiang #define	VDEV_PAD_SIZE		(8 << 10)
465*22ce4affSfengbojiang /* 2 padding areas (vl_pad1 and vl_be) to skip */
466*22ce4affSfengbojiang #define	VDEV_SKIP_SIZE		VDEV_PAD_SIZE * 2
467*22ce4affSfengbojiang #define	VDEV_PHYS_SIZE		(112 << 10)
468*22ce4affSfengbojiang #define	VDEV_UBERBLOCK_RING	(128 << 10)
469*22ce4affSfengbojiang 
470*22ce4affSfengbojiang /*
471*22ce4affSfengbojiang  * MMP blocks occupy the last MMP_BLOCKS_PER_LABEL slots in the uberblock
472*22ce4affSfengbojiang  * ring when MMP is enabled.
473*22ce4affSfengbojiang  */
474*22ce4affSfengbojiang #define	MMP_BLOCKS_PER_LABEL	1
475*22ce4affSfengbojiang 
476*22ce4affSfengbojiang /* The largest uberblock we support is 8k. */
477*22ce4affSfengbojiang #define	MAX_UBERBLOCK_SHIFT (13)
478*22ce4affSfengbojiang #define	VDEV_UBERBLOCK_SHIFT(vd)	\
479*22ce4affSfengbojiang 	MIN(MAX((vd)->vdev_top->vdev_ashift, UBERBLOCK_SHIFT), \
480*22ce4affSfengbojiang 	    MAX_UBERBLOCK_SHIFT)
481*22ce4affSfengbojiang #define	VDEV_UBERBLOCK_COUNT(vd)	\
482*22ce4affSfengbojiang 	(VDEV_UBERBLOCK_RING >> VDEV_UBERBLOCK_SHIFT(vd))
483*22ce4affSfengbojiang #define	VDEV_UBERBLOCK_OFFSET(vd, n)	\
484*22ce4affSfengbojiang 	offsetof(vdev_label_t, vl_uberblock[(n) << VDEV_UBERBLOCK_SHIFT(vd)])
485*22ce4affSfengbojiang #define	VDEV_UBERBLOCK_SIZE(vd)		(1ULL << VDEV_UBERBLOCK_SHIFT(vd))
486*22ce4affSfengbojiang 
487*22ce4affSfengbojiang typedef struct vdev_phys {
488*22ce4affSfengbojiang 	char		vp_nvlist[VDEV_PHYS_SIZE - sizeof (zio_eck_t)];
489*22ce4affSfengbojiang 	zio_eck_t	vp_zbt;
490*22ce4affSfengbojiang } vdev_phys_t;
491*22ce4affSfengbojiang 
492*22ce4affSfengbojiang typedef enum vbe_vers {
493*22ce4affSfengbojiang 	/*
494*22ce4affSfengbojiang 	 * The bootenv file is stored as ascii text in the envblock.
495*22ce4affSfengbojiang 	 * It is used by the GRUB bootloader used on Linux to store the
496*22ce4affSfengbojiang 	 * contents of the grubenv file. The file is stored as raw ASCII,
497*22ce4affSfengbojiang 	 * and is protected by an embedded checksum. By default, GRUB will
498*22ce4affSfengbojiang 	 * check if the boot filesystem supports storing the environment data
499*22ce4affSfengbojiang 	 * in a special location, and if so, will invoke filesystem specific
500*22ce4affSfengbojiang 	 * logic to retrieve it. This can be overriden by a variable, should
501*22ce4affSfengbojiang 	 * the user so desire.
502*22ce4affSfengbojiang 	 */
503*22ce4affSfengbojiang 	VB_RAW = 0,
504*22ce4affSfengbojiang 
505*22ce4affSfengbojiang 	/*
506*22ce4affSfengbojiang 	 * The bootenv file is converted to an nvlist and then packed into the
507*22ce4affSfengbojiang 	 * envblock.
508*22ce4affSfengbojiang 	 */
509*22ce4affSfengbojiang 	VB_NVLIST = 1
510*22ce4affSfengbojiang } vbe_vers_t;
511*22ce4affSfengbojiang 
512*22ce4affSfengbojiang typedef struct vdev_boot_envblock {
513*22ce4affSfengbojiang 	uint64_t	vbe_version;
514*22ce4affSfengbojiang 	char		vbe_bootenv[VDEV_PAD_SIZE - sizeof (uint64_t) -
515*22ce4affSfengbojiang 			sizeof (zio_eck_t)];
516*22ce4affSfengbojiang 	zio_eck_t	vbe_zbt;
517*22ce4affSfengbojiang } vdev_boot_envblock_t;
518*22ce4affSfengbojiang 
519*22ce4affSfengbojiang CTASSERT_GLOBAL(sizeof (vdev_boot_envblock_t) == VDEV_PAD_SIZE);
520*22ce4affSfengbojiang 
521*22ce4affSfengbojiang typedef struct vdev_label {
522*22ce4affSfengbojiang 	char		vl_pad1[VDEV_PAD_SIZE];			/*  8K */
523*22ce4affSfengbojiang 	vdev_boot_envblock_t	vl_be;				/*  8K */
524*22ce4affSfengbojiang 	vdev_phys_t	vl_vdev_phys;				/* 112K	*/
525*22ce4affSfengbojiang 	char		vl_uberblock[VDEV_UBERBLOCK_RING];	/* 128K	*/
526*22ce4affSfengbojiang } vdev_label_t;						/* 256K total */
527*22ce4affSfengbojiang 
528*22ce4affSfengbojiang /*
529*22ce4affSfengbojiang  * vdev_dirty() flags
530*22ce4affSfengbojiang  */
531*22ce4affSfengbojiang #define	VDD_METASLAB	0x01
532*22ce4affSfengbojiang #define	VDD_DTL		0x02
533*22ce4affSfengbojiang 
534*22ce4affSfengbojiang /* Offset of embedded boot loader region on each label */
535*22ce4affSfengbojiang #define	VDEV_BOOT_OFFSET	(2 * sizeof (vdev_label_t))
536*22ce4affSfengbojiang /*
537*22ce4affSfengbojiang  * Size of embedded boot loader region on each label.
538*22ce4affSfengbojiang  * The total size of the first two labels plus the boot area is 4MB.
539*22ce4affSfengbojiang  */
540*22ce4affSfengbojiang #define	VDEV_BOOT_SIZE		(7ULL << 19)			/* 3.5M */
541*22ce4affSfengbojiang 
542*22ce4affSfengbojiang /*
543*22ce4affSfengbojiang  * Size of label regions at the start and end of each leaf device.
544*22ce4affSfengbojiang  */
545*22ce4affSfengbojiang #define	VDEV_LABEL_START_SIZE	(2 * sizeof (vdev_label_t) + VDEV_BOOT_SIZE)
546*22ce4affSfengbojiang #define	VDEV_LABEL_END_SIZE	(2 * sizeof (vdev_label_t))
547*22ce4affSfengbojiang #define	VDEV_LABELS		4
548*22ce4affSfengbojiang #define	VDEV_BEST_LABEL		VDEV_LABELS
549*22ce4affSfengbojiang #define	VDEV_OFFSET_IS_LABEL(vd, off)                           \
550*22ce4affSfengbojiang 	(((off) < VDEV_LABEL_START_SIZE) ||                     \
551*22ce4affSfengbojiang 	((off) >= ((vd)->vdev_psize - VDEV_LABEL_END_SIZE)))
552*22ce4affSfengbojiang 
553*22ce4affSfengbojiang #define	VDEV_ALLOC_LOAD		0
554*22ce4affSfengbojiang #define	VDEV_ALLOC_ADD		1
555*22ce4affSfengbojiang #define	VDEV_ALLOC_SPARE	2
556*22ce4affSfengbojiang #define	VDEV_ALLOC_L2CACHE	3
557*22ce4affSfengbojiang #define	VDEV_ALLOC_ROOTPOOL	4
558*22ce4affSfengbojiang #define	VDEV_ALLOC_SPLIT	5
559*22ce4affSfengbojiang #define	VDEV_ALLOC_ATTACH	6
560*22ce4affSfengbojiang 
561*22ce4affSfengbojiang /*
562*22ce4affSfengbojiang  * Allocate or free a vdev
563*22ce4affSfengbojiang  */
564*22ce4affSfengbojiang extern vdev_t *vdev_alloc_common(spa_t *spa, uint_t id, uint64_t guid,
565*22ce4affSfengbojiang     vdev_ops_t *ops);
566*22ce4affSfengbojiang extern int vdev_alloc(spa_t *spa, vdev_t **vdp, nvlist_t *config,
567*22ce4affSfengbojiang     vdev_t *parent, uint_t id, int alloctype);
568*22ce4affSfengbojiang extern void vdev_free(vdev_t *vd);
569*22ce4affSfengbojiang 
570*22ce4affSfengbojiang /*
571*22ce4affSfengbojiang  * Add or remove children and parents
572*22ce4affSfengbojiang  */
573*22ce4affSfengbojiang extern void vdev_add_child(vdev_t *pvd, vdev_t *cvd);
574*22ce4affSfengbojiang extern void vdev_remove_child(vdev_t *pvd, vdev_t *cvd);
575*22ce4affSfengbojiang extern void vdev_compact_children(vdev_t *pvd);
576*22ce4affSfengbojiang extern vdev_t *vdev_add_parent(vdev_t *cvd, vdev_ops_t *ops);
577*22ce4affSfengbojiang extern void vdev_remove_parent(vdev_t *cvd);
578*22ce4affSfengbojiang 
579*22ce4affSfengbojiang /*
580*22ce4affSfengbojiang  * vdev sync load and sync
581*22ce4affSfengbojiang  */
582*22ce4affSfengbojiang extern boolean_t vdev_log_state_valid(vdev_t *vd);
583*22ce4affSfengbojiang extern int vdev_load(vdev_t *vd);
584*22ce4affSfengbojiang extern int vdev_dtl_load(vdev_t *vd);
585*22ce4affSfengbojiang extern void vdev_sync(vdev_t *vd, uint64_t txg);
586*22ce4affSfengbojiang extern void vdev_sync_done(vdev_t *vd, uint64_t txg);
587*22ce4affSfengbojiang extern void vdev_dirty(vdev_t *vd, int flags, void *arg, uint64_t txg);
588*22ce4affSfengbojiang extern void vdev_dirty_leaves(vdev_t *vd, int flags, uint64_t txg);
589*22ce4affSfengbojiang 
590*22ce4affSfengbojiang /*
591*22ce4affSfengbojiang  * Available vdev types.
592*22ce4affSfengbojiang  */
593*22ce4affSfengbojiang extern vdev_ops_t vdev_root_ops;
594*22ce4affSfengbojiang extern vdev_ops_t vdev_mirror_ops;
595*22ce4affSfengbojiang extern vdev_ops_t vdev_replacing_ops;
596*22ce4affSfengbojiang extern vdev_ops_t vdev_raidz_ops;
597*22ce4affSfengbojiang extern vdev_ops_t vdev_draid_ops;
598*22ce4affSfengbojiang extern vdev_ops_t vdev_draid_spare_ops;
599*22ce4affSfengbojiang extern vdev_ops_t vdev_disk_ops;
600*22ce4affSfengbojiang extern vdev_ops_t vdev_file_ops;
601*22ce4affSfengbojiang extern vdev_ops_t vdev_missing_ops;
602*22ce4affSfengbojiang extern vdev_ops_t vdev_hole_ops;
603*22ce4affSfengbojiang extern vdev_ops_t vdev_spare_ops;
604*22ce4affSfengbojiang extern vdev_ops_t vdev_indirect_ops;
605*22ce4affSfengbojiang 
606*22ce4affSfengbojiang /*
607*22ce4affSfengbojiang  * Common size functions
608*22ce4affSfengbojiang  */
609*22ce4affSfengbojiang extern void vdev_default_xlate(vdev_t *vd, const range_seg64_t *logical_rs,
610*22ce4affSfengbojiang     range_seg64_t *physical_rs, range_seg64_t *remain_rs);
611*22ce4affSfengbojiang extern uint64_t vdev_default_asize(vdev_t *vd, uint64_t psize);
612*22ce4affSfengbojiang extern uint64_t vdev_default_min_asize(vdev_t *vd);
613*22ce4affSfengbojiang extern uint64_t vdev_get_min_asize(vdev_t *vd);
614*22ce4affSfengbojiang extern void vdev_set_min_asize(vdev_t *vd);
615*22ce4affSfengbojiang extern uint64_t vdev_get_min_alloc(vdev_t *vd);
616*22ce4affSfengbojiang extern uint64_t vdev_get_nparity(vdev_t *vd);
617*22ce4affSfengbojiang extern uint64_t vdev_get_ndisks(vdev_t *vd);
618*22ce4affSfengbojiang 
619*22ce4affSfengbojiang /*
620*22ce4affSfengbojiang  * Global variables
621*22ce4affSfengbojiang  */
622*22ce4affSfengbojiang extern int zfs_vdev_standard_sm_blksz;
623*22ce4affSfengbojiang /* zdb uses this tunable, so it must be declared here to make lint happy. */
624*22ce4affSfengbojiang extern int zfs_vdev_cache_size;
625*22ce4affSfengbojiang 
626*22ce4affSfengbojiang /*
627*22ce4affSfengbojiang  * Functions from vdev_indirect.c
628*22ce4affSfengbojiang  */
629*22ce4affSfengbojiang extern void vdev_indirect_sync_obsolete(vdev_t *vd, dmu_tx_t *tx);
630*22ce4affSfengbojiang extern boolean_t vdev_indirect_should_condense(vdev_t *vd);
631*22ce4affSfengbojiang extern void spa_condense_indirect_start_sync(vdev_t *vd, dmu_tx_t *tx);
632*22ce4affSfengbojiang extern int vdev_obsolete_sm_object(vdev_t *vd, uint64_t *sm_obj);
633*22ce4affSfengbojiang extern int vdev_obsolete_counts_are_precise(vdev_t *vd, boolean_t *are_precise);
634*22ce4affSfengbojiang 
635*22ce4affSfengbojiang /*
636*22ce4affSfengbojiang  * Other miscellaneous functions
637*22ce4affSfengbojiang  */
638*22ce4affSfengbojiang int vdev_checkpoint_sm_object(vdev_t *vd, uint64_t *sm_obj);
639*22ce4affSfengbojiang 
640*22ce4affSfengbojiang /*
641*22ce4affSfengbojiang  * Vdev ashift optimization tunables
642*22ce4affSfengbojiang  */
643*22ce4affSfengbojiang extern uint64_t zfs_vdev_min_auto_ashift;
644*22ce4affSfengbojiang extern uint64_t zfs_vdev_max_auto_ashift;
645*22ce4affSfengbojiang int param_set_min_auto_ashift(ZFS_MODULE_PARAM_ARGS);
646*22ce4affSfengbojiang int param_set_max_auto_ashift(ZFS_MODULE_PARAM_ARGS);
647*22ce4affSfengbojiang 
648*22ce4affSfengbojiang #ifdef	__cplusplus
649*22ce4affSfengbojiang }
650*22ce4affSfengbojiang #endif
651*22ce4affSfengbojiang 
652*22ce4affSfengbojiang #endif	/* _SYS_VDEV_IMPL_H */
653