Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp953003ybt; Tue, 7 Jul 2020 04:25:33 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwBnEoJOu7ElqZlgGYMd30+L/HVXfeKVQ/Q+qfKj6JfyxcH+qouM5m/b2IHutKs9UcZrQY1 X-Received: by 2002:a50:ee8d:: with SMTP id f13mr58534590edr.302.1594121133069; Tue, 07 Jul 2020 04:25:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1594121133; cv=none; d=google.com; s=arc-20160816; b=hZAcgJOgHoX4cQhfkpoQHqtd5o9a+yG/8frCRfxafGZn1nO2faBFbOSP76h2vQRtYx boWn0M4RCYp0x01DBmvehZ5Z3BKvZ3GMgzvoRij5XlPDuTj+JxS12Eos22bwhTAiNMWT XbAukQp2RGqC/pN4jfgZXOmvRUvtf2BMBU01buhdyePTEKa8/6y4ngxMVFhxRwbTGhKj bjpOunsR/fj++231tSePxKNls3vm4cGO9qQe868BpjHJBMkN+1OpQOiM6u7gxpN8Q0og VD/ugATsUJJg0uHosJqCRma4S+3grKMmqSV7uQnB6F6Yo/aQZjewWuUfHReZr7WlaUob 2yLw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=uJCfycduqa9vTYAKP8rPtQCLdirXlsx85Gtuopnq07w=; b=MV4+kOqonfZwfeY4m9JFrZIUJRFrw7PS5k4yFTFTyHatWVeXUuvLLLic/QgJpLLbFe 6MvkjuXBzuyMkTSKbXhJLKmSXj/HjA0K1DnQpYgyIgVnrY45q0nQH9cEWDIJJ6UvFrZQ Iz8+PXkQBS7XzUDYGKKgA4Y035lLjN4yoE92Pek4j1MLJjgPaenzy0pcYqB1u8t99Bbq 3Hbad3y4RkavmA+mzQ9jHGpg1meb2RZh7/Y1KgIY/9WOTGHA7iPIXXUbCSxyICXQoK5J X9FzW17Ahtp7DcF/Y31EcZoOHb5WnQnczBWIfLL9mzb/z8RM0JD0wNxMgZ0h05p6B0yA VDnw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id b8si19701862edz.89.2020.07.07.04.25.09; Tue, 07 Jul 2020 04:25:33 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728263AbgGGLV4 (ORCPT + 99 others); Tue, 7 Jul 2020 07:21:56 -0400 Received: from szxga05-in.huawei.com ([45.249.212.191]:7265 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1728249AbgGGLVz (ORCPT ); Tue, 7 Jul 2020 07:21:55 -0400 Received: from DGGEMS409-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id 3843FBA025BB331CADEA; Tue, 7 Jul 2020 19:21:53 +0800 (CST) Received: from szvp000203569.huawei.com (10.120.216.130) by DGGEMS409-HUB.china.huawei.com (10.3.19.209) with Microsoft SMTP Server id 14.3.487.0; Tue, 7 Jul 2020 19:21:45 +0800 From: Chao Yu To: CC: , , , Chao Yu Subject: [PATCH 4/5] f2fs: support 64-bits key in f2fs rb-tree node entry Date: Tue, 7 Jul 2020 19:21:27 +0800 Message-ID: <20200707112128.89136-5-yuchao0@huawei.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200707112128.89136-1-yuchao0@huawei.com> References: <20200707112128.89136-1-yuchao0@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7BIT Content-Type: text/plain; charset=US-ASCII X-Originating-IP: [10.120.216.130] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org then, we can add specified entry into rb-tree with 64-bits segment time as key. Signed-off-by: Chao Yu --- fs/f2fs/extent_cache.c | 37 +++++++++++++++++++++++++++++++++++-- fs/f2fs/f2fs.h | 15 ++++++++++++--- fs/f2fs/segment.c | 4 ++-- 3 files changed, 49 insertions(+), 7 deletions(-) diff --git a/fs/f2fs/extent_cache.c b/fs/f2fs/extent_cache.c index 686c68b98610..3ebf976a682d 100644 --- a/fs/f2fs/extent_cache.c +++ b/fs/f2fs/extent_cache.c @@ -58,6 +58,29 @@ struct rb_entry *f2fs_lookup_rb_tree(struct rb_root_cached *root, return re; } +struct rb_node **f2fs_lookup_rb_tree_ext(struct f2fs_sb_info *sbi, + struct rb_root_cached *root, + struct rb_node **parent, + unsigned long long key, bool *leftmost) +{ + struct rb_node **p = &root->rb_root.rb_node; + struct rb_entry *re; + + while (*p) { + *parent = *p; + re = rb_entry(*parent, struct rb_entry, rb_node); + + if (key < re->key) { + p = &(*p)->rb_left; + } else { + p = &(*p)->rb_right; + *leftmost = false; + } + } + + return p; +} + struct rb_node **f2fs_lookup_rb_tree_for_insert(struct f2fs_sb_info *sbi, struct rb_root_cached *root, struct rb_node **parent, @@ -166,7 +189,7 @@ struct rb_entry *f2fs_lookup_rb_tree_ret(struct rb_root_cached *root, } bool f2fs_check_rb_tree_consistence(struct f2fs_sb_info *sbi, - struct rb_root_cached *root) + struct rb_root_cached *root, bool check_key) { #ifdef CONFIG_F2FS_CHECK_FS struct rb_node *cur = rb_first_cached(root), *next; @@ -183,13 +206,23 @@ bool f2fs_check_rb_tree_consistence(struct f2fs_sb_info *sbi, cur_re = rb_entry(cur, struct rb_entry, rb_node); next_re = rb_entry(next, struct rb_entry, rb_node); + if (check_key) { + if (cur_re->key > next_re->key) { + f2fs_info(sbi, "inconsistent rbtree, " + "cur(%llu) next(%llu)", + cur_re->key, next_re->key); + return false; + } + goto next; + } + if (cur_re->ofs + cur_re->len > next_re->ofs) { f2fs_info(sbi, "inconsistent rbtree, cur(%u, %u) next(%u, %u)", cur_re->ofs, cur_re->len, next_re->ofs, next_re->len); return false; } - +next: cur = next; } #endif diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index dcf99f1bdfe1..3430964f0f6a 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -635,8 +635,13 @@ enum { struct rb_entry { struct rb_node rb_node; /* rb node located in rb-tree */ - unsigned int ofs; /* start offset of the entry */ - unsigned int len; /* length of the entry */ + union { + struct { + unsigned int ofs; /* start offset of the entry */ + unsigned int len; /* length of the entry */ + }; + unsigned long long key; /* 64-bits key */ + }; }; struct extent_info { @@ -3828,6 +3833,10 @@ void f2fs_leave_shrinker(struct f2fs_sb_info *sbi); */ struct rb_entry *f2fs_lookup_rb_tree(struct rb_root_cached *root, struct rb_entry *cached_re, unsigned int ofs); +struct rb_node **f2fs_lookup_rb_tree_ext(struct f2fs_sb_info *sbi, + struct rb_root_cached *root, + struct rb_node **parent, + unsigned long long key, bool *left_most); struct rb_node **f2fs_lookup_rb_tree_for_insert(struct f2fs_sb_info *sbi, struct rb_root_cached *root, struct rb_node **parent, @@ -3838,7 +3847,7 @@ struct rb_entry *f2fs_lookup_rb_tree_ret(struct rb_root_cached *root, struct rb_node ***insert_p, struct rb_node **insert_parent, bool force, bool *leftmost); bool f2fs_check_rb_tree_consistence(struct f2fs_sb_info *sbi, - struct rb_root_cached *root); + struct rb_root_cached *root, bool check_key); unsigned int f2fs_shrink_extent_tree(struct f2fs_sb_info *sbi, int nr_shrink); void f2fs_init_extent_tree(struct inode *inode, struct page *ipage); void f2fs_drop_extent_tree(struct inode *inode); diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 222d28c44e4f..b66ac28d9aa5 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -1521,7 +1521,7 @@ static int __issue_discard_cmd(struct f2fs_sb_info *sbi, goto next; if (unlikely(dcc->rbtree_check)) f2fs_bug_on(sbi, !f2fs_check_rb_tree_consistence(sbi, - &dcc->root)); + &dcc->root, false)); blk_start_plug(&plug); list_for_each_entry_safe(dc, tmp, pend_list, list) { f2fs_bug_on(sbi, dc->state != D_PREP); @@ -2887,7 +2887,7 @@ static unsigned int __issue_discard_cmd_range(struct f2fs_sb_info *sbi, mutex_lock(&dcc->cmd_lock); if (unlikely(dcc->rbtree_check)) f2fs_bug_on(sbi, !f2fs_check_rb_tree_consistence(sbi, - &dcc->root)); + &dcc->root, false)); dc = (struct discard_cmd *)f2fs_lookup_rb_tree_ret(&dcc->root, NULL, start, -- 2.26.2