zstd_compress_module.c 4.7 KB

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