On Tue, 16 Nov 2021 17:49:39 +0800
Gao Xiang <[email protected]> wrote:

> 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)

Reviewed-by: Yue Hu <[email protected]>

Thanks.

Reply via email to