[PATCH v4 6/6] erofs-utils: get compression algorithms directly on mapping
Yue Hu
zbestahu at gmail.com
Thu Nov 18 16:51:33 AEDT 2021
On Tue, 16 Nov 2021 17:49:39 +0800
Gao Xiang <hsiangkao at linux.alibaba.com> 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 <hsiangkao at linux.alibaba.com>
> ---
> 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 <huyue2 at yulong.com>
Thanks.
More information about the Linux-erofs
mailing list