xref: /freebsd/sys/contrib/openzfs/cmd/zstream/zstream_io.h (revision d0b3ecdc274930e190ea233b6b69ff03782eaf8d)
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