Source kernel commit: 3b7781aeaefb627d4e07c1af9be923f9e8047d8b Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com> --- lib/zmap.c | 60 ++++++++++++++++++++++-------------------------------- 1 file changed, 24 insertions(+), 36 deletions(-)
diff --git a/lib/zmap.c b/lib/zmap.c index 2a9baba..30bb7e3 100644 --- a/lib/zmap.c +++ b/lib/zmap.c @@ -282,26 +282,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("unknown type %u @ lcn %lu of nid %llu", + m->type, lcn, vi->nid | 0ULL); + 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("unknown type %u @ lcn %lu of nid %llu", - m->type, lcn, vi->nid | 0ULL); - DBG_BUGON(1); - return -EOPNOTSUPP; } } -err_bogus: erofs_err("bogus lookback distance %u @ lcn %lu of nid %llu", lookback_distance, m->lcn | 0ULL, vi->nid); DBG_BUGON(1); @@ -345,36 +341,30 @@ 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("bogus CBLKCNT @ lcn %lu of nid %llu", + lcn, vi->nid | 0ULL); + 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("cannot found CBLKCNT @ lcn %lu of nid %llu", - lcn, vi->nid | 0ULL); - DBG_BUGON(1); - return -EFSCORRUPTED; + goto out; } -out: - m->map->m_plen = erofs_pos(sbi, m->compressedblks); - return 0; -err_bonus_cblkcnt: - erofs_err("bogus CBLKCNT @ lcn %lu of nid %llu", + erofs_err("cannot found CBLKCNT @ lcn %lu of nid %llu", lcn, vi->nid | 0ULL); DBG_BUGON(1); return -EFSCORRUPTED; +out: + m->map->m_plen = erofs_pos(sbi, m->compressedblks); + return 0; } static int z_erofs_get_extent_decompressedlen(struct z_erofs_maprecorder *m) @@ -402,9 +392,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; -- 2.43.5