public inbox for stable@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 6.1.y 1/2] erofs: simplify compression configuration parser
@ 2024-02-27  2:22 Yue Hu
  2024-02-27  3:00 ` Gao Xiang
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Yue Hu @ 2024-02-27  2:22 UTC (permalink / raw)
  To: stable, gregkh, hsiangkao; +Cc: linux-erofs, zhangwen, Yue Hu

From: Gao Xiang <hsiangkao@linux.alibaba.com>

[ Upstream commit efb4fb02cef3ab410b603c8f0e1c67f61d55f542 ]

Move erofs_load_compr_cfgs() into decompressor.c as well as introduce
a callback instead of a hard-coded switch for each algorithm for
simplicity.

Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20231022130957.11398-1-xiang@kernel.org
Stable-dep-of: 118a8cf504d7 ("erofs: fix inconsistent per-file compression format")
Signed-off-by: Yue Hu <huyue2@coolpad.com>
---
 fs/erofs/compress.h          |  4 ++
 fs/erofs/decompressor.c      | 60 ++++++++++++++++++++++++++++--
 fs/erofs/decompressor_lzma.c |  4 +-
 fs/erofs/internal.h          | 28 ++------------
 fs/erofs/super.c             | 72 +++++-------------------------------
 5 files changed, 76 insertions(+), 92 deletions(-)

diff --git a/fs/erofs/compress.h b/fs/erofs/compress.h
index 26fa170090b8..c4a3187bdb8f 100644
--- a/fs/erofs/compress.h
+++ b/fs/erofs/compress.h
@@ -21,6 +21,8 @@ struct z_erofs_decompress_req {
 };
 
 struct z_erofs_decompressor {
+	int (*config)(struct super_block *sb, struct erofs_super_block *dsb,
+		      void *data, int size);
 	int (*decompress)(struct z_erofs_decompress_req *rq,
 			  struct page **pagepool);
 	char *name;
@@ -93,6 +95,8 @@ int z_erofs_decompress(struct z_erofs_decompress_req *rq,
 		       struct page **pagepool);
 
 /* prototypes for specific algorithms */
+int z_erofs_load_lzma_config(struct super_block *sb,
+			struct erofs_super_block *dsb, void *data, int size);
 int z_erofs_lzma_decompress(struct z_erofs_decompress_req *rq,
 			    struct page **pagepool);
 #endif
diff --git a/fs/erofs/decompressor.c b/fs/erofs/decompressor.c
index 0cfad74374ca..ae3cfd018d99 100644
--- a/fs/erofs/decompressor.c
+++ b/fs/erofs/decompressor.c
@@ -24,11 +24,11 @@ struct z_erofs_lz4_decompress_ctx {
 	unsigned int oend;
 };
 
-int z_erofs_load_lz4_config(struct super_block *sb,
-			    struct erofs_super_block *dsb,
-			    struct z_erofs_lz4_cfgs *lz4, int size)
+static int z_erofs_load_lz4_config(struct super_block *sb,
+			    struct erofs_super_block *dsb, void *data, int size)
 {
 	struct erofs_sb_info *sbi = EROFS_SB(sb);
+	struct z_erofs_lz4_cfgs *lz4 = data;
 	u16 distance;
 
 	if (lz4) {
@@ -374,17 +374,71 @@ static struct z_erofs_decompressor decompressors[] = {
 		.name = "interlaced"
 	},
 	[Z_EROFS_COMPRESSION_LZ4] = {
+		.config = z_erofs_load_lz4_config,
 		.decompress = z_erofs_lz4_decompress,
 		.name = "lz4"
 	},
 #ifdef CONFIG_EROFS_FS_ZIP_LZMA
 	[Z_EROFS_COMPRESSION_LZMA] = {
+		.config = z_erofs_load_lzma_config,
 		.decompress = z_erofs_lzma_decompress,
 		.name = "lzma"
 	},
 #endif
 };
 
+int z_erofs_parse_cfgs(struct super_block *sb, struct erofs_super_block *dsb)
+{
+	struct erofs_sb_info *sbi = EROFS_SB(sb);
+	struct erofs_buf buf = __EROFS_BUF_INITIALIZER;
+	unsigned int algs, alg;
+	erofs_off_t offset;
+	int size, ret = 0;
+
+	if (!erofs_sb_has_compr_cfgs(sbi)) {
+		sbi->available_compr_algs = Z_EROFS_COMPRESSION_LZ4;
+		return z_erofs_load_lz4_config(sb, dsb, NULL, 0);
+	}
+
+	sbi->available_compr_algs = le16_to_cpu(dsb->u1.available_compr_algs);
+	if (sbi->available_compr_algs & ~Z_EROFS_ALL_COMPR_ALGS) {
+		erofs_err(sb, "unidentified algorithms %x, please upgrade kernel",
+			  sbi->available_compr_algs & ~Z_EROFS_ALL_COMPR_ALGS);
+		return -EOPNOTSUPP;
+	}
+
+	offset = EROFS_SUPER_OFFSET + sbi->sb_size;
+	alg = 0;
+	for (algs = sbi->available_compr_algs; algs; algs >>= 1, ++alg) {
+		void *data;
+
+		if (!(algs & 1))
+			continue;
+
+		data = erofs_read_metadata(sb, &buf, &offset, &size);
+		if (IS_ERR(data)) {
+			ret = PTR_ERR(data);
+			break;
+		}
+
+		if (alg >= ARRAY_SIZE(decompressors) ||
+		    !decompressors[alg].config) {
+			erofs_err(sb, "algorithm %d isn't enabled on this kernel",
+				  alg);
+			ret = -EOPNOTSUPP;
+		} else {
+			ret = decompressors[alg].config(sb,
+					dsb, data, size);
+		}
+
+		kfree(data);
+		if (ret)
+			break;
+	}
+	erofs_put_metabuf(&buf);
+	return ret;
+}
+
 int z_erofs_decompress(struct z_erofs_decompress_req *rq,
 		       struct page **pagepool)
 {
diff --git a/fs/erofs/decompressor_lzma.c b/fs/erofs/decompressor_lzma.c
index 49addc345aeb..970464c4b676 100644
--- a/fs/erofs/decompressor_lzma.c
+++ b/fs/erofs/decompressor_lzma.c
@@ -72,10 +72,10 @@ int z_erofs_lzma_init(void)
 }
 
 int z_erofs_load_lzma_config(struct super_block *sb,
-			     struct erofs_super_block *dsb,
-			     struct z_erofs_lzma_cfgs *lzma, int size)
+			struct erofs_super_block *dsb, void *data, int size)
 {
 	static DEFINE_MUTEX(lzma_resize_mutex);
+	struct z_erofs_lzma_cfgs *lzma = data;
 	unsigned int dict_size, i;
 	struct z_erofs_lzma *strm, *head = NULL;
 	int err;
diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h
index d8d09fc3ed65..79a7a5815ea6 100644
--- a/fs/erofs/internal.h
+++ b/fs/erofs/internal.h
@@ -471,6 +471,8 @@ struct erofs_map_dev {
 
 /* data.c */
 extern const struct file_operations erofs_file_fops;
+void *erofs_read_metadata(struct super_block *sb, struct erofs_buf *buf,
+			  erofs_off_t *offset, int *lengthp);
 void erofs_unmap_metabuf(struct erofs_buf *buf);
 void erofs_put_metabuf(struct erofs_buf *buf);
 void *erofs_bread(struct erofs_buf *buf, struct inode *inode,
@@ -565,9 +567,7 @@ void z_erofs_exit_zip_subsystem(void);
 int erofs_try_to_free_all_cached_pages(struct erofs_sb_info *sbi,
 				       struct erofs_workgroup *egrp);
 int erofs_try_to_free_cached_page(struct page *page);
-int z_erofs_load_lz4_config(struct super_block *sb,
-			    struct erofs_super_block *dsb,
-			    struct z_erofs_lz4_cfgs *lz4, int len);
+int z_erofs_parse_cfgs(struct super_block *sb, struct erofs_super_block *dsb);
 #else
 static inline void erofs_shrinker_register(struct super_block *sb) {}
 static inline void erofs_shrinker_unregister(struct super_block *sb) {}
@@ -575,36 +575,14 @@ static inline int erofs_init_shrinker(void) { return 0; }
 static inline void erofs_exit_shrinker(void) {}
 static inline int z_erofs_init_zip_subsystem(void) { return 0; }
 static inline void z_erofs_exit_zip_subsystem(void) {}
-static inline int z_erofs_load_lz4_config(struct super_block *sb,
-				  struct erofs_super_block *dsb,
-				  struct z_erofs_lz4_cfgs *lz4, int len)
-{
-	if (lz4 || dsb->u1.lz4_max_distance) {
-		erofs_err(sb, "lz4 algorithm isn't enabled");
-		return -EINVAL;
-	}
-	return 0;
-}
 #endif	/* !CONFIG_EROFS_FS_ZIP */
 
 #ifdef CONFIG_EROFS_FS_ZIP_LZMA
 int z_erofs_lzma_init(void);
 void z_erofs_lzma_exit(void);
-int z_erofs_load_lzma_config(struct super_block *sb,
-			     struct erofs_super_block *dsb,
-			     struct z_erofs_lzma_cfgs *lzma, int size);
 #else
 static inline int z_erofs_lzma_init(void) { return 0; }
 static inline int z_erofs_lzma_exit(void) { return 0; }
-static inline int z_erofs_load_lzma_config(struct super_block *sb,
-			     struct erofs_super_block *dsb,
-			     struct z_erofs_lzma_cfgs *lzma, int size) {
-	if (lzma) {
-		erofs_err(sb, "lzma algorithm isn't enabled");
-		return -EINVAL;
-	}
-	return 0;
-}
 #endif	/* !CONFIG_EROFS_FS_ZIP */
 
 /* flags for erofs_fscache_register_cookie() */
diff --git a/fs/erofs/super.c b/fs/erofs/super.c
index bd8bf8fc2f5d..f2647126cb2f 100644
--- a/fs/erofs/super.c
+++ b/fs/erofs/super.c
@@ -126,8 +126,8 @@ static bool check_layout_compatibility(struct super_block *sb,
 
 #ifdef CONFIG_EROFS_FS_ZIP
 /* read variable-sized metadata, offset will be aligned by 4-byte */
-static void *erofs_read_metadata(struct super_block *sb, struct erofs_buf *buf,
-				 erofs_off_t *offset, int *lengthp)
+void *erofs_read_metadata(struct super_block *sb, struct erofs_buf *buf,
+			  erofs_off_t *offset, int *lengthp)
 {
 	u8 *buffer, *ptr;
 	int len, i, cnt;
@@ -159,64 +159,15 @@ static void *erofs_read_metadata(struct super_block *sb, struct erofs_buf *buf,
 	}
 	return buffer;
 }
-
-static int erofs_load_compr_cfgs(struct super_block *sb,
-				 struct erofs_super_block *dsb)
-{
-	struct erofs_sb_info *sbi = EROFS_SB(sb);
-	struct erofs_buf buf = __EROFS_BUF_INITIALIZER;
-	unsigned int algs, alg;
-	erofs_off_t offset;
-	int size, ret = 0;
-
-	sbi->available_compr_algs = le16_to_cpu(dsb->u1.available_compr_algs);
-	if (sbi->available_compr_algs & ~Z_EROFS_ALL_COMPR_ALGS) {
-		erofs_err(sb, "try to load compressed fs with unsupported algorithms %x",
-			  sbi->available_compr_algs & ~Z_EROFS_ALL_COMPR_ALGS);
-		return -EINVAL;
-	}
-
-	offset = EROFS_SUPER_OFFSET + sbi->sb_size;
-	alg = 0;
-	for (algs = sbi->available_compr_algs; algs; algs >>= 1, ++alg) {
-		void *data;
-
-		if (!(algs & 1))
-			continue;
-
-		data = erofs_read_metadata(sb, &buf, &offset, &size);
-		if (IS_ERR(data)) {
-			ret = PTR_ERR(data);
-			break;
-		}
-
-		switch (alg) {
-		case Z_EROFS_COMPRESSION_LZ4:
-			ret = z_erofs_load_lz4_config(sb, dsb, data, size);
-			break;
-		case Z_EROFS_COMPRESSION_LZMA:
-			ret = z_erofs_load_lzma_config(sb, dsb, data, size);
-			break;
-		default:
-			DBG_BUGON(1);
-			ret = -EFAULT;
-		}
-		kfree(data);
-		if (ret)
-			break;
-	}
-	erofs_put_metabuf(&buf);
-	return ret;
-}
 #else
-static int erofs_load_compr_cfgs(struct super_block *sb,
-				 struct erofs_super_block *dsb)
+static int z_erofs_parse_cfgs(struct super_block *sb,
+			      struct erofs_super_block *dsb)
 {
-	if (dsb->u1.available_compr_algs) {
-		erofs_err(sb, "try to load compressed fs when compression is disabled");
-		return -EINVAL;
-	}
-	return 0;
+	if (!dsb->u1.available_compr_algs)
+		return 0;
+
+	erofs_err(sb, "compression disabled, unable to mount compressed EROFS");
+	return -EOPNOTSUPP;
 }
 #endif
 
@@ -398,10 +349,7 @@ static int erofs_read_superblock(struct super_block *sb)
 	}
 
 	/* parse on-disk compression configurations */
-	if (erofs_sb_has_compr_cfgs(sbi))
-		ret = erofs_load_compr_cfgs(sb, dsb);
-	else
-		ret = z_erofs_load_lz4_config(sb, dsb, NULL, 0);
+	ret = z_erofs_parse_cfgs(sb, dsb);
 	if (ret < 0)
 		goto out;
 
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 6.1.y 1/2] erofs: simplify compression configuration parser
  2024-02-27  2:22 [PATCH 6.1.y 1/2] erofs: simplify compression configuration parser Yue Hu
@ 2024-02-27  3:00 ` Gao Xiang
  2024-02-27  7:40   ` Yue Hu
  2024-02-27  3:11 ` [PATCH 6.1.y 2/2] erofs: fix inconsistent per-file compression format Yue Hu
  2024-02-27  8:52 ` [PATCH 6.1.y 1/2] erofs: simplify compression configuration parser Greg KH
  2 siblings, 1 reply; 5+ messages in thread
From: Gao Xiang @ 2024-02-27  3:00 UTC (permalink / raw)
  To: Yue Hu, stable, gregkh; +Cc: linux-erofs, zhangwen, Yue Hu

Hi Yue,

On 2024/2/27 10:22, Yue Hu wrote:
> From: Gao Xiang <hsiangkao@linux.alibaba.com>
> 
> [ Upstream commit efb4fb02cef3ab410b603c8f0e1c67f61d55f542 ]
> 
> Move erofs_load_compr_cfgs() into decompressor.c as well as introduce
> a callback instead of a hard-coded switch for each algorithm for
> simplicity.
> 
> Reviewed-by: Chao Yu <chao@kernel.org>
> Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
> Link: https://lore.kernel.org/r/20231022130957.11398-1-xiang@kernel.org
> Stable-dep-of: 118a8cf504d7 ("erofs: fix inconsistent per-file compression format")
> Signed-off-by: Yue Hu <huyue2@coolpad.com>

where is the real fix [patch 2/2]? It's needed to be posted
here too.

Thanks,
Gao Xiang

> ---
>   fs/erofs/compress.h          |  4 ++
>   fs/erofs/decompressor.c      | 60 ++++++++++++++++++++++++++++--
>   fs/erofs/decompressor_lzma.c |  4 +-
>   fs/erofs/internal.h          | 28 ++------------
>   fs/erofs/super.c             | 72 +++++-------------------------------
>   5 files changed, 76 insertions(+), 92 deletions(-)
> 
> diff --git a/fs/erofs/compress.h b/fs/erofs/compress.h
> index 26fa170090b8..c4a3187bdb8f 100644
> --- a/fs/erofs/compress.h
> +++ b/fs/erofs/compress.h
> @@ -21,6 +21,8 @@ struct z_erofs_decompress_req {
>   };
>   
>   struct z_erofs_decompressor {
> +	int (*config)(struct super_block *sb, struct erofs_super_block *dsb,
> +		      void *data, int size);
>   	int (*decompress)(struct z_erofs_decompress_req *rq,
>   			  struct page **pagepool);
>   	char *name;
> @@ -93,6 +95,8 @@ int z_erofs_decompress(struct z_erofs_decompress_req *rq,
>   		       struct page **pagepool);
>   
>   /* prototypes for specific algorithms */
> +int z_erofs_load_lzma_config(struct super_block *sb,
> +			struct erofs_super_block *dsb, void *data, int size);
>   int z_erofs_lzma_decompress(struct z_erofs_decompress_req *rq,
>   			    struct page **pagepool);
>   #endif
> diff --git a/fs/erofs/decompressor.c b/fs/erofs/decompressor.c
> index 0cfad74374ca..ae3cfd018d99 100644
> --- a/fs/erofs/decompressor.c
> +++ b/fs/erofs/decompressor.c
> @@ -24,11 +24,11 @@ struct z_erofs_lz4_decompress_ctx {
>   	unsigned int oend;
>   };
>   
> -int z_erofs_load_lz4_config(struct super_block *sb,
> -			    struct erofs_super_block *dsb,
> -			    struct z_erofs_lz4_cfgs *lz4, int size)
> +static int z_erofs_load_lz4_config(struct super_block *sb,
> +			    struct erofs_super_block *dsb, void *data, int size)
>   {
>   	struct erofs_sb_info *sbi = EROFS_SB(sb);
> +	struct z_erofs_lz4_cfgs *lz4 = data;
>   	u16 distance;
>   
>   	if (lz4) {
> @@ -374,17 +374,71 @@ static struct z_erofs_decompressor decompressors[] = {
>   		.name = "interlaced"
>   	},
>   	[Z_EROFS_COMPRESSION_LZ4] = {
> +		.config = z_erofs_load_lz4_config,
>   		.decompress = z_erofs_lz4_decompress,
>   		.name = "lz4"
>   	},
>   #ifdef CONFIG_EROFS_FS_ZIP_LZMA
>   	[Z_EROFS_COMPRESSION_LZMA] = {
> +		.config = z_erofs_load_lzma_config,
>   		.decompress = z_erofs_lzma_decompress,
>   		.name = "lzma"
>   	},
>   #endif
>   };
>   
> +int z_erofs_parse_cfgs(struct super_block *sb, struct erofs_super_block *dsb)
> +{
> +	struct erofs_sb_info *sbi = EROFS_SB(sb);
> +	struct erofs_buf buf = __EROFS_BUF_INITIALIZER;
> +	unsigned int algs, alg;
> +	erofs_off_t offset;
> +	int size, ret = 0;
> +
> +	if (!erofs_sb_has_compr_cfgs(sbi)) {
> +		sbi->available_compr_algs = Z_EROFS_COMPRESSION_LZ4;
> +		return z_erofs_load_lz4_config(sb, dsb, NULL, 0);
> +	}
> +
> +	sbi->available_compr_algs = le16_to_cpu(dsb->u1.available_compr_algs);
> +	if (sbi->available_compr_algs & ~Z_EROFS_ALL_COMPR_ALGS) {
> +		erofs_err(sb, "unidentified algorithms %x, please upgrade kernel",
> +			  sbi->available_compr_algs & ~Z_EROFS_ALL_COMPR_ALGS);
> +		return -EOPNOTSUPP;
> +	}
> +
> +	offset = EROFS_SUPER_OFFSET + sbi->sb_size;
> +	alg = 0;
> +	for (algs = sbi->available_compr_algs; algs; algs >>= 1, ++alg) {
> +		void *data;
> +
> +		if (!(algs & 1))
> +			continue;
> +
> +		data = erofs_read_metadata(sb, &buf, &offset, &size);
> +		if (IS_ERR(data)) {
> +			ret = PTR_ERR(data);
> +			break;
> +		}
> +
> +		if (alg >= ARRAY_SIZE(decompressors) ||
> +		    !decompressors[alg].config) {
> +			erofs_err(sb, "algorithm %d isn't enabled on this kernel",
> +				  alg);
> +			ret = -EOPNOTSUPP;
> +		} else {
> +			ret = decompressors[alg].config(sb,
> +					dsb, data, size);
> +		}
> +
> +		kfree(data);
> +		if (ret)
> +			break;
> +	}
> +	erofs_put_metabuf(&buf);
> +	return ret;
> +}
> +
>   int z_erofs_decompress(struct z_erofs_decompress_req *rq,
>   		       struct page **pagepool)
>   {
> diff --git a/fs/erofs/decompressor_lzma.c b/fs/erofs/decompressor_lzma.c
> index 49addc345aeb..970464c4b676 100644
> --- a/fs/erofs/decompressor_lzma.c
> +++ b/fs/erofs/decompressor_lzma.c
> @@ -72,10 +72,10 @@ int z_erofs_lzma_init(void)
>   }
>   
>   int z_erofs_load_lzma_config(struct super_block *sb,
> -			     struct erofs_super_block *dsb,
> -			     struct z_erofs_lzma_cfgs *lzma, int size)
> +			struct erofs_super_block *dsb, void *data, int size)
>   {
>   	static DEFINE_MUTEX(lzma_resize_mutex);
> +	struct z_erofs_lzma_cfgs *lzma = data;
>   	unsigned int dict_size, i;
>   	struct z_erofs_lzma *strm, *head = NULL;
>   	int err;
> diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h
> index d8d09fc3ed65..79a7a5815ea6 100644
> --- a/fs/erofs/internal.h
> +++ b/fs/erofs/internal.h
> @@ -471,6 +471,8 @@ struct erofs_map_dev {
>   
>   /* data.c */
>   extern const struct file_operations erofs_file_fops;
> +void *erofs_read_metadata(struct super_block *sb, struct erofs_buf *buf,
> +			  erofs_off_t *offset, int *lengthp);
>   void erofs_unmap_metabuf(struct erofs_buf *buf);
>   void erofs_put_metabuf(struct erofs_buf *buf);
>   void *erofs_bread(struct erofs_buf *buf, struct inode *inode,
> @@ -565,9 +567,7 @@ void z_erofs_exit_zip_subsystem(void);
>   int erofs_try_to_free_all_cached_pages(struct erofs_sb_info *sbi,
>   				       struct erofs_workgroup *egrp);
>   int erofs_try_to_free_cached_page(struct page *page);
> -int z_erofs_load_lz4_config(struct super_block *sb,
> -			    struct erofs_super_block *dsb,
> -			    struct z_erofs_lz4_cfgs *lz4, int len);
> +int z_erofs_parse_cfgs(struct super_block *sb, struct erofs_super_block *dsb);
>   #else
>   static inline void erofs_shrinker_register(struct super_block *sb) {}
>   static inline void erofs_shrinker_unregister(struct super_block *sb) {}
> @@ -575,36 +575,14 @@ static inline int erofs_init_shrinker(void) { return 0; }
>   static inline void erofs_exit_shrinker(void) {}
>   static inline int z_erofs_init_zip_subsystem(void) { return 0; }
>   static inline void z_erofs_exit_zip_subsystem(void) {}
> -static inline int z_erofs_load_lz4_config(struct super_block *sb,
> -				  struct erofs_super_block *dsb,
> -				  struct z_erofs_lz4_cfgs *lz4, int len)
> -{
> -	if (lz4 || dsb->u1.lz4_max_distance) {
> -		erofs_err(sb, "lz4 algorithm isn't enabled");
> -		return -EINVAL;
> -	}
> -	return 0;
> -}
>   #endif	/* !CONFIG_EROFS_FS_ZIP */
>   
>   #ifdef CONFIG_EROFS_FS_ZIP_LZMA
>   int z_erofs_lzma_init(void);
>   void z_erofs_lzma_exit(void);
> -int z_erofs_load_lzma_config(struct super_block *sb,
> -			     struct erofs_super_block *dsb,
> -			     struct z_erofs_lzma_cfgs *lzma, int size);
>   #else
>   static inline int z_erofs_lzma_init(void) { return 0; }
>   static inline int z_erofs_lzma_exit(void) { return 0; }
> -static inline int z_erofs_load_lzma_config(struct super_block *sb,
> -			     struct erofs_super_block *dsb,
> -			     struct z_erofs_lzma_cfgs *lzma, int size) {
> -	if (lzma) {
> -		erofs_err(sb, "lzma algorithm isn't enabled");
> -		return -EINVAL;
> -	}
> -	return 0;
> -}
>   #endif	/* !CONFIG_EROFS_FS_ZIP */
>   
>   /* flags for erofs_fscache_register_cookie() */
> diff --git a/fs/erofs/super.c b/fs/erofs/super.c
> index bd8bf8fc2f5d..f2647126cb2f 100644
> --- a/fs/erofs/super.c
> +++ b/fs/erofs/super.c
> @@ -126,8 +126,8 @@ static bool check_layout_compatibility(struct super_block *sb,
>   
>   #ifdef CONFIG_EROFS_FS_ZIP
>   /* read variable-sized metadata, offset will be aligned by 4-byte */
> -static void *erofs_read_metadata(struct super_block *sb, struct erofs_buf *buf,
> -				 erofs_off_t *offset, int *lengthp)
> +void *erofs_read_metadata(struct super_block *sb, struct erofs_buf *buf,
> +			  erofs_off_t *offset, int *lengthp)
>   {
>   	u8 *buffer, *ptr;
>   	int len, i, cnt;
> @@ -159,64 +159,15 @@ static void *erofs_read_metadata(struct super_block *sb, struct erofs_buf *buf,
>   	}
>   	return buffer;
>   }
> -
> -static int erofs_load_compr_cfgs(struct super_block *sb,
> -				 struct erofs_super_block *dsb)
> -{
> -	struct erofs_sb_info *sbi = EROFS_SB(sb);
> -	struct erofs_buf buf = __EROFS_BUF_INITIALIZER;
> -	unsigned int algs, alg;
> -	erofs_off_t offset;
> -	int size, ret = 0;
> -
> -	sbi->available_compr_algs = le16_to_cpu(dsb->u1.available_compr_algs);
> -	if (sbi->available_compr_algs & ~Z_EROFS_ALL_COMPR_ALGS) {
> -		erofs_err(sb, "try to load compressed fs with unsupported algorithms %x",
> -			  sbi->available_compr_algs & ~Z_EROFS_ALL_COMPR_ALGS);
> -		return -EINVAL;
> -	}
> -
> -	offset = EROFS_SUPER_OFFSET + sbi->sb_size;
> -	alg = 0;
> -	for (algs = sbi->available_compr_algs; algs; algs >>= 1, ++alg) {
> -		void *data;
> -
> -		if (!(algs & 1))
> -			continue;
> -
> -		data = erofs_read_metadata(sb, &buf, &offset, &size);
> -		if (IS_ERR(data)) {
> -			ret = PTR_ERR(data);
> -			break;
> -		}
> -
> -		switch (alg) {
> -		case Z_EROFS_COMPRESSION_LZ4:
> -			ret = z_erofs_load_lz4_config(sb, dsb, data, size);
> -			break;
> -		case Z_EROFS_COMPRESSION_LZMA:
> -			ret = z_erofs_load_lzma_config(sb, dsb, data, size);
> -			break;
> -		default:
> -			DBG_BUGON(1);
> -			ret = -EFAULT;
> -		}
> -		kfree(data);
> -		if (ret)
> -			break;
> -	}
> -	erofs_put_metabuf(&buf);
> -	return ret;
> -}
>   #else
> -static int erofs_load_compr_cfgs(struct super_block *sb,
> -				 struct erofs_super_block *dsb)
> +static int z_erofs_parse_cfgs(struct super_block *sb,
> +			      struct erofs_super_block *dsb)
>   {
> -	if (dsb->u1.available_compr_algs) {
> -		erofs_err(sb, "try to load compressed fs when compression is disabled");
> -		return -EINVAL;
> -	}
> -	return 0;
> +	if (!dsb->u1.available_compr_algs)
> +		return 0;
> +
> +	erofs_err(sb, "compression disabled, unable to mount compressed EROFS");
> +	return -EOPNOTSUPP;
>   }
>   #endif
>   
> @@ -398,10 +349,7 @@ static int erofs_read_superblock(struct super_block *sb)
>   	}
>   
>   	/* parse on-disk compression configurations */
> -	if (erofs_sb_has_compr_cfgs(sbi))
> -		ret = erofs_load_compr_cfgs(sb, dsb);
> -	else
> -		ret = z_erofs_load_lz4_config(sb, dsb, NULL, 0);
> +	ret = z_erofs_parse_cfgs(sb, dsb);
>   	if (ret < 0)
>   		goto out;
>   

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 6.1.y 2/2] erofs: fix inconsistent per-file compression format
  2024-02-27  2:22 [PATCH 6.1.y 1/2] erofs: simplify compression configuration parser Yue Hu
  2024-02-27  3:00 ` Gao Xiang
