]> git.sesse.net Git - bcachefs-tools-debian/blob - c_src/linux/zstd_compress_module.c
rust: bump rpassword to v7.x
[bcachefs-tools-debian] / c_src / linux / zstd_compress_module.c
1 // SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
2 /*
3  * Copyright (c) Facebook, Inc.
4  * All rights reserved.
5  *
6  * This source code is licensed under both the BSD-style license (found in the
7  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
8  * in the COPYING file in the root directory of this source tree).
9  * You may select, at your option, one of the above-listed licenses.
10  */
11
12 #include <linux/kernel.h>
13 #include <linux/module.h>
14 #include <linux/string.h>
15 #include <linux/zstd.h>
16
17 #define ZSTD_FORWARD_IF_ERR(ret)            \
18         do {                                \
19                 size_t const __ret = (ret); \
20                 if (ZSTD_isError(__ret))    \
21                         return __ret;       \
22         } while (0)
23
24 static size_t zstd_cctx_init(zstd_cctx *cctx, const zstd_parameters *parameters,
25         unsigned long long pledged_src_size)
26 {
27         ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_reset(
28                 cctx, ZSTD_reset_session_and_parameters));
29         ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setPledgedSrcSize(
30                 cctx, pledged_src_size));
31         ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
32                 cctx, ZSTD_c_windowLog, parameters->cParams.windowLog));
33         ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
34                 cctx, ZSTD_c_hashLog, parameters->cParams.hashLog));
35         ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
36                 cctx, ZSTD_c_chainLog, parameters->cParams.chainLog));
37         ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
38                 cctx, ZSTD_c_searchLog, parameters->cParams.searchLog));
39         ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
40                 cctx, ZSTD_c_minMatch, parameters->cParams.minMatch));
41         ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
42                 cctx, ZSTD_c_targetLength, parameters->cParams.targetLength));
43         ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
44                 cctx, ZSTD_c_strategy, parameters->cParams.strategy));
45         ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
46                 cctx, ZSTD_c_contentSizeFlag, parameters->fParams.contentSizeFlag));
47         ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
48                 cctx, ZSTD_c_checksumFlag, parameters->fParams.checksumFlag));
49         ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter(
50                 cctx, ZSTD_c_dictIDFlag, !parameters->fParams.noDictIDFlag));
51         return 0;
52 }
53
54 int zstd_min_clevel(void)
55 {
56         return ZSTD_minCLevel();
57 }
58 EXPORT_SYMBOL(zstd_min_clevel);
59
60 int zstd_max_clevel(void)
61 {
62         return ZSTD_maxCLevel();
63 }
64 EXPORT_SYMBOL(zstd_max_clevel);
65
66 size_t zstd_compress_bound(size_t src_size)
67 {
68         return ZSTD_compressBound(src_size);
69 }
70 EXPORT_SYMBOL(zstd_compress_bound);
71
72 zstd_parameters zstd_get_params(int level,
73         unsigned long long estimated_src_size)
74 {
75         return ZSTD_getParams(level, estimated_src_size, 0);
76 }
77 EXPORT_SYMBOL(zstd_get_params);
78
79 size_t zstd_cctx_workspace_bound(const zstd_compression_parameters *cparams)
80 {
81         return ZSTD_estimateCCtxSize_usingCParams(*cparams);
82 }
83 EXPORT_SYMBOL(zstd_cctx_workspace_bound);
84
85 zstd_cctx *zstd_init_cctx(void *workspace, size_t workspace_size)
86 {
87         if (workspace == NULL)
88                 return NULL;
89         return ZSTD_initStaticCCtx(workspace, workspace_size);
90 }
91 EXPORT_SYMBOL(zstd_init_cctx);
92
93 size_t zstd_compress_cctx(zstd_cctx *cctx, void *dst, size_t dst_capacity,
94         const void *src, size_t src_size, const zstd_parameters *parameters)
95 {
96         ZSTD_FORWARD_IF_ERR(zstd_cctx_init(cctx, parameters, src_size));
97         return ZSTD_compress2(cctx, dst, dst_capacity, src, src_size);
98 }
99 EXPORT_SYMBOL(zstd_compress_cctx);
100
101 size_t zstd_cstream_workspace_bound(const zstd_compression_parameters *cparams)
102 {
103         return ZSTD_estimateCStreamSize_usingCParams(*cparams);
104 }
105 EXPORT_SYMBOL(zstd_cstream_workspace_bound);
106
107 zstd_cstream *zstd_init_cstream(const zstd_parameters *parameters,
108         unsigned long long pledged_src_size, void *workspace, size_t workspace_size)
109 {
110         zstd_cstream *cstream;
111
112         if (workspace == NULL)
113                 return NULL;
114
115         cstream = ZSTD_initStaticCStream(workspace, workspace_size);
116         if (cstream == NULL)
117                 return NULL;
118
119         /* 0 means unknown in linux zstd API but means 0 in new zstd API */
120         if (pledged_src_size == 0)
121                 pledged_src_size = ZSTD_CONTENTSIZE_UNKNOWN;
122
123         if (ZSTD_isError(zstd_cctx_init(cstream, parameters, pledged_src_size)))
124                 return NULL;
125
126         return cstream;
127 }
128 EXPORT_SYMBOL(zstd_init_cstream);
129
130 size_t zstd_reset_cstream(zstd_cstream *cstream,
131         unsigned long long pledged_src_size)
132 {
133         return ZSTD_resetCStream(cstream, pledged_src_size);
134 }
135 EXPORT_SYMBOL(zstd_reset_cstream);
136
137 size_t zstd_compress_stream(zstd_cstream *cstream, zstd_out_buffer *output,
138         zstd_in_buffer *input)
139 {
140         return ZSTD_compressStream(cstream, output, input);
141 }
142 EXPORT_SYMBOL(zstd_compress_stream);
143
144 size_t zstd_flush_stream(zstd_cstream *cstream, zstd_out_buffer *output)
145 {
146         return ZSTD_flushStream(cstream, output);
147 }
148 EXPORT_SYMBOL(zstd_flush_stream);
149
150 size_t zstd_end_stream(zstd_cstream *cstream, zstd_out_buffer *output)
151 {
152         return ZSTD_endStream(cstream, output);
153 }
154 EXPORT_SYMBOL(zstd_end_stream);
155
156 MODULE_LICENSE("Dual BSD/GPL");
157 MODULE_DESCRIPTION("Zstd Compressor");