[PATCH 6.1.y] erofs: get rid of z_erofs_fill_inode()

From: driz2t

Date: Wed Mar 25 2026 - 07:20:19 EST


[ Upstream commit 4fdadd5b0f0c723c812842454f8cca1619f2e731 ]

Prior to big pclusters, non-compact compression indexes could have
empty headers.

Avoid the legacy path since it can be handled properly as a specific
compression header with z_erofs_fill_inode_lazy() too.

Tested with existing erofs-utils versions.

Link: https://lore.kernel.org/r/20230413092241.73829-1-hsiangkao@xxxxxxxxxxxxxxxxx
Link: https://syzkaller.appspot.com/bug?extid=016d861797fd718491a8
Reported-by: syzbot+016d861797fd718491a8@xxxxxxxxxxxxxxxxxxxxxxxxx
Tested-by: syzbot+016d861797fd718491a8@xxxxxxxxxxxxxxxxxxxxxxxxx
Signed-off-by: Gao Xiang <hsiangkao@xxxxxxxxxxxxxxxxx>
Signed-off-by: Changjian Liu <driz2t@xxxxxx>
---
fs/erofs/inode.c | 12 ++++++++----
fs/erofs/internal.h | 2 --
fs/erofs/zmap.c | 18 ------------------
3 files changed, 8 insertions(+), 24 deletions(-)

diff --git a/fs/erofs/inode.c b/fs/erofs/inode.c
index 3cbef6318b7b..484572504b4d 100644
--- a/fs/erofs/inode.c
+++ b/fs/erofs/inode.c
@@ -280,11 +280,15 @@ static int erofs_fill_inode(struct inode *inode)
}

if (erofs_inode_is_data_compressed(vi-&gt;datalayout)) {
+#ifdef CONFIG_EROFS_FS_ZIP
if (!erofs_is_fscache_mode(inode-&gt;i_sb) &amp;&amp;
- inode-&gt;i_sb-&gt;s_blocksize_bits == PAGE_SHIFT)
- err = z_erofs_fill_inode(inode);
- else
- err = -EOPNOTSUPP;
+ inode-&gt;i_sb-&gt;s_blocksize_bits == PAGE_SHIFT) {
+ inode-&gt;i_mapping-&gt;a_ops = &amp;z_erofs_aops;
+ err = 0;
+ goto out_unlock;
+ }
+#endif
+ err = -EOPNOTSUPP;
goto out_unlock;
}
inode-&gt;i_mapping-&gt;a_ops = &amp;erofs_raw_access_aops;
diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h
index 126970932805..1a4d08a93339 100644
--- a/fs/erofs/internal.h
+++ b/fs/erofs/internal.h
@@ -423,12 +423,10 @@ enum {
extern const struct iomap_ops z_erofs_iomap_report_ops;

#ifdef CONFIG_EROFS_FS_ZIP
-int z_erofs_fill_inode(struct inode *inode);
int z_erofs_map_blocks_iter(struct inode *inode,
struct erofs_map_blocks *map,
int flags);
#else
-static inline int z_erofs_fill_inode(struct inode *inode) { return -EOPNOTSUPP; }
static inline int z_erofs_map_blocks_iter(struct inode *inode,
struct erofs_map_blocks *map,
int flags)
diff --git a/fs/erofs/zmap.c b/fs/erofs/zmap.c
index d2d7fe826091..ff84533da0c4 100644
--- a/fs/erofs/zmap.c
+++ b/fs/erofs/zmap.c
@@ -7,24 +7,6 @@
#include <asm unaligned.h="">
#include <trace events="" erofs.h="">

-int z_erofs_fill_inode(struct inode *inode)
-{
- struct erofs_inode *const vi = EROFS_I(inode);
- struct erofs_sb_info *sbi = EROFS_SB(inode-&gt;i_sb);
-
- if (!erofs_sb_has_big_pcluster(sbi) &amp;&amp;
- !erofs_sb_has_ztailpacking(sbi) &amp;&amp; !erofs_sb_has_fragments(sbi) &amp;&amp;
- vi-&gt;datalayout == EROFS_INODE_COMPRESSED_FULL) {
- vi-&gt;z_advise = 0;
- vi-&gt;z_algorithmtype[0] = 0;
- vi-&gt;z_algorithmtype[1] = 0;
- vi-&gt;z_logical_clusterbits = inode-&gt;i_sb-&gt;s_blocksize_bits;
- set_bit(EROFS_I_Z_INITED_BIT, &amp;vi-&gt;flags);
- }
- inode-&gt;i_mapping-&gt;a_ops = &amp;z_erofs_aops;
- return 0;
-}
-
struct z_erofs_maprecorder {
struct inode *inode;
struct erofs_map_blocks *map;
--
2.43.0</trace></asm></driz2t@xxxxxx></hsiangkao@xxxxxxxxxxxxxxxxx>