@ 2024-02-27  3:11 ` Yue Hu
  2024-02-27  8:52 ` [PATCH 6.1.y 1/2] erofs: simplify compression configuration parser Greg KH
  2 siblings, 0 replies; 5+ messages in thread
From: Yue Hu @ 2024-02-27  3:11 UTC (permalink / raw)
  To: stable, gregkh, hsiangkao; +Cc: linux-erofs, zhangwen, Yue Hu

From: Gao Xiang <hsiangkao@linux.alibaba.com>

[ Upstream commit 118a8cf504d7dfa519562d000f423ee3ca75d2c4 ]

EROFS can select compression algorithms on a per-file basis, and each
per-file compression algorithm needs to be marked in the on-disk
superblock for initialization.

However, syzkaller can generate inconsistent crafted images that use
an unsupported algorithmtype for specific inodes, e.g. use MicroLZMA
algorithmtype even it's not set in `sbi->available_compr_algs`.  This
can lead to an unexpected "BUG: kernel NULL pointer dereference" if
the corresponding decompressor isn't built-in.

Fix this by checking against `sbi->available_compr_algs` for each
m_algorithmformat request.  Incorrect !erofs_sb_has_compr_cfgs preset
bitmap is now fixed together since it was harmless previously.

Reported-by: <bugreport@ubisectech.com>
Fixes: 8f89926290c4 ("erofs: get compression algorithms directly on mapping")
Fixes: 622ceaddb764 ("erofs: lzma compression support")
Reviewed-by: Yue Hu <huyue2@coolpad.com>
Link: https://lore.kernel.org/r/20240113150602.1471050-1-hsiangkao@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Signed-off-by: Yue Hu <huyue2@coolpad.com>
---
 fs/erofs/decompressor.c |  2 +-
 fs/erofs/zmap.c         | 23 +++++++++++++----------
 2 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/fs/erofs/decompressor.c b/fs/erofs/decompressor.c
