There's no need to enumerate each type.  No logic changes.

Signed-off-by: Hongzhen Luo <hongz...@linux.alibaba.com>
---
v5: Exit the loop and return EOPNOTSUPP when `!lookback_distance`.
v4: 
https://lore.kernel.org/linux-erofs/20250207094515.2589242-1-hongz...@linux.alibaba.com/
v3: 
https://lore.kernel.org/all/20250207085056.2502010-1-hongz...@linux.alibaba.com/
v2: 
https://lore.kernel.org/all/20250207080829.2405528-1-hongz...@linux.alibaba.com/
v1: 
https://lore.kernel.org/all/20250207064135.2249529-1-hongz...@linux.alibaba.com/
---
 fs/erofs/zmap.c | 63 +++++++++++++++++++------------------------------
 1 file changed, 24 insertions(+), 39 deletions(-)

diff --git a/fs/erofs/zmap.c b/fs/erofs/zmap.c
index 689437e99a5a..d278ebd60281 100644
--- a/fs/erofs/zmap.c
+++ b/fs/erofs/zmap.c
@@ -265,26 +265,22 @@ static int z_erofs_extent_lookback(struct 
z_erofs_maprecorder *m,
                if (err)
                        return err;
 
-               switch (m->type) {
-               case Z_EROFS_LCLUSTER_TYPE_NONHEAD:
+               if (m->type >= Z_EROFS_LCLUSTER_TYPE_MAX) {
+                       erofs_err(sb, "unknown type %u @ lcn %lu of nid %llu",
+                                 m->type, lcn, vi->nid);
+                       DBG_BUGON(1);
+                       return -EOPNOTSUPP;
+               } else if (m->type == Z_EROFS_LCLUSTER_TYPE_NONHEAD) {
                        lookback_distance = m->delta[0];
                        if (!lookback_distance)
-                               goto err_bogus;
+                               break;
                        continue;
-               case Z_EROFS_LCLUSTER_TYPE_PLAIN:
-               case Z_EROFS_LCLUSTER_TYPE_HEAD1:
-               case Z_EROFS_LCLUSTER_TYPE_HEAD2:
+               } else {
                        m->headtype = m->type;
                        m->map->m_la = (lcn << lclusterbits) | m->clusterofs;
                        return 0;
-               default:
-                       erofs_err(sb, "unknown type %u @ lcn %lu of nid %llu",
-                                 m->type, lcn, vi->nid);
-                       DBG_BUGON(1);
-                       return -EOPNOTSUPP;
                }
        }
-err_bogus:
        erofs_err(sb, "bogus lookback distance %u @ lcn %lu of nid %llu",
                  lookback_distance, m->lcn, vi->nid);
        DBG_BUGON(1);
@@ -329,35 +325,28 @@ static int z_erofs_get_extent_compressedlen(struct 
z_erofs_maprecorder *m,
        DBG_BUGON(lcn == initial_lcn &&
                  m->type == Z_EROFS_LCLUSTER_TYPE_NONHEAD);
 
-       switch (m->type) {
-       case Z_EROFS_LCLUSTER_TYPE_PLAIN:
-       case Z_EROFS_LCLUSTER_TYPE_HEAD1:
-       case Z_EROFS_LCLUSTER_TYPE_HEAD2:
+       if (m->type == Z_EROFS_LCLUSTER_TYPE_NONHEAD) {
+               if (m->delta[0] != 1) {
+                       erofs_err(sb, "bogus CBLKCNT @ lcn %lu of nid %llu", 
lcn, vi->nid);
+                       DBG_BUGON(1);
+                       return -EFSCORRUPTED;
+               }
+               if (m->compressedblks)
+                       goto out;
+       } else if (m->type < Z_EROFS_LCLUSTER_TYPE_MAX) {
                /*
                 * if the 1st NONHEAD lcluster is actually PLAIN or HEAD type
                 * rather than CBLKCNT, it's a 1 block-sized pcluster.
                 */
                m->compressedblks = 1;
-               break;
-       case Z_EROFS_LCLUSTER_TYPE_NONHEAD:
-               if (m->delta[0] != 1)
-                       goto err_bonus_cblkcnt;
-               if (m->compressedblks)
-                       break;
-               fallthrough;
-       default:
-               erofs_err(sb, "cannot found CBLKCNT @ lcn %lu of nid %llu", lcn,
-                         vi->nid);
-               DBG_BUGON(1);
-               return -EFSCORRUPTED;
+               goto out;
        }
+       erofs_err(sb, "cannot found CBLKCNT @ lcn %lu of nid %llu", lcn, 
vi->nid);
+       DBG_BUGON(1);
+       return -EFSCORRUPTED;
 out:
        m->map->m_plen = erofs_pos(sb, m->compressedblks);
        return 0;
-err_bonus_cblkcnt:
-       erofs_err(sb, "bogus CBLKCNT @ lcn %lu of nid %llu", lcn, vi->nid);
-       DBG_BUGON(1);
-       return -EFSCORRUPTED;
 }
 
 static int z_erofs_get_extent_decompressedlen(struct z_erofs_maprecorder *m)
@@ -386,9 +375,7 @@ static int z_erofs_get_extent_decompressedlen(struct 
z_erofs_maprecorder *m)
                                m->delta[1] = 1;
                                DBG_BUGON(1);
                        }
-               } else if (m->type == Z_EROFS_LCLUSTER_TYPE_PLAIN ||
-                          m->type == Z_EROFS_LCLUSTER_TYPE_HEAD1 ||
-                          m->type == Z_EROFS_LCLUSTER_TYPE_HEAD2) {
+               } else if (m->type < Z_EROFS_LCLUSTER_TYPE_MAX) {
                        if (lcn != headlcn)
                                break;  /* ends at the next HEAD lcluster */
                        m->delta[1] = 1;
@@ -452,8 +439,7 @@ static int z_erofs_do_map_blocks(struct inode *inode,
                }
                /* m.lcn should be >= 1 if endoff < m.clusterofs */
                if (!m.lcn) {
-                       erofs_err(inode->i_sb,
-                                 "invalid logical cluster 0 at nid %llu",
+                       erofs_err(inode->i_sb, "invalid logical cluster 0 at 
nid %llu",
                                  vi->nid);
                        err = -EFSCORRUPTED;
                        goto unmap_out;
@@ -469,8 +455,7 @@ static int z_erofs_do_map_blocks(struct inode *inode,
                        goto unmap_out;
                break;
        default:
-               erofs_err(inode->i_sb,
-                         "unknown type %u @ offset %llu of nid %llu",
+               erofs_err(inode->i_sb, "unknown type %u @ offset %llu of nid 
%llu",
                          m.type, ofs, vi->nid);
                err = -EOPNOTSUPP;
                goto unmap_out;
-- 
2.43.5

Reply via email to