Received: by 2002:a05:6a10:413:0:0:0:0 with SMTP id 19csp2094328pxp; Thu, 10 Mar 2022 19:50:08 -0800 (PST) X-Google-Smtp-Source: ABdhPJwbEW+xHXxWhtjfdC812XVmRqxRglv66rrx+ym/gldaFEmrZLi4sVtZ1NaaAaz2y0NlbHdI X-Received: by 2002:a17:902:ce08:b0:14f:85c1:773e with SMTP id k8-20020a170902ce0800b0014f85c1773emr8522042plg.99.1646970607939; Thu, 10 Mar 2022 19:50:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1646970607; cv=none; d=google.com; s=arc-20160816; b=QDCiN9f4fbSpk5oCCQJRo7sMmqhrbfwCn6VWc/nZ/KMoBUD1ATS5f30+mOT62/0Vlp BL23wKot+t7IYaN2hibBv2zmMRJ8DHdemZ2qgalZajWAMNIKA0GEguw3j0UqK2/GLcY5 lEM660LYVRPPAiyZR60+bNQXhvG9y0tOy512+uLEPmYQp3V9RuxYNhOyeQxbtpQyrBdj 86sEDQasjElTwB9Nl5xZ/xPeLnl5PGP7fCdz3cA+cGQPzoyUgHW6zmd7keSGggX9qDMq +evVjOWK+rgl40gOa8V5Gl0lPBKvPvBxMPLavOduHEVw2K5ADveHxw0nGBidaGiDmOYR dRCg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=kW/IeLdLv/uYMG/P2XfZsaP38XG4PVstz8UIBFz0pi4=; b=y0iJrMHxXTf5jc3MRH/elzPTuwCiTgoxiuuou2dvMai76yE9cgLRdhN/Kvm+6Y3GDI SSbxoUSCUI7P8xyvoXzx+HM0l9cxTceU7/bHyibE6rc5aC/fwUbjsEvOUovWxsJUnRzY 6eaYWd3AHMeVPMTZ6Q04EbtVQASzr1FFmsdRXB/ydA6C2a8x+nrLf2hHDKa3P/xQkvZN ps9hZLw8WK4uuKAnThFpK4WR6ULkMSFwU86n0Wtlrux+VWNzTSwodedKoattfcQfeqzi QZxD1MGnDsJ9JQ0KlFtDAafLYzyvsk5EQI83y3/cMSeP+XBDz0g6jyLu86FATAKMD5UF Tfmg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=alibaba.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id g24-20020a635658000000b003788f039ce7si6595971pgm.345.2022.03.10.19.49.51; Thu, 10 Mar 2022 19:50:07 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=alibaba.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S245443AbiCJS2z (ORCPT + 99 others); Thu, 10 Mar 2022 13:28:55 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42068 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242094AbiCJS2y (ORCPT ); Thu, 10 Mar 2022 13:28:54 -0500 Received: from out30-130.freemail.mail.aliyun.com (out30-130.freemail.mail.aliyun.com [115.124.30.130]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 577C9A7754 for ; Thu, 10 Mar 2022 10:27:52 -0800 (PST) X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R201e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=e01e04394;MF=hsiangkao@linux.alibaba.com;NM=1;PH=DS;RN=4;SR=0;TI=SMTPD_---0V6pgl69_1646936864; Received: from e18g06460.et15sqa.tbsite.net(mailfrom:hsiangkao@linux.alibaba.com fp:SMTPD_---0V6pgl69_1646936864) by smtp.aliyun-inc.com(127.0.0.1); Fri, 11 Mar 2022 02:27:50 +0800 From: Gao Xiang To: linux-erofs@lists.ozlabs.org, Chao Yu Cc: LKML , Gao Xiang Subject: [PATCH 1/2] erofs: clean up z_erofs_extent_lookback Date: Fri, 11 Mar 2022 02:27:42 +0800 Message-Id: <20220310182743.102365-1-hsiangkao@linux.alibaba.com> X-Mailer: git-send-email 2.24.4 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-9.9 required=5.0 tests=BAYES_00, ENV_AND_HDR_SPF_MATCH,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H5, RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE, UNPARSEABLE_RELAY,USER_IN_DEF_SPF_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Avoid the unnecessary tail recursion since it can be converted into a loop directly in order to prevent potential stack overflow. It's a pretty straightforward conversion. Signed-off-by: Gao Xiang --- fs/erofs/zmap.c | 67 ++++++++++++++++++++++++------------------------- 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/fs/erofs/zmap.c b/fs/erofs/zmap.c index b4059b9c3bac..572f0b8151ba 100644 --- a/fs/erofs/zmap.c +++ b/fs/erofs/zmap.c @@ -431,48 +431,47 @@ static int z_erofs_extent_lookback(struct z_erofs_maprecorder *m, unsigned int lookback_distance) { struct erofs_inode *const vi = EROFS_I(m->inode); - struct erofs_map_blocks *const map = m->map; const unsigned int lclusterbits = vi->z_logical_clusterbits; - unsigned long lcn = m->lcn; - int err; - if (lcn < lookback_distance) { - erofs_err(m->inode->i_sb, - "bogus lookback distance @ nid %llu", vi->nid); - DBG_BUGON(1); - return -EFSCORRUPTED; - } + while (m->lcn >= lookback_distance) { + unsigned long lcn = m->lcn - lookback_distance; + int err; - /* load extent head logical cluster if needed */ - lcn -= lookback_distance; - err = z_erofs_load_cluster_from_disk(m, lcn, false); - if (err) - return err; + /* load extent head logical cluster if needed */ + err = z_erofs_load_cluster_from_disk(m, lcn, false); + if (err) + return err; - switch (m->type) { - case Z_EROFS_VLE_CLUSTER_TYPE_NONHEAD: - if (!m->delta[0]) { + switch (m->type) { + case Z_EROFS_VLE_CLUSTER_TYPE_NONHEAD: + if (!m->delta[0]) { + erofs_err(m->inode->i_sb, + "invalid lookback distance 0 @ nid %llu", + vi->nid); + DBG_BUGON(1); + return -EFSCORRUPTED; + } + lookback_distance = m->delta[0]; + continue; + case Z_EROFS_VLE_CLUSTER_TYPE_PLAIN: + case Z_EROFS_VLE_CLUSTER_TYPE_HEAD1: + case Z_EROFS_VLE_CLUSTER_TYPE_HEAD2: + m->headtype = m->type; + m->map->m_la = (lcn << lclusterbits) | m->clusterofs; + return 0; + default: erofs_err(m->inode->i_sb, - "invalid lookback distance 0 @ nid %llu", - vi->nid); + "unknown type %u @ lcn %lu of nid %llu", + m->type, lcn, vi->nid); DBG_BUGON(1); - return -EFSCORRUPTED; + return -EOPNOTSUPP; } - return z_erofs_extent_lookback(m, m->delta[0]); - case Z_EROFS_VLE_CLUSTER_TYPE_PLAIN: - case Z_EROFS_VLE_CLUSTER_TYPE_HEAD1: - case Z_EROFS_VLE_CLUSTER_TYPE_HEAD2: - m->headtype = m->type; - map->m_la = (lcn << lclusterbits) | m->clusterofs; - break; - default: - erofs_err(m->inode->i_sb, - "unknown type %u @ lcn %lu of nid %llu", - m->type, lcn, vi->nid); - DBG_BUGON(1); - return -EOPNOTSUPP; } - return 0; + + erofs_err(m->inode->i_sb, "bogus lookback distance @ nid %llu", + vi->nid); + DBG_BUGON(1); + return -EFSCORRUPTED; } static int z_erofs_get_extent_compressedlen(struct z_erofs_maprecorder *m, -- 2.24.4