The initial m.delta[0] also needs to be checked against zero.

In addition, also drop the redundant logic that errors out for
lcn == 0 / m.delta[0] == 1 case.

Signed-off-by: Gao Xiang <[email protected]>
---
 fs/erofs/zmap.c | 20 ++++++--------------
 1 file changed, 6 insertions(+), 14 deletions(-)

diff --git a/fs/erofs/zmap.c b/fs/erofs/zmap.c
index 6aca228cd2a5..a8ce531f4f19 100644
--- a/fs/erofs/zmap.c
+++ b/fs/erofs/zmap.c
@@ -272,20 +272,19 @@ static int z_erofs_extent_lookback(struct 
z_erofs_maprecorder *m,
                unsigned long lcn = m->lcn - lookback_distance;
                int err;
 
+               if (!lookback_distance)
+                       break;
+
                err = z_erofs_load_lcluster_from_disk(m, lcn, false);
                if (err)
                        return err;
-
                if (m->type == Z_EROFS_LCLUSTER_TYPE_NONHEAD) {
                        lookback_distance = m->delta[0];
-                       if (!lookback_distance)
-                               break;
                        continue;
-               } else {
-                       m->headtype = m->type;
-                       m->map->m_la = (lcn << lclusterbits) | m->clusterofs;
-                       return 0;
                }
+               m->headtype = m->type;
+               m->map->m_la = (lcn << lclusterbits) | m->clusterofs;
+               return 0;
        }
        erofs_err(sb, "bogus lookback distance %u @ lcn %lu of nid %llu",
                  lookback_distance, m->lcn, vi->nid);
@@ -435,13 +434,6 @@ static int z_erofs_map_blocks_fo(struct inode *inode,
                        end = inode->i_size;
        } else {
                if (m.type != Z_EROFS_LCLUSTER_TYPE_NONHEAD) {
-                       /* m.lcn should be >= 1 if endoff < m.clusterofs */
-                       if (!m.lcn) {
-                               erofs_err(sb, "invalid logical cluster 0 at nid 
%llu",
-                                         vi->nid);
-                               err = -EFSCORRUPTED;
-                               goto unmap_out;
-                       }
                        end = (m.lcn << lclusterbits) | m.clusterofs;
                        map->m_flags |= EROFS_MAP_FULL_MAPPED;
                        m.delta[0] = 1;
-- 
2.43.5


Reply via email to