index ae3cfd018d99..1eefa4411e06 100644
--- a/fs/erofs/decompressor.c
+++ b/fs/erofs/decompressor.c
@@ -396,7 +396,7 @@ int z_erofs_parse_cfgs(struct super_block *sb, struct erofs_super_block *dsb)
 	int size, ret = 0;
 
 	if (!erofs_sb_has_compr_cfgs(sbi)) {
-		sbi->available_compr_algs = Z_EROFS_COMPRESSION_LZ4;
+		sbi->available_compr_algs = 1 << Z_EROFS_COMPRESSION_LZ4;
 		return z_erofs_load_lz4_config(sb, dsb, NULL, 0);
 	}
 
diff --git a/fs/erofs/zmap.c b/fs/erofs/zmap.c
index 0337b70b2dac..abcded1acd19 100644
--- a/fs/erofs/zmap.c
+++ b/fs/erofs/zmap.c
@@ -610,7 +610,7 @@ static int z_erofs_do_map_blocks(struct inode *inode,
 		.map = map,
 	};
 	int err = 0;
-	unsigned int lclusterbits, endoff;
+	unsigned int lclusterbits, endoff, afmt;
 	unsigned long initial_lcn;
 	unsigned long long ofs, end;
 
@@ -700,17 +700,20 @@ static int z_erofs_do_map_blocks(struct inode *inode,
 			err = -EFSCORRUPTED;
 			goto unmap_out;
 		}
-		if (vi->z_advise & Z_EROFS_ADVISE_INTERLACED_PCLUSTER)
-			map->m_algorithmformat =
-				Z_EROFS_COMPRESSION_INTERLACED;
-		else
-			map->m_algorithmformat =
-				Z_EROFS_COMPRESSION_SHIFTED;
-	} else if (m.headtype == Z_EROFS_VLE_CLUSTER_TYPE_HEAD2) {
-		map->m_algorithmformat = vi->z_algorithmtype[1];
+		afmt = vi->z_advise & Z_EROFS_ADVISE_INTERLACED_PCLUSTER ?
+			Z_EROFS_COMPRESSION_INTERLACED :
+			Z_EROFS_COMPRESSION_SHIFTED;
 	} else {
-		map->m_algorithmformat = vi->z_algorithmtype[0];
+		afmt = m.headtype == Z_EROFS_VLE_CLUSTER_TYPE_HEAD2 ?
+			vi->z_algorithmtype[1] : vi->z_algorithmtype[0];
+		if (!(EROFS_I_SB(inode)->available_compr_algs & (1 << afmt))) {
+			erofs_err(inode->i_sb, "inconsistent algorithmtype %u for nid %llu",
+				  afmt, vi->nid);
+			err = -EFSCORRUPTED;
+			goto unmap_out;
+		}
 	}
+	map->m_algorithmformat = afmt;
 
 	if ((flags & EROFS_GET_BLOCKS_FIEMAP) ||
 	    ((flags & EROFS_GET_BLOCKS_READMORE) &&
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 6.1.y 1/2] erofs: simplify compression configuration parser
  2024-02-27  3:00 ` Gao Xiang
@ 2024-02-27  7:40   ` Yue Hu
  0 siblings, 0 replies; 5+ messages in thread
From: Yue Hu @ 2024-02-27  7:40 UTC (permalink / raw)
  To: Gao Xiang; +Cc: stable, gregkh, linux-erofs, zhangwen, Yue Hu

On Tue, 27 Feb 2024 11:00:01 +0800
Gao Xiang <hsiangkao@linux.alibaba.com> wrote:

> Hi Yue,
> 
> On 2024/2/27 10:22, Yue Hu wrote:
> > From: Gao Xiang <hsiangkao@linux.alibaba.com>
> > 
> > [ Upstream commit efb4fb02cef3ab410b603c8f0e1c67f61d55f542 ]
> > 
> > Move erofs_load_compr_cfgs() into decompressor.c as well as introduce
> > a callback instead of a hard-coded switch for each algorithm for
> > simplicity.
> > 
> > Reviewed-by: Chao Yu <chao@kernel.org>
> > Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
> > Link: https://lore.kernel.org/r/20231022130957.11398-1-xiang@kernel.org
> > Stable-dep-of: 118a8cf504d7 ("erofs: fix inconsistent per-file compression format")
> > Signed-off-by: Yue Hu <huyue2@coolpad.com>  
> 
> where is the real fix [patch 2/2]? It's needed to be posted
> here too.

Already sent.

> 
> Thanks,
> Gao Xiang
> 
> > ---
> >   fs/erofs/compress.h          |  4 ++
> >   fs/erofs/decompressor.c      | 60 ++++++++++++++++++++++++++++--
> >   fs/erofs/decompressor_lzma.c |  4 +-
> >   fs/erofs/internal.h          | 28 ++------------
> >   fs/erofs/super.c             | 72 +++++-------------------------------
> >   5 files changed, 76 insertions(+), 92 deletions(-)
> > 
> > diff --git a/fs/erofs/compress.h b/fs/erofs/compress.h
> > index 26fa170090b8..c4a3187bdb8f 100644
> > --- a/fs/erofs/compress.h
> > +++ b/fs/erofs/compress.h
> > @@ -21,6 +21,8 @@ struct z_erofs_decompress_req {
> >   };
> >   
> >   struct z_erofs_decompressor {
> > +	int (*config)(struct super_block *sb, struct erofs_super_block *dsb,
> > +		      void *data, int size);
> >   	int (*decompress)(struct z_erofs_decompress_req *rq,
> >   			  struct page **pagepool);
> >   	char *name;
> > @@ -93,6 +95,8 @@ int z_erofs_decompress(struct z_erofs_decompress_req *rq,
> >   		       struct page **pagepool);
> >   
> >   /* prototypes for specific algorithms */
> > +int z_erofs_load_lzma_config(struct super_block *sb,
> > +			struct erofs_super_block *dsb, void *data, int size);
> >   int z_erofs_lzma_decompress(struct z_erofs_decompress_req *rq,
> >   			    struct page **pagepool);
> >   #endif
> > diff --git a/fs/erofs/decompressor.c b/fs/erofs/decompressor.c
> > index 0cfad74374ca..ae3cfd018d99 100644
> > --- a/fs/erofs/decompressor.c
> > +++ b/fs/erofs/decompressor.c
> > @@ -24,11 +24,11 @@ struct z_erofs_lz4_decompress_ctx {
> >   	unsigned int oend;
> >   };
> >   
> > -int z_erofs_load_lz4_config(struct super_block *sb,
> > -			    struct erofs_super_block *dsb,
> > -			    struct z_erofs_lz4_cfgs *lz4, int size)
> > +static int z_erofs_load_lz4_config(struct super_block *sb,
> > +			    struct erofs_super_block *dsb, void *data, int size)
> >   {
> >   	struct erofs_sb_info *sbi = EROFS_SB(sb);
> > +	struct z_erofs_lz4_cfgs *lz4 = data;
> >   	u16 distance;
> >   
> >   	if (lz4) {
> > @@ -374,17 +374,71 @@ static struct z_erofs_decompressor decompressors[] = {
> >   		.name = "interlaced"
> >   	},
> >   	[Z_EROFS_COMPRESSION_LZ4] = {
> > +		.config = z_erofs_load_lz4_config,
> >   		.decompress = z_erofs_lz4_decompress,
> >   		.name = "lz4"
> >   	},
> >   #ifdef CONFIG_EROFS_FS_ZIP_LZMA
> >   	[Z_EROFS_COMPRESSION_LZMA] = {
> > +		.config = z_erofs_load_lzma_config,
> >   		.decompress = z_erofs_lzma_decompress,
> >   		.name = "lzma"
> >   	},
> >   #endif
> >   };
> >   
> > +int z_erofs_parse_cfgs(struct super_block *sb, struct erofs_super_block *dsb)
> > +{
> > +	struct erofs_sb_info *sbi = EROFS_SB(sb);
> > +	struct erofs_buf buf = __EROFS_BUF_INITIALIZER;
> > +	unsigned int algs, alg;
> > +	erofs_off_t offset;
> > +	int size, ret = 0;
> > +
> > +	if (!erofs_sb_has_compr_cfgs(sbi)) {
> > +		sbi->available_compr_algs = Z_EROFS_COMPRESSION_LZ4;
> > +		return z_erofs_load_lz4_config(sb, dsb, NULL, 0);
> > +	}
> > +
> > +	sbi->available_compr_algs = le16_to_cpu(dsb->u1.available_compr_algs);
> > +	if (sbi->available_compr_algs & ~Z_EROFS_ALL_COMPR_ALGS) {
> > +		erofs_err(sb, "unidentified algorithms %x, please upgrade kernel",
> > +			  sbi->available_compr_algs & ~Z_EROFS_ALL_COMPR_ALGS);
> > +		return -EOPNOTSUPP;
> > +	}
> > +
> > +	offset = EROFS_SUPER_OFFSET + sbi->sb_size;
> > +	alg = 0;
> > +	for (algs = sbi->available_compr_algs; algs; algs >>= 1, ++alg) {
> > +		void *data;
> > +
> > +		if (!(algs & 1))
> > +			continue;
> > +
> > +		data = erofs_read_metadata(sb, &buf, &offset, &size);
> > +		if (IS_ERR(data)) {
> > +			ret = PTR_ERR(data);
> > +			break;
> > +		}
> > +
> > +		if (alg >= ARRAY_SIZE(decompressors) ||
> > +		    !decompressors[alg].config) {
> > +			erofs_err(sb, "algorithm %d isn't enabled on this kernel",
> > +				  alg);
> > +			ret = -EOPNOTSUPP;
> > +		} else {
> > +			ret = decompressors[alg].config(sb,
> > +					dsb, data, size);
> > +		}
> > +
> > +		kfree(data);
> > +		if (ret)
> > +			break;
> > +	}
> > +	erofs_put_metabuf(&buf);
> > +	return ret;
> > +}
> > +
> >   int z_erofs_decompress(struct z_erofs_decompress_req *rq,
> >   		       struct page **pagepool)
> >   {
> > diff --git a/fs/erofs/decompressor_lzma.c b/fs/erofs/decompressor_lzma.c
> > index 49addc345aeb..970464c4b676 100644
> > --- a/fs/erofs/decompressor_lzma.c
> > +++ b/fs/erofs/decompressor_lzma.c
> > @@ -72,10 +72,10 @@ int z_erofs_lzma_init(void)
> >   }
> >   
> >   int z_erofs_load_lzma_config(struct super_block *sb,
> > -			     struct erofs_super_block *dsb,
> > -			     struct z_erofs_lzma_cfgs *lzma, int size)
> > +			struct erofs_super_block *dsb, void *data, int size)
> >   {
> >   	static DEFINE_MUTEX(lzma_resize_mutex);
> > +	struct z_erofs_lzma_cfgs *lzma = data;
> >   	unsigned int dict_size, i;
> >   	struct z_erofs_lzma *strm, *head = NULL;
> >   	int err;
> > diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h
> > index d8d09fc3ed65..79a7a5815ea6 100644
> > --- a/fs/erofs/internal.h
> > +++ b/fs/erofs/internal.h
> > @@ -471,6 +471,8 @@ struct erofs_map_dev {
> >   
> >   /* data.c */
> >   extern const struct file_operations erofs_file_fops;
> > +void *erofs_read_metadata(struct super_block *sb, struct erofs_buf *buf,
> > +			  erofs_off_t *offset, int *lengthp);
> >   void erofs_unmap_metabuf(struct erofs_buf *buf);
> >   void erofs_put_metabuf(struct erofs_buf *buf);
> >   void *erofs_bread(struct erofs_buf *buf, struct inode *inode,
> > @@ -565,9 +567,7 @@ void z_erofs_exit_zip_subsystem(void);
> >   int erofs_try_to_free_all_cached_pages(struct erofs_sb_info *sbi,
> >   				       struct erofs_workgroup *egrp);
> >   int erofs_try_to_free_cached_page(struct page *page);
> > -int z_erofs_load_lz4_config(struct super_block *sb,
> > -			    struct erofs_super_block *dsb,
> > -			    struct z_erofs_lz4_cfgs *lz4, int len);
> > +int z_erofs_parse_cfgs(struct super_block *sb, struct erofs_super_block *dsb);
> >   #else
> >   static inline void erofs_shrinker_register(struct super_block *sb) {}
> >   static inline void erofs_shrinker_unregister(struct super_block *sb) {}
> > @@ -575,36 +575,14 @@ static inline int erofs_init_shrinker(void) { return 0; }
> >   static inline void erofs_exit_shrinker(void) {}
> >   static inline int z_erofs_init_zip_subsystem(void) { return 0; }
> >   static inline void z_erofs_exit_zip_subsystem(void) {}
> > -static inline int z_erofs_load_lz4_config(struct super_block *sb,
> > -				  struct erofs_super_block *dsb,
> > -				  struct z_erofs_lz4_cfgs *lz4, int len)
> > -{
> > -	if (lz4 || dsb->u1.lz4_max_distance) {
> > -		erofs_err(sb, "lz4 algorithm isn't enabled");
> > -		return -EINVAL;
> > -	}
> > -	return 0;
> > -}
> >   #endif	/* !CONFIG_EROFS_FS_ZIP */
> >   
> >   #ifdef CONFIG_EROFS_FS_ZIP_LZMA
> >   int z_erofs_lzma_init(void);
> >   void z_erofs_lzma_exit(void);
> > -int z_erofs_load_lzma_config(struct super_block *sb,
> > -			     struct erofs_super_block *dsb,
> > -			     struct z_erofs_lzma_cfgs *lzma, int size);
> >   #else
> >   static inline int z_erofs_lzma_init(void) { return 0; }
> >   static inline int z_erofs_lzma_exit(void) { return 0; }
> > -static inline int z_erofs_load_lzma_config(struct super_block *sb,
> > -			     struct erofs_super_block *dsb,
> > -			     struct z_erofs_lzma_cfgs *lzma, int size) {
> > -	if (lzma) {
> > -		erofs_err(sb, "lzma algorithm isn't enabled");
> > -		return -EINVAL;
> > -	}
> > -	return 0;
> > -}
> >   #endif	/* !CONFIG_EROFS_FS_ZIP */
> >   
> >   /* flags for erofs_fscache_register_cookie() */
> > diff --git a/fs/erofs/super.c b/fs/erofs/super.c
> > index bd8bf8fc2f5d..f2647126cb2f 100644
> > --- a/fs/erofs/super.c
> > +++ b/fs/erofs/super.c
> > @@ -126,8 +126,8 @@ static bool check_layout_compatibility(struct super_block *sb,
> >   
> >   #ifdef CONFIG_EROFS_FS_ZIP
> >   /* read variable-sized metadata, offset will be aligned by 4-byte */
> > -static void *erofs_read_metadata(struct super_block *sb, struct erofs_buf *buf,
> > -				 erofs_off_t *offset, int *lengthp)
> > +void *erofs_read_metadata(struct super_block *sb, struct erofs_buf *buf,
> > +			  erofs_off_t *offset, int *lengthp)
> >   {
> >   	u8 *buffer, *ptr;
> >   	int len, i, cnt;
> > @@ -159,64 +159,15 @@ static void *erofs_read_metadata(struct super_block *sb, struct erofs_buf *buf,
> >   	}
> >   	return buffer;
> >   }
> > -
> > -static int erofs_load_compr_cfgs(struct super_block *sb,
> > -				 struct erofs_super_block *dsb)
> > -{
> > -	struct erofs_sb_info *sbi = EROFS_SB(sb);
> > -	struct erofs_buf buf = __EROFS_BUF_INITIALIZER;
> > -	unsigned int algs, alg;
> > -	erofs_off_t offset;
> > -	int size, ret = 0;
> > -
> > -	sbi->available_compr_algs = le16_to_cpu(dsb->u1.available_compr_algs);
> > -	if (sbi->available_compr_algs & ~Z_EROFS_ALL_COMPR_ALGS) {
> > -		erofs_err(sb, "try to load compressed fs with unsupported algorithms %x",
> > -			  sbi->available_compr_algs & ~Z_EROFS_ALL_COMPR_ALGS);
> > -		return -EINVAL;
> > -	}
> > -
> > -	offset = EROFS_SUPER_OFFSET + sbi->sb_size;
> > -	alg = 0;
> > -	for (algs = sbi->available_compr_algs; algs; algs >>= 1, ++alg) {
> > -		void *data;
> > -
> > -		if (!(algs & 1))
> > -			continue;
> > -
> > -		data = erofs_read_metadata(sb, &buf, &offset, &size);
> > -		if (IS_ERR(data)) {
> > -			ret = PTR_ERR(data);
> > -			break;
> > -		}
> > -
> > -		switch (alg) {
> > -		case Z_EROFS_COMPRESSION_LZ4:
> > -			ret = z_erofs_load_lz4_config(sb, dsb, data, size);
> > -			break;
> > -		case Z_EROFS_COMPRESSION_LZMA:
> > -			ret = z_erofs_load_lzma_config(sb, dsb, data, size);
> > -			break;
> > -		default:
> > -			DBG_BUGON(1);
> > -			ret = -EFAULT;
> > -		}
> > -		kfree(data);
> > -		if (ret)
> > -			break;
> > -	}
> > -	erofs_put_metabuf(&buf);
> > -	return ret;
> > -}
> >   #else
> > -static int erofs_load_compr_cfgs(struct super_block *sb,
> > -				 struct erofs_super_block *dsb)
> > +static int z_erofs_parse_cfgs(struct super_block *sb,
> > +			      struct erofs_super_block *dsb)
> >   {
> > -	if (dsb->u1.available_compr_algs) {
> > -		erofs_err(sb, "try to load compressed fs when compression is disabled");
> > -		return -EINVAL;
> > -	}
> > -	return 0;
> > +	if (!dsb->u1.available_compr_algs)
> > +		return 0;
> > +
> > +	erofs_err(sb, "compression disabled, unable to mount compressed EROFS");
> > +	return -EOPNOTSUPP;
> >   }
> >   #endif
> >   
> > @@ -398,10 +349,7 @@ static int erofs_read_superblock(struct super_block *sb)
> >   	}
> >   
> >   	/* parse on-disk compression configurations */
> > -	if (erofs_sb_has_compr_cfgs(sbi))
> > -		ret = erofs_load_compr_cfgs(sb, dsb);
> > -	else
> > -		ret = z_erofs_load_lz4_config(sb, dsb, NULL, 0);
> > +	ret = z_erofs_parse_cfgs(sb, dsb);
> >   	if (ret < 0)
> >   		goto out;
> >     


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 6.1.y 1/2] erofs: simplify compression configuration parser
  2024-02-27  2:22 [PATCH 6.1.y 1/2] erofs: simplify compression configuration parser Yue Hu
  2024-02-27  3:00 ` Gao Xiang
  2024-02-27  3:11 ` [PATCH 6.1.y 2/2] erofs: fix inconsistent per-file compression format Yue Hu
@ 2024-02-27  8:52 ` Greg KH
  2 siblings, 0 replies; 5+ messages in thread
From: Greg KH @ 2024-02-27  8:52 UTC (permalink / raw)
  To: Yue Hu; +Cc: stable, hsiangkao, linux-erofs, zhangwen, Yue Hu

On Tue, Feb 27, 2024 at 10:22:38AM +0800, Yue Hu wrote:
> From: Gao Xiang <hsiangkao@linux.alibaba.com>
> 
> [ Upstream commit efb4fb02cef3ab410b603c8f0e1c67f61d55f542 ]
> 
> Move erofs_load_compr_cfgs() into decompressor.c as well as introduce
> a callback instead of a hard-coded switch for each algorithm for
> simplicity.
> 
> Reviewed-by: Chao Yu <chao@kernel.org>
> Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
> Link: https://lore.kernel.org/r/20231022130957.11398-1-xiang@kernel.org
> Stable-dep-of: 118a8cf504d7 ("erofs: fix inconsistent per-file compression format")
> Signed-off-by: Yue Hu <huyue2@coolpad.com>
> ---

Both queued up, thanks.

greg k-h

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2024-02-27  8:52 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-02-27  2:22 [PATCH 6.1.y 1/2] erofs: simplify compression configuration parser Yue Hu
2024-02-27  3:00 ` Gao Xiang
2024-02-27  7:40   ` Yue Hu
2024-02-27  3:11 ` [PATCH 6.1.y 2/2] erofs: fix inconsistent per-file compression format Yue Hu
2024-02-27  8:52 ` [PATCH 6.1.y 1/2] erofs: simplify compression configuration parser Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox