Home | History | Annotate | Download | only in sys
      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 /*
     23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 #ifndef _ZIO_H
     28 #define	_ZIO_H
     29 
     30 #include <sys/zfs_context.h>
     31 #include <sys/spa.h>
     32 #include <sys/txg.h>
     33 #include <sys/avl.h>
     34 #include <sys/fs/zfs.h>
     35 #include <sys/zio_impl.h>
     36 
     37 #ifdef	__cplusplus
     38 extern "C" {
     39 #endif
     40 
     41 #define	ZBT_MAGIC	0x210da7ab10c7a11ULL	/* zio data bloc tail */
     42 
     43 typedef struct zio_block_tail {
     44 	uint64_t	zbt_magic;	/* for validation, endianness	*/
     45 	zio_cksum_t	zbt_cksum;	/* 256-bit checksum		*/
     46 } zio_block_tail_t;
     47 
     48 /*
     49  * Gang block headers are self-checksumming and contain an array
     50  * of block pointers.
     51  */
     52 #define	SPA_GANGBLOCKSIZE	SPA_MINBLOCKSIZE
     53 #define	SPA_GBH_NBLKPTRS	((SPA_GANGBLOCKSIZE - \
     54 	sizeof (zio_block_tail_t)) / sizeof (blkptr_t))
     55 #define	SPA_GBH_FILLER		((SPA_GANGBLOCKSIZE - \
     56 	sizeof (zio_block_tail_t) - \
     57 	(SPA_GBH_NBLKPTRS * sizeof (blkptr_t))) /\
     58 	sizeof (uint64_t))
     59 
     60 typedef struct zio_gbh {
     61 	blkptr_t		zg_blkptr[SPA_GBH_NBLKPTRS];
     62 	uint64_t		zg_filler[SPA_GBH_FILLER];
     63 	zio_block_tail_t	zg_tail;
     64 } zio_gbh_phys_t;
     65 
     66 enum zio_checksum {
     67 	ZIO_CHECKSUM_INHERIT = 0,
     68 	ZIO_CHECKSUM_ON,
     69 	ZIO_CHECKSUM_OFF,
     70 	ZIO_CHECKSUM_LABEL,
     71 	ZIO_CHECKSUM_GANG_HEADER,
     72 	ZIO_CHECKSUM_ZILOG,
     73 	ZIO_CHECKSUM_FLETCHER_2,
     74 	ZIO_CHECKSUM_FLETCHER_4,
     75 	ZIO_CHECKSUM_SHA256,
     76 	ZIO_CHECKSUM_FUNCTIONS
     77 };
     78 
     79 #define	ZIO_CHECKSUM_ON_VALUE	ZIO_CHECKSUM_FLETCHER_4
     80 #define	ZIO_CHECKSUM_DEFAULT	ZIO_CHECKSUM_ON
     81 
     82 #define	ZIO_CHECKSUM_MASK	0xffULL
     83 #define	ZIO_CHECKSUM_VERIFY	(1 << 8)
     84 
     85 #define	ZIO_DEDUPCHECKSUM	ZIO_CHECKSUM_SHA256
     86 #define	ZIO_DEDUPDITTO_MIN	100
     87 
     88 enum zio_compress {
     89 	ZIO_COMPRESS_INHERIT = 0,
     90 	ZIO_COMPRESS_ON,
     91 	ZIO_COMPRESS_OFF,
     92 	ZIO_COMPRESS_LZJB,
     93 	ZIO_COMPRESS_EMPTY,
     94 	ZIO_COMPRESS_GZIP_1,
     95 	ZIO_COMPRESS_GZIP_2,
     96 	ZIO_COMPRESS_GZIP_3,
     97 	ZIO_COMPRESS_GZIP_4,
     98 	ZIO_COMPRESS_GZIP_5,
     99 	ZIO_COMPRESS_GZIP_6,
    100 	ZIO_COMPRESS_GZIP_7,
    101 	ZIO_COMPRESS_GZIP_8,
    102 	ZIO_COMPRESS_GZIP_9,
    103 	ZIO_COMPRESS_ZLE,
    104 	ZIO_COMPRESS_FUNCTIONS
    105 };
    106 
    107 #define	ZIO_COMPRESS_ON_VALUE	ZIO_COMPRESS_LZJB
    108 #define	ZIO_COMPRESS_DEFAULT	ZIO_COMPRESS_OFF
    109 
    110 #define	BOOTFS_COMPRESS_VALID(compress)			\
    111 	((compress) == ZIO_COMPRESS_LZJB ||		\
    112 	((compress) == ZIO_COMPRESS_ON &&		\
    113 	ZIO_COMPRESS_ON_VALUE == ZIO_COMPRESS_LZJB) ||	\
    114 	(compress) == ZIO_COMPRESS_OFF)
    115 
    116 #define	ZIO_FAILURE_MODE_WAIT		0
    117 #define	ZIO_FAILURE_MODE_CONTINUE	1
    118 #define	ZIO_FAILURE_MODE_PANIC		2
    119 
    120 #define	ZIO_PRIORITY_NOW		(zio_priority_table[0])
    121 #define	ZIO_PRIORITY_SYNC_READ		(zio_priority_table[1])
    122 #define	ZIO_PRIORITY_SYNC_WRITE		(zio_priority_table[2])
    123 #define	ZIO_PRIORITY_LOG_WRITE		(zio_priority_table[3])
    124 #define	ZIO_PRIORITY_CACHE_FILL		(zio_priority_table[4])
    125 #define	ZIO_PRIORITY_AGG		(zio_priority_table[5])
    126 #define	ZIO_PRIORITY_FREE		(zio_priority_table[6])
    127 #define	ZIO_PRIORITY_ASYNC_WRITE	(zio_priority_table[7])
    128 #define	ZIO_PRIORITY_ASYNC_READ		(zio_priority_table[8])
    129 #define	ZIO_PRIORITY_RESILVER		(zio_priority_table[9])
    130 #define	ZIO_PRIORITY_SCRUB		(zio_priority_table[10])
    131 #define	ZIO_PRIORITY_TABLE_SIZE		11
    132 
    133 #define	ZIO_PIPELINE_CONTINUE		0x100
    134 #define	ZIO_PIPELINE_STOP		0x101
    135 
    136 enum zio_flag {
    137 	/*
    138 	 * Flags inherited by gang, ddt, and vdev children,
    139 	 * and that must be equal for two zios to aggregate
    140 	 */
    141 	ZIO_FLAG_DONT_AGGREGATE	= 1 << 0,
    142 	ZIO_FLAG_IO_REPAIR	= 1 << 1,
    143 	ZIO_FLAG_SELF_HEAL	= 1 << 2,
    144 	ZIO_FLAG_RESILVER	= 1 << 3,
    145 	ZIO_FLAG_SCRUB		= 1 << 4,
    146 	ZIO_FLAG_SCRUB_THREAD	= 1 << 5,
    147 
    148 #define	ZIO_FLAG_AGG_INHERIT	(ZIO_FLAG_CANFAIL - 1)
    149 
    150 	/*
    151 	 * Flags inherited by ddt, gang, and vdev children.
    152 	 */
    153 	ZIO_FLAG_CANFAIL	= 1 << 6,	/* must be first for INHERIT */
    154 	ZIO_FLAG_SPECULATIVE	= 1 << 7,
    155 	ZIO_FLAG_CONFIG_WRITER	= 1 << 8,
    156 	ZIO_FLAG_DONT_RETRY	= 1 << 9,
    157 	ZIO_FLAG_DONT_CACHE	= 1 << 10,
    158 	ZIO_FLAG_NODATA		= 1 << 11,
    159 	ZIO_FLAG_INDUCE_DAMAGE	= 1 << 12,
    160 
    161 #define	ZIO_FLAG_DDT_INHERIT	(ZIO_FLAG_IO_RETRY - 1)
    162 #define	ZIO_FLAG_GANG_INHERIT	(ZIO_FLAG_IO_RETRY - 1)
    163 
    164 	/*
    165 	 * Flags inherited by vdev children.
    166 	 */
    167 	ZIO_FLAG_IO_RETRY	= 1 << 13,	/* must be first for INHERIT */
    168 	ZIO_FLAG_PROBE		= 1 << 14,
    169 	ZIO_FLAG_TRYHARD	= 1 << 15,
    170 	ZIO_FLAG_OPTIONAL	= 1 << 16,
    171 
    172 #define	ZIO_FLAG_VDEV_INHERIT	(ZIO_FLAG_DONT_QUEUE - 1)
    173 
    174 	/*
    175 	 * Flags not inherited by any children.
    176 	 */
    177 	ZIO_FLAG_DONT_QUEUE	= 1 << 17,	/* must be first for INHERIT */
    178 	ZIO_FLAG_DONT_PROPAGATE	= 1 << 18,
    179 	ZIO_FLAG_IO_BYPASS	= 1 << 19,
    180 	ZIO_FLAG_IO_REWRITE	= 1 << 20,
    181 	ZIO_FLAG_RAW		= 1 << 21,
    182 	ZIO_FLAG_GANG_CHILD	= 1 << 22,
    183 	ZIO_FLAG_DDT_CHILD	= 1 << 23,
    184 	ZIO_FLAG_GODFATHER	= 1 << 24
    185 };
    186 
    187 #define	ZIO_FLAG_MUSTSUCCEED		0
    188 
    189 #define	ZIO_DDT_CHILD_FLAGS(zio)				\
    190 	(((zio)->io_flags & ZIO_FLAG_DDT_INHERIT) |		\
    191 	ZIO_FLAG_DDT_CHILD | ZIO_FLAG_CANFAIL)
    192 
    193 #define	ZIO_GANG_CHILD_FLAGS(zio)				\
    194 	(((zio)->io_flags & ZIO_FLAG_GANG_INHERIT) |		\
    195 	ZIO_FLAG_GANG_CHILD | ZIO_FLAG_CANFAIL)
    196 
    197 #define	ZIO_VDEV_CHILD_FLAGS(zio)				\
    198 	(((zio)->io_flags & ZIO_FLAG_VDEV_INHERIT) |		\
    199 	ZIO_FLAG_CANFAIL)
    200 
    201 enum zio_child {
    202 	ZIO_CHILD_VDEV = 0,
    203 	ZIO_CHILD_GANG,
    204 	ZIO_CHILD_DDT,
    205 	ZIO_CHILD_LOGICAL,
    206 	ZIO_CHILD_TYPES
    207 };
    208 
    209 enum zio_wait_type {
    210 	ZIO_WAIT_READY = 0,
    211 	ZIO_WAIT_DONE,
    212 	ZIO_WAIT_TYPES
    213 };
    214 
    215 /*
    216  * We'll take the unused errnos, 'EBADE' and 'EBADR' (from the Convergent
    217  * graveyard) to indicate checksum errors and fragmentation.
    218  */
    219 #define	ECKSUM	EBADE
    220 #define	EFRAGS	EBADR
    221 
    222 typedef void zio_done_func_t(zio_t *zio);
    223 
    224 extern uint8_t zio_priority_table[ZIO_PRIORITY_TABLE_SIZE];
    225 extern char *zio_type_name[ZIO_TYPES];
    226 
    227 /*
    228  * A bookmark is a four-tuple <objset, object, level, blkid> that uniquely
    229  * identifies any block in the pool.  By convention, the meta-objset (MOS)
    230  * is objset 0, and the meta-dnode is object 0.  This covers all blocks
    231  * except root blocks and ZIL blocks, which are defined as follows:
    232  *
    233  * Root blocks (objset_phys_t) are object 0, level -1:  <objset, 0, -1, 0>.
    234  * ZIL blocks are bookmarked <objset, 0, -2, blkid == ZIL sequence number>.
    235  * dmu_sync()ed ZIL data blocks are bookmarked <objset, object, -2, blkid>.
    236  *
    237  * Note: this structure is called a bookmark because its original purpose
    238  * was to remember where to resume a pool-wide traverse.
    239  *
    240  * Note: this structure is passed between userland and the kernel.
    241  * Therefore it must not change size or alignment between 32/64 bit
    242  * compilation options.
    243  */
    244 typedef struct zbookmark {
    245 	uint64_t	zb_objset;
    246 	uint64_t	zb_object;
    247 	int64_t		zb_level;
    248 	uint64_t	zb_blkid;
    249 } zbookmark_t;
    250 
    251 #define	SET_BOOKMARK(zb, objset, object, level, blkid)  \
    252 {                                                       \
    253 	(zb)->zb_objset = objset;                       \
    254 	(zb)->zb_object = object;                       \
    255 	(zb)->zb_level = level;                         \
    256 	(zb)->zb_blkid = blkid;                         \
    257 }
    258 
    259 #define	ZB_DESTROYED_OBJSET	(-1ULL)
    260 
    261 #define	ZB_ROOT_OBJECT		(0ULL)
    262 #define	ZB_ROOT_LEVEL		(-1LL)
    263 #define	ZB_ROOT_BLKID		(0ULL)
    264 
    265 #define	ZB_ZIL_OBJECT		(0ULL)
    266 #define	ZB_ZIL_LEVEL		(-2LL)
    267 
    268 typedef struct zio_prop {
    269 	enum zio_checksum	zp_checksum;
    270 	enum zio_compress	zp_compress;
    271 	dmu_object_type_t	zp_type;
    272 	uint8_t			zp_level;
    273 	uint8_t			zp_copies;
    274 	uint8_t			zp_dedup;
    275 	uint8_t			zp_dedup_verify;
    276 } zio_prop_t;
    277 
    278 typedef struct zio_cksum_report zio_cksum_report_t;
    279 
    280 typedef void zio_cksum_finish_f(zio_cksum_report_t *rep,
    281     const void *good_data);
    282 typedef void zio_cksum_free_f(void *cbdata, size_t size);
    283 
    284 struct zio_bad_cksum;				/* defined in zio_checksum.h */
    285 
    286 struct zio_cksum_report {
    287 	struct zio_cksum_report *zcr_next;
    288 	nvlist_t		*zcr_ereport;
    289 	nvlist_t		*zcr_detector;
    290 	void			*zcr_cbdata;
    291 	size_t			zcr_cbinfo;	/* passed to zcr_free() */
    292 	uint64_t		zcr_align;
    293 	uint64_t		zcr_length;
    294 	zio_cksum_finish_f	*zcr_finish;
    295 	zio_cksum_free_f	*zcr_free;
    296 
    297 	/* internal use only */
    298 	struct zio_bad_cksum	*zcr_ckinfo;	/* information from failure */
    299 };
    300 
    301 typedef void zio_vsd_cksum_report_f(zio_t *zio, zio_cksum_report_t *zcr,
    302     void *arg);
    303 
    304 zio_vsd_cksum_report_f	zio_vsd_default_cksum_report;
    305 
    306 typedef struct zio_vsd_ops {
    307 	zio_done_func_t		*vsd_free;
    308 	zio_vsd_cksum_report_f	*vsd_cksum_report;
    309 } zio_vsd_ops_t;
    310 
    311 typedef struct zio_gang_node {
    312 	zio_gbh_phys_t		*gn_gbh;
    313 	struct zio_gang_node	*gn_child[SPA_GBH_NBLKPTRS];
    314 } zio_gang_node_t;
    315 
    316 typedef zio_t *zio_gang_issue_func_t(zio_t *zio, blkptr_t *bp,
    317     zio_gang_node_t *gn, void *data);
    318 
    319 typedef void zio_transform_func_t(zio_t *zio, void *data, uint64_t size);
    320 
    321 typedef struct zio_transform {
    322 	void			*zt_orig_data;
    323 	uint64_t		zt_orig_size;
    324 	uint64_t		zt_bufsize;
    325 	zio_transform_func_t	*zt_transform;
    326 	struct zio_transform	*zt_next;
    327 } zio_transform_t;
    328 
    329 typedef int zio_pipe_stage_t(zio_t *zio);
    330 
    331 /*
    332  * The io_reexecute flags are distinct from io_flags because the child must
    333  * be able to propagate them to the parent.  The normal io_flags are local
    334  * to the zio, not protected by any lock, and not modifiable by children;
    335  * the reexecute flags are protected by io_lock, modifiable by children,
    336  * and always propagated -- even when ZIO_FLAG_DONT_PROPAGATE is set.
    337  */
    338 #define	ZIO_REEXECUTE_NOW	0x01
    339 #define	ZIO_REEXECUTE_SUSPEND	0x02
    340 
    341 typedef struct zio_link {
    342 	zio_t		*zl_parent;
    343 	zio_t		*zl_child;
    344 	list_node_t	zl_parent_node;
    345 	list_node_t	zl_child_node;
    346 } zio_link_t;
    347 
    348 struct zio {
    349 	/* Core information about this I/O */
    350 	zbookmark_t	io_bookmark;
    351 	zio_prop_t	io_prop;
    352 	zio_type_t	io_type;
    353 	enum zio_child	io_child_type;
    354 	int		io_cmd;
    355 	uint8_t		io_priority;
    356 	uint8_t		io_reexecute;
    357 	uint8_t		io_state[ZIO_WAIT_TYPES];
    358 	uint64_t	io_txg;
    359 	spa_t		*io_spa;
    360 	blkptr_t	*io_bp;
    361 	blkptr_t	*io_bp_override;
    362 	blkptr_t	io_bp_copy;
    363 	list_t		io_parent_list;
    364 	list_t		io_child_list;
    365 	zio_link_t	*io_walk_link;
    366 	zio_t		*io_logical;
    367 	zio_transform_t *io_transform_stack;
    368 
    369 	/* Callback info */
    370 	zio_done_func_t	*io_ready;
    371 	zio_done_func_t	*io_done;
    372 	void		*io_private;
    373 	int64_t		io_prev_space_delta;	/* DMU private */
    374 	blkptr_t	io_bp_orig;
    375 
    376 	/* Data represented by this I/O */
    377 	void		*io_data;
    378 	void		*io_orig_data;
    379 	uint64_t	io_size;
    380 	uint64_t	io_orig_size;
    381 
    382 	/* Stuff for the vdev stack */
    383 	vdev_t		*io_vd;
    384 	void		*io_vsd;
    385 	const zio_vsd_ops_t *io_vsd_ops;
    386 
    387 	uint64_t	io_offset;
    388 	uint64_t	io_deadline;
    389 	avl_node_t	io_offset_node;
    390 	avl_node_t	io_deadline_node;
    391 	avl_tree_t	*io_vdev_tree;
    392 
    393 	/* Internal pipeline state */
    394 	enum zio_flag	io_flags;
    395 	enum zio_stage	io_stage;
    396 	enum zio_stage	io_pipeline;
    397 	enum zio_flag	io_orig_flags;
    398 	enum zio_stage	io_orig_stage;
    399 	enum zio_stage	io_orig_pipeline;
    400 	int		io_error;
    401 	int		io_child_error[ZIO_CHILD_TYPES];
    402 	uint64_t	io_children[ZIO_CHILD_TYPES][ZIO_WAIT_TYPES];
    403 	uint64_t	io_child_count;
    404 	uint64_t	io_parent_count;
    405 	uint64_t	*io_stall;
    406 	zio_t		*io_gang_leader;
    407 	zio_gang_node_t	*io_gang_tree;
    408 	void		*io_executor;
    409 	void		*io_waiter;
    410 	kmutex_t	io_lock;
    411 	kcondvar_t	io_cv;
    412 
    413 	/* FMA state */
    414 	zio_cksum_report_t *io_cksum_report;
    415 	uint64_t	io_ena;
    416 };
    417 
    418 extern zio_t *zio_null(zio_t *pio, spa_t *spa, vdev_t *vd,
    419     zio_done_func_t *done, void *private, enum zio_flag flags);
    420 
    421 extern zio_t *zio_root(spa_t *spa,
    422     zio_done_func_t *done, void *private, enum zio_flag flags);
    423 
    424 extern zio_t *zio_read(zio_t *pio, spa_t *spa, const blkptr_t *bp, void *data,
    425     uint64_t size, zio_done_func_t *done, void *private,
    426     int priority, enum zio_flag flags, const zbookmark_t *zb);
    427 
    428 extern zio_t *zio_write(zio_t *pio, spa_t *spa, uint64_t txg, blkptr_t *bp,
    429     void *data, uint64_t size, const zio_prop_t *zp,
    430     zio_done_func_t *ready, zio_done_func_t *done, void *private,
    431     int priority, enum zio_flag flags, const zbookmark_t *zb);
    432 
    433 extern zio_t *zio_rewrite(zio_t *pio, spa_t *spa, uint64_t txg, blkptr_t *bp,
    434     void *data, uint64_t size, zio_done_func_t *done, void *private,
    435     int priority, enum zio_flag flags, zbookmark_t *zb);
    436 
    437 extern void zio_write_override(zio_t *zio, blkptr_t *bp, int copies);
    438 
    439 extern void zio_free(spa_t *spa, uint64_t txg, const blkptr_t *bp);
    440 
    441 extern zio_t *zio_claim(zio_t *pio, spa_t *spa, uint64_t txg,
    442     const blkptr_t *bp,
    443     zio_done_func_t *done, void *private, enum zio_flag flags);
    444 
    445 extern zio_t *zio_ioctl(zio_t *pio, spa_t *spa, vdev_t *vd, int cmd,
    446     zio_done_func_t *done, void *private, int priority, enum zio_flag flags);
    447 
    448 extern zio_t *zio_read_phys(zio_t *pio, vdev_t *vd, uint64_t offset,
    449     uint64_t size, void *data, int checksum,
    450     zio_done_func_t *done, void *private, int priority, enum zio_flag flags,
    451     boolean_t labels);
    452 
    453 extern zio_t *zio_write_phys(zio_t *pio, vdev_t *vd, uint64_t offset,
    454     uint64_t size, void *data, int checksum,
    455     zio_done_func_t *done, void *private, int priority, enum zio_flag flags,
    456     boolean_t labels);
    457 
    458 extern zio_t *zio_free_sync(zio_t *pio, spa_t *spa, uint64_t txg,
    459     const blkptr_t *bp, enum zio_flag flags);
    460 
    461 extern int zio_alloc_zil(spa_t *spa, uint64_t txg, blkptr_t *new_bp,
    462     blkptr_t *old_bp, uint64_t size, boolean_t use_slog);
    463 extern void zio_free_zil(spa_t *spa, uint64_t txg, blkptr_t *bp);
    464 extern void zio_flush(zio_t *zio, vdev_t *vd);
    465 
    466 extern int zio_wait(zio_t *zio);
    467 extern void zio_nowait(zio_t *zio);
    468 extern void zio_execute(zio_t *zio);
    469 extern void zio_interrupt(zio_t *zio);
    470 
    471 extern zio_t *zio_walk_parents(zio_t *cio);
    472 extern zio_t *zio_walk_children(zio_t *pio);
    473 extern zio_t *zio_unique_parent(zio_t *cio);
    474 extern void zio_add_child(zio_t *pio, zio_t *cio);
    475 
    476 extern void *zio_buf_alloc(size_t size);
    477 extern void zio_buf_free(void *buf, size_t size);
    478 extern void *zio_data_buf_alloc(size_t size);
    479 extern void zio_data_buf_free(void *buf, size_t size);
    480 
    481 extern void zio_resubmit_stage_async(void *);
    482 
    483 extern zio_t *zio_vdev_child_io(zio_t *zio, blkptr_t *bp, vdev_t *vd,
    484     uint64_t offset, void *data, uint64_t size, int type, int priority,
    485     enum zio_flag flags, zio_done_func_t *done, void *private);
    486 
    487 extern zio_t *zio_vdev_delegated_io(vdev_t *vd, uint64_t offset,
    488     void *data, uint64_t size, int type, int priority,
    489     enum zio_flag flags, zio_done_func_t *done, void *private);
    490 
    491 extern void zio_vdev_io_bypass(zio_t *zio);
    492 extern void zio_vdev_io_reissue(zio_t *zio);
    493 extern void zio_vdev_io_redone(zio_t *zio);
    494 
    495 extern void zio_checksum_verified(zio_t *zio);
    496 extern int zio_worst_error(int e1, int e2);
    497 
    498 extern enum zio_checksum zio_checksum_select(enum zio_checksum child,
    499     enum zio_checksum parent);
    500 extern enum zio_checksum zio_checksum_dedup_select(spa_t *spa,
    501     enum zio_checksum child, enum zio_checksum parent);
    502 extern enum zio_compress zio_compress_select(enum zio_compress child,
    503     enum zio_compress parent);
    504 
    505 extern void zio_suspend(spa_t *spa, zio_t *zio);
    506 extern int zio_resume(spa_t *spa);
    507 extern void zio_resume_wait(spa_t *spa);
    508 
    509 /*
    510  * Initial setup and teardown.
    511  */
    512 extern void zio_init(void);
    513 extern void zio_fini(void);
    514 
    515 /*
    516  * Fault injection
    517  */
    518 struct zinject_record;
    519 extern uint32_t zio_injection_enabled;
    520 extern int zio_inject_fault(char *name, int flags, int *id,
    521     struct zinject_record *record);
    522 extern int zio_inject_list_next(int *id, char *name, size_t buflen,
    523     struct zinject_record *record);
    524 extern int zio_clear_fault(int id);
    525 extern void zio_handle_panic_injection(spa_t *spa, char *tag);
    526 extern int zio_handle_fault_injection(zio_t *zio, int error);
    527 extern int zio_handle_device_injection(vdev_t *vd, zio_t *zio, int error);
    528 extern int zio_handle_label_injection(zio_t *zio, int error);
    529 extern void zio_handle_ignored_writes(zio_t *zio);
    530 
    531 /*
    532  * Checksum ereport functions
    533  */
    534 extern void zfs_ereport_start_checksum(spa_t *spa, vdev_t *vd, struct zio *zio,
    535     uint64_t offset, uint64_t length, void *arg, struct zio_bad_cksum *info);
    536 extern void zfs_ereport_finish_checksum(zio_cksum_report_t *report,
    537     const void *good_data, const void *bad_data, boolean_t drop_if_identical);
    538 
    539 extern void zfs_ereport_send_interim_checksum(zio_cksum_report_t *report);
    540 extern void zfs_ereport_free_checksum(zio_cksum_report_t *report);
    541 
    542 /* If we have the good data in hand, this function can be used */
    543 extern void zfs_ereport_post_checksum(spa_t *spa, vdev_t *vd,
    544     struct zio *zio, uint64_t offset, uint64_t length,
    545     const void *good_data, const void *bad_data, struct zio_bad_cksum *info);
    546 
    547 /* Called from spa_sync(), but primarily an injection handler */
    548 extern void spa_handle_ignored_writes(spa_t *spa);
    549 
    550 #ifdef	__cplusplus
    551 }
    552 #endif
    553 
    554 #endif	/* _ZIO_H */
    555