- Get rid of unpack_compacted_index() and fold it into
   z_erofs_load_compact_lcluster();

 - Avoid a goto.

Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com>
---
 fs/erofs/zmap.c | 89 ++++++++++++++++++++-----------------------------
 1 file changed, 36 insertions(+), 53 deletions(-)

diff --git a/fs/erofs/zmap.c b/fs/erofs/zmap.c
index 4535f2f0a014..b9e35089c9b8 100644
--- a/fs/erofs/zmap.c
+++ b/fs/erofs/zmap.c
@@ -97,17 +97,48 @@ static int get_compacted_la_distance(unsigned int lobits,
        return d1;
 }
 
-static int unpack_compacted_index(struct z_erofs_maprecorder *m,
-                                 unsigned int amortizedshift,
-                                 erofs_off_t pos, bool lookahead)
+static int z_erofs_load_compact_lcluster(struct z_erofs_maprecorder *m,
+                                        unsigned long lcn, bool lookahead)
 {
-       struct erofs_inode *const vi = EROFS_I(m->inode);
+       struct inode *const inode = m->inode;
+       struct erofs_inode *const vi = EROFS_I(inode);
+       const erofs_off_t ebase = sizeof(struct z_erofs_map_header) +
+               ALIGN(erofs_iloc(inode) + vi->inode_isize + vi->xattr_isize, 8);
        const unsigned int lclusterbits = vi->z_logical_clusterbits;
+       const unsigned int totalidx = erofs_iblks(inode);
+       unsigned int compacted_4b_initial, compacted_2b, amortizedshift;
        unsigned int vcnt, lo, lobits, encodebits, nblk, bytes;
-       bool big_pcluster;
+       bool big_pcluster = vi->z_advise & Z_EROFS_ADVISE_BIG_PCLUSTER_1;
+       erofs_off_t pos;
        u8 *in, type;
        int i;
 
+       if (lcn >= totalidx || lclusterbits > 14)
+               return -EINVAL;
+
+       m->lcn = lcn;
+       /* used to align to 32-byte (compacted_2b) alignment */
+       compacted_4b_initial = ((32 - ebase % 32) / 4) & 7;
+       compacted_2b = 0;
+       if ((vi->z_advise & Z_EROFS_ADVISE_COMPACTED_2B) &&
+           compacted_4b_initial < totalidx)
+               compacted_2b = rounddown(totalidx - compacted_4b_initial, 16);
+
+       pos = ebase;
+       amortizedshift = 2;     /* compact_4b */
+       if (lcn >= compacted_4b_initial) {
+               pos += compacted_4b_initial * 4;
+               lcn -= compacted_4b_initial;
+               if (lcn < compacted_2b) {
+                       amortizedshift = 1;
+               } else {
+                       pos += compacted_2b * 2;
+                       lcn -= compacted_2b;
+               }
+       }
+       pos += lcn * (1 << amortizedshift);
+
+       /* figure out the lcluster count in this pack */
        if (1 << amortizedshift == 4 && lclusterbits <= 14)
                vcnt = 2;
        else if (1 << amortizedshift == 2 && lclusterbits <= 12)
@@ -122,7 +153,6 @@ static int unpack_compacted_index(struct 
z_erofs_maprecorder *m,
        /* it doesn't equal to round_up(..) */
        m->nextpackoff = round_down(pos, vcnt << amortizedshift) +
                         (vcnt << amortizedshift);
-       big_pcluster = vi->z_advise & Z_EROFS_ADVISE_BIG_PCLUSTER_1;
        lobits = max(lclusterbits, ilog2(Z_EROFS_LI_D0_CBLKCNT) + 1U);
        encodebits = ((vcnt << amortizedshift) - sizeof(__le32)) * 8 / vcnt;
        bytes = pos & ((vcnt << amortizedshift) - 1);
@@ -207,53 +237,6 @@ static int unpack_compacted_index(struct 
z_erofs_maprecorder *m,
        return 0;
 }
 
-static int z_erofs_load_compact_lcluster(struct z_erofs_maprecorder *m,
-                                        unsigned long lcn, bool lookahead)
-{
-       struct inode *const inode = m->inode;
-       struct erofs_inode *const vi = EROFS_I(inode);
-       const erofs_off_t ebase = sizeof(struct z_erofs_map_header) +
-               ALIGN(erofs_iloc(inode) + vi->inode_isize + vi->xattr_isize, 8);
-       unsigned int totalidx = erofs_iblks(inode);
-       unsigned int compacted_4b_initial, compacted_2b;
-       unsigned int amortizedshift;
-       erofs_off_t pos;
-
-       if (lcn >= totalidx || vi->z_logical_clusterbits > 14)
-               return -EINVAL;
-
-       m->lcn = lcn;
-       /* used to align to 32-byte (compacted_2b) alignment */
-       compacted_4b_initial = (32 - ebase % 32) / 4;
-       if (compacted_4b_initial == 32 / 4)
-               compacted_4b_initial = 0;
-
-       if ((vi->z_advise & Z_EROFS_ADVISE_COMPACTED_2B) &&
-           compacted_4b_initial < totalidx)
-               compacted_2b = rounddown(totalidx - compacted_4b_initial, 16);
-       else
-               compacted_2b = 0;
-
-       pos = ebase;
-       if (lcn < compacted_4b_initial) {
-               amortizedshift = 2;
-               goto out;
-       }
-       pos += compacted_4b_initial * 4;
-       lcn -= compacted_4b_initial;
-
-       if (lcn < compacted_2b) {
-               amortizedshift = 1;
-               goto out;
-       }
-       pos += compacted_2b * 2;
-       lcn -= compacted_2b;
-       amortizedshift = 2;
-out:
-       pos += lcn * (1 << amortizedshift);
-       return unpack_compacted_index(m, amortizedshift, pos, lookahead);
-}
-
 static int z_erofs_load_lcluster_from_disk(struct z_erofs_maprecorder *m,
                                           unsigned int lcn, bool lookahead)
 {
-- 
2.43.5

Reply via email to