fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER START
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The contents of this file are subject to the terms of the
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * Common Development and Distribution License (the "License").
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * You may not use this file except in compliance with the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fa9e4066f08beec538e775443c5be79dd423fcabahrens * See the License for the specific language governing permissions
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and limitations under the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * When distributing Covered Code, include this CDDL HEADER in each
fa9e4066f08beec538e775443c5be79dd423fcabahrens * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If applicable, add the following below this CDDL HEADER, with the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * fields enclosed by brackets "[]" replaced with your own identifying
fa9e4066f08beec538e775443c5be79dd423fcabahrens * information: Portions Copyright [yyyy] [name of copyright owner]
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER END
c7cd242109c82107ec2e50013369e92be9d77702George Wilson * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
5aeb94743e3be0c51e86f73096334611ae3a058eGarrett D'Amore * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
8df0bcf0df7622a075cc6e52f659d2fcfdd08cdcPaul Dagnelie * Copyright (c) 2012, 2016 by Delphix. All rights reserved.
a6f561b4aee75d0d028e7b36b151c8ed8a86bc76Sašo Kiselkov * Copyright (c) 2013 by Saso Kiselkov. All rights reserved.
810e43b2eb0e320833671a403fdda51917e8b036Bill Pijewski * Copyright (c) 2013, Joyent, Inc. All rights reserved.
c8811bd3e2427dddbac6c05a59cfe117d8fea370Toomas Soome * Copyright 2016 Toomas Soome <tsoome@me.com>
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern "C" {
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin * Embedded checksum
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin uint64_t zec_magic; /* for validation, endianness */
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Gang block headers are self-checksumming and contain an array
fa9e4066f08beec538e775443c5be79dd423fcabahrens * of block pointers.
5d7b4d438c4a51eccc95e77a83a437b4d48380ebMatthew Ahrens * The number of "legacy" compression functions which can be set on individual
5d7b4d438c4a51eccc95e77a83a437b4d48380ebMatthew Ahrens#define ZIO_CHECKSUM_LEGACY_FUNCTIONS ZIO_CHECKSUM_ZILOG2
7e322df5ee63a00c1c57398abec50fc1dc54b67aJonathan Adams#define ZIO_CHECKSUM_ON_VALUE ZIO_CHECKSUM_FLETCHER_4
5d7b4d438c4a51eccc95e77a83a437b4d48380ebMatthew Ahrens * The number of "legacy" compression functions which can be set on individual
5d7b4d438c4a51eccc95e77a83a437b4d48380ebMatthew Ahrens#define ZIO_COMPRESS_LEGACY_FUNCTIONS ZIO_COMPRESS_LZ4
db1741f555ec79def5e9846e6bfd132248514ffeJustin T. Gibbs * The meaning of "compress = on" selected by the compression features enabled
db1741f555ec79def5e9846e6bfd132248514ffeJustin T. Gibbs * on a given pool.
db1741f555ec79def5e9846e6bfd132248514ffeJustin T. Gibbs#define ZIO_COMPRESS_LEGACY_ON_VALUE ZIO_COMPRESS_LZJB
db1741f555ec79def5e9846e6bfd132248514ffeJustin T. Gibbs#define ZIO_COMPRESS_LZ4_ON_VALUE ZIO_COMPRESS_LZ4
db1741f555ec79def5e9846e6bfd132248514ffeJustin T. Gibbs#define ZIO_COMPRESS_DEFAULT ZIO_COMPRESS_OFF
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick * Flags inherited by gang, ddt, and vdev children,
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick * and that must be equal for two zios to aggregate
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick#define ZIO_FLAG_AGG_INHERIT (ZIO_FLAG_CANFAIL - 1)
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick * Flags inherited by ddt, gang, and vdev children.
2a104a5236475eb73aa41eaaf3ed9f3ccbe0ca55Alex Reece ZIO_FLAG_CANFAIL = 1 << 7, /* must be first for INHERIT */
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick#define ZIO_FLAG_DDT_INHERIT (ZIO_FLAG_IO_RETRY - 1)
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick#define ZIO_FLAG_GANG_INHERIT (ZIO_FLAG_IO_RETRY - 1)
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick * Flags inherited by vdev children.
0f7643c7376dd69a08acbfc9d1d7d548b10c846aGeorge Wilson ZIO_FLAG_IO_RETRY = 1 << 15, /* must be first for INHERIT */
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick#define ZIO_FLAG_VDEV_INHERIT (ZIO_FLAG_DONT_QUEUE - 1)
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick * Flags not inherited by any children.
0f7643c7376dd69a08acbfc9d1d7d548b10c846aGeorge Wilson ZIO_FLAG_DONT_QUEUE = 1 << 19, /* must be first for INHERIT */
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw * We'll take the unused errnos, 'EBADE' and 'EBADR' (from the Convergent
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw * graveyard) to indicate checksum errors and fragmentation.
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * A bookmark is a four-tuple <objset, object, level, blkid> that uniquely
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * identifies any block in the pool. By convention, the meta-objset (MOS)
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick * is objset 0, and the meta-dnode is object 0. This covers all blocks
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick * except root blocks and ZIL blocks, which are defined as follows:
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick * Root blocks (objset_phys_t) are object 0, level -1: <objset, 0, -1, 0>.
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick * ZIL blocks are bookmarked <objset, 0, -2, blkid == ZIL sequence number>.
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick * dmu_sync()ed ZIL data blocks are bookmarked <objset, object, -2, blkid>.
a2cdcdd260232b58202b11a9bfc0103c9449ed52Paul Dagnelie * dnode visit bookmarks are <objset, object id of dnode, -3, 0>.
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick * Note: this structure is called a bookmark because its original purpose
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick * was to remember where to resume a pool-wide traverse.
7802d7bf98dec568dadf72286893b1fe5abd8602Matthew Ahrens * Note: this structure is passed between userland and the kernel, and is
7802d7bf98dec568dadf72286893b1fe5abd8602Matthew Ahrens * stored on disk (by virtue of being incorporated into other on-disk
7802d7bf98dec568dadf72286893b1fe5abd8602Matthew Ahrens * structures, e.g. dsl_scan_phys_t).
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick#define SET_BOOKMARK(zb, objset, object, level, blkid) \
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden ((zb)->zb_objset == 0 && (zb)->zb_object == 0 && \
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden (zb)->zb_level == 0 && (zb)->zb_blkid == 0)
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adamstypedef struct zio_cksum_report zio_cksum_report_t;
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adamstypedef void zio_cksum_finish_f(zio_cksum_report_t *rep,
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adamstypedef void zio_cksum_free_f(void *cbdata, size_t size);
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adamsstruct zio_bad_cksum; /* defined in zio_checksum.h */
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adams size_t zcr_cbinfo; /* passed to zcr_free() */
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adams /* internal use only */
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adams struct zio_bad_cksum *zcr_ckinfo; /* information from failure */
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adamstypedef void zio_vsd_cksum_report_f(zio_t *zio, zio_cksum_report_t *zcr,
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adamszio_vsd_cksum_report_f zio_vsd_default_cksum_report;
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick struct zio_gang_node *gn_child[SPA_GBH_NBLKPTRS];
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwicktypedef zio_t *zio_gang_issue_func_t(zio_t *zio, blkptr_t *bp,
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwicktypedef void zio_transform_func_t(zio_t *zio, void *data, uint64_t size);
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick * The io_reexecute flags are distinct from io_flags because the child must
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick * be able to propagate them to the parent. The normal io_flags are local
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick * to the zio, not protected by any lock, and not modifiable by children;
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick * the reexecute flags are protected by io_lock, modifiable by children,
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick * and always propagated -- even when ZIO_FLAG_DONT_PROPAGATE is set.
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Core information about this I/O */
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Callback info */
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Data represented by this I/O */
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel /* io_lsize != io_orig_size iff this is a raw write */
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Stuff for the vdev stack */
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Internal pipeline state */
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick uint64_t io_children[ZIO_CHILD_TYPES][ZIO_WAIT_TYPES];
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock /* FMA state */
5aeb94743e3be0c51e86f73096334611ae3a058eGarrett D'Amore /* Taskq dispatching state */
0f7643c7376dd69a08acbfc9d1d7d548b10c846aGeorge Wilsonextern int zio_timestamp_compare(const void *, const void *);
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Mooreextern zio_t *zio_null(zio_t *pio, spa_t *spa, vdev_t *vd,
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick zio_done_func_t *done, void *private, enum zio_flag flags);
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick zio_done_func_t *done, void *private, enum zio_flag flags);
088f389458728c464569a5506b58070254fa4f7dahrensextern zio_t *zio_read(zio_t *pio, spa_t *spa, const blkptr_t *bp, void *data,
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel uint64_t lsize, zio_done_func_t *done, void *private,
7802d7bf98dec568dadf72286893b1fe5abd8602Matthew Ahrens zio_priority_t priority, enum zio_flag flags, const zbookmark_phys_t *zb);
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwickextern zio_t *zio_write(zio_t *pio, spa_t *spa, uint64_t txg, blkptr_t *bp,
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel void *data, uint64_t size, uint64_t psize, const zio_prop_t *zp,
8df0bcf0df7622a075cc6e52f659d2fcfdd08cdcPaul Dagnelie zio_done_func_t *ready, zio_done_func_t *children_ready,
8df0bcf0df7622a075cc6e52f659d2fcfdd08cdcPaul Dagnelie zio_done_func_t *physdone, zio_done_func_t *done,
8df0bcf0df7622a075cc6e52f659d2fcfdd08cdcPaul Dagnelie void *private, zio_priority_t priority, enum zio_flag flags,
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwickextern zio_t *zio_rewrite(zio_t *pio, spa_t *spa, uint64_t txg, blkptr_t *bp,
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick void *data, uint64_t size, zio_done_func_t *done, void *private,
7802d7bf98dec568dadf72286893b1fe5abd8602Matthew Ahrens zio_priority_t priority, enum zio_flag flags, zbookmark_phys_t *zb);
80901aea8e78a2c20751f61f01bebd1d5b5c2ba5George Wilsonextern void zio_write_override(zio_t *zio, blkptr_t *bp, int copies,
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwickextern void zio_free(spa_t *spa, uint64_t txg, const blkptr_t *bp);
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwickextern zio_t *zio_claim(zio_t *pio, spa_t *spa, uint64_t txg,
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick zio_done_func_t *done, void *private, enum zio_flag flags);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern zio_t *zio_ioctl(zio_t *pio, spa_t *spa, vdev_t *vd, int cmd,
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens zio_done_func_t *done, void *private, enum zio_flag flags);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern zio_t *zio_read_phys(zio_t *pio, vdev_t *vd, uint64_t offset,
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens zio_done_func_t *done, void *private, zio_priority_t priority,
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern zio_t *zio_write_phys(zio_t *pio, vdev_t *vd, uint64_t offset,
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens zio_done_func_t *done, void *private, zio_priority_t priority,
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwickextern zio_t *zio_free_sync(zio_t *pio, spa_t *spa, uint64_t txg,
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwickextern int zio_alloc_zil(spa_t *spa, uint64_t txg, blkptr_t *new_bp,
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick blkptr_t *old_bp, uint64_t size, boolean_t use_slog);
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwickextern void zio_free_zil(spa_t *spa, uint64_t txg, blkptr_t *bp);
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrinextern void zio_shrink(zio_t *zio, uint64_t size);
0f7643c7376dd69a08acbfc9d1d7d548b10c846aGeorge Wilsonextern zio_t *zio_walk_parents(zio_t *cio, zio_link_t **);
0f7643c7376dd69a08acbfc9d1d7d548b10c846aGeorge Wilsonextern zio_t *zio_walk_children(zio_t *pio, zio_link_t **);
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Mooreextern void zio_add_child(zio_t *pio, zio_t *cio);
ad23a2db4cfc94c0ed1d58554479ce8d2e7e5768johansenextern void zio_data_buf_free(void *buf, size_t size);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilsonextern void zio_push_transform(zio_t *zio, void *data, uint64_t size,
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson uint64_t bufsize, zio_transform_func_t *transform);
0a4e9518a44f226be6d39383330b5b1792d2f184gwextern void zio_resubmit_stage_async(void *);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern zio_t *zio_vdev_child_io(zio_t *zio, blkptr_t *bp, vdev_t *vd,
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens uint64_t offset, void *data, uint64_t size, int type,
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens zio_priority_t priority, enum zio_flag flags,
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwickextern zio_t *zio_vdev_delegated_io(vdev_t *vd, uint64_t offset,
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens void *data, uint64_t size, int type, zio_priority_t priority,
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick enum zio_flag flags, zio_done_func_t *done, void *private);
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwickextern enum zio_checksum zio_checksum_select(enum zio_checksum child,
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwickextern enum zio_checksum zio_checksum_dedup_select(spa_t *spa,
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick enum zio_checksum child, enum zio_checksum parent);
db1741f555ec79def5e9846e6bfd132248514ffeJustin T. Gibbsextern enum zio_compress zio_compress_select(spa_t *spa,
db1741f555ec79def5e9846e6bfd132248514ffeJustin T. Gibbs enum zio_compress child, enum zio_compress parent);
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwickextern void zio_suspend(spa_t *spa, zio_t *zio);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Initial setup and teardown.
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void zio_init(void);
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern void zio_fini(void);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * Fault injection
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockextern int zio_inject_fault(char *name, int flags, int *id,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockextern int zio_inject_list_next(int *id, char *name, size_t buflen,
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musanteextern void zio_handle_panic_injection(spa_t *spa, char *tag, uint64_t type);
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockextern int zio_handle_fault_injection(zio_t *zio, int error);
8956713aded83a741173fcd4f9ef1c83521fbea9Eric Schrockextern int zio_handle_device_injection(vdev_t *vd, zio_t *zio, int error);
21bf64a78855d076f09716ea1c06175d954e934cgwextern int zio_handle_label_injection(zio_t *zio, int error);
97e81309571898df9fdd94aab1216dfcf23e060bPrakash Suryaextern hrtime_t zio_handle_io_delay(zio_t *zio);
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adams * Checksum ereport functions
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adamsextern void zfs_ereport_start_checksum(spa_t *spa, vdev_t *vd, struct zio *zio,
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adams uint64_t offset, uint64_t length, void *arg, struct zio_bad_cksum *info);
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adamsextern void zfs_ereport_finish_checksum(zio_cksum_report_t *report,
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adams const void *good_data, const void *bad_data, boolean_t drop_if_identical);
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adamsextern void zfs_ereport_send_interim_checksum(zio_cksum_report_t *report);
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adamsextern void zfs_ereport_free_checksum(zio_cksum_report_t *report);
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adams/* If we have the good data in hand, this function can be used */
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adamsextern void zfs_ereport_post_checksum(spa_t *spa, vdev_t *vd,
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adams struct zio *zio, uint64_t offset, uint64_t length,
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adams const void *good_data, const void *bad_data, struct zio_bad_cksum *info);
468c413a79615e77179e8d98f22a7e513a8135bdTim Haley/* Called from spa_sync(), but primarily an injection handler */
7802d7bf98dec568dadf72286893b1fe5abd8602Matthew Ahrens/* zbookmark_phys functions */
a2cdcdd260232b58202b11a9bfc0103c9449ed52Paul Dagnelieboolean_t zbookmark_subtree_completed(const struct dnode_phys *dnp,
a2cdcdd260232b58202b11a9bfc0103c9449ed52Paul Dagnelie const zbookmark_phys_t *subtree_root, const zbookmark_phys_t *last_block);
a2cdcdd260232b58202b11a9bfc0103c9449ed52Paul Dagnelieint zbookmark_compare(uint16_t dbss1, uint8_t ibs1, uint16_t dbss2,
a2cdcdd260232b58202b11a9bfc0103c9449ed52Paul Dagnelie uint8_t ibs2, const zbookmark_phys_t *zb1, const zbookmark_phys_t *zb2);
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif /* _ZIO_H */