@@ -852,6 +852,8 @@ static int z_erofs_register_pcluster(struct z_erofs_decompress_frontend *fe)
852
852
static int z_erofs_pcluster_begin (struct z_erofs_decompress_frontend * fe )
853
853
{
854
854
struct erofs_map_blocks * map = & fe -> map ;
855
+ struct super_block * sb = fe -> inode -> i_sb ;
856
+ erofs_blk_t blknr = erofs_blknr (sb , map -> m_pa );
855
857
struct erofs_workgroup * grp = NULL ;
856
858
int ret ;
857
859
@@ -861,8 +863,7 @@ static int z_erofs_pcluster_begin(struct z_erofs_decompress_frontend *fe)
861
863
DBG_BUGON (fe -> owned_head == Z_EROFS_PCLUSTER_NIL );
862
864
863
865
if (!(map -> m_flags & EROFS_MAP_META )) {
864
- grp = erofs_find_workgroup (fe -> inode -> i_sb ,
865
- map -> m_pa >> PAGE_SHIFT );
866
+ grp = erofs_find_workgroup (sb , blknr );
866
867
} else if ((map -> m_pa & ~PAGE_MASK ) + map -> m_plen > PAGE_SIZE ) {
867
868
DBG_BUGON (1 );
868
869
return - EFSCORRUPTED ;
@@ -881,9 +882,26 @@ static int z_erofs_pcluster_begin(struct z_erofs_decompress_frontend *fe)
881
882
} else if (ret ) {
882
883
return ret ;
883
884
}
885
+
884
886
z_erofs_bvec_iter_begin (& fe -> biter , & fe -> pcl -> bvset ,
885
887
Z_EROFS_INLINE_BVECS , fe -> pcl -> vcnt );
886
- /* since file-backed online pages are traversed in reverse order */
888
+ if (!z_erofs_is_inline_pcluster (fe -> pcl )) {
889
+ /* bind cache first when cached decompression is preferred */
890
+ z_erofs_bind_cache (fe );
891
+ } else {
892
+ void * mptr ;
893
+
894
+ mptr = erofs_read_metabuf (& map -> buf , sb , blknr , EROFS_NO_KMAP );
895
+ if (IS_ERR (mptr )) {
896
+ ret = PTR_ERR (mptr );
897
+ erofs_err (sb , "failed to get inline data %d" , ret );
898
+ return ret ;
899
+ }
900
+ get_page (map -> buf .page );
901
+ WRITE_ONCE (fe -> pcl -> compressed_bvecs [0 ].page , map -> buf .page );
902
+ fe -> mode = Z_EROFS_PCLUSTER_FOLLOWED_NOINPLACE ;
903
+ }
904
+ /* file-backed inplace I/O pages are traversed in reverse order */
887
905
fe -> icur = z_erofs_pclusterpages (fe -> pcl );
888
906
return 0 ;
889
907
}
@@ -982,39 +1000,15 @@ static int z_erofs_do_read_page(struct z_erofs_decompress_frontend *fe,
982
1000
err = z_erofs_map_blocks_iter (inode , map , 0 );
983
1001
if (err )
984
1002
goto out ;
985
- } else {
986
- if (fe -> pcl )
987
- goto hitted ;
988
- /* didn't get a valid pcluster previously (very rare) */
989
- }
990
-
991
- if (!(map -> m_flags & EROFS_MAP_MAPPED ) ||
992
- map -> m_flags & EROFS_MAP_FRAGMENT )
1003
+ } else if (fe -> pcl ) {
993
1004
goto hitted ;
1005
+ }
994
1006
995
- err = z_erofs_pcluster_begin (fe );
996
- if (err )
997
- goto out ;
998
-
999
- if (z_erofs_is_inline_pcluster (fe -> pcl )) {
1000
- void * mp ;
1001
-
1002
- mp = erofs_read_metabuf (& fe -> map .buf , inode -> i_sb ,
1003
- erofs_blknr (inode -> i_sb , map -> m_pa ),
1004
- EROFS_NO_KMAP );
1005
- if (IS_ERR (mp )) {
1006
- err = PTR_ERR (mp );
1007
- erofs_err (inode -> i_sb ,
1008
- "failed to get inline page, err %d" , err );
1007
+ if ((map -> m_flags & EROFS_MAP_MAPPED ) &&
1008
+ !(map -> m_flags & EROFS_MAP_FRAGMENT )) {
1009
+ err = z_erofs_pcluster_begin (fe );
1010
+ if (err )
1009
1011
goto out ;
1010
- }
1011
- get_page (fe -> map .buf .page );
1012
- WRITE_ONCE (fe -> pcl -> compressed_bvecs [0 ].page ,
1013
- fe -> map .buf .page );
1014
- fe -> mode = Z_EROFS_PCLUSTER_FOLLOWED_NOINPLACE ;
1015
- } else {
1016
- /* bind cache first when cached decompression is preferred */
1017
- z_erofs_bind_cache (fe );
1018
1012
}
1019
1013
hitted :
1020
1014
/*
0 commit comments