From: Nick Terrell <terre...@fb.com>

Move away from the compatibility wrapper to the zstd-1.4.6 API. This
code is functionally equivalent.

Signed-off-by: Nick Terrell <terre...@fb.com>
---
 lib/decompress_unzstd.c | 40 ++++++++++++++--------------------------
 1 file changed, 14 insertions(+), 26 deletions(-)

diff --git a/lib/decompress_unzstd.c b/lib/decompress_unzstd.c
index 3c6ad01ffcd5..efbe66501b34 100644
--- a/lib/decompress_unzstd.c
+++ b/lib/decompress_unzstd.c
@@ -73,7 +73,8 @@
 
 #include <linux/decompress/mm.h>
 #include <linux/kernel.h>
-#include <linux/zstd_compat.h>
+#include <linux/zstd.h>
+#include <linux/zstd_errors.h>
 
 /* 128MB is the maximum window size supported by zstd. */
 #define ZSTD_WINDOWSIZE_MAX    (1 << ZSTD_WINDOWLOG_MAX)
@@ -120,9 +121,9 @@ static int INIT decompress_single(const u8 *in_buf, long 
in_len, u8 *out_buf,
                                  long out_len, long *in_pos,
                                  void (*error)(char *x))
 {
-       const size_t wksp_size = ZSTD_DCtxWorkspaceBound();
+       const size_t wksp_size = ZSTD_estimateDCtxSize();
        void *wksp = large_malloc(wksp_size);
-       ZSTD_DCtx *dctx = ZSTD_initDCtx(wksp, wksp_size);
+       ZSTD_DCtx *dctx = ZSTD_initStaticDCtx(wksp, wksp_size);
        int err;
        size_t ret;
 
@@ -165,7 +166,6 @@ static int INIT __unzstd(unsigned char *in_buf, long in_len,
 {
        ZSTD_inBuffer in;
        ZSTD_outBuffer out;
-       ZSTD_frameParams params;
        void *in_allocated = NULL;
        void *out_allocated = NULL;
        void *wksp = NULL;
@@ -234,36 +234,24 @@ static int INIT __unzstd(unsigned char *in_buf, long 
in_len,
        out.size = out_len;
 
        /*
-        * We need to know the window size to allocate the ZSTD_DStream.
-        * Since we are streaming, we need to allocate a buffer for the sliding
-        * window. The window size varies from 1 KB to ZSTD_WINDOWSIZE_MAX
-        * (8 MB), so it is important to use the actual value so as not to
-        * waste memory when it is smaller.
+        * Zstd determines the workspace size from the window size written
+        * into the frame header. This ensures that we use the minimum value
+        * possible, since the window size varies from 1 KB to 
ZSTD_WINDOWSIZE_MAX
+        * (1 GB), so it is very important to use the actual value.
         */
-       ret = ZSTD_getFrameParams(&params, in.src, in.size);
+       wksp_size = ZSTD_estimateDStreamSize_fromFrame(in.src, in.size);
        err = handle_zstd_error(ret, error);
        if (err)
                goto out;
-       if (ret != 0) {
-               error("ZSTD-compressed data has an incomplete frame header");
-               err = -1;
-               goto out;
-       }
-       if (params.windowSize > ZSTD_WINDOWSIZE_MAX) {
-               error("ZSTD-compressed data has too large a window size");
+       wksp = large_malloc(wksp_size);
+       if (wksp == NULL) {
+               error("Out of memory while allocating ZSTD_DStream");
                err = -1;
                goto out;
        }
-
-       /*
-        * Allocate the ZSTD_DStream now that we know how much memory is
-        * required.
-        */
-       wksp_size = ZSTD_DStreamWorkspaceBound(params.windowSize);
-       wksp = large_malloc(wksp_size);
-       dstream = ZSTD_initDStream(params.windowSize, wksp, wksp_size);
+       dstream = ZSTD_initStaticDStream(wksp, wksp_size);
        if (dstream == NULL) {
-               error("Out of memory while allocating ZSTD_DStream");
+               error("ZSTD_initStaticDStream failed");
                err = -1;
                goto out;
        }
-- 
2.28.0

Reply via email to