From patchwork Wed Apr 25 05:13:49 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Su Yue X-Patchwork-Id: 10361527 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 3E7A660225 for ; Wed, 25 Apr 2018 05:08:25 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2565B28C66 for ; Wed, 25 Apr 2018 05:08:25 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 19A8428ECE; Wed, 25 Apr 2018 05:08:25 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00, MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8BE3C28C66 for ; Wed, 25 Apr 2018 05:08:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751079AbeDYFIV (ORCPT ); Wed, 25 Apr 2018 01:08:21 -0400 Received: from mail.cn.fujitsu.com ([183.91.158.132]:35655 "EHLO heian.cn.fujitsu.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750995AbeDYFIU (ORCPT ); Wed, 25 Apr 2018 01:08:20 -0400 X-IronPort-AV: E=Sophos;i="5.43,368,1503331200"; d="scan'208";a="39290842" Received: from bogon (HELO cn.fujitsu.com) ([10.167.33.5]) by heian.cn.fujitsu.com with ESMTP; 25 Apr 2018 13:08:10 +0800 Received: from G08CNEXCHPEKD03.g08.fujitsu.local (unknown [10.167.33.85]) by cn.fujitsu.com (Postfix) with ESMTP id E103F49F19DD for ; Wed, 25 Apr 2018 13:08:04 +0800 (CST) Received: from archlinux.g08.fujitsu.local (10.167.226.31) by G08CNEXCHPEKD03.g08.fujitsu.local (10.167.33.89) with Microsoft SMTP Server (TLS) id 14.3.361.1; Wed, 25 Apr 2018 13:08:04 +0800 From: Su Yue To: Subject: [PATCH V2] btrfs-progs: do not merge tree block refs have different root_id Date: Wed, 25 Apr 2018 13:13:49 +0800 Message-ID: <20180425051349.2639-1-suy.fnst@cn.fujitsu.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180424055233.6420-1-suy.fnst@cn.fujitsu.com> References: <20180424055233.6420-1-suy.fnst@cn.fujitsu.com> MIME-Version: 1.0 X-Originating-IP: [10.167.226.31] X-yoursite-MailScanner-ID: E103F49F19DD.AC46E X-yoursite-MailScanner: Found to be clean X-yoursite-MailScanner-From: suy.fnst@cn.fujitsu.com Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP For an extent item which contains many tree block backrefs, like ================================================================= In 020-extent-ref-cases/keyed_block_ref.img item 10 key (29470720 METADATA_ITEM 0) itemoff 3450 itemsize 222 refs 23 gen 10 flags TREE_BLOCK tree block skinny level 0 tree block backref root 278 tree block backref root 277 tree block backref root 276 tree block backref root 275 tree block backref root 274 tree block backref root 273 tree block backref root 272 tree block backref root 271 tree block backref root 270 tree block backref root 269 tree block backref root 268 tree block backref root 267 tree block backref root 266 tree block backref root 265 tree block backref root 264 tree block backref root 263 tree block backref root 262 tree block backref root 261 tree block backref root 260 tree block backref root 259 tree block backref root 258 tree block backref root 257 ================================================================= In find_parent_nodes(), these refs's parents are 0, then __merge_refs will merge refs to one ref. It causes only one root to be returned. So, if both parents are 0, do not merge refs. Lowmem check calls find_parent_nodes frequently to decide whether check an extent buffer or not. The bug influences bytes accounting. Signed-off-by: Su Yue --- Changelog: v2: Put judgment of ref->parent above comparison. Add the comment. Fix typos. --- backref.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/backref.c b/backref.c index 51553c702187..d5772ec228c3 100644 --- a/backref.c +++ b/backref.c @@ -505,8 +505,15 @@ static void __merge_refs(struct pref_state *prefstate, int mode) if (!ref_for_same_block(ref1, ref2)) continue; } else { + /* + * Parent == 0 means that the ref is tree block + * backref or its parent is unresolved. + */ + if (!ref1->parent || !ref2->parent) + continue; if (ref1->parent != ref2->parent) continue; + } eie = ref1->inode_list;