1*d0b3ecdcSMartin Matuska // SPDX-License-Identifier: CDDL-1.0 2*d0b3ecdcSMartin Matuska /* 3*d0b3ecdcSMartin Matuska * CDDL HEADER START 4*d0b3ecdcSMartin Matuska * 5*d0b3ecdcSMartin Matuska * This file and its contents are supplied under the terms of the Common 6*d0b3ecdcSMartin Matuska * Development and Distribution License ("CDDL"), version 1.0. You may only use 7*d0b3ecdcSMartin Matuska * this file in accordance with the terms of version 1.0 of the CDDL. 8*d0b3ecdcSMartin Matuska * 9*d0b3ecdcSMartin Matuska * A full copy of the text of the CDDL should have accompanied this source. A 10*d0b3ecdcSMartin Matuska * copy of the CDDL is also available via the Internet at 11*d0b3ecdcSMartin Matuska * http://www.illumos.org/license/CDDL. 12*d0b3ecdcSMartin Matuska * 13*d0b3ecdcSMartin Matuska * CDDL HEADER END 14*d0b3ecdcSMartin Matuska */ 15*d0b3ecdcSMartin Matuska 16*d0b3ecdcSMartin Matuska /* 17*d0b3ecdcSMartin Matuska * Copyright (c) 2026 by Garth Snyder. All rights reserved. 18*d0b3ecdcSMartin Matuska */ 19*d0b3ecdcSMartin Matuska 20*d0b3ecdcSMartin Matuska #ifndef _ZSTREAM_IO_H 21*d0b3ecdcSMartin Matuska #define _ZSTREAM_IO_H 22*d0b3ecdcSMartin Matuska 23*d0b3ecdcSMartin Matuska #ifdef __cplusplus 24*d0b3ecdcSMartin Matuska extern "C" { 25*d0b3ecdcSMartin Matuska #endif 26*d0b3ecdcSMartin Matuska 27*d0b3ecdcSMartin Matuska #include <sys/types.h> 28*d0b3ecdcSMartin Matuska #include <sys/zfs_ioctl.h> 29*d0b3ecdcSMartin Matuska 30*d0b3ecdcSMartin Matuska #include "zstream_chain.h" 31*d0b3ecdcSMartin Matuska 32*d0b3ecdcSMartin Matuska #define MAX_IO_STREAMS 4 33*d0b3ecdcSMartin Matuska 34*d0b3ecdcSMartin Matuska /* 35*d0b3ecdcSMartin Matuska * The stream offset is the offset within the original source stream. 36*d0b3ecdcSMartin Matuska * Changes to the stream (e.g., recompression) will necessarily change 37*d0b3ecdcSMartin Matuska * offsets within the final stream. The original stream offset is raw data; 38*d0b3ecdcSMartin Matuska * it should never be updated. 39*d0b3ecdcSMartin Matuska */ 40*d0b3ecdcSMartin Matuska typedef struct { 41*d0b3ecdcSMartin Matuska dmu_replay_record_t dp_drr; 42*d0b3ecdcSMartin Matuska uint8_t *dp_payload; 43*d0b3ecdcSMartin Matuska uint32_t dp_payload_size; 44*d0b3ecdcSMartin Matuska off_t dp_stream_offset; 45*d0b3ecdcSMartin Matuska } drr_packet_t; 46*d0b3ecdcSMartin Matuska 47*d0b3ecdcSMartin Matuska /* 48*d0b3ecdcSMartin Matuska * In the following, the filename or checkpoint names must remain valid 49*d0b3ecdcSMartin Matuska * as long as the chain is executing. 50*d0b3ecdcSMartin Matuska */ 51*d0b3ecdcSMartin Matuska 52*d0b3ecdcSMartin Matuska chain_step_t 53*d0b3ecdcSMartin Matuska serial_read_stream(const char *filename); 54*d0b3ecdcSMartin Matuska 55*d0b3ecdcSMartin Matuska chain_step_t 56*d0b3ecdcSMartin Matuska serial_write_stream(const char *filename); 57*d0b3ecdcSMartin Matuska 58*d0b3ecdcSMartin Matuska /* Report throughput periodically */ 59*d0b3ecdcSMartin Matuska chain_step_t 60*d0b3ecdcSMartin Matuska serial_checkpoint(const char *name); 61*d0b3ecdcSMartin Matuska 62*d0b3ecdcSMartin Matuska /* 63*d0b3ecdcSMartin Matuska * Usually the output step is responsible for freeing payloads. Subcommands 64*d0b3ecdcSMartin Matuska * that don't have stream outputs still need to free this memory. A 65*d0b3ecdcSMartin Matuska * serial_null_output step does this and nothing more. 66*d0b3ecdcSMartin Matuska */ 67*d0b3ecdcSMartin Matuska chain_step_t 68*d0b3ecdcSMartin Matuska serial_null_output(void); 69*d0b3ecdcSMartin Matuska 70*d0b3ecdcSMartin Matuska #ifdef __cplusplus 71*d0b3ecdcSMartin Matuska } 72*d0b3ecdcSMartin Matuska #endif 73*d0b3ecdcSMartin Matuska 74*d0b3ecdcSMartin Matuska #endif /* _ZSTREAM_IO_H */ 75