kernel: backport erofs MicroLZMA support
[openwrt/staging/aparcar.git] / target / linux / generic / backport-5.15 / 1011-erofs-rename-some-generic-methods-in-decompressor.patch
diff --git a/target/linux/generic/backport-5.15/1011-erofs-rename-some-generic-methods-in-decompressor.patch b/target/linux/generic/backport-5.15/1011-erofs-rename-some-generic-methods-in-decompressor.patch
new file mode 100644 (file)
index 0000000..cbaea90
--- /dev/null
@@ -0,0 +1,160 @@
+From 7a6d16b5e3a16262873dd30dbf81944f53466dc9 Mon Sep 17 00:00:00 2001
+From: Gao Xiang <hsiangkao@linux.alibaba.com>
+Date: Mon, 11 Oct 2021 05:31:44 +0800
+Subject: [PATCH 1011/1012] erofs: rename some generic methods in decompressor
+
+Previously, some LZ4 methods were named with `generic'. However, while
+evaluating the effective LZMA approach, it seems they aren't quite
+generic at all (e.g. no need preparing dstpages for most LZMA cases.)
+
+Avoid such naming instead.
+
+Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
+---
+ fs/erofs/decompressor.c | 63 ++++++++++++++++++++---------------------
+ 1 file changed, 30 insertions(+), 33 deletions(-)
+
+diff --git a/fs/erofs/decompressor.c b/fs/erofs/decompressor.c
+index dce06ac61..8fd7af9d6 100644
+--- a/fs/erofs/decompressor.c
++++ b/fs/erofs/decompressor.c
+@@ -17,13 +17,8 @@
+ #endif
+ struct z_erofs_decompressor {
+-      /*
+-       * if destpages have sparsed pages, fill them with bounce pages.
+-       * it also check whether destpages indicate continuous physical memory.
+-       */
+-      int (*prepare_destpages)(struct z_erofs_decompress_req *rq,
+-                               struct list_head *pagepool);
+-      int (*decompress)(struct z_erofs_decompress_req *rq, u8 *out);
++      int (*decompress)(struct z_erofs_decompress_req *rq,
++                        struct list_head *pagepool);
+       char *name;
+ };
+@@ -63,8 +58,12 @@ int z_erofs_load_lz4_config(struct super_block *sb,
+       return erofs_pcpubuf_growsize(sbi->lz4.max_pclusterblks);
+ }
+-static int z_erofs_lz4_prepare_destpages(struct z_erofs_decompress_req *rq,
+-                                       struct list_head *pagepool)
++/*
++ * Fill all gaps with bounce pages if it's a sparse page list. Also check if
++ * all physical pages are consecutive, which can be seen for moderate CR.
++ */
++static int z_erofs_lz4_prepare_dstpages(struct z_erofs_decompress_req *rq,
++                                      struct list_head *pagepool)
+ {
+       const unsigned int nr =
+               PAGE_ALIGN(rq->pageofs_out + rq->outputsize) >> PAGE_SHIFT;
+@@ -119,7 +118,7 @@ static int z_erofs_lz4_prepare_destpages(struct z_erofs_decompress_req *rq,
+       return kaddr ? 1 : 0;
+ }
+-static void *z_erofs_handle_inplace_io(struct z_erofs_decompress_req *rq,
++static void *z_erofs_lz4_handle_inplace_io(struct z_erofs_decompress_req *rq,
+                       void *inpage, unsigned int *inputmargin, int *maptype,
+                       bool support_0padding)
+ {
+@@ -189,7 +188,8 @@ static void *z_erofs_handle_inplace_io(struct z_erofs_decompress_req *rq,
+       return src;
+ }
+-static int z_erofs_lz4_decompress(struct z_erofs_decompress_req *rq, u8 *out)
++static int z_erofs_lz4_decompress_mem(struct z_erofs_decompress_req *rq,
++                                    u8 *out)
+ {
+       unsigned int inputmargin;
+       u8 *headpage, *src;
+@@ -216,8 +216,8 @@ static int z_erofs_lz4_decompress(struct z_erofs_decompress_req *rq, u8 *out)
+       }
+       rq->inputsize -= inputmargin;
+-      src = z_erofs_handle_inplace_io(rq, headpage, &inputmargin, &maptype,
+-                                      support_0padding);
++      src = z_erofs_lz4_handle_inplace_io(rq, headpage, &inputmargin,
++                                          &maptype, support_0padding);
+       if (IS_ERR(src))
+               return PTR_ERR(src);
+@@ -259,23 +259,11 @@ static int z_erofs_lz4_decompress(struct z_erofs_decompress_req *rq, u8 *out)
+       return ret;
+ }
+-static struct z_erofs_decompressor decompressors[] = {
+-      [Z_EROFS_COMPRESSION_SHIFTED] = {
+-              .name = "shifted"
+-      },
+-      [Z_EROFS_COMPRESSION_LZ4] = {
+-              .prepare_destpages = z_erofs_lz4_prepare_destpages,
+-              .decompress = z_erofs_lz4_decompress,
+-              .name = "lz4"
+-      },
+-};
+-
+-static int z_erofs_decompress_generic(struct z_erofs_decompress_req *rq,
+-                                    struct list_head *pagepool)
++static int z_erofs_lz4_decompress(struct z_erofs_decompress_req *rq,
++                                struct list_head *pagepool)
+ {
+       const unsigned int nrpages_out =
+               PAGE_ALIGN(rq->pageofs_out + rq->outputsize) >> PAGE_SHIFT;
+-      const struct z_erofs_decompressor *alg = decompressors + rq->alg;
+       unsigned int dst_maptype;
+       void *dst;
+       int ret;
+@@ -289,7 +277,7 @@ static int z_erofs_decompress_generic(struct z_erofs_decompress_req *rq,
+       }
+       /* general decoding path which can be used for all cases */
+-      ret = alg->prepare_destpages(rq, pagepool);
++      ret = z_erofs_lz4_prepare_dstpages(rq, pagepool);
+       if (ret < 0)
+               return ret;
+       if (ret) {
+@@ -304,7 +292,7 @@ static int z_erofs_decompress_generic(struct z_erofs_decompress_req *rq,
+       dst_maptype = 2;
+ dstmap_out:
+-      ret = alg->decompress(rq, dst + rq->pageofs_out);
++      ret = z_erofs_lz4_decompress_mem(rq, dst + rq->pageofs_out);
+       if (!dst_maptype)
+               kunmap_atomic(dst);
+@@ -313,7 +301,7 @@ static int z_erofs_decompress_generic(struct z_erofs_decompress_req *rq,
+       return ret;
+ }
+-static int z_erofs_shifted_transform(const struct z_erofs_decompress_req *rq,
++static int z_erofs_shifted_transform(struct z_erofs_decompress_req *rq,
+                                    struct list_head *pagepool)
+ {
+       const unsigned int nrpages_out =
+@@ -352,10 +340,19 @@ static int z_erofs_shifted_transform(const struct z_erofs_decompress_req *rq,
+       return 0;
+ }
++static struct z_erofs_decompressor decompressors[] = {
++      [Z_EROFS_COMPRESSION_SHIFTED] = {
++              .decompress = z_erofs_shifted_transform,
++              .name = "shifted"
++      },
++      [Z_EROFS_COMPRESSION_LZ4] = {
++              .decompress = z_erofs_lz4_decompress,
++              .name = "lz4"
++      },
++};
++
+ int z_erofs_decompress(struct z_erofs_decompress_req *rq,
+                      struct list_head *pagepool)
+ {
+-      if (rq->alg == Z_EROFS_COMPRESSION_SHIFTED)
+-              return z_erofs_shifted_transform(rq, pagepool);
+-      return z_erofs_decompress_generic(rq, pagepool);
++      return decompressors[rq->alg].decompress(rq, pagepool);
+ }
+-- 
+2.32.0
+