zstd_compress_module.c (4830B)
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#include "common/zstd_deps.h" 18#include "common/zstd_internal.h" 19 20#define ZSTD_FORWARD_IF_ERR(ret) \ 21 do { \ 22 size_t const __ret = (ret); \ 23 if (ZSTD_isError(__ret)) \ 24 return __ret; \ 25 } while (0) 26 27static size_t zstd_cctx_init(zstd_cctx *cctx, const zstd_parameters *parameters, 28 unsigned long long pledged_src_size) 29{ 30 ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_reset( 31 cctx, ZSTD_reset_session_and_parameters)); 32 ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setPledgedSrcSize( 33 cctx, pledged_src_size)); 34 ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 35 cctx, ZSTD_c_windowLog, parameters->cParams.windowLog)); 36 ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 37 cctx, ZSTD_c_hashLog, parameters->cParams.hashLog)); 38 ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 39 cctx, ZSTD_c_chainLog, parameters->cParams.chainLog)); 40 ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 41 cctx, ZSTD_c_searchLog, parameters->cParams.searchLog)); 42 ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 43 cctx, ZSTD_c_minMatch, parameters->cParams.minMatch)); 44 ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 45 cctx, ZSTD_c_targetLength, parameters->cParams.targetLength)); 46 ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 47 cctx, ZSTD_c_strategy, parameters->cParams.strategy)); 48 ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 49 cctx, ZSTD_c_contentSizeFlag, parameters->fParams.contentSizeFlag)); 50 ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 51 cctx, ZSTD_c_checksumFlag, parameters->fParams.checksumFlag)); 52 ZSTD_FORWARD_IF_ERR(ZSTD_CCtx_setParameter( 53 cctx, ZSTD_c_dictIDFlag, !parameters->fParams.noDictIDFlag)); 54 return 0; 55} 56 57int zstd_min_clevel(void) 58{ 59 return ZSTD_minCLevel(); 60} 61EXPORT_SYMBOL(zstd_min_clevel); 62 63int zstd_max_clevel(void) 64{ 65 return ZSTD_maxCLevel(); 66} 67EXPORT_SYMBOL(zstd_max_clevel); 68 69size_t zstd_compress_bound(size_t src_size) 70{ 71 return ZSTD_compressBound(src_size); 72} 73EXPORT_SYMBOL(zstd_compress_bound); 74 75zstd_parameters zstd_get_params(int level, 76 unsigned long long estimated_src_size) 77{ 78 return ZSTD_getParams(level, estimated_src_size, 0); 79} 80EXPORT_SYMBOL(zstd_get_params); 81 82size_t zstd_cctx_workspace_bound(const zstd_compression_parameters *cparams) 83{ 84 return ZSTD_estimateCCtxSize_usingCParams(*cparams); 85} 86EXPORT_SYMBOL(zstd_cctx_workspace_bound); 87 88zstd_cctx *zstd_init_cctx(void *workspace, size_t workspace_size) 89{ 90 if (workspace == NULL) 91 return NULL; 92 return ZSTD_initStaticCCtx(workspace, workspace_size); 93} 94EXPORT_SYMBOL(zstd_init_cctx); 95 96size_t zstd_compress_cctx(zstd_cctx *cctx, void *dst, size_t dst_capacity, 97 const void *src, size_t src_size, const zstd_parameters *parameters) 98{ 99 ZSTD_FORWARD_IF_ERR(zstd_cctx_init(cctx, parameters, src_size)); 100 return ZSTD_compress2(cctx, dst, dst_capacity, src, src_size); 101} 102EXPORT_SYMBOL(zstd_compress_cctx); 103 104size_t zstd_cstream_workspace_bound(const zstd_compression_parameters *cparams) 105{ 106 return ZSTD_estimateCStreamSize_usingCParams(*cparams); 107} 108EXPORT_SYMBOL(zstd_cstream_workspace_bound); 109 110zstd_cstream *zstd_init_cstream(const zstd_parameters *parameters, 111 unsigned long long pledged_src_size, void *workspace, size_t workspace_size) 112{ 113 zstd_cstream *cstream; 114 115 if (workspace == NULL) 116 return NULL; 117 118 cstream = ZSTD_initStaticCStream(workspace, workspace_size); 119 if (cstream == NULL) 120 return NULL; 121 122 /* 0 means unknown in linux zstd API but means 0 in new zstd API */ 123 if (pledged_src_size == 0) 124 pledged_src_size = ZSTD_CONTENTSIZE_UNKNOWN; 125 126 if (ZSTD_isError(zstd_cctx_init(cstream, parameters, pledged_src_size))) 127 return NULL; 128 129 return cstream; 130} 131EXPORT_SYMBOL(zstd_init_cstream); 132 133size_t zstd_reset_cstream(zstd_cstream *cstream, 134 unsigned long long pledged_src_size) 135{ 136 return ZSTD_resetCStream(cstream, pledged_src_size); 137} 138EXPORT_SYMBOL(zstd_reset_cstream); 139 140size_t zstd_compress_stream(zstd_cstream *cstream, zstd_out_buffer *output, 141 zstd_in_buffer *input) 142{ 143 return ZSTD_compressStream(cstream, output, input); 144} 145EXPORT_SYMBOL(zstd_compress_stream); 146 147size_t zstd_flush_stream(zstd_cstream *cstream, zstd_out_buffer *output) 148{ 149 return ZSTD_flushStream(cstream, output); 150} 151EXPORT_SYMBOL(zstd_flush_stream); 152 153size_t zstd_end_stream(zstd_cstream *cstream, zstd_out_buffer *output) 154{ 155 return ZSTD_endStream(cstream, output); 156} 157EXPORT_SYMBOL(zstd_end_stream); 158 159MODULE_LICENSE("Dual BSD/GPL"); 160MODULE_DESCRIPTION("Zstd Compressor");