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