Keep in sync with the latest kernel
commit 8f89926290c4 ("erofs: get compression algorithms directly on mapping")

And it also fixes fsck MicroLZMA support, btw.

Signed-off-by: Gao Xiang <[email protected]>
---
 fsck/main.c                |  8 ++------
 include/erofs/decompress.h |  5 -----
 include/erofs/internal.h   | 12 +++++++++---
 lib/data.c                 | 10 ++--------
 lib/zmap.c                 | 19 ++++++++++---------
 5 files changed, 23 insertions(+), 31 deletions(-)

diff --git a/fsck/main.c b/fsck/main.c
index 7bee5605b9df..aefa881f740a 100644
--- a/fsck/main.c
+++ b/fsck/main.c
@@ -287,7 +287,7 @@ static int verify_compressed_inode(struct erofs_inode 
*inode)
        int ret = 0;
        u64 pchunk_len = 0;
        erofs_off_t end = inode->i_size;
-       unsigned int algorithmformat, raw_size = 0, buffer_size = 0;
+       unsigned int raw_size = 0, buffer_size = 0;
        char *raw = NULL, *buffer = NULL;
 
        while (end > 0) {
@@ -310,10 +310,6 @@ static int verify_compressed_inode(struct erofs_inode 
*inode)
                if (!fsckcfg.check_decomp || !(map.m_flags & EROFS_MAP_MAPPED))
                        continue;
 
-               algorithmformat = map.m_flags & EROFS_MAP_ZIPPED ?
-                                               Z_EROFS_COMPRESSION_LZ4 :
-                                               Z_EROFS_COMPRESSION_SHIFTED;
-
                if (map.m_plen > raw_size) {
                        raw_size = map.m_plen;
                        raw = realloc(raw, raw_size);
@@ -350,7 +346,7 @@ static int verify_compressed_inode(struct erofs_inode 
*inode)
                                        .decodedskip = 0,
                                        .inputsize = map.m_plen,
                                        .decodedlength = map.m_llen,
-                                       .alg = algorithmformat,
+                                       .alg = map.m_algorithmformat,
                                        .partial_decoding = 0
                                         });
 
diff --git a/include/erofs/decompress.h b/include/erofs/decompress.h
index 0ba2b08daa73..3d0d9633865d 100644
--- a/include/erofs/decompress.h
+++ b/include/erofs/decompress.h
@@ -8,11 +8,6 @@
 
 #include "internal.h"
 
-enum {
-       Z_EROFS_COMPRESSION_SHIFTED = Z_EROFS_COMPRESSION_MAX,
-       Z_EROFS_COMPRESSION_RUNTIME_MAX
-};
-
 struct z_erofs_decompress_req {
        char *in, *out;
 
diff --git a/include/erofs/internal.h b/include/erofs/internal.h
index 93e05bbc8271..666d1f2df466 100644
--- a/include/erofs/internal.h
+++ b/include/erofs/internal.h
@@ -252,7 +252,7 @@ static inline const char *erofs_strerror(int err)
 enum {
        BH_Meta,
        BH_Mapped,
-       BH_Zipped,
+       BH_Encoded,
        BH_FullMapped,
 };
 
@@ -260,8 +260,8 @@ enum {
 #define EROFS_MAP_MAPPED       (1 << BH_Mapped)
 /* Located in metadata (could be copied from bd_inode) */
 #define EROFS_MAP_META         (1 << BH_Meta)
-/* The extent has been compressed */
-#define EROFS_MAP_ZIPPED       (1 << BH_Zipped)
+/* The extent is encoded */
+#define EROFS_MAP_ENCODED      (1 << BH_Encoded)
 /* The length of extent is full */
 #define EROFS_MAP_FULL_MAPPED  (1 << BH_FullMapped)
 
@@ -272,6 +272,7 @@ struct erofs_map_blocks {
        u64 m_plen, m_llen;
 
        unsigned short m_deviceid;
+       char m_algorithmformat;
        unsigned int m_flags;
        erofs_blk_t index;
 };
@@ -282,6 +283,11 @@ struct erofs_map_blocks {
  */
 #define EROFS_GET_BLOCKS_FIEMAP        0x0002
 
+enum {
+       Z_EROFS_COMPRESSION_SHIFTED = Z_EROFS_COMPRESSION_MAX,
+       Z_EROFS_COMPRESSION_RUNTIME_MAX
+};
+
 struct erofs_map_dev {
        erofs_off_t m_pa;
        unsigned int m_deviceid;
diff --git a/lib/data.c b/lib/data.c
index 136c0d97ab45..27710f941615 100644
--- a/lib/data.c
+++ b/lib/data.c
@@ -226,12 +226,11 @@ static int z_erofs_read_data(struct erofs_inode *inode, 
char *buffer,
        };
        struct erofs_map_dev mdev;
        bool partial;
-       unsigned int algorithmformat, bufsize;
+       unsigned int bufsize = 0;
        char *raw = NULL;
        int ret = 0;
 
        end = offset + size;
-       bufsize = 0;
        while (end > offset) {
                map.m_la = end - 1;
 
@@ -288,18 +287,13 @@ static int z_erofs_read_data(struct erofs_inode *inode, 
char *buffer,
                if (ret < 0)
                        break;
 
-               if (map.m_flags & EROFS_MAP_ZIPPED)
-                       algorithmformat = inode->z_algorithmtype[0];
-               else
-                       algorithmformat = Z_EROFS_COMPRESSION_SHIFTED;
-
                ret = z_erofs_decompress(&(struct z_erofs_decompress_req) {
                                        .in = raw,
                                        .out = buffer + end - offset,
                                        .decodedskip = skip,
                                        .inputsize = map.m_plen,
                                        .decodedlength = length,
-                                       .alg = algorithmformat,
+                                       .alg = map.m_algorithmformat,
                                        .partial_decoding = partial
                                         });
                if (ret < 0)
diff --git a/lib/zmap.c b/lib/zmap.c
index 9dd0c7633a45..3715c47e3647 100644
--- a/lib/zmap.c
+++ b/lib/zmap.c
@@ -72,7 +72,7 @@ struct z_erofs_maprecorder {
 
        unsigned long lcn;
        /* compression extent information gathered */
-       u8  type;
+       u8  type, headtype;
        u16 clusterofs;
        u16 delta[2];
        erofs_blk_t pblk, compressedlcs;
@@ -390,9 +390,8 @@ static int z_erofs_extent_lookback(struct 
z_erofs_maprecorder *m,
                }
                return z_erofs_extent_lookback(m, m->delta[0]);
        case Z_EROFS_VLE_CLUSTER_TYPE_PLAIN:
-               map->m_flags &= ~EROFS_MAP_ZIPPED;
-               /* fallthrough */
        case Z_EROFS_VLE_CLUSTER_TYPE_HEAD:
+               m->headtype = m->type;
                map->m_la = (lcn << lclusterbits) | m->clusterofs;
                break;
        default:
@@ -415,7 +414,7 @@ static int z_erofs_get_extent_compressedlen(struct 
z_erofs_maprecorder *m,
 
        DBG_BUGON(m->type != Z_EROFS_VLE_CLUSTER_TYPE_PLAIN &&
                  m->type != Z_EROFS_VLE_CLUSTER_TYPE_HEAD);
-       if (!(map->m_flags & EROFS_MAP_ZIPPED) ||
+       if (m->headtype == Z_EROFS_VLE_CLUSTER_TYPE_PLAIN ||
            !(vi->z_advise & Z_EROFS_ADVISE_BIG_PCLUSTER_1)) {
                map->m_plen = 1 << lclusterbits;
                return 0;
@@ -548,15 +547,13 @@ int z_erofs_map_blocks_iter(struct erofs_inode *vi,
        if (err)
                goto out;
 
-       map->m_flags = EROFS_MAP_ZIPPED;        /* by default, compressed */
+       map->m_flags = EROFS_MAP_MAPPED | EROFS_MAP_ENCODED;
        end = (m.lcn + 1ULL) << lclusterbits;
        switch (m.type) {
        case Z_EROFS_VLE_CLUSTER_TYPE_PLAIN:
-               if (endoff >= m.clusterofs)
-                       map->m_flags &= ~EROFS_MAP_ZIPPED;
-               /* fallthrough */
        case Z_EROFS_VLE_CLUSTER_TYPE_HEAD:
                if (endoff >= m.clusterofs) {
+                       m.headtype = m.type;
                        map->m_la = (m.lcn << lclusterbits) | m.clusterofs;
                        break;
                }
@@ -586,12 +583,16 @@ int z_erofs_map_blocks_iter(struct erofs_inode *vi,
 
        map->m_llen = end - map->m_la;
        map->m_pa = blknr_to_addr(m.pblk);
-       map->m_flags |= EROFS_MAP_MAPPED;
 
        err = z_erofs_get_extent_compressedlen(&m, initial_lcn);
        if (err)
                goto out;
 
+       if (m.headtype == Z_EROFS_VLE_CLUSTER_TYPE_PLAIN)
+               map->m_algorithmformat = Z_EROFS_COMPRESSION_SHIFTED;
+       else
+               map->m_algorithmformat = vi->z_algorithmtype[0];
+
        if (flags & EROFS_GET_BLOCKS_FIEMAP) {
                err = z_erofs_get_extent_decompressedlen(&m);
                if (!err)
-- 
2.24.4

Reply via email to