/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* Copyright (c) 2012, 2015 by Delphix. All rights reserved.
*/
#ifndef _ZIO_IMPL_H
#define _ZIO_IMPL_H
#include <sys/zfs_context.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
* XXX -- Describe ZFS I/O pipeline here. Fill in as needed.
*
* The ZFS I/O pipeline is comprised of various stages which are defined
* in the zio_stage enum below. The individual stages are used to construct
* these basic I/O operations: Read, Write, Free, Claim, and Ioctl.
*
* I/O operations: (XXX - provide detail for each of the operations)
*
* Read:
* Write:
* Free:
* Claim:
* Ioctl:
*
* Although the most common pipeline are used by the basic I/O operations
* above, there are some helper pipelines (one could consider them
* sub-pipelines) which are used internally by the ZIO module and are
* explained below:
*
* Interlock Pipeline:
* The interlock pipeline is the most basic pipeline and is used by all
* of the I/O operations. The interlock pipeline does not perform any I/O
*
* Vdev child Pipeline:
* The vdev child pipeline is responsible for performing the physical I/O.
* It is in this pipeline where the I/O are queued and possibly cached.
*
* In addition to performing I/O, the pipeline is also responsible for
* data transformations. The transformations performed are based on the
* specific properties that user may have selected and modify the
* behavior of the pipeline. Examples of supported transformations are
* compression, dedup, and nop writes. Transformations will either modify
* the data or the pipeline. This list below further describes each of
* the supported transformations:
*
* Compression:
* ZFS supports three different flavors of compression -- gzip, lzjb, and
* zle. Compression occurs as part of the write pipeline and is performed
* in the ZIO_STAGE_WRITE_BP_INIT stage.
*
* Dedup:
* Dedup reads are handled by the ZIO_STAGE_DDT_READ_START and
* ZIO_STAGE_DDT_READ_DONE stages. These stages are added to an existing
* read pipeline if the dedup bit is set on the block pointer.
* Writing a dedup block is performed by the ZIO_STAGE_DDT_WRITE stage
* and added to a write pipeline if a user has enabled dedup on that
* particular dataset.
*
* NOP Write:
* The NOP write feature is performed by the ZIO_STAGE_NOP_WRITE stage
* and is added to an existing write pipeline if a crypographically
* secure checksum (i.e. SHA256) is enabled and compression is turned on.
* The NOP write stage will compare the checksums of the current data
* on-disk (level-0 blocks only) and the data that is currently being written.
* If the checksum values are identical then the pipeline is converted to
* an interlock pipeline skipping block allocation and bypassing the
* physical I/O. The nop write feature can handle writes in either
* syncing or open context (i.e. zil writes) and as a result is mutually
* exclusive with dedup.
*/
/*
* zio pipeline stage definitions
*/
enum zio_stage {
};
#define ZIO_INTERLOCK_STAGES \
(ZIO_STAGE_READY | \
#define ZIO_INTERLOCK_PIPELINE \
#define ZIO_VDEV_IO_STAGES \
#define ZIO_VDEV_CHILD_PIPELINE \
(ZIO_VDEV_IO_STAGES | \
#define ZIO_READ_COMMON_STAGES \
(ZIO_INTERLOCK_STAGES | \
#define ZIO_READ_PHYS_PIPELINE \
#define ZIO_READ_PIPELINE \
#define ZIO_DDT_CHILD_READ_PIPELINE \
#define ZIO_DDT_READ_PIPELINE \
(ZIO_INTERLOCK_STAGES | \
#define ZIO_WRITE_COMMON_STAGES \
(ZIO_INTERLOCK_STAGES | \
#define ZIO_WRITE_PHYS_PIPELINE \
#define ZIO_REWRITE_PIPELINE \
#define ZIO_WRITE_PIPELINE \
#define ZIO_DDT_CHILD_WRITE_PIPELINE \
(ZIO_INTERLOCK_STAGES | \
#define ZIO_DDT_WRITE_PIPELINE \
(ZIO_INTERLOCK_STAGES | \
#define ZIO_GANG_STAGES \
#define ZIO_FREE_PIPELINE \
(ZIO_INTERLOCK_STAGES | \
#define ZIO_DDT_FREE_PIPELINE \
(ZIO_INTERLOCK_STAGES | \
#define ZIO_CLAIM_PIPELINE \
(ZIO_INTERLOCK_STAGES | \
#define ZIO_IOCTL_PIPELINE \
(ZIO_INTERLOCK_STAGES | \
#define ZIO_BLOCKING_STAGES \
extern void zio_inject_init(void);
extern void zio_inject_fini(void);
#ifdef __cplusplus
}
#endif
#endif /* _ZIO_IMPL_H */