1 /*
2  * BSD 3-Clause New License (https://spdx.org/licenses/BSD-3-Clause.html)
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  * 1. Redistributions of source code must retain the above copyright notice,
8  * this list of conditions and the following disclaimer.
9  *
10  * 2. Redistributions in binary form must reproduce the above copyright notice,
11  * this list of conditions and the following disclaimer in the documentation
12  * and/or other materials provided with the distribution.
13  *
14  * 3. Neither the name of the copyright holder nor the names of its
15  * contributors may be used to endorse or promote products derived from this
16  * software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 /*
32  * Copyright (c) 2016-2018, Klara Inc.
33  * Copyright (c) 2016-2018, Allan Jude
34  * Copyright (c) 2018-2020, Sebastian Gottschall
35  * Copyright (c) 2019-2020, Michael Niewöhner
36  * Copyright (c) 2020, The FreeBSD Foundation [1]
37  *
38  * [1] Portions of this software were developed by Allan Jude
39  *     under sponsorship from the FreeBSD Foundation.
40  */
41 
42 #ifndef	_ZFS_ZSTD_H
43 #define	_ZFS_ZSTD_H
44 
45 #ifdef	__cplusplus
46 extern "C" {
47 #endif
48 
49 /*
50  * ZSTD block header
51  * NOTE: all fields in this header are in big endian order.
52  */
53 typedef struct zfs_zstd_header {
54 	/* Compressed size of data */
55 	uint32_t c_len;
56 
57 	/*
58 	 * Version and compression level
59 	 * We use a union to be able to big endian encode a single 32 bit
60 	 * unsigned integer, but still access the individual bitmasked
61 	 * components easily.
62 	 */
63 	union {
64 		uint32_t raw_version_level;
65 		struct {
66 			uint32_t version : 24;
67 			uint8_t level;
68 		};
69 	};
70 
71 	char data[];
72 } zfs_zstdhdr_t;
73 
74 /*
75  * kstat helper macros
76  */
77 #define	ZSTDSTAT(stat)		(zstd_stats.stat.value.ui64)
78 #define	ZSTDSTAT_ADD(stat, val) \
79 	atomic_add_64(&zstd_stats.stat.value.ui64, (val))
80 #define	ZSTDSTAT_SUB(stat, val) \
81 	atomic_sub_64(&zstd_stats.stat.value.ui64, (val))
82 #define	ZSTDSTAT_BUMP(stat)	ZSTDSTAT_ADD(stat, 1)
83 
84 /* (de)init for user space / kernel emulation */
85 int zstd_init(void);
86 void zstd_fini(void);
87 
88 size_t zfs_zstd_compress(void *s_start, void *d_start, size_t s_len,
89     size_t d_len, int level);
90 int zfs_zstd_get_level(void *s_start, size_t s_len, uint8_t *level);
91 int zfs_zstd_decompress_level(void *s_start, void *d_start, size_t s_len,
92     size_t d_len, uint8_t *level);
93 int zfs_zstd_decompress(void *s_start, void *d_start, size_t s_len,
94     size_t d_len, int n);
95 void zfs_zstd_cache_reap_now(void);
96 
97 #ifdef	__cplusplus
98 }
99 #endif
100 
101 #endif /* _ZFS_ZSTD_H */
102