From patchwork Wed Nov 10 20:14:13 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612863 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 95BBBC433FE for ; Wed, 10 Nov 2021 20:14:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7E52A61241 for ; Wed, 10 Nov 2021 20:14:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232296AbhKJURh (ORCPT ); Wed, 10 Nov 2021 15:17:37 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36526 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231759AbhKJURg (ORCPT ); Wed, 10 Nov 2021 15:17:36 -0500 Received: from mail-qt1-x834.google.com (mail-qt1-x834.google.com [IPv6:2607:f8b0:4864:20::834]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 97DC4C061764 for ; Wed, 10 Nov 2021 12:14:48 -0800 (PST) Received: by mail-qt1-x834.google.com with SMTP id z9so3268469qtj.9 for ; Wed, 10 Nov 2021 12:14:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=ftJd5ouJkupGrNrVkwnDeYnPhB7HQuv+S3la/+gkQAA=; b=txTR32gOaaDiK/fJoXHfcys1Hf6a87SVC22FkVU2qdN+Wa5PIKjoADBzTsxBqmqNA+ GCF3bs0O112X9EPf8PH+nDDg4LthkkMA/gvU1LLYmC+Q+pNRxK8TK1dWfoJXKJQkyO4+ bmT+znkeNGOBmbv5G/VJHBz4g9WibaXnKMMqqLsbAy1Fpb9T6F8hEN/pidiUZyw1HPl9 KmrhQchNt3MIVUXV1piZpzjN+55FdOs7OH2ZPQcBQxGPIDZz5AeW8o70kbnDNgQQwY1L G56SsjOO2deX/ceQr7IA0505GIjOhMuKY36Nt4kcD0KvmEihy7gRXidA/MhDRyIZbVnF ulEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ftJd5ouJkupGrNrVkwnDeYnPhB7HQuv+S3la/+gkQAA=; b=UXuRM1esl1cSNY1lsx6N2PDFhID5iGA9BpPvCzoHRFCXX6nwV2cQYpwjBALk7tsyPZ QcGXuS5YV2BQTHTHcaM/zdW9roFZrqXtNF3cD3hAGol2DY/XplLCtsfU+dSyBBz1op5y ZXt9WmfUSECMJm7rLTRKJd9faAUNIwZAFTdfTIPnGgCFl+ew63vYF7ZrerjRUtY8KJh9 Rj/vQfAA+EHsLrdtM6Ot/rWS+W4uaVQFTcF6uQ3OOOjoD32qaSV+lkDiNuaw2YjVG7i2 qfqz2k1Ux85UrFdE/ZL+ORGkf/qooDNxw8ybLJqbnjTLz0Xer5nmJowk1t5iUmNRuGNt oiYg== X-Gm-Message-State: AOAM530oa/pBzn5Sv7t4L4JxpYACWLR4R7c2ocCi8UcVgwVMOIjUcOld lcYkeQEyIWNsFZn8B74n2cV4qY+OUlmtVg== X-Google-Smtp-Source: ABdhPJwK6QGQTBsbEv9OmHMtr52QI7MF3noir6+ogG3IOSyMzQwzBXFIlw3NYPezsMV7jHCDQwXFVQ== X-Received: by 2002:a05:622a:1115:: with SMTP id e21mr1824227qty.315.1636575286714; Wed, 10 Nov 2021 12:14:46 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id v15sm440811qkl.91.2021.11.10.12.14.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:14:46 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 01/30] btrfs-progs: stop accessing ->extent_root directly Date: Wed, 10 Nov 2021 15:14:13 -0500 Message-Id: <28e56d362e833756b928bf9c356127dcee5c3874.1636575146.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org When we switch to multiple global trees we'll need to access the appropriate extent root depending on the block group or possibly root. To handle this, use a helper in most places and then the actual root in places where it is required. We will whittle down the direct accessors with future patches, but this does the bulk of the preparatory work. Signed-off-by: Josef Bacik --- btrfs-corrupt-block.c | 13 +++--- btrfs-map-logical.c | 9 ++-- btrfstune.c | 2 +- check/main.c | 78 +++++++++++++++++++-------------- check/mode-common.c | 8 ++-- check/mode-lowmem.c | 72 +++++++++++++++++------------- check/qgroup-verify.c | 2 +- cmds/rescue-chunk-recover.c | 18 ++++---- common/repair.c | 5 +-- convert/main.c | 4 +- image/main.c | 2 +- kernel-shared/backref.c | 10 +++-- kernel-shared/ctree.h | 2 +- kernel-shared/disk-io.c | 30 ++++++++----- kernel-shared/disk-io.h | 1 + kernel-shared/extent-tree.c | 42 ++++++++++-------- kernel-shared/free-space-tree.c | 8 +++- kernel-shared/volumes.c | 3 +- kernel-shared/zoned.c | 2 +- mkfs/main.c | 4 +- 20 files changed, 179 insertions(+), 136 deletions(-) diff --git a/btrfs-corrupt-block.c b/btrfs-corrupt-block.c index d7904b6f..d976345c 100644 --- a/btrfs-corrupt-block.c +++ b/btrfs-corrupt-block.c @@ -183,6 +183,7 @@ static int corrupt_keys_in_block(struct btrfs_fs_info *fs_info, u64 bytenr) static int corrupt_extent(struct btrfs_trans_handle *trans, struct btrfs_root *root, u64 bytenr) { + struct btrfs_root *extent_root; struct btrfs_key key; struct extent_buffer *leaf; u32 item_size; @@ -200,9 +201,9 @@ static int corrupt_extent(struct btrfs_trans_handle *trans, key.type = (u8)-1; key.offset = (u64)-1; + extent_root = btrfs_extent_root(trans->fs_info, bytenr); while(1) { - ret = btrfs_search_slot(trans, root->fs_info->extent_root, - &key, path, -1, 1); + ret = btrfs_search_slot(trans, extent_root, &key, path, -1, 1); if (ret < 0) break; @@ -472,7 +473,7 @@ static int corrupt_block_group(struct btrfs_root *root, u64 bg, char *field) u64 orig, bogus; int ret = 0; - root = root->fs_info->extent_root; + root = btrfs_extent_root(root->fs_info, 0); corrupt_field = convert_block_group_field(field); if (corrupt_field == BTRFS_BLOCK_GROUP_ITEM_BAD) { @@ -1382,11 +1383,13 @@ int main(int argc, char **argv) } if (extent_tree) { struct btrfs_trans_handle *trans; + struct btrfs_root *extent_root; + extent_root = btrfs_extent_root(root->fs_info, 0); trans = btrfs_start_transaction(root, 1); BUG_ON(IS_ERR(trans)); - btrfs_corrupt_extent_tree(trans, root->fs_info->extent_root, - root->fs_info->extent_root->node); + btrfs_corrupt_extent_tree(trans, extent_root, + extent_root->node); btrfs_commit_transaction(trans, root); goto out_close; } diff --git a/btrfs-map-logical.c b/btrfs-map-logical.c index 4ac644b4..b3a7526b 100644 --- a/btrfs-map-logical.c +++ b/btrfs-map-logical.c @@ -42,6 +42,7 @@ static FILE *info_file; static int map_one_extent(struct btrfs_fs_info *fs_info, u64 *logical_ret, u64 *len_ret, int search_forward) { + struct btrfs_root *extent_root; struct btrfs_path *path; struct btrfs_key key; u64 logical; @@ -59,8 +60,8 @@ static int map_one_extent(struct btrfs_fs_info *fs_info, key.type = 0; key.offset = 0; - ret = btrfs_search_slot(NULL, fs_info->extent_root, &key, path, - 0, 0); + extent_root = btrfs_extent_root(fs_info, logical); + ret = btrfs_search_slot(NULL, extent_root, &key, path, 0, 0); if (ret < 0) goto out; BUG_ON(ret == 0); @@ -73,10 +74,10 @@ again: (key.type != BTRFS_EXTENT_ITEM_KEY && key.type != BTRFS_METADATA_ITEM_KEY)) { if (!search_forward) - ret = btrfs_previous_extent_item(fs_info->extent_root, + ret = btrfs_previous_extent_item(extent_root, path, 0); else - ret = btrfs_next_extent_item(fs_info->extent_root, + ret = btrfs_next_extent_item(extent_root, path, 0); if (ret) goto out; diff --git a/btrfstune.c b/btrfstune.c index d34d89c1..4f77cfc0 100644 --- a/btrfstune.c +++ b/btrfstune.c @@ -233,7 +233,7 @@ static int change_buffer_header_uuid(struct extent_buffer *eb, uuid_t new_fsid) static int change_extents_uuid(struct btrfs_fs_info *fs_info, uuid_t new_fsid) { - struct btrfs_root *root = fs_info->extent_root; + struct btrfs_root *root = btrfs_extent_root(fs_info, 0); struct btrfs_path path; struct btrfs_key key = {0, 0, 0}; int ret = 0; diff --git a/check/main.c b/check/main.c index 632dfba0..e3e5a336 100644 --- a/check/main.c +++ b/check/main.c @@ -5619,7 +5619,7 @@ static int verify_space_cache(struct btrfs_root *root, u64 last; int ret = 0; - root = gfs_info->extent_root; + root = btrfs_extent_root(root->fs_info, cache->start); last = max_t(u64, cache->start, BTRFS_SUPER_INFO_OFFSET); @@ -5837,6 +5837,7 @@ out: static int check_extent_exists(struct btrfs_root *root, u64 bytenr, u64 num_bytes) { + struct btrfs_root *extent_root; struct btrfs_path path; struct extent_buffer *leaf; struct btrfs_key key; @@ -5848,7 +5849,8 @@ static int check_extent_exists(struct btrfs_root *root, u64 bytenr, key.offset = (u64)-1; again: - ret = btrfs_search_slot(NULL, gfs_info->extent_root, &key, &path, + extent_root = btrfs_extent_root(gfs_info, key.objectid); + ret = btrfs_search_slot(NULL, extent_root, &key, &path, 0, 0); if (ret < 0) { fprintf(stderr, "Error looking up extent record %d\n", ret); @@ -5858,7 +5860,7 @@ again: if (path.slots[0] > 0) { path.slots[0]--; } else { - ret = btrfs_prev_leaf(root, &path); + ret = btrfs_prev_leaf(extent_root, &path); if (ret < 0) { goto out; } else if (ret > 0) { @@ -5882,7 +5884,7 @@ again: if (path.slots[0] > 0) { path.slots[0]--; } else { - ret = btrfs_prev_leaf(root, &path); + ret = btrfs_prev_leaf(extent_root, &path); if (ret < 0) { goto out; } else if (ret > 0) { @@ -5895,7 +5897,7 @@ again: while (num_bytes) { if (path.slots[0] >= btrfs_header_nritems(path.nodes[0])) { - ret = btrfs_next_leaf(root, &path); + ret = btrfs_next_leaf(extent_root, &path); if (ret < 0) { fprintf(stderr, "Error going to next leaf " "%d\n", ret); @@ -5946,7 +5948,8 @@ again: * anyway just in case. */ btrfs_release_path(&path); - ret = check_extent_exists(root, new_start, + ret = check_extent_exists(extent_root, + new_start, new_bytes); if (ret) { fprintf(stderr, "Right section didn't " @@ -6720,6 +6723,7 @@ static int delete_extent_records(struct btrfs_trans_handle *trans, struct btrfs_path *path, u64 bytenr) { + struct btrfs_root *extent_root = btrfs_extent_root(gfs_info, bytenr); struct btrfs_key key; struct btrfs_key found_key; struct extent_buffer *leaf; @@ -6732,7 +6736,7 @@ static int delete_extent_records(struct btrfs_trans_handle *trans, key.offset = (u64)-1; while (1) { - ret = btrfs_search_slot(trans, gfs_info->extent_root, &key, + ret = btrfs_search_slot(trans, extent_root, &key, path, 0, 1); if (ret < 0) break; @@ -6775,7 +6779,7 @@ static int delete_extent_records(struct btrfs_trans_handle *trans, "repair deleting extent record: key [%llu,%u,%llu]\n", found_key.objectid, found_key.type, found_key.offset); - ret = btrfs_del_item(trans, gfs_info->extent_root, path); + ret = btrfs_del_item(trans, extent_root, path); if (ret) break; btrfs_release_path(path); @@ -6807,7 +6811,8 @@ static int record_extent(struct btrfs_trans_handle *trans, int allocated, u64 flags) { int ret = 0; - struct btrfs_root *extent_root = gfs_info->extent_root; + struct btrfs_root *extent_root = btrfs_extent_root(gfs_info, + rec->start); struct extent_buffer *leaf; struct btrfs_key ins_key; struct btrfs_extent_item *ei; @@ -6888,7 +6893,7 @@ static int record_extent(struct btrfs_trans_handle *trans, * just makes the backref allocator create a data * backref */ - ret = btrfs_inc_extent_ref(trans, gfs_info->extent_root, + ret = btrfs_inc_extent_ref(trans, extent_root, rec->start, rec->max_size, parent, dback->root, @@ -6917,7 +6922,7 @@ static int record_extent(struct btrfs_trans_handle *trans, else parent = 0; - ret = btrfs_inc_extent_ref(trans, gfs_info->extent_root, + ret = btrfs_inc_extent_ref(trans, extent_root, rec->start, rec->max_size, parent, tback->root, 0, 0); fprintf(stderr, @@ -7437,7 +7442,6 @@ static int delete_duplicate_records(struct btrfs_root *root, list_move_tail(&tmp->list, &delete_list); } - root = gfs_info->extent_root; trans = btrfs_start_transaction(root, 1); if (IS_ERR(trans)) { ret = PTR_ERR(trans); @@ -7459,6 +7463,7 @@ static int delete_duplicate_records(struct btrfs_root *root, abort(); } + root = btrfs_extent_root(gfs_info, key.objectid); ret = btrfs_search_slot(trans, root, &key, &path, -1, 1); if (ret) { if (ret > 0) @@ -7697,7 +7702,7 @@ static int fixup_extent_refs(struct cache_tree *extent_cache, if (ret < 0) goto out; - trans = btrfs_start_transaction(gfs_info->extent_root, 1); + trans = btrfs_start_transaction(gfs_info->tree_root, 1); if (IS_ERR(trans)) { ret = PTR_ERR(trans); goto out; @@ -7736,7 +7741,7 @@ static int fixup_extent_refs(struct cache_tree *extent_cache, } out: if (trans) { - int err = btrfs_commit_transaction(trans, gfs_info->extent_root); + int err = btrfs_commit_transaction(trans, gfs_info->tree_root); if (!ret) ret = err; @@ -7753,7 +7758,7 @@ out: static int fixup_extent_flags(struct extent_record *rec) { struct btrfs_trans_handle *trans; - struct btrfs_root *root = gfs_info->extent_root; + struct btrfs_root *root = btrfs_extent_root(gfs_info, rec->start); struct btrfs_path path; struct btrfs_extent_item *ei; struct btrfs_key key; @@ -7822,6 +7827,7 @@ retry: static int prune_one_block(struct btrfs_trans_handle *trans, struct btrfs_corrupt_block *corrupt) { + struct btrfs_root *extent_root; int ret; struct btrfs_path path; struct extent_buffer *eb; @@ -7832,11 +7838,12 @@ static int prune_one_block(struct btrfs_trans_handle *trans, btrfs_init_path(&path); again: + extent_root = btrfs_extent_root(gfs_info, corrupt->key.objectid); /* we want to stop at the parent to our busted block */ path.lowest_level = level; - ret = btrfs_search_slot(trans, gfs_info->extent_root, - &corrupt->key, &path, -1, 1); + ret = btrfs_search_slot(trans, extent_root, &corrupt->key, &path, + -1, 1); if (ret < 0) goto out; @@ -7868,7 +7875,7 @@ again: * We couldn't find the bad block. * TODO: search all the nodes for pointers to this block */ - if (eb == gfs_info->extent_root->node) { + if (eb == extent_root->node) { ret = -ENOENT; goto out; } else { @@ -7879,7 +7886,7 @@ again: del_ptr: printk("deleting pointer to block %llu\n", corrupt->cache.start); - ret = btrfs_del_ptr(gfs_info->extent_root, &path, level, slot); + ret = btrfs_del_ptr(extent_root, &path, level, slot); out: btrfs_release_path(&path); @@ -7897,7 +7904,7 @@ static int prune_corrupt_blocks(void) if (!cache) break; if (!trans) { - trans = btrfs_start_transaction(gfs_info->extent_root, 1); + trans = btrfs_start_transaction(gfs_info->tree_root, 1); if (IS_ERR(trans)) return PTR_ERR(trans); } @@ -7906,7 +7913,7 @@ static int prune_corrupt_blocks(void) remove_cache_extent(gfs_info->corrupt_blocks, cache); } if (trans) - return btrfs_commit_transaction(trans, gfs_info->extent_root); + return btrfs_commit_transaction(trans, gfs_info->tree_root); return 0; } @@ -8011,7 +8018,8 @@ static int repair_extent_item_generation(struct extent_record *rec) struct btrfs_path path; struct btrfs_key key; struct btrfs_extent_item *ei; - struct btrfs_root *extent_root = gfs_info->extent_root; + struct btrfs_root *extent_root = btrfs_extent_root(gfs_info, + rec->start); u64 new_gen = 0;; int ret; @@ -8258,7 +8266,6 @@ repair_abort: } else if (!ret) { struct btrfs_trans_handle *trans; - root = gfs_info->extent_root; trans = btrfs_start_transaction(root, 1); if (IS_ERR(trans)) { ret = PTR_ERR(trans); @@ -8714,7 +8721,7 @@ static int check_block_groups(struct block_group_tree *bg_cache) if (!repair || !ret) return ret; - trans = btrfs_start_transaction(gfs_info->extent_root, 1); + trans = btrfs_start_transaction(gfs_info->tree_root, 1); if (IS_ERR(trans)) { ret = PTR_ERR(trans); fprintf(stderr, "Failed to start a transaction\n"); @@ -8722,7 +8729,7 @@ static int check_block_groups(struct block_group_tree *bg_cache) } ret = btrfs_fix_block_accounting(trans); - btrfs_commit_transaction(trans, gfs_info->extent_root); + btrfs_commit_transaction(trans, gfs_info->tree_root); return ret ? ret : -EAGAIN; } @@ -9368,7 +9375,7 @@ again: } /* Ok we can allocate now, reinit the extent root */ - ret = btrfs_fsck_reinit_root(trans, gfs_info->extent_root); + ret = btrfs_fsck_reinit_root(trans, btrfs_extent_root(gfs_info, 0)); if (ret) { fprintf(stderr, "extent root initialization failed\n"); /* @@ -9387,6 +9394,7 @@ again: while (1) { struct btrfs_block_group_item bgi; struct btrfs_block_group *cache; + struct btrfs_root *extent_root = btrfs_extent_root(gfs_info, 0); struct btrfs_key key; cache = btrfs_lookup_first_block_group(gfs_info, start); @@ -9400,8 +9408,8 @@ again: key.objectid = cache->start; key.type = BTRFS_BLOCK_GROUP_ITEM_KEY; key.offset = cache->length; - ret = btrfs_insert_item(trans, gfs_info->extent_root, &key, - &bgi, sizeof(bgi)); + ret = btrfs_insert_item(trans, extent_root, &key, &bgi, + sizeof(bgi)); if (ret) { fprintf(stderr, "Error adding block group\n"); return ret; @@ -9618,7 +9626,7 @@ out: static int fill_csum_tree_from_extent(struct btrfs_trans_handle *trans) { - struct btrfs_root *extent_root = gfs_info->extent_root; + struct btrfs_root *extent_root = btrfs_extent_root(gfs_info, 0); struct btrfs_root *csum_root; struct btrfs_path path; struct btrfs_extent_item *ei; @@ -9721,6 +9729,7 @@ static void free_roots_info_cache(void) static int build_roots_info_cache(void) { + struct btrfs_root *extent_root = btrfs_extent_root(gfs_info, 0); int ret = 0; struct btrfs_key key; struct extent_buffer *leaf; @@ -9737,7 +9746,7 @@ static int build_roots_info_cache(void) key.objectid = 0; key.type = BTRFS_EXTENT_ITEM_KEY; key.offset = 0; - ret = btrfs_search_slot(NULL, gfs_info->extent_root, &key, &path, 0, 0); + ret = btrfs_search_slot(NULL, extent_root, &key, &path, 0, 0); if (ret < 0) goto out; leaf = path.nodes[0]; @@ -9757,7 +9766,7 @@ static int build_roots_info_cache(void) ctx.item_count++; if (slot >= btrfs_header_nritems(leaf)) { - ret = btrfs_next_leaf(gfs_info->extent_root, &path); + ret = btrfs_next_leaf(extent_root, &path); if (ret < 0) { break; } else if (ret) { @@ -10670,7 +10679,7 @@ static int cmd_check(const struct cmd_struct *cmd, int argc, char **argv) if (init_extent_tree || init_csum_tree) { struct btrfs_trans_handle *trans; - trans = btrfs_start_transaction(gfs_info->extent_root, 0); + trans = btrfs_start_transaction(gfs_info->tree_root, 0); if (IS_ERR(trans)) { error("error starting transaction"); ret = PTR_ERR(trans); @@ -10711,12 +10720,13 @@ static int cmd_check(const struct cmd_struct *cmd, int argc, char **argv) * Ok now we commit and run the normal fsck, which will add * extent entries for all of the items it finds. */ - ret = btrfs_commit_transaction(trans, gfs_info->extent_root); + ret = btrfs_commit_transaction(trans, gfs_info->tree_root); err |= !!ret; if (ret) goto close_out; } - if (!extent_buffer_uptodate(gfs_info->extent_root->node)) { + root = btrfs_extent_root(gfs_info, 0); + if (!extent_buffer_uptodate(root->node)) { error("critical: extent_root, unable to check the filesystem"); ret = -EIO; err |= !!ret; diff --git a/check/mode-common.c b/check/mode-common.c index 56377840..72fec47c 100644 --- a/check/mode-common.c +++ b/check/mode-common.c @@ -176,6 +176,8 @@ static int check_prealloc_shared_data_ref(u64 parent, u64 disk_bytenr) */ int check_prealloc_extent_written(u64 disk_bytenr, u64 num_bytes) { + struct btrfs_root *extent_root = btrfs_extent_root(gfs_info, + disk_bytenr); struct btrfs_path path; struct btrfs_key key; int ret; @@ -189,7 +191,7 @@ int check_prealloc_extent_written(u64 disk_bytenr, u64 num_bytes) key.offset = num_bytes; btrfs_init_path(&path); - ret = btrfs_search_slot(NULL, gfs_info->extent_root, &key, &path, 0, 0); + ret = btrfs_search_slot(NULL, extent_root, &key, &path, 0, 0); if (ret > 0) { fprintf(stderr, "Missing extent item in extent tree for disk_bytenr %llu, num_bytes %llu\n", @@ -240,7 +242,7 @@ int check_prealloc_extent_written(u64 disk_bytenr, u64 num_bytes) path.slots[0]++; while (true) { if (path.slots[0] >= btrfs_header_nritems(path.nodes[0])) { - ret = btrfs_next_leaf(gfs_info->extent_root, &path); + ret = btrfs_next_leaf(extent_root, &path); if (ret < 0) goto out; if (ret > 0) { @@ -1083,7 +1085,7 @@ int recow_extent_buffer(struct btrfs_root *root, struct extent_buffer *eb) */ int get_extent_item_generation(u64 bytenr, u64 *gen_ret) { - struct btrfs_root *root = gfs_info->extent_root; + struct btrfs_root *root = btrfs_extent_root(gfs_info, bytenr); struct btrfs_extent_item *ei; struct btrfs_path path; struct btrfs_key key; diff --git a/check/mode-lowmem.c b/check/mode-lowmem.c index 696ad215..cc6773cd 100644 --- a/check/mode-lowmem.c +++ b/check/mode-lowmem.c @@ -33,7 +33,7 @@ static u64 total_used = 0; static int calc_extent_flag(struct btrfs_root *root, struct extent_buffer *eb, u64 *flags_ret) { - struct btrfs_root *extent_root = gfs_info->extent_root; + struct btrfs_root *extent_root; struct btrfs_root_item *ri = &root->root_item; struct btrfs_extent_inline_ref *iref; struct btrfs_extent_item *ei; @@ -73,6 +73,7 @@ static int calc_extent_flag(struct btrfs_root *root, struct extent_buffer *eb, key.type = (u8)-1; key.offset = (u64)-1; + extent_root = btrfs_extent_root(gfs_info, key.objectid); ret = btrfs_search_slot(NULL, extent_root, &key, path, 0, 0); if (ret <= 0) { ret = -EIO; @@ -265,7 +266,7 @@ static int modify_block_group_cache(struct btrfs_block_group *block_group, int c */ static int modify_block_groups_cache(u64 flags, int cache) { - struct btrfs_root *root = gfs_info->extent_root; + struct btrfs_root *root = btrfs_extent_root(gfs_info, 0); struct btrfs_key key; struct btrfs_path path; struct btrfs_block_group *bg_cache; @@ -330,7 +331,7 @@ static int clear_block_groups_full(u64 flags) static int create_chunk_and_block_group(u64 flags, u64 *start, u64 *nbytes) { struct btrfs_trans_handle *trans; - struct btrfs_root *root = gfs_info->extent_root; + struct btrfs_root *root = btrfs_extent_root(gfs_info, 0); int ret; if ((flags & BTRFS_BLOCK_GROUP_TYPE_MASK) == 0) @@ -418,7 +419,7 @@ static int is_chunk_almost_full(u64 start) { struct btrfs_path path; struct btrfs_key key; - struct btrfs_root *root = gfs_info->extent_root; + struct btrfs_root *root = btrfs_extent_root(gfs_info, 0); struct btrfs_block_group_item *bi; struct btrfs_block_group_item bg_item; struct extent_buffer *eb; @@ -594,10 +595,9 @@ out: static int repair_block_accounting(void) { struct btrfs_trans_handle *trans = NULL; - struct btrfs_root *root = gfs_info->extent_root; int ret; - trans = btrfs_start_transaction(root, 1); + trans = btrfs_start_transaction(gfs_info->tree_root, 1); if (IS_ERR(trans)) { ret = PTR_ERR(trans); errno = -ret; @@ -606,7 +606,7 @@ static int repair_block_accounting(void) } ret = btrfs_fix_block_accounting(trans); - btrfs_commit_transaction(trans, root); + btrfs_commit_transaction(trans, gfs_info->tree_root); return ret; } @@ -622,7 +622,7 @@ static int repair_tree_block_ref(struct btrfs_root *root, struct node_refs *nrefs, int level, int err) { struct btrfs_trans_handle *trans = NULL; - struct btrfs_root *extent_root = gfs_info->extent_root; + struct btrfs_root *extent_root; struct btrfs_path path; struct btrfs_extent_item *ei; struct btrfs_tree_block_info *bi; @@ -656,6 +656,7 @@ static int repair_tree_block_ref(struct btrfs_root *root, key.offset = (u64)-1; /* Search for the extent item */ + extent_root = btrfs_extent_root(gfs_info, bytenr); ret = btrfs_search_slot(NULL, extent_root, &key, &path, 0, 0); if (ret <= 0) { ret = -EIO; @@ -3001,7 +3002,7 @@ static int check_tree_block_ref(struct btrfs_root *root, int level, u64 owner, struct node_refs *nrefs) { struct btrfs_key key; - struct btrfs_root *extent_root = gfs_info->extent_root; + struct btrfs_root *extent_root; struct btrfs_path path; struct btrfs_extent_item *ei; struct btrfs_extent_inline_ref *iref; @@ -3030,6 +3031,7 @@ static int check_tree_block_ref(struct btrfs_root *root, key.offset = (u64)-1; /* Search for the backref in extent tree */ + extent_root = btrfs_extent_root(gfs_info, bytenr); ret = btrfs_search_slot(NULL, extent_root, &key, &path, 0, 0); if (ret < 0) { err |= BACKREF_MISSING; @@ -3222,7 +3224,7 @@ static int repair_extent_data_item(struct btrfs_root *root, struct btrfs_key key; struct btrfs_extent_item *ei; struct btrfs_path path; - struct btrfs_root *extent_root = gfs_info->extent_root; + struct btrfs_root *extent_root; struct extent_buffer *eb; u64 size; u64 disk_bytenr; @@ -3274,6 +3276,7 @@ static int repair_extent_data_item(struct btrfs_root *root, key.offset = num_bytes; btrfs_init_path(&path); + extent_root = btrfs_extent_root(gfs_info, key.objectid); ret = btrfs_search_slot(NULL, extent_root, &key, &path, 0, 0); if (ret < 0) { ret = -EIO; @@ -3356,7 +3359,7 @@ static int check_extent_data_item(struct btrfs_root *root, struct btrfs_file_extent_item *fi; struct extent_buffer *eb = pathp->nodes[0]; struct btrfs_path path; - struct btrfs_root *extent_root = gfs_info->extent_root; + struct btrfs_root *extent_root; struct btrfs_key fi_key; struct btrfs_key dbref_key; struct extent_buffer *leaf; @@ -3426,6 +3429,7 @@ static int check_extent_data_item(struct btrfs_root *root, dbref_key.type = BTRFS_EXTENT_ITEM_KEY; dbref_key.offset = btrfs_file_extent_disk_num_bytes(eb, fi); + extent_root = btrfs_extent_root(gfs_info, dbref_key.objectid); ret = btrfs_search_slot(NULL, extent_root, &dbref_key, &path, 0, 0); if (ret) goto out; @@ -3499,8 +3503,9 @@ static int check_extent_data_item(struct btrfs_root *root, dbref_key.offset = hash_extent_data_ref(owner, fi_key.objectid, fi_key.offset - offset); - ret = btrfs_search_slot(NULL, gfs_info->extent_root, - &dbref_key, &path, 0, 0); + extent_root = btrfs_extent_root(gfs_info, dbref_key.objectid); + ret = btrfs_search_slot(NULL, extent_root, &dbref_key, &path, 0, + 0); if (!ret) { found_dbackref = 1; goto out; @@ -3516,8 +3521,8 @@ static int check_extent_data_item(struct btrfs_root *root, dbref_key.type = BTRFS_SHARED_DATA_REF_KEY; dbref_key.offset = eb->start; - ret = btrfs_search_slot(NULL, gfs_info->extent_root, - &dbref_key, &path, 0, 0); + ret = btrfs_search_slot(NULL, extent_root, &dbref_key, &path, 0, + 0); if (!ret) { found_dbackref = 1; goto out; @@ -3542,7 +3547,7 @@ out: */ static int check_block_group_item(struct extent_buffer *eb, int slot) { - struct btrfs_root *extent_root = gfs_info->extent_root; + struct btrfs_root *extent_root; struct btrfs_root *chunk_root = gfs_info->chunk_root; struct btrfs_block_group_item *bi; struct btrfs_block_group_item bg_item; @@ -3598,6 +3603,7 @@ static int check_block_group_item(struct extent_buffer *eb, int slot) extent_key.offset = 0; btrfs_init_path(&path); + extent_root = btrfs_extent_root(gfs_info, extent_key.objectid); ret = btrfs_search_slot(NULL, extent_root, &extent_key, &path, 0, 0); if (ret < 0) goto out; @@ -3673,6 +3679,7 @@ out: */ static int query_tree_block_level(u64 bytenr) { + struct btrfs_root *extent_root; struct extent_buffer *eb; struct btrfs_path path; struct btrfs_key key; @@ -3689,10 +3696,12 @@ static int query_tree_block_level(u64 bytenr) key.offset = (u64)-1; btrfs_init_path(&path); - ret = btrfs_search_slot(NULL, gfs_info->extent_root, &key, &path, 0, 0); + + extent_root = btrfs_extent_root(gfs_info, bytenr); + ret = btrfs_search_slot(NULL, extent_root, &key, &path, 0, 0); if (ret < 0) goto release_out; - ret = btrfs_previous_extent_item(gfs_info->extent_root, &path, bytenr); + ret = btrfs_previous_extent_item(extent_root, &path, bytenr); if (ret < 0) goto release_out; if (ret > 0) { @@ -3920,7 +3929,7 @@ static int check_extent_data_backref(u64 root_id, u64 objectid, u64 offset, u64 bytenr, u64 len, u32 count) { struct btrfs_root *root; - struct btrfs_root *extent_root = gfs_info->extent_root; + struct btrfs_root *extent_root; struct btrfs_key key; struct btrfs_path path; struct extent_buffer *leaf; @@ -3935,6 +3944,7 @@ static int check_extent_data_backref(u64 root_id, u64 objectid, u64 offset, key.offset = (u64)-1; btrfs_init_path(&path); + extent_root = btrfs_extent_root(gfs_info, bytenr); ret = btrfs_search_slot(NULL, extent_root, &key, &path, 0, 0); if (ret < 0) goto out; @@ -4084,13 +4094,13 @@ out: * Returns >0 the backref was deleted but extent still exists * Returns =0 the whole extent item was deleted */ -static int repair_extent_item(struct btrfs_root *root, struct btrfs_path *path, - u64 bytenr, u64 num_bytes, u64 parent, u64 root_objectid, - u64 owner, u64 offset) +static int repair_extent_item(struct btrfs_path *path, u64 bytenr, u64 + num_bytes, u64 parent, u64 root_objectid, u64 + owner, u64 offset) { struct btrfs_trans_handle *trans; - struct btrfs_root *extent_root = gfs_info->extent_root; struct btrfs_key old_key; + struct btrfs_root *extent_root = btrfs_extent_root(gfs_info, bytenr); int ret; btrfs_item_key_to_cpu(path->nodes[0], &old_key, path->slots[0]); @@ -4121,7 +4131,7 @@ static int repair_extent_item(struct btrfs_root *root, struct btrfs_path *path, btrfs_commit_transaction(trans, extent_root); btrfs_release_path(path); - ret = btrfs_search_slot(NULL, root, &old_key, path, 0, 0); + ret = btrfs_search_slot(NULL, extent_root, &old_key, path, 0, 0); if (ret > 0) { /* odd, there must be one block group before at least */ if (path->slots[0] == 0) { @@ -4159,7 +4169,7 @@ static int repair_extent_item_generation(struct btrfs_path *path) struct btrfs_trans_handle *trans; struct btrfs_key key; struct btrfs_extent_item *ei; - struct btrfs_root *extent_root = gfs_info->extent_root; + struct btrfs_root *extent_root; u64 new_gen = 0;; int ret; @@ -4172,6 +4182,7 @@ static int repair_extent_item_generation(struct btrfs_path *path) if (ret) return ret; btrfs_release_path(path); + extent_root = btrfs_extent_root(gfs_info, key.objectid); trans = btrfs_start_transaction(extent_root, 1); if (IS_ERR(trans)) { ret = PTR_ERR(trans); @@ -4349,9 +4360,8 @@ next: if ((tmp_err & (REFERENCER_MISSING | REFERENCER_MISMATCH)) && repair) { - ret = repair_extent_item(gfs_info->extent_root, path, - key.objectid, num_bytes, parent, root_objectid, - owner, owner_offset); + ret = repair_extent_item(path, key.objectid, num_bytes, parent, + root_objectid, owner, owner_offset); if (ret < 0) { err |= tmp_err; err |= FATAL_ERROR; @@ -4581,6 +4591,7 @@ next: static int find_block_group_item(struct btrfs_path *path, u64 bytenr, u64 len, u64 type) { + struct btrfs_root *root = btrfs_extent_root(gfs_info, 0); struct btrfs_block_group_item bgi; struct btrfs_key key; int ret; @@ -4589,7 +4600,7 @@ static int find_block_group_item(struct btrfs_path *path, u64 bytenr, u64 len, key.type = BTRFS_BLOCK_GROUP_ITEM_KEY; key.offset = len; - ret = btrfs_search_slot(NULL, gfs_info->extent_root, &key, path, 0, 0); + ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); if (ret < 0) return ret; if (ret > 0) { @@ -4705,7 +4716,7 @@ static int repair_chunk_item(struct btrfs_root *chunk_root, struct btrfs_chunk *chunk; struct btrfs_key chunk_key; struct extent_buffer *eb = path->nodes[0]; - struct btrfs_root *extent_root = gfs_info->extent_root; + struct btrfs_root *extent_root; struct btrfs_trans_handle *trans; u64 length; int slot = path->slots[0]; @@ -4715,6 +4726,7 @@ static int repair_chunk_item(struct btrfs_root *chunk_root, btrfs_item_key_to_cpu(eb, &chunk_key, slot); if (chunk_key.type != BTRFS_CHUNK_ITEM_KEY) return err; + extent_root = btrfs_extent_root(gfs_info, chunk_key.offset); chunk = btrfs_item_ptr(eb, slot, struct btrfs_chunk); type = btrfs_chunk_type(path->nodes[0], chunk); length = btrfs_chunk_length(eb, chunk); diff --git a/check/qgroup-verify.c b/check/qgroup-verify.c index a514fee1..0813b841 100644 --- a/check/qgroup-verify.c +++ b/check/qgroup-verify.c @@ -1157,7 +1157,7 @@ static int scan_extents(struct btrfs_fs_info *info, u64 start, u64 end) { int ret, i, nr, level; - struct btrfs_root *root = info->extent_root; + struct btrfs_root *root = btrfs_extent_root(info, start); struct btrfs_key key; struct btrfs_path path; struct btrfs_disk_key disk_key; diff --git a/cmds/rescue-chunk-recover.c b/cmds/rescue-chunk-recover.c index 115d91d7..3bf9c36c 100644 --- a/cmds/rescue-chunk-recover.c +++ b/cmds/rescue-chunk-recover.c @@ -555,6 +555,7 @@ static int check_chunk_by_metadata(struct recover_control *rc, struct btrfs_root *root, struct chunk_record *chunk, int bg_only) { + struct btrfs_fs_info *fs_info = root->fs_info; int ret; int i; int slot; @@ -616,7 +617,8 @@ bg_check: key.type = BTRFS_BLOCK_GROUP_ITEM_KEY; key.offset = chunk->length; - ret = btrfs_search_slot(NULL, root->fs_info->extent_root, &key, &path, + root = btrfs_extent_root(fs_info, key.objectid); + ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0); if (ret < 0) { fprintf(stderr, "Search block group failed(%d)\n", ret); @@ -997,7 +999,7 @@ static int block_group_remove_all_extent_items(struct btrfs_trans_handle *trans, int del_s, del_nr; btrfs_init_path(&path); - root = root->fs_info->extent_root; + root = btrfs_extent_root(fs_info, start); key.objectid = start; key.offset = 0; @@ -1382,6 +1384,7 @@ static int rebuild_block_group(struct btrfs_trans_handle *trans, struct recover_control *rc, struct btrfs_root *root) { + struct btrfs_fs_info *fs_info = root->fs_info; struct chunk_record *chunk_rec; struct btrfs_key search_key; struct btrfs_path path; @@ -1396,12 +1399,11 @@ static int rebuild_block_group(struct btrfs_trans_handle *trans, search_key.objectid = chunk_rec->offset; search_key.type = BTRFS_EXTENT_ITEM_KEY; search_key.offset = 0; - ret = btrfs_search_slot(NULL, root->fs_info->extent_root, - &search_key, &path, 0, 0); + root = btrfs_extent_root(fs_info, chunk_rec->offset); + ret = btrfs_search_slot(NULL, root, &search_key, &path, 0, 0); if (ret < 0) goto out; - ret = calculate_bg_used(root->fs_info->extent_root, - chunk_rec, &path, &used); + ret = calculate_bg_used(root, chunk_rec, &path, &used); /* * Extent tree is damaged, better to rebuild the whole extent * tree. Currently, change the used to chunk's len to prevent @@ -1417,9 +1419,7 @@ static int rebuild_block_group(struct btrfs_trans_handle *trans, used = chunk_rec->length; } btrfs_release_path(&path); - ret = __insert_block_group(trans, chunk_rec, - root->fs_info->extent_root, - used); + ret = __insert_block_group(trans, chunk_rec, root, used); if (ret < 0) goto out; } diff --git a/common/repair.c b/common/repair.c index 176665bb..41520b32 100644 --- a/common/repair.c +++ b/common/repair.c @@ -167,7 +167,7 @@ int btrfs_fix_block_accounting(struct btrfs_trans_handle *trans) struct extent_buffer *leaf; struct btrfs_block_group *cache; struct btrfs_fs_info *fs_info = trans->fs_info; - struct btrfs_root *root = fs_info->extent_root; + struct btrfs_root *root = btrfs_extent_root(fs_info, 0); ret = btrfs_run_delayed_refs(trans, -1); if (ret) @@ -189,8 +189,7 @@ int btrfs_fix_block_accounting(struct btrfs_trans_handle *trans) key.offset = 0; key.objectid = 0; key.type = BTRFS_EXTENT_ITEM_KEY; - ret = btrfs_search_slot(trans, root->fs_info->extent_root, - &key, &path, 0, 0); + ret = btrfs_search_slot(trans, root, &key, &path, 0, 0); if (ret < 0) return ret; while(1) { diff --git a/convert/main.c b/convert/main.c index d480f166..378c6aff 100644 --- a/convert/main.c +++ b/convert/main.c @@ -945,7 +945,6 @@ static int make_convert_data_block_groups(struct btrfs_trans_handle *trans, struct btrfs_mkfs_config *cfg, struct btrfs_convert_context *cctx) { - struct btrfs_root *extent_root = fs_info->extent_root; struct cache_tree *data_chunks = &cctx->data_chunks; struct cache_extent *cache; u64 max_chunk_size; @@ -957,8 +956,7 @@ static int make_convert_data_block_groups(struct btrfs_trans_handle *trans, */ max_chunk_size = cfg->num_bytes / 10; max_chunk_size = min((u64)(SZ_1G), max_chunk_size); - max_chunk_size = round_down(max_chunk_size, - extent_root->fs_info->sectorsize); + max_chunk_size = round_down(max_chunk_size, fs_info->sectorsize); for (cache = first_cache_extent(data_chunks); cache; cache = next_cache_extent(cache)) { diff --git a/image/main.c b/image/main.c index 57e0cb6c..ab57ce4e 100644 --- a/image/main.c +++ b/image/main.c @@ -922,7 +922,7 @@ static int copy_from_extent_tree(struct metadump_struct *metadump, u64 num_bytes; int ret; - extent_root = metadump->root->fs_info->extent_root; + extent_root = btrfs_extent_root(metadump->root->fs_info, 0); bytenr = BTRFS_SUPER_INFO_OFFSET + BTRFS_SUPER_INFO_SIZE; key.objectid = bytenr; key.type = BTRFS_EXTENT_ITEM_KEY; diff --git a/kernel-shared/backref.c b/kernel-shared/backref.c index c04d505e..42832c48 100644 --- a/kernel-shared/backref.c +++ b/kernel-shared/backref.c @@ -645,7 +645,7 @@ static int __add_keyed_refs(struct btrfs_fs_info *fs_info, struct btrfs_path *path, u64 bytenr, int info_level) { - struct btrfs_root *extent_root = fs_info->extent_root; + struct btrfs_root *extent_root = btrfs_extent_root(fs_info, bytenr); int ret; int slot; struct extent_buffer *leaf; @@ -734,6 +734,7 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans, u64 time_seq, struct ulist *refs, struct ulist *roots, const u64 *extent_item_pos) { + struct btrfs_root *extent_root = btrfs_extent_root(fs_info, bytenr); struct btrfs_key key; struct btrfs_path *path; int info_level = 0; @@ -756,7 +757,7 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans, if (!path) return -ENOMEM; - ret = btrfs_search_slot(trans, fs_info->extent_root, &key, path, 0, 0); + ret = btrfs_search_slot(trans, extent_root, &key, path, 0, 0); if (ret < 0) goto out; BUG_ON(ret == 0); @@ -1136,6 +1137,7 @@ int extent_from_logical(struct btrfs_fs_info *fs_info, u64 logical, struct btrfs_path *path, struct btrfs_key *found_key, u64 *flags_ret) { + struct btrfs_root *extent_root = btrfs_extent_root(fs_info, logical); int ret; u64 flags; u64 size = 0; @@ -1151,11 +1153,11 @@ int extent_from_logical(struct btrfs_fs_info *fs_info, u64 logical, key.objectid = logical; key.offset = (u64)-1; - ret = btrfs_search_slot(NULL, fs_info->extent_root, &key, path, 0, 0); + ret = btrfs_search_slot(NULL, extent_root, &key, path, 0, 0); if (ret < 0) return ret; - ret = btrfs_previous_extent_item(fs_info->extent_root, path, 0); + ret = btrfs_previous_extent_item(extent_root, path, 0); if (ret) { if (ret > 0) ret = -ENOENT; diff --git a/kernel-shared/ctree.h b/kernel-shared/ctree.h index d2d1a006..23750156 100644 --- a/kernel-shared/ctree.h +++ b/kernel-shared/ctree.h @@ -1157,7 +1157,7 @@ struct btrfs_fs_info { u8 chunk_tree_uuid[BTRFS_UUID_SIZE]; u8 *new_chunk_tree_uuid; struct btrfs_root *fs_root; - struct btrfs_root *extent_root; + struct btrfs_root *_extent_root; struct btrfs_root *tree_root; struct btrfs_root *chunk_root; struct btrfs_root *dev_root; diff --git a/kernel-shared/disk-io.c b/kernel-shared/disk-io.c index f157442d..76cf7567 100644 --- a/kernel-shared/disk-io.c +++ b/kernel-shared/disk-io.c @@ -761,6 +761,12 @@ struct btrfs_root *btrfs_csum_root(struct btrfs_fs_info *fs_info, return fs_info->_csum_root; } +struct btrfs_root *btrfs_extent_root(struct btrfs_fs_info *fs_info, + u64 bytenr) +{ + return fs_info->_extent_root; +} + struct btrfs_root *btrfs_read_fs_root(struct btrfs_fs_info *fs_info, struct btrfs_key *location) { @@ -772,7 +778,7 @@ struct btrfs_root *btrfs_read_fs_root(struct btrfs_fs_info *fs_info, if (location->objectid == BTRFS_ROOT_TREE_OBJECTID) return fs_info->tree_root; if (location->objectid == BTRFS_EXTENT_TREE_OBJECTID) - return fs_info->extent_root; + return fs_info->_extent_root; if (location->objectid == BTRFS_CHUNK_TREE_OBJECTID) return fs_info->chunk_root; if (location->objectid == BTRFS_DEV_TREE_OBJECTID) @@ -811,7 +817,7 @@ void btrfs_free_fs_info(struct btrfs_fs_info *fs_info) free(fs_info->quota_root); free(fs_info->tree_root); - free(fs_info->extent_root); + free(fs_info->_extent_root); free(fs_info->chunk_root); free(fs_info->dev_root); free(fs_info->_csum_root); @@ -831,7 +837,7 @@ struct btrfs_fs_info *btrfs_new_fs_info(int writable, u64 sb_bytenr) return NULL; fs_info->tree_root = calloc(1, sizeof(struct btrfs_root)); - fs_info->extent_root = calloc(1, sizeof(struct btrfs_root)); + fs_info->_extent_root = calloc(1, sizeof(struct btrfs_root)); fs_info->chunk_root = calloc(1, sizeof(struct btrfs_root)); fs_info->dev_root = calloc(1, sizeof(struct btrfs_root)); fs_info->_csum_root = calloc(1, sizeof(struct btrfs_root)); @@ -840,7 +846,7 @@ struct btrfs_fs_info *btrfs_new_fs_info(int writable, u64 sb_bytenr) fs_info->uuid_root = calloc(1, sizeof(struct btrfs_root)); fs_info->super_copy = calloc(1, BTRFS_SUPER_INFO_SIZE); - if (!fs_info->tree_root || !fs_info->extent_root || + if (!fs_info->tree_root || !fs_info->_extent_root || !fs_info->chunk_root || !fs_info->dev_root || !fs_info->_csum_root || !fs_info->quota_root || !fs_info->free_space_root || !fs_info->uuid_root || @@ -1000,11 +1006,11 @@ int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info, u64 root_tree_bytenr, return -EIO; } - ret = setup_root_or_create_block(fs_info, flags, fs_info->extent_root, + ret = setup_root_or_create_block(fs_info, flags, fs_info->_extent_root, BTRFS_EXTENT_TREE_OBJECTID, "extent"); if (ret) return ret; - fs_info->extent_root->track_dirty = 1; + fs_info->_extent_root->track_dirty = 1; ret = find_and_setup_root(root, fs_info, BTRFS_DEV_TREE_OBJECTID, fs_info->dev_root); @@ -1062,7 +1068,7 @@ int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info, u64 root_tree_bytenr, fs_info->generation = generation; fs_info->last_trans_committed = generation; - if (extent_buffer_uptodate(fs_info->extent_root->node) && + if (extent_buffer_uptodate(fs_info->_extent_root->node) && !(flags & OPEN_CTREE_NO_BLOCK_GROUPS)) { ret = btrfs_read_block_groups(fs_info); /* @@ -1097,8 +1103,8 @@ void btrfs_release_all_roots(struct btrfs_fs_info *fs_info) free_extent_buffer(fs_info->_csum_root->node); if (fs_info->dev_root) free_extent_buffer(fs_info->dev_root->node); - if (fs_info->extent_root) - free_extent_buffer(fs_info->extent_root->node); + if (fs_info->_extent_root) + free_extent_buffer(fs_info->_extent_root->node); if (fs_info->tree_root) free_extent_buffer(fs_info->tree_root->node); if (fs_info->log_root_tree) @@ -1851,11 +1857,11 @@ static void backup_super_roots(struct btrfs_fs_info *info) btrfs_set_backup_chunk_root_level(root_backup, btrfs_header_level(info->chunk_root->node)); - btrfs_set_backup_extent_root(root_backup, info->extent_root->node->start); + btrfs_set_backup_extent_root(root_backup, info->_extent_root->node->start); btrfs_set_backup_extent_root_gen(root_backup, - btrfs_header_generation(info->extent_root->node)); + btrfs_header_generation(info->_extent_root->node)); btrfs_set_backup_extent_root_level(root_backup, - btrfs_header_level(info->extent_root->node)); + btrfs_header_level(info->_extent_root->node)); /* * we might commit during log recovery, which happens before we set * the fs_root. Make sure it is valid before we fill it in. diff --git a/kernel-shared/disk-io.h b/kernel-shared/disk-io.h index 38abbca5..dc71cc2b 100644 --- a/kernel-shared/disk-io.h +++ b/kernel-shared/disk-io.h @@ -218,4 +218,5 @@ struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans, struct btrfs_fs_info *fs_info, u64 objectid); struct btrfs_root *btrfs_csum_root(struct btrfs_fs_info *fs_info, u64 bytenr); +struct btrfs_root *btrfs_extent_root(struct btrfs_fs_info *fs_inf, u64 bytenr); #endif diff --git a/kernel-shared/extent-tree.c b/kernel-shared/extent-tree.c index 402904d1..3713452b 100644 --- a/kernel-shared/extent-tree.c +++ b/kernel-shared/extent-tree.c @@ -96,7 +96,7 @@ static int cache_block_group(struct btrfs_root *root, if (!block_group) return 0; - root = root->fs_info->extent_root; + root = btrfs_extent_root(root->fs_info, 0); free_space_cache = &root->fs_info->free_space_cache; if (block_group->cached) @@ -1243,6 +1243,8 @@ int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans, u64 bytenr, u64 num_bytes, u64 parent, u64 root_objectid, u64 owner, u64 offset) { + struct btrfs_root *extent_root = btrfs_extent_root(root->fs_info, + bytenr); struct btrfs_path *path; struct extent_buffer *leaf; struct btrfs_extent_item *item; @@ -1254,9 +1256,9 @@ int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans, if (!path) return -ENOMEM; - ret = insert_inline_extent_backref(trans, root->fs_info->extent_root, - path, bytenr, num_bytes, parent, - root_objectid, owner, offset, 1); + ret = insert_inline_extent_backref(trans, extent_root, path, bytenr, + num_bytes, parent, root_objectid, + owner, offset, 1); if (ret == 0) goto out; @@ -1274,9 +1276,8 @@ int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans, btrfs_release_path(path); /* now insert the actual backref */ - ret = insert_extent_backref(trans, root->fs_info->extent_root, - path, bytenr, parent, root_objectid, - owner, offset, 1); + ret = insert_extent_backref(trans, extent_root, path, bytenr, parent, + root_objectid, owner, offset, 1); if (ret) err = ret; out: @@ -1289,6 +1290,7 @@ int btrfs_lookup_extent_info(struct btrfs_trans_handle *trans, struct btrfs_fs_info *fs_info, u64 bytenr, u64 offset, int metadata, u64 *refs, u64 *flags) { + struct btrfs_root *extent_root = btrfs_extent_root(fs_info, bytenr); struct btrfs_path *path; int ret; struct btrfs_key key; @@ -1315,7 +1317,7 @@ int btrfs_lookup_extent_info(struct btrfs_trans_handle *trans, key.type = BTRFS_EXTENT_ITEM_KEY; again: - ret = btrfs_search_slot(trans, fs_info->extent_root, &key, path, 0, 0); + ret = btrfs_search_slot(trans, extent_root, &key, path, 0, 0); if (ret < 0) goto out; @@ -1374,6 +1376,7 @@ int btrfs_set_block_flags(struct btrfs_trans_handle *trans, u64 bytenr, int level, u64 flags) { struct btrfs_fs_info *fs_info = trans->fs_info; + struct btrfs_root *extent_root = btrfs_extent_root(fs_info, bytenr); struct btrfs_path *path; int ret; struct btrfs_key key; @@ -1396,7 +1399,7 @@ int btrfs_set_block_flags(struct btrfs_trans_handle *trans, u64 bytenr, } again: - ret = btrfs_search_slot(trans, fs_info->extent_root, &key, path, 0, 0); + ret = btrfs_search_slot(trans, extent_root, &key, path, 0, 0); if (ret < 0) goto out; @@ -1537,7 +1540,7 @@ static int update_block_group_item(struct btrfs_trans_handle *trans, { int ret; struct btrfs_fs_info *fs_info = trans->fs_info; - struct btrfs_root *root = fs_info->extent_root; + struct btrfs_root *root = btrfs_extent_root(fs_info, 0); unsigned long bi; struct btrfs_block_group_item bgi; struct extent_buffer *leaf; @@ -1911,9 +1914,10 @@ static int __free_extent(struct btrfs_trans_handle *trans, u64 owner_offset, int refs_to_drop) { + struct btrfs_root *extent_root = btrfs_extent_root(trans->fs_info, + bytenr); struct btrfs_key key; struct btrfs_path *path; - struct btrfs_root *extent_root = trans->fs_info->extent_root; struct extent_buffer *leaf; struct btrfs_extent_item *ei; struct btrfs_extent_inline_ref *iref; @@ -2181,7 +2185,7 @@ static int noinline find_free_extent(struct btrfs_trans_handle *trans, { int ret; u64 orig_search_start = search_start; - struct btrfs_root * root = orig_root->fs_info->extent_root; + struct btrfs_root *root = orig_root->fs_info->tree_root; struct btrfs_fs_info *info = root->fs_info; u64 total_needed = num_bytes; struct btrfs_block_group *block_group; @@ -2363,6 +2367,8 @@ static int alloc_reserved_tree_block(struct btrfs_trans_handle *trans, struct btrfs_delayed_extent_op *extent_op) { + struct btrfs_root *extent_root = btrfs_extent_root(trans->fs_info, + node->bytenr); struct btrfs_delayed_tree_ref *ref = btrfs_delayed_node_to_tree_ref(node); bool skinny_metadata = btrfs_fs_incompat(trans->fs_info, SKINNY_METADATA); struct btrfs_fs_info *fs_info = trans->fs_info; @@ -2403,8 +2409,7 @@ static int alloc_reserved_tree_block(struct btrfs_trans_handle *trans, if (!path) return -ENOMEM; - ret = btrfs_insert_empty_item(trans, fs_info->extent_root, path, - &ins, size); + ret = btrfs_insert_empty_item(trans, extent_root, path, &ins, size); if (ret) return ret; @@ -2726,7 +2731,7 @@ int btrfs_read_block_groups(struct btrfs_fs_info *fs_info) int ret; struct btrfs_key key; - root = fs_info->extent_root; + root = btrfs_extent_root(fs_info, 0); key.objectid = 0; key.offset = 0; key.type = BTRFS_BLOCK_GROUP_ITEM_KEY; @@ -2807,7 +2812,7 @@ static int insert_block_group_item(struct btrfs_trans_handle *trans, key.type = BTRFS_BLOCK_GROUP_ITEM_KEY; key.offset = block_group->length; - root = fs_info->extent_root; + root = btrfs_extent_root(fs_info, 0); return btrfs_insert_item(trans, root, &key, &bgi, sizeof(bgi)); } @@ -2924,7 +2929,7 @@ static int remove_block_group_item(struct btrfs_trans_handle *trans, { struct btrfs_fs_info *fs_info = trans->fs_info; struct btrfs_key key; - struct btrfs_root *root = fs_info->extent_root; + struct btrfs_root *root = btrfs_extent_root(fs_info, 0); int ret = 0; key.objectid = block_group->start; @@ -3247,7 +3252,6 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans, return ret; } - static void __get_extent_size(struct btrfs_root *root, struct btrfs_path *path, u64 *start, u64 *len) { @@ -3319,7 +3323,7 @@ static int __btrfs_record_file_extent(struct btrfs_trans_handle *trans, { int ret; struct btrfs_fs_info *info = root->fs_info; - struct btrfs_root *extent_root = info->extent_root; + struct btrfs_root *extent_root = btrfs_extent_root(info, disk_bytenr); struct extent_buffer *leaf; struct btrfs_file_extent_item *fi; struct btrfs_key ins_key; diff --git a/kernel-shared/free-space-tree.c b/kernel-shared/free-space-tree.c index 83a8520d..0434733d 100644 --- a/kernel-shared/free-space-tree.c +++ b/kernel-shared/free-space-tree.c @@ -1014,12 +1014,18 @@ out: int populate_free_space_tree(struct btrfs_trans_handle *trans, struct btrfs_block_group *block_group) { - struct btrfs_root *extent_root = trans->fs_info->extent_root; + struct btrfs_fs_info *fs_info = trans->fs_info; + struct btrfs_root *extent_root; struct btrfs_path *path, *path2; struct btrfs_key key; u64 start, end; int ret; + if (btrfs_fs_incompat(fs_info, EXTENT_TREE_V2)) + return -EINVAL; + + extent_root = btrfs_extent_root(fs_info, 0); + path = btrfs_alloc_path(); if (!path) return -ENOMEM; diff --git a/kernel-shared/volumes.c b/kernel-shared/volumes.c index 7d6fe8fd..4092c067 100644 --- a/kernel-shared/volumes.c +++ b/kernel-shared/volumes.c @@ -1348,7 +1348,6 @@ static int create_chunk(struct btrfs_trans_handle *trans, struct btrfs_fs_info *info, struct alloc_chunk_ctl *ctl, struct list_head *private_devs) { - struct btrfs_root *extent_root = info->extent_root; struct btrfs_root *chunk_root = info->chunk_root; struct btrfs_stripe *stripes; struct btrfs_device *device = NULL; @@ -1432,7 +1431,7 @@ static int create_chunk(struct btrfs_trans_handle *trans, /* key was set above */ btrfs_set_stack_chunk_length(chunk, ctl->num_bytes); - btrfs_set_stack_chunk_owner(chunk, extent_root->root_key.objectid); + btrfs_set_stack_chunk_owner(chunk, BTRFS_EXTENT_TREE_OBJECTID); btrfs_set_stack_chunk_stripe_len(chunk, BTRFS_STRIPE_LEN); btrfs_set_stack_chunk_type(chunk, ctl->type); btrfs_set_stack_chunk_num_stripes(chunk, ctl->num_stripes); diff --git a/kernel-shared/zoned.c b/kernel-shared/zoned.c index 776576bc..0164fe9f 100644 --- a/kernel-shared/zoned.c +++ b/kernel-shared/zoned.c @@ -757,7 +757,7 @@ static int calculate_alloc_pointer(struct btrfs_fs_info *fs_info, struct btrfs_block_group *cache, u64 *offset_ret) { - struct btrfs_root *root = fs_info->extent_root; + struct btrfs_root *root = btrfs_extent_root(fs_info, cache->start); struct btrfs_path *path; struct btrfs_key key; struct btrfs_key found_key; diff --git a/mkfs/main.c b/mkfs/main.c index c6cc51e9..9647f12a 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -277,7 +277,7 @@ static int recow_roots(struct btrfs_trans_handle *trans, ret = __recow_root(trans, info->tree_root); if (ret) return ret; - ret = __recow_root(trans, info->extent_root); + ret = __recow_root(trans, info->_extent_root); if (ret) return ret; ret = __recow_root(trans, info->chunk_root); @@ -588,7 +588,7 @@ static int cleanup_temp_chunks(struct btrfs_fs_info *fs_info, { struct btrfs_trans_handle *trans = NULL; struct btrfs_block_group_item *bgi; - struct btrfs_root *root = fs_info->extent_root; + struct btrfs_root *root = btrfs_extent_root(fs_info, 0); struct btrfs_key key; struct btrfs_key found_key; struct btrfs_path path; From patchwork Wed Nov 10 20:14:14 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612865 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 495FBC433F5 for ; Wed, 10 Nov 2021 20:14:52 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 2FF9861241 for ; Wed, 10 Nov 2021 20:14:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232353AbhKJURi (ORCPT ); Wed, 10 Nov 2021 15:17:38 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36534 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231759AbhKJURi (ORCPT ); Wed, 10 Nov 2021 15:17:38 -0500 Received: from mail-qv1-xf2f.google.com (mail-qv1-xf2f.google.com [IPv6:2607:f8b0:4864:20::f2f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 08FC4C061764 for ; Wed, 10 Nov 2021 12:14:50 -0800 (PST) Received: by mail-qv1-xf2f.google.com with SMTP id m17so2627825qvx.8 for ; Wed, 10 Nov 2021 12:14:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=8Log85UcwvuZtzc96yzzk5mucDO778TsPIHh/KLvfeM=; b=fDmjJ5vrQmnEPwanYMr+xvfRnbCAbvADXzWZ8/h8oC28buQA4v1KHjcvNzvQsQL29R xcnWRQIgVbh2dxNvSeVio4V1hmFn0kOHLe45Z2Bs95/zu7+pzOVW8GcAB2o/MVJTtkFh JP0iBvMWqyZF+FJbOaYH/TZrA2iCaHWZqYxPUfgfO5hq8TLCiMbIjbUquAViucYB87b7 FE4Eg8IP0XC3TowuzdVjwEe8sPOL/p6/gSD9Xc+znPq03APoCNIhJh2SHSS+hHco1F7c r+ehFSDhtBWLvvMxV6VQHan19nOUKONUAfy5Ehj+7aR+8+1BRqJ+5C5GJF2CHOmmz2hp O8Jg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=8Log85UcwvuZtzc96yzzk5mucDO778TsPIHh/KLvfeM=; b=f7mkUwfz6wPOeRuUVlXcGHSRaGzBPgqMk9GOhSPXOfCbmN8GcBE+6RBkVf8eegQJTy 8uT7zEFSYNGr1ONBF+E93qBFHYfRDTHuHCLIqhnwJWP1WKIRtmsnBo9YcRG3wOd/3CMq slyd5dlz4vWZxVgZajxPX28RMp3N3YFSzI8zOHcMDJDzB02DGsVI+EnzUep5NrOc7OxZ nMBQ4f+hM1IvUOk4dRmuGz73qYPVCHNQSKQg7wI8+QhZ0IL1oZmFY7yavxToaA+vqLMo PJeCmrOIcQDJhRV4avb1p7i3WMoC8hVP+9ouAqb1NRe+c7x8B/0fehkrMDALz2jvbtcT Vong== X-Gm-Message-State: AOAM533FmacsCl1GN8hJAbK5gsLNo9AO6L6VrAyrVO5xrhvSP/TPxAkm YDoNELZg1VpMn2u5C55MKKC4KnRucUdsWQ== X-Google-Smtp-Source: ABdhPJxZNMzSWO+qUvEc/EEvi/pvl6/iwjz4WRGrklLACWXNQQEdyM8XCn+XYNgD39jyD2d29DHleg== X-Received: by 2002:a05:6214:c8a:: with SMTP id r10mr1577840qvr.38.1636575288911; Wed, 10 Nov 2021 12:14:48 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id f1sm376542qkj.84.2021.11.10.12.14.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:14:47 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 02/30] btrfs-progs: stop accessing ->free_space_root directly Date: Wed, 10 Nov 2021 15:14:14 -0500 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We're going to have multiple free space roots in the future, so access it via a helper in most cases. We will address the remaining direct accesses in future patches. Signed-off-by: Josef Bacik --- kernel-shared/ctree.h | 2 +- kernel-shared/disk-io.c | 24 ++++++++++----------- kernel-shared/free-space-tree.c | 37 +++++++++++++++++++++------------ mkfs/main.c | 4 ++-- 4 files changed, 39 insertions(+), 28 deletions(-) diff --git a/kernel-shared/ctree.h b/kernel-shared/ctree.h index 23750156..c263a3bb 100644 --- a/kernel-shared/ctree.h +++ b/kernel-shared/ctree.h @@ -1163,7 +1163,7 @@ struct btrfs_fs_info { struct btrfs_root *dev_root; struct btrfs_root *_csum_root; struct btrfs_root *quota_root; - struct btrfs_root *free_space_root; + struct btrfs_root *_free_space_root; struct btrfs_root *uuid_root; struct rb_root fs_root_tree; diff --git a/kernel-shared/disk-io.c b/kernel-shared/disk-io.c index 76cf7567..4a43e102 100644 --- a/kernel-shared/disk-io.c +++ b/kernel-shared/disk-io.c @@ -791,7 +791,7 @@ struct btrfs_root *btrfs_read_fs_root(struct btrfs_fs_info *fs_info, return fs_info->quota_enabled ? fs_info->quota_root : ERR_PTR(-ENOENT); if (location->objectid == BTRFS_FREE_SPACE_TREE_OBJECTID) - return fs_info->free_space_root ? fs_info->free_space_root : + return fs_info->_free_space_root ? fs_info->_free_space_root : ERR_PTR(-ENOENT); BUG_ON(location->objectid == BTRFS_TREE_RELOC_OBJECTID); @@ -821,7 +821,7 @@ void btrfs_free_fs_info(struct btrfs_fs_info *fs_info) free(fs_info->chunk_root); free(fs_info->dev_root); free(fs_info->_csum_root); - free(fs_info->free_space_root); + free(fs_info->_free_space_root); free(fs_info->uuid_root); free(fs_info->super_copy); free(fs_info->log_root_tree); @@ -842,14 +842,14 @@ struct btrfs_fs_info *btrfs_new_fs_info(int writable, u64 sb_bytenr) fs_info->dev_root = calloc(1, sizeof(struct btrfs_root)); fs_info->_csum_root = calloc(1, sizeof(struct btrfs_root)); fs_info->quota_root = calloc(1, sizeof(struct btrfs_root)); - fs_info->free_space_root = calloc(1, sizeof(struct btrfs_root)); + fs_info->_free_space_root = calloc(1, sizeof(struct btrfs_root)); fs_info->uuid_root = calloc(1, sizeof(struct btrfs_root)); fs_info->super_copy = calloc(1, BTRFS_SUPER_INFO_SIZE); if (!fs_info->tree_root || !fs_info->_extent_root || !fs_info->chunk_root || !fs_info->dev_root || !fs_info->_csum_root || !fs_info->quota_root || - !fs_info->free_space_root || !fs_info->uuid_root || + !fs_info->_free_space_root || !fs_info->uuid_root || !fs_info->super_copy) goto free_all; @@ -1046,17 +1046,17 @@ int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info, u64 root_tree_bytenr, if (btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE)) { ret = find_and_setup_root(root, fs_info, BTRFS_FREE_SPACE_TREE_OBJECTID, - fs_info->free_space_root); + fs_info->_free_space_root); if (ret) { - free(fs_info->free_space_root); - fs_info->free_space_root = NULL; + free(fs_info->_free_space_root); + fs_info->_free_space_root = NULL; printk("Couldn't read free space tree\n"); return -EIO; } - fs_info->free_space_root->track_dirty = 1; + fs_info->_free_space_root->track_dirty = 1; } else { - free(fs_info->free_space_root); - fs_info->free_space_root = NULL; + free(fs_info->_free_space_root); + fs_info->_free_space_root = NULL; } ret = find_and_setup_log_root(root, fs_info, sb); @@ -1095,8 +1095,8 @@ int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info, u64 root_tree_bytenr, void btrfs_release_all_roots(struct btrfs_fs_info *fs_info) { - if (fs_info->free_space_root) - free_extent_buffer(fs_info->free_space_root->node); + if (fs_info->_free_space_root) + free_extent_buffer(fs_info->_free_space_root->node); if (fs_info->quota_root) free_extent_buffer(fs_info->quota_root->node); if (fs_info->_csum_root) diff --git a/kernel-shared/free-space-tree.c b/kernel-shared/free-space-tree.c index 0434733d..70b3d62a 100644 --- a/kernel-shared/free-space-tree.c +++ b/kernel-shared/free-space-tree.c @@ -25,13 +25,19 @@ #include "kernel-lib/bitops.h" #include "common/internal.h" +static struct btrfs_root *btrfs_free_space_root(struct btrfs_fs_info *fs_info, + struct btrfs_block_group *block_group) +{ + return fs_info->_free_space_root; +} + static struct btrfs_free_space_info * search_free_space_info(struct btrfs_trans_handle *trans, struct btrfs_fs_info *fs_info, struct btrfs_block_group *block_group, struct btrfs_path *path, int cow) { - struct btrfs_root *root = fs_info->free_space_root; + struct btrfs_root *root = btrfs_free_space_root(fs_info, block_group); struct btrfs_key key; int ret; @@ -103,7 +109,8 @@ static int add_new_free_space_info(struct btrfs_trans_handle *trans, struct btrfs_block_group *block_group, struct btrfs_path *path) { - struct btrfs_root *root = trans->fs_info->free_space_root; + struct btrfs_fs_info *fs_info = trans->fs_info; + struct btrfs_root *root = btrfs_free_space_root(fs_info, block_group); struct btrfs_free_space_info *info; struct btrfs_key key; struct extent_buffer *leaf; @@ -179,7 +186,7 @@ static int convert_free_space_to_bitmaps(struct btrfs_trans_handle *trans, struct btrfs_path *path) { struct btrfs_fs_info *fs_info = trans->fs_info; - struct btrfs_root *root = fs_info->free_space_root; + struct btrfs_root *root = btrfs_free_space_root(fs_info, block_group); struct btrfs_free_space_info *info; struct btrfs_key key, found_key; struct extent_buffer *leaf; @@ -318,7 +325,7 @@ static int convert_free_space_to_extents(struct btrfs_trans_handle *trans, struct btrfs_path *path) { struct btrfs_fs_info *fs_info = trans->fs_info; - struct btrfs_root *root = fs_info->free_space_root; + struct btrfs_root *root = btrfs_free_space_root(fs_info, block_group); struct btrfs_free_space_info *info; struct btrfs_key key, found_key; struct extent_buffer *leaf; @@ -558,7 +565,8 @@ static int modify_free_space_bitmap(struct btrfs_trans_handle *trans, struct btrfs_path *path, u64 start, u64 size, int remove) { - struct btrfs_root *root = trans->fs_info->free_space_root; + struct btrfs_fs_info *fs_info = trans->fs_info; + struct btrfs_root *root = btrfs_free_space_root(fs_info, block_group); struct btrfs_key key; u64 end = start + size; u64 cur_start, cur_size; @@ -671,7 +679,8 @@ static int remove_free_space_extent(struct btrfs_trans_handle *trans, struct btrfs_path *path, u64 start, u64 size) { - struct btrfs_root *root = trans->fs_info->free_space_root; + struct btrfs_fs_info *fs_info = trans->fs_info; + struct btrfs_root *root = btrfs_free_space_root(fs_info, block_group); struct btrfs_key key; u64 found_start, found_end; u64 end = start + size; @@ -811,7 +820,8 @@ static int add_free_space_extent(struct btrfs_trans_handle *trans, struct btrfs_path *path, u64 start, u64 size) { - struct btrfs_root *root = trans->fs_info->free_space_root; + struct btrfs_fs_info *fs_info = trans->fs_info; + struct btrfs_root *root = btrfs_free_space_root(fs_info, block_group); struct btrfs_key key, new_key; u64 found_start, found_end; u64 end = start + size; @@ -1107,7 +1117,8 @@ out: int remove_block_group_free_space(struct btrfs_trans_handle *trans, struct btrfs_block_group *block_group) { - struct btrfs_root *root = trans->fs_info->free_space_root; + struct btrfs_fs_info *fs_info = trans->fs_info; + struct btrfs_root *root = btrfs_free_space_root(fs_info, block_group); struct btrfs_path *path; struct btrfs_key key, found_key; struct extent_buffer *leaf; @@ -1215,7 +1226,7 @@ int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info) { struct btrfs_trans_handle *trans; struct btrfs_root *tree_root = fs_info->tree_root; - struct btrfs_root *free_space_root = fs_info->free_space_root; + struct btrfs_root *free_space_root = btrfs_free_space_root(fs_info, NULL); int ret; u64 features; @@ -1227,7 +1238,7 @@ int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info) features &= ~(BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE_VALID | BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE); btrfs_set_super_compat_ro_flags(fs_info->super_copy, features); - fs_info->free_space_root = NULL; + fs_info->_free_space_root = NULL; ret = clear_free_space_tree(trans, free_space_root); if (ret) @@ -1263,7 +1274,7 @@ static int load_free_space_bitmaps(struct btrfs_fs_info *fs_info, u32 expected_extent_count, int *errors) { - struct btrfs_root *root = fs_info->free_space_root; + struct btrfs_root *root = btrfs_free_space_root(fs_info, block_group); struct btrfs_key key; int prev_bit = 0, bit; u64 extent_start = 0; @@ -1343,7 +1354,7 @@ static int load_free_space_extents(struct btrfs_fs_info *fs_info, u32 expected_extent_count, int *errors) { - struct btrfs_root *root = fs_info->free_space_root; + struct btrfs_root *root = btrfs_free_space_root(fs_info, block_group); struct btrfs_key key, prev_key; int have_prev = 0; u64 start, end; @@ -1463,7 +1474,7 @@ int btrfs_create_free_space_tree(struct btrfs_fs_info *fs_info) ret = PTR_ERR(free_space_root); goto abort; } - fs_info->free_space_root = free_space_root; + fs_info->_free_space_root = free_space_root; add_root_to_dirty_list(free_space_root); do { diff --git a/mkfs/main.c b/mkfs/main.c index 9647f12a..16f9ba19 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -289,8 +289,8 @@ static int recow_roots(struct btrfs_trans_handle *trans, ret = __recow_root(trans, csum_root); if (ret) return ret; - if (info->free_space_root) { - ret = __recow_root(trans, info->free_space_root); + if (info->_free_space_root) { + ret = __recow_root(trans, info->_free_space_root); if (ret) return ret; } From patchwork Wed Nov 10 20:14:15 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612867 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id CA87BC433F5 for ; Wed, 10 Nov 2021 20:14:54 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A86DF61247 for ; Wed, 10 Nov 2021 20:14:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232373AbhKJURl (ORCPT ); Wed, 10 Nov 2021 15:17:41 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36544 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231759AbhKJURk (ORCPT ); Wed, 10 Nov 2021 15:17:40 -0500 Received: from mail-qt1-x836.google.com (mail-qt1-x836.google.com [IPv6:2607:f8b0:4864:20::836]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4C75CC061764 for ; Wed, 10 Nov 2021 12:14:52 -0800 (PST) Received: by mail-qt1-x836.google.com with SMTP id o17so3317255qtk.1 for ; Wed, 10 Nov 2021 12:14:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=78V0NzVEYLhxExZC26l+CKyckASl5NDXIxMCt3XkLvo=; b=B5yBatTuNM05xDLhZ6q3A80chv9JziY6QZdJr6sDJ/uLCFL3DM21GbRrRRFrjLriwD fo91nlwAHeIEDIVeicN9iHPTbAlbwTILg1mn3+Eo/YC6pgbzsNN2G0ATq/E33kKVXS4w IsY54KhUF0Lj7okajjVUDKD9s3YgjMeKgIh5V6iquueYjrJA2/7hKF0X7XxGXPG6s2Oh ADhwKjm2nphRh8M3BKrGVKgZ427Ha46r0T0NatOh/Clw+wUT9OK1ur967/7Qz8jid8PH Lakqwql8iJIIfM/6+qUlhIu1AcxBZeIzS/ZI4XH57ZD51oFstuGG9y4vqltWW/M4zb97 6XJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=78V0NzVEYLhxExZC26l+CKyckASl5NDXIxMCt3XkLvo=; b=Scg5Hn5RuCY/mOAkuZV3imIUuWWRQGFieeghR7+jqNJfI8f/mCkKwKIB8WFdvVCCUQ dDqLq5v95GpkEuhxRaLx8LXXIzUhLj+pvv6c1gP2d6GKcVrsqY/r0IrJgPCt9oPswPX+ ZDjjREqNWUaNGJ/cYMNy0OBOv3wE4wxyJXhNBqg9BD4pvX5PtMBSa6uvvEayn63vkoR8 TX8tguzm8IzYqmT/O8PWUYm51+gP9ypOa5HK/V/DemC4t7cjgDQCRjAwZDRdExdrJk/7 xYavWxIa+Slr13M4B2WSMPtRlaSub2AiabsPdoedph3hZ2jjxxDwegi7wbS57CTfVsmy D1Fw== X-Gm-Message-State: AOAM530kHlfs98FYB1YhdxefVy8kyZwtQWb6SejwJZjcYg14czaLqlcB +RA2ii+mchgjcfRK5JyVLVHd4muKCjbFsA== X-Google-Smtp-Source: ABdhPJyeG2ghNsE5TZsQmEpqv2oiRQ0r6qvdDgKw44qm8wX3ieL5w9aCpdv8RfvEZxoIqg1V6FkgIg== X-Received: by 2002:ac8:7f0c:: with SMTP id f12mr1950575qtk.362.1636575290797; Wed, 10 Nov 2021 12:14:50 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id t64sm387618qkd.71.2021.11.10.12.14.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:14:49 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 03/30] btrfs-progs: track csum, extent, and free space trees in a rb tree Date: Wed, 10 Nov 2021 15:14:15 -0500 Message-Id: <8973fad817c9bddc5f7964b7a6f5a229b878ec06.1636575146.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We are going to have multiples of these trees with extent tree v2, so add a rb tree to track them based on their root key value. This works for both v1 and v2, so we can remove the direct pointers to these roots in our fs_info. Signed-off-by: Josef Bacik --- kernel-shared/ctree.h | 4 +- kernel-shared/disk-io.c | 292 ++++++++++++++++++++++++-------- kernel-shared/disk-io.h | 5 + kernel-shared/free-space-tree.c | 15 +- mkfs/main.c | 28 +-- 5 files changed, 261 insertions(+), 83 deletions(-) diff --git a/kernel-shared/ctree.h b/kernel-shared/ctree.h index c263a3bb..12a8165d 100644 --- a/kernel-shared/ctree.h +++ b/kernel-shared/ctree.h @@ -1157,15 +1157,13 @@ struct btrfs_fs_info { u8 chunk_tree_uuid[BTRFS_UUID_SIZE]; u8 *new_chunk_tree_uuid; struct btrfs_root *fs_root; - struct btrfs_root *_extent_root; struct btrfs_root *tree_root; struct btrfs_root *chunk_root; struct btrfs_root *dev_root; - struct btrfs_root *_csum_root; struct btrfs_root *quota_root; - struct btrfs_root *_free_space_root; struct btrfs_root *uuid_root; + struct rb_root global_roots_tree; struct rb_root fs_root_tree; /* the log root tree is a directory of all the other log roots */ diff --git a/kernel-shared/disk-io.c b/kernel-shared/disk-io.c index 4a43e102..a1866d9f 100644 --- a/kernel-shared/disk-io.c +++ b/kernel-shared/disk-io.c @@ -732,6 +732,23 @@ insert: return root; } +static int btrfs_global_roots_compare_keys(struct rb_node *node, + void *data) +{ + struct btrfs_key *key = (struct btrfs_key *)data; + struct btrfs_root *root; + + root = rb_entry(node, struct btrfs_root, rb_node); + return btrfs_comp_cpu_keys(key, &root->root_key); +} + +static int btrfs_global_roots_compare(struct rb_node *node1, + struct rb_node *node2) +{ + struct btrfs_root *root = rb_entry(node2, struct btrfs_root, rb_node); + return btrfs_global_roots_compare_keys(node1, &root->root_key); +} + static int btrfs_fs_roots_compare_objectids(struct rb_node *node, void *data) { @@ -755,16 +772,54 @@ int btrfs_fs_roots_compare_roots(struct rb_node *node1, struct rb_node *node2) return btrfs_fs_roots_compare_objectids(node1, (void *)&root->objectid); } +int btrfs_global_root_insert(struct btrfs_fs_info *fs_info, + struct btrfs_root *root) +{ + return rb_insert(&fs_info->global_roots_tree, &root->rb_node, + btrfs_global_roots_compare); +} + +struct btrfs_root *btrfs_global_root(struct btrfs_fs_info *fs_info, + struct btrfs_key *key) +{ + struct rb_node *node; + + /* + * Some callers use the key->offset = (u64)-1 convention for looking up + * roots, so set this to 0 if we ended up here from that. + */ + if (key->offset == (u64)-1) + key->offset = 0; + + node = rb_search(&fs_info->global_roots_tree, (void *)key, + btrfs_global_roots_compare_keys, NULL); + if (node) + return rb_entry(node, struct btrfs_root, rb_node); + return NULL; +} + struct btrfs_root *btrfs_csum_root(struct btrfs_fs_info *fs_info, u64 bytenr) { - return fs_info->_csum_root; + struct btrfs_key key = { + .objectid = BTRFS_CSUM_TREE_OBJECTID, + .type = BTRFS_ROOT_ITEM_KEY, + .offset = 0, + }; + + return btrfs_global_root(fs_info, &key); } struct btrfs_root *btrfs_extent_root(struct btrfs_fs_info *fs_info, u64 bytenr) { - return fs_info->_extent_root; + struct btrfs_key key = { + .objectid = BTRFS_EXTENT_TREE_OBJECTID, + .type = BTRFS_ROOT_ITEM_KEY, + .offset = 0, + }; + + return btrfs_global_root(fs_info, &key); } struct btrfs_root *btrfs_read_fs_root(struct btrfs_fs_info *fs_info, @@ -778,21 +833,22 @@ struct btrfs_root *btrfs_read_fs_root(struct btrfs_fs_info *fs_info, if (location->objectid == BTRFS_ROOT_TREE_OBJECTID) return fs_info->tree_root; if (location->objectid == BTRFS_EXTENT_TREE_OBJECTID) - return fs_info->_extent_root; + return btrfs_global_root(fs_info, location); if (location->objectid == BTRFS_CHUNK_TREE_OBJECTID) return fs_info->chunk_root; if (location->objectid == BTRFS_DEV_TREE_OBJECTID) return fs_info->dev_root; if (location->objectid == BTRFS_CSUM_TREE_OBJECTID) - return btrfs_csum_root(fs_info, location->offset); + return btrfs_global_root(fs_info, location); if (location->objectid == BTRFS_UUID_TREE_OBJECTID) return fs_info->uuid_root ? fs_info->uuid_root : ERR_PTR(-ENOENT); if (location->objectid == BTRFS_QUOTA_TREE_OBJECTID) return fs_info->quota_enabled ? fs_info->quota_root : ERR_PTR(-ENOENT); - if (location->objectid == BTRFS_FREE_SPACE_TREE_OBJECTID) - return fs_info->_free_space_root ? fs_info->_free_space_root : - ERR_PTR(-ENOENT); + if (location->objectid == BTRFS_FREE_SPACE_TREE_OBJECTID) { + root = btrfs_global_root(fs_info, location); + return root ? root : ERR_PTR(-ENOENT); + } BUG_ON(location->objectid == BTRFS_TREE_RELOC_OBJECTID); @@ -811,17 +867,25 @@ struct btrfs_root *btrfs_read_fs_root(struct btrfs_fs_info *fs_info, return root; } +static void __free_global_root(struct rb_node *node) +{ + struct btrfs_root *root; + + root = rb_entry(node, struct btrfs_root, rb_node); + kfree(root); +} + +FREE_RB_BASED_TREE(global_roots, __free_global_root); + void btrfs_free_fs_info(struct btrfs_fs_info *fs_info) { if (fs_info->quota_root) free(fs_info->quota_root); + free_global_roots_tree(&fs_info->global_roots_tree); free(fs_info->tree_root); - free(fs_info->_extent_root); free(fs_info->chunk_root); free(fs_info->dev_root); - free(fs_info->_csum_root); - free(fs_info->_free_space_root); free(fs_info->uuid_root); free(fs_info->super_copy); free(fs_info->log_root_tree); @@ -837,20 +901,14 @@ struct btrfs_fs_info *btrfs_new_fs_info(int writable, u64 sb_bytenr) return NULL; fs_info->tree_root = calloc(1, sizeof(struct btrfs_root)); - fs_info->_extent_root = calloc(1, sizeof(struct btrfs_root)); fs_info->chunk_root = calloc(1, sizeof(struct btrfs_root)); fs_info->dev_root = calloc(1, sizeof(struct btrfs_root)); - fs_info->_csum_root = calloc(1, sizeof(struct btrfs_root)); fs_info->quota_root = calloc(1, sizeof(struct btrfs_root)); - fs_info->_free_space_root = calloc(1, sizeof(struct btrfs_root)); fs_info->uuid_root = calloc(1, sizeof(struct btrfs_root)); fs_info->super_copy = calloc(1, BTRFS_SUPER_INFO_SIZE); - if (!fs_info->tree_root || !fs_info->_extent_root || - !fs_info->chunk_root || !fs_info->dev_root || - !fs_info->_csum_root || !fs_info->quota_root || - !fs_info->_free_space_root || !fs_info->uuid_root || - !fs_info->super_copy) + if (!fs_info->tree_root || !fs_info->chunk_root || !fs_info->dev_root || + !fs_info->quota_root || !fs_info->uuid_root || !fs_info->super_copy) goto free_all; extent_io_tree_init(&fs_info->extent_cache); @@ -940,15 +998,14 @@ static int find_best_backup_root(struct btrfs_super_block *super) return best_index; } -static int setup_root_or_create_block(struct btrfs_fs_info *fs_info, - unsigned flags, - struct btrfs_root *info_root, - u64 objectid, char *str) +static int read_root_or_create_block(struct btrfs_fs_info *fs_info, + struct btrfs_root *root, u64 bytenr, + u64 gen, int level, unsigned flags, + char *str) { - struct btrfs_root *root = fs_info->tree_root; int ret; - ret = find_and_setup_root(root, fs_info, objectid, info_root); + ret = read_root_node(fs_info, root, bytenr, gen, level); if (ret) { if (!(flags & OPEN_CTREE_PARTIAL)) { error("could not setup %s tree", str); @@ -959,16 +1016,128 @@ static int setup_root_or_create_block(struct btrfs_fs_info *fs_info, * Need a blank node here just so we don't screw up in the * million of places that assume a root has a valid ->node */ - info_root->node = - btrfs_find_create_tree_block(fs_info, 0); - if (!info_root->node) + root->node = btrfs_find_create_tree_block(fs_info, 0); + if (!root->node) return -ENOMEM; - clear_extent_buffer_uptodate(info_root->node); + clear_extent_buffer_uptodate(root->node); } return 0; } +static inline bool maybe_load_block_groups(struct btrfs_fs_info *fs_info, + u64 flags) +{ + struct btrfs_root *root = btrfs_extent_root(fs_info, 0); + + if (flags & OPEN_CTREE_NO_BLOCK_GROUPS) + return false; + + if (root && extent_buffer_uptodate(root->node)) + return true; + + return false; +} + + +static int load_global_roots_objectid(struct btrfs_fs_info *fs_info, + struct btrfs_path *path, u64 objectid, + unsigned flags, char *str) +{ + struct btrfs_root *tree_root = fs_info->tree_root; + struct btrfs_root *root; + int ret; + struct btrfs_key key = { + .objectid = objectid, + .type = BTRFS_ROOT_ITEM_KEY, + .offset = 0, + }; + + + ret = btrfs_search_slot(NULL, tree_root, &key, path, 0, 0); + if (ret < 0) { + error("could not find %s tree", str); + return ret; + } + ret = 0; + + while (1) { + if (path->slots[0] >= btrfs_header_nritems(path->nodes[0])) { + ret = btrfs_next_leaf(tree_root, path); + if (ret) { + if (ret > 0) + ret = 0; + break; + } + } + btrfs_item_key_to_cpu(path->nodes[0], &key, + path->slots[0]); + if (key.objectid != objectid) + break; + + root = calloc(1, sizeof(*root)); + if (!root) { + ret = -ENOMEM; + break; + } + + btrfs_setup_root(root, fs_info, objectid); + read_extent_buffer(path->nodes[0], &root->root_item, + btrfs_item_ptr_offset(path->nodes[0], + path->slots[0]), + sizeof(root->root_item)); + memcpy(&root->root_key, &key, sizeof(key)); + ret = read_root_or_create_block(fs_info, root, + btrfs_root_bytenr(&root->root_item), + btrfs_root_generation(&root->root_item), + btrfs_root_level(&root->root_item), + flags, str); + if (ret) { + free(root); + break; + } + root->track_dirty = 1; + + ret = btrfs_global_root_insert(fs_info, root); + if (ret) { + free_extent_buffer(root->node); + free(root); + break; + } + + path->slots[0]++; + } + btrfs_release_path(path); + return ret; +} + +static int load_global_roots(struct btrfs_fs_info *fs_info, unsigned flags) +{ + struct btrfs_path *path; + int ret = 0; + + path = btrfs_alloc_path(); + if (!path) + return -ENOMEM; + + ret = load_global_roots_objectid(fs_info, path, + BTRFS_EXTENT_TREE_OBJECTID, flags, + "extent"); + if (ret) + goto out; + ret = load_global_roots_objectid(fs_info, path, + BTRFS_CSUM_TREE_OBJECTID, flags, + "csum"); + if (ret) + goto out; + ret = load_global_roots_objectid(fs_info, path, + BTRFS_FREE_SPACE_TREE_OBJECTID, flags, + "free space"); +out: + btrfs_free_path(path); + return ret; +} + int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info, u64 root_tree_bytenr, unsigned flags) { @@ -1006,11 +1175,9 @@ int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info, u64 root_tree_bytenr, return -EIO; } - ret = setup_root_or_create_block(fs_info, flags, fs_info->_extent_root, - BTRFS_EXTENT_TREE_OBJECTID, "extent"); + ret = load_global_roots(fs_info, flags); if (ret) return ret; - fs_info->_extent_root->track_dirty = 1; ret = find_and_setup_root(root, fs_info, BTRFS_DEV_TREE_OBJECTID, fs_info->dev_root); @@ -1020,12 +1187,6 @@ int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info, u64 root_tree_bytenr, } fs_info->dev_root->track_dirty = 1; - ret = setup_root_or_create_block(fs_info, flags, fs_info->_csum_root, - BTRFS_CSUM_TREE_OBJECTID, "csum"); - if (ret) - return ret; - fs_info->_csum_root->track_dirty = 1; - ret = find_and_setup_root(root, fs_info, BTRFS_UUID_TREE_OBJECTID, fs_info->uuid_root); if (ret) { @@ -1044,21 +1205,6 @@ int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info, u64 root_tree_bytenr, fs_info->quota_enabled = 1; } - if (btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE)) { - ret = find_and_setup_root(root, fs_info, BTRFS_FREE_SPACE_TREE_OBJECTID, - fs_info->_free_space_root); - if (ret) { - free(fs_info->_free_space_root); - fs_info->_free_space_root = NULL; - printk("Couldn't read free space tree\n"); - return -EIO; - } - fs_info->_free_space_root->track_dirty = 1; - } else { - free(fs_info->_free_space_root); - fs_info->_free_space_root = NULL; - } - ret = find_and_setup_log_root(root, fs_info, sb); if (ret) { printk("Couldn't setup log root tree\n"); @@ -1068,8 +1214,7 @@ int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info, u64 root_tree_bytenr, fs_info->generation = generation; fs_info->last_trans_committed = generation; - if (extent_buffer_uptodate(fs_info->_extent_root->node) && - !(flags & OPEN_CTREE_NO_BLOCK_GROUPS)) { + if (maybe_load_block_groups(fs_info, flags)) { ret = btrfs_read_block_groups(fs_info); /* * If we don't find any blockgroups (ENOENT) we're either @@ -1093,18 +1238,29 @@ int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info, u64 root_tree_bytenr, return 0; } +static void release_global_roots(struct btrfs_fs_info *fs_info) +{ + struct btrfs_root *root; + struct rb_node *n; + + for (n = rb_first(&fs_info->global_roots_tree); n; n = rb_next(n)) { + root = rb_entry(n, struct btrfs_root, rb_node); + if (root->node) + free_extent_buffer(root->node); + if (root->commit_root) + free_extent_buffer(root->commit_root); + root->node = NULL; + root->commit_root = NULL; + } +} + void btrfs_release_all_roots(struct btrfs_fs_info *fs_info) { - if (fs_info->_free_space_root) - free_extent_buffer(fs_info->_free_space_root->node); + release_global_roots(fs_info); if (fs_info->quota_root) free_extent_buffer(fs_info->quota_root->node); - if (fs_info->_csum_root) - free_extent_buffer(fs_info->_csum_root->node); if (fs_info->dev_root) free_extent_buffer(fs_info->dev_root->node); - if (fs_info->_extent_root) - free_extent_buffer(fs_info->_extent_root->node); if (fs_info->tree_root) free_extent_buffer(fs_info->tree_root->node); if (fs_info->log_root_tree) @@ -1826,6 +1982,8 @@ static int write_dev_supers(struct btrfs_fs_info *fs_info, static void backup_super_roots(struct btrfs_fs_info *info) { struct btrfs_root_backup *root_backup; + struct btrfs_root *csum_root = btrfs_csum_root(info, 0); + struct btrfs_root *extent_root = btrfs_extent_root(info, 0); int next_backup; int last_backup; @@ -1857,11 +2015,11 @@ static void backup_super_roots(struct btrfs_fs_info *info) btrfs_set_backup_chunk_root_level(root_backup, btrfs_header_level(info->chunk_root->node)); - btrfs_set_backup_extent_root(root_backup, info->_extent_root->node->start); + btrfs_set_backup_extent_root(root_backup, extent_root->node->start); btrfs_set_backup_extent_root_gen(root_backup, - btrfs_header_generation(info->_extent_root->node)); + btrfs_header_generation(extent_root->node)); btrfs_set_backup_extent_root_level(root_backup, - btrfs_header_level(info->_extent_root->node)); + btrfs_header_level(extent_root->node)); /* * we might commit during log recovery, which happens before we set * the fs_root. Make sure it is valid before we fill it in. @@ -1881,11 +2039,11 @@ static void backup_super_roots(struct btrfs_fs_info *info) btrfs_set_backup_dev_root_level(root_backup, btrfs_header_level(info->dev_root->node)); - btrfs_set_backup_csum_root(root_backup, info->_csum_root->node->start); + btrfs_set_backup_csum_root(root_backup, csum_root->node->start); btrfs_set_backup_csum_root_gen(root_backup, - btrfs_header_generation(info->_csum_root->node)); + btrfs_header_generation(csum_root->node)); btrfs_set_backup_csum_root_level(root_backup, - btrfs_header_level(info->_csum_root->node)); + btrfs_header_level(csum_root->node)); btrfs_set_backup_total_bytes(root_backup, btrfs_super_total_bytes(info->super_copy)); @@ -1893,7 +2051,7 @@ static void backup_super_roots(struct btrfs_fs_info *info) btrfs_super_bytes_used(info->super_copy)); btrfs_set_backup_num_devices(root_backup, btrfs_super_num_devices(info->super_copy)); -}; +} int write_all_supers(struct btrfs_fs_info *fs_info) { diff --git a/kernel-shared/disk-io.h b/kernel-shared/disk-io.h index dc71cc2b..0d2f505f 100644 --- a/kernel-shared/disk-io.h +++ b/kernel-shared/disk-io.h @@ -219,4 +219,9 @@ struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans, u64 objectid); struct btrfs_root *btrfs_csum_root(struct btrfs_fs_info *fs_info, u64 bytenr); struct btrfs_root *btrfs_extent_root(struct btrfs_fs_info *fs_inf, u64 bytenr); +struct btrfs_root *btrfs_block_group_root(struct btrfs_fs_info *fs_info); +struct btrfs_root *btrfs_global_root(struct btrfs_fs_info *fs_info, + struct btrfs_key *key); +int btrfs_global_root_insert(struct btrfs_fs_info *fs_info, + struct btrfs_root *root); #endif diff --git a/kernel-shared/free-space-tree.c b/kernel-shared/free-space-tree.c index 70b3d62a..0fdf5004 100644 --- a/kernel-shared/free-space-tree.c +++ b/kernel-shared/free-space-tree.c @@ -28,7 +28,13 @@ static struct btrfs_root *btrfs_free_space_root(struct btrfs_fs_info *fs_info, struct btrfs_block_group *block_group) { - return fs_info->_free_space_root; + struct btrfs_key key = { + .objectid = BTRFS_FREE_SPACE_TREE_OBJECTID, + .type = BTRFS_ROOT_ITEM_KEY, + .offset = 0, + }; + + return btrfs_global_root(fs_info, &key); } static struct btrfs_free_space_info * @@ -1238,7 +1244,6 @@ int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info) features &= ~(BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE_VALID | BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE); btrfs_set_super_compat_ro_flags(fs_info->super_copy, features); - fs_info->_free_space_root = NULL; ret = clear_free_space_tree(trans, free_space_root); if (ret) @@ -1258,6 +1263,7 @@ int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info) if (ret) goto abort; + rb_erase(&free_space_root->rb_node, &fs_info->global_roots_tree); free_extent_buffer(free_space_root->node); free_extent_buffer(free_space_root->commit_root); kfree(free_space_root); @@ -1474,7 +1480,10 @@ int btrfs_create_free_space_tree(struct btrfs_fs_info *fs_info) ret = PTR_ERR(free_space_root); goto abort; } - fs_info->_free_space_root = free_space_root; + + ret = btrfs_global_root_insert(fs_info, free_space_root); + if (ret) + goto abort; add_root_to_dirty_list(free_space_root); do { diff --git a/mkfs/main.c b/mkfs/main.c index 16f9ba19..d0c863fd 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -264,20 +264,33 @@ out: return ret; } +static int recow_global_roots(struct btrfs_trans_handle *trans) +{ + struct btrfs_fs_info *fs_info = trans->fs_info; + struct btrfs_root *root; + struct rb_node *n; + int ret = 0; + + for (n = rb_first(&fs_info->global_roots_tree); n; n = rb_next(n)) { + root = rb_entry(n, struct btrfs_root, rb_node); + ret = __recow_root(trans, root); + if (ret) + return ret; + } + + return ret; +} + static int recow_roots(struct btrfs_trans_handle *trans, struct btrfs_root *root) { struct btrfs_fs_info *info = root->fs_info; - struct btrfs_root *csum_root = btrfs_csum_root(info, 0); int ret; ret = __recow_root(trans, info->fs_root); if (ret) return ret; ret = __recow_root(trans, info->tree_root); - if (ret) - return ret; - ret = __recow_root(trans, info->_extent_root); if (ret) return ret; ret = __recow_root(trans, info->chunk_root); @@ -286,14 +299,9 @@ static int recow_roots(struct btrfs_trans_handle *trans, ret = __recow_root(trans, info->dev_root); if (ret) return ret; - ret = __recow_root(trans, csum_root); + ret = recow_global_roots(trans); if (ret) return ret; - if (info->_free_space_root) { - ret = __recow_root(trans, info->_free_space_root); - if (ret) - return ret; - } return 0; } From patchwork Wed Nov 10 20:14:16 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612869 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E1A36C433EF for ; Wed, 10 Nov 2021 20:14:55 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C2BA661247 for ; Wed, 10 Nov 2021 20:14:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232063AbhKJURm (ORCPT ); Wed, 10 Nov 2021 15:17:42 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36550 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231759AbhKJURl (ORCPT ); Wed, 10 Nov 2021 15:17:41 -0500 Received: from mail-qt1-x82e.google.com (mail-qt1-x82e.google.com [IPv6:2607:f8b0:4864:20::82e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B8BDBC061764 for ; Wed, 10 Nov 2021 12:14:53 -0800 (PST) Received: by mail-qt1-x82e.google.com with SMTP id t34so3281353qtc.7 for ; Wed, 10 Nov 2021 12:14:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=QgMOTazHwFNx2BLBLMTC6pSXDQZeaqM4d4JNoJSwriQ=; b=dwDl5sc8MR0ta+8Ti20xtP2YLkZoocmxQEW4p/1+3uxjzxiuLaLViVtpLrUG1jfIQq w4vQt+zgf2Tx3Oyp56j3BGTFT2AhTqNlywkpp7IQ47OuYoA8S5iSPy2Lhgw22XnN1ZI7 YzkrOh25lEaJmHPi/8xDM7gLKBAYn2gziINq+MuJywuYIgiE2Gzox3pMG5IYMOnLGfRw gvaAa+15SK8Q/X1N93o/qNoNGGHGBAXzOLKju7YjSz/WyX96B2wOLRVcdkrMvqC3np4M HAOdS/RhdixACLoZO6j+gnY+stQbf/e7tqi8EgB2ZNJkQc4gfPFQoxESlEEqMVzjWopF qTow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=QgMOTazHwFNx2BLBLMTC6pSXDQZeaqM4d4JNoJSwriQ=; b=CKi835pXwbXsoNpaqPxfIG4wCwXXypNTtqaDxYv0Vzqvg66sHrL6gwqfA/pSO65T8E jJZW6iPaRd7JDtZN0egUSeyUj77I+mTe9dDcgX4WmKdTrBqjUexYTfDmuuuy4/iFAEux uYS4uCbD/s6Mh4K5drVPOn8omXNZQ5mPOMesP8pHy4MG8lwdKGoqtm4fo22SPJ4d30GN lngZ1gFAlWEpqQ5u+1rhMiSZb3L9KZzfrAatt9BgmN5zJpYwvpM7BFA0ilqPPu5bUuZk tyGa2yxEIZmNP9OHL9Zm0OSC7bUlitX8VLeYu0S1odwVQWP2BDQNT9vaV81MHGtUAwwE 8+rw== X-Gm-Message-State: AOAM531s2MvDOY1atwGz9mtD7GXv1iF/j8CJd0I/npZc+1di4SdU8AQs WSbZovONRXyk0wnONg+M7M3G5Ion8qycZQ== X-Google-Smtp-Source: ABdhPJw/2MhYQux5FD/a4x8W8BUYZPIXhWoqbPfAWDF4gTghU+UW4Vg7VpovFB+d5oXlDiAiKdFibQ== X-Received: by 2002:a05:622a:44e:: with SMTP id o14mr1950790qtx.80.1636575292344; Wed, 10 Nov 2021 12:14:52 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id de13sm390436qkb.81.2021.11.10.12.14.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:14:51 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 04/30] btrfs-progs: check: make reinit work per found root item Date: Wed, 10 Nov 2021 15:14:16 -0500 Message-Id: <75eb2e354247aa6e9ab3b57083559bc6da131fd9.1636575146.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Instead of looking for the first extent root or csum root in memory, scan through the tree root and re-init any root items that match the given objectid. This will allow reinit to work with both extent tree v1 and extent tree v2 global roots when using the --reinit option. Signed-off-by: Josef Bacik --- check/main.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/check/main.c b/check/main.c index e3e5a336..140cd427 100644 --- a/check/main.c +++ b/check/main.c @@ -9319,6 +9319,52 @@ out: return ret; } +static int reinit_global_roots(struct btrfs_trans_handle *trans, u64 objectid) +{ + struct btrfs_key key = { + .objectid = objectid, + .type = BTRFS_ROOT_ITEM_KEY, + .offset = 0, + }; + struct btrfs_path path; + struct btrfs_root *tree_root = gfs_info->tree_root; + struct btrfs_root *root; + int ret; + + btrfs_init_path(&path); + while (1) { + ret = btrfs_search_slot(NULL, tree_root, &key, &path, 0, 0); + if (ret) { + if (ret == 1) { + /* We should at least find the first one. */ + if (key.offset == 0) + ret = -ENOENT; + else + ret = 0; + } + break; + } + + btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]); + if (key.objectid != objectid) + break; + btrfs_release_path(&path); + root = btrfs_read_fs_root(gfs_info, &key); + if (IS_ERR(root)) { + error("Error reading global root [%llu %llu]", + key.objectid, key.offset); + ret = PTR_ERR(root); + break; + } + ret = btrfs_fsck_reinit_root(trans, root); + if (ret) + break; + key.offset++; + } + btrfs_release_path(&path); + return ret; +} + static int reinit_extent_tree(struct btrfs_trans_handle *trans, bool pin) { u64 start = 0; @@ -9375,7 +9421,7 @@ again: } /* Ok we can allocate now, reinit the extent root */ - ret = btrfs_fsck_reinit_root(trans, btrfs_extent_root(gfs_info, 0)); + ret = reinit_global_roots(trans, BTRFS_EXTENT_TREE_OBJECTID); if (ret) { fprintf(stderr, "extent root initialization failed\n"); /* @@ -10699,8 +10745,8 @@ static int cmd_check(const struct cmd_struct *cmd, int argc, char **argv) if (init_csum_tree) { printf("Reinitialize checksum tree\n"); - ret = btrfs_fsck_reinit_root(trans, - btrfs_csum_root(gfs_info, 0)); + ret = reinit_global_roots(trans, + BTRFS_CSUM_TREE_OBJECTID); if (ret) { error("checksum tree initialization failed: %d", ret); From patchwork Wed Nov 10 20:14:17 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612871 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5B8BDC433FE for ; Wed, 10 Nov 2021 20:14:57 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 45E7061248 for ; Wed, 10 Nov 2021 20:14:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232077AbhKJURn (ORCPT ); Wed, 10 Nov 2021 15:17:43 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36554 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231160AbhKJURm (ORCPT ); Wed, 10 Nov 2021 15:17:42 -0500 Received: from mail-qk1-x731.google.com (mail-qk1-x731.google.com [IPv6:2607:f8b0:4864:20::731]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E2A93C061764 for ; Wed, 10 Nov 2021 12:14:54 -0800 (PST) Received: by mail-qk1-x731.google.com with SMTP id bl12so3643831qkb.13 for ; Wed, 10 Nov 2021 12:14:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=Bpqw75jqbcDSIbk5WrH7KTaX40c8yGb9tmuEntpkosI=; b=uvpChxaeZMUw0PwBYRfiWMZUHu8hTOUDf7pK05QToC6/7ziR2/30olUpXfBkFNXAvP bspn7g6cuCBzgcHlbbCZiv6hzwZyp2Eh1a9jZu1FBByRTD9h4h7RsbrFLnfes2LSLr5W JbixIT8922h0D0eaaEXTmXczxXHOtKSwqC8id+W5WJb1so3YcZ1nmnwFV3StRaQmVDHr 7pIKh3KMiDiw9ECj8Dfq7Lf/EANOlkCBDLCCc0Ck5wSdyzc8oZrCSzB629vsWv41Zxoh SRhD+Cl75gIeOSz+EeeCgXEXyCquwxLBU4AivBCfCs4tsjpbVHyuiA4NE18SsU0uUhoH 5ZGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Bpqw75jqbcDSIbk5WrH7KTaX40c8yGb9tmuEntpkosI=; b=CqEHN0dwVb/QJquKp2lqDXNDuRgttMeizUIyL3bhsyXy7GqiSIxUWB+m+ibU7mq/7p cYfcQGIzkKPBmMrmEPgkJmugjOPPdBg6PrZF4qprBq/U+02nIjGMsVuNwsvvPgXNbs7f p9IJv3GMNk0nQQHtHYCpnYRR0KfG0f3Cb+e+ZumHo5NJPcuKdBWYlfWWyQ5QBUbjczJe rxDrazBn3p/3eFm2SFD3R7sBM42Svma1wwLqKozMzBNQ2X4h9z6oC6QwGSK/6qxOPqOn C0/qtUmXlIOGNZjSY+Z+pzNCfKT197A7XVp78sJr0gWbZnDXZUCvH35jvVD0o+OQRkXN Ijzg== X-Gm-Message-State: AOAM5306hnkSwWyVIxETyxLnhs+fWEVGfjQwntYfjTqty1pdez09KPf8 aZsa0/YNQJB+2I6LiqKCXcs7LSdT3Q9eGA== X-Google-Smtp-Source: ABdhPJwF6KCeLtvP4bqZS8Gxl5P/m5OnJ7iFfglWNPq+PSmih0kAmo+JpWmWOalGhlUk1U1VSXRaDQ== X-Received: by 2002:a05:620a:3183:: with SMTP id bi3mr1813839qkb.76.1636575293805; Wed, 10 Nov 2021 12:14:53 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id 9sm351011qkm.5.2021.11.10.12.14.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:14:53 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 05/30] btrfs-progs: check: check the global roots for uptodate root nodes Date: Wed, 10 Nov 2021 15:14:17 -0500 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Instead of checking the csum and extent tree individually, walk through the global roots and validate them all. This will work properly if we have extent tree v1 or extent tree v2. Signed-off-by: Josef Bacik --- check/main.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/check/main.c b/check/main.c index 140cd427..6795e675 100644 --- a/check/main.c +++ b/check/main.c @@ -10379,6 +10379,23 @@ out: return ret; } +static int check_global_roots_uptodate(void) +{ + struct btrfs_root *root; + struct rb_node *n; + + for (n = rb_first(&gfs_info->global_roots_tree); n; n = rb_next(n)) { + root = rb_entry(n, struct btrfs_root, rb_node); + if (!extent_buffer_uptodate(root->node)) { + error("chritical: global root [%llu %llu] not uptodate, unable to check the file system", + root->root_key.objectid, root->root_key.offset); + return -EIO; + } + } + + return 0; +} + static const char * const cmd_check_usage[] = { "btrfs check [options] ", "Check structural integrity of a filesystem (unmounted).", @@ -10771,18 +10788,9 @@ static int cmd_check(const struct cmd_struct *cmd, int argc, char **argv) if (ret) goto close_out; } - root = btrfs_extent_root(gfs_info, 0); - if (!extent_buffer_uptodate(root->node)) { - error("critical: extent_root, unable to check the filesystem"); - ret = -EIO; - err |= !!ret; - goto close_out; - } - root = btrfs_csum_root(gfs_info, 0); - if (!extent_buffer_uptodate(root->node)) { - error("critical: csum_root, unable to check the filesystem"); - ret = -EIO; + ret = check_global_roots_uptodate(); + if (ret) { err |= !!ret; goto close_out; } From patchwork Wed Nov 10 20:14:18 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612873 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 954C5C433EF for ; Wed, 10 Nov 2021 20:14:58 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7A47D61248 for ; Wed, 10 Nov 2021 20:14:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232444AbhKJURp (ORCPT ); Wed, 10 Nov 2021 15:17:45 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36564 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232311AbhKJURo (ORCPT ); Wed, 10 Nov 2021 15:17:44 -0500 Received: from mail-qt1-x834.google.com (mail-qt1-x834.google.com [IPv6:2607:f8b0:4864:20::834]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5B126C061764 for ; Wed, 10 Nov 2021 12:14:56 -0800 (PST) Received: by mail-qt1-x834.google.com with SMTP id z9so3268821qtj.9 for ; Wed, 10 Nov 2021 12:14:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=iJXWVIvO1tuVtnIozW4eE+rzIC8d+GMpsaxozXvZXMY=; b=ETYkR1BeHW+K2BKJQtQIZz+rPGpwSMw6d+TSVr/jGLyIz8ao9gLG8+PUmfIKyoVUR1 sur7Ev3S/gtpVu+h0FLwXM1Kr1FpLheFNhNOm4MSF/PMRbzWotM+93/h12rXQwsNlg4t Xr8yhzLIknZRAE4KUwPdhYRYly/jA8sHjV3yfVJxeR6gcmKEqlsQNPqZJyJXCxnVf/9e 1VfeqErtBkb87lJepUOG02uEJIjDafG8vIkTgdkxZj4lTvyz6J1wQ9rc9bG2PmxIivot 1VZfrxkWJ73ohOjt/Zwp6am06n3RSHI3nAL8H0HGeKG7zqjIhGd06rKm1Esfznz5D9Bl yzgg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=iJXWVIvO1tuVtnIozW4eE+rzIC8d+GMpsaxozXvZXMY=; b=5t6VrExtOV5EJNHl3rVditbGDEtjXs3D8drJXDXiGbvTOjr5ZZvlhZGmpj3GHPh/eV /Zc7jh6wSKC/XElAJdyTNvtHOQ0I4wcY0PBdSjhcHEtqvekhVSqzsjbSy1o0mmPQuvpJ UFZiCjCK8U7ub9aYRuL7XAbs6283VHPwqfv79pKgHsz0YECjA96mEMjMi2mb0Jq1upFK j2kKIgrL9YGQoetj1qSUAhQ0NFKw6jUs2Syb8gEIiSZb475C3718uGY9HckAz/PLr3n0 oOa+yLGE31jEl/gEnne7LhRN/uGz3j9hdQAl6sl/ZMdtc8MVNp9JYdqWOmai0eSW8t+H 1umw== X-Gm-Message-State: AOAM532HpDchLm9q/yuelBngx9A1NRjXKg0WyJ700odE7umc9kDyG+i1 E4pzTOic0vv7Zi699ob41kfmpVmUgekPAg== X-Google-Smtp-Source: ABdhPJz+EzcWiS2XaKEeBot9yDztK8/VF+14y/hMoxWJgDCzYObCHbbsoirlg+rFqc6v9qehc8a9Cw== X-Received: by 2002:ac8:5b8c:: with SMTP id a12mr1906545qta.342.1636575295198; Wed, 10 Nov 2021 12:14:55 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id w5sm456281qko.54.2021.11.10.12.14.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:14:54 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 06/30] btrfs-progs: check: check all of the csum roots Date: Wed, 10 Nov 2021 15:14:18 -0500 Message-Id: <3a581652e5573d8be4ab72578fc909e8094468f3.1636575146.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Use the global roots tree to find all of the csum roots in the system and check all of them as appropriate. Signed-off-by: Josef Bacik --- check/main.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/check/main.c b/check/main.c index 6795e675..175fe616 100644 --- a/check/main.c +++ b/check/main.c @@ -5977,7 +5977,7 @@ out: return ret; } -static int check_csums(struct btrfs_root *root) +static int check_csum_root(struct btrfs_root *root) { struct btrfs_path path; struct extent_buffer *leaf; @@ -5991,7 +5991,6 @@ static int check_csums(struct btrfs_root *root) unsigned long leaf_offset; bool verify_csum = !!check_data_csum; - root = btrfs_csum_root(gfs_info, 0); if (!extent_buffer_uptodate(root->node)) { fprintf(stderr, "No valid csum tree found\n"); return -ENOENT; @@ -6087,6 +6086,27 @@ skip_csum_check: return errors; } +static int check_csums(void) +{ + struct rb_node *n; + struct btrfs_root *root; + int ret; + + root = btrfs_csum_root(gfs_info, 0); + while (1) { + ret = check_csum_root(root); + if (ret) + break; + n = rb_next(&root->rb_node); + if (!n) + break; + root = rb_entry(n, struct btrfs_root, rb_node); + if (root->root_key.objectid != BTRFS_CSUM_TREE_OBJECTID) + break; + } + return ret; +} + static int is_dropped_key(struct btrfs_key *key, struct btrfs_key *drop_key) { @@ -10899,7 +10919,7 @@ static int cmd_check(const struct cmd_struct *cmd, int argc, char **argv) task_start(ctx.info, &ctx.start_time, &ctx.item_count); } - ret = check_csums(root); + ret = check_csums(); task_stop(ctx.info); /* * Data csum error is not fatal, and it may indicate more serious From patchwork Wed Nov 10 20:14:19 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612875 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2468AC433F5 for ; Wed, 10 Nov 2021 20:15:00 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 0F8226109F for ; Wed, 10 Nov 2021 20:15:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232235AbhKJURq (ORCPT ); Wed, 10 Nov 2021 15:17:46 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36570 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232179AbhKJURp (ORCPT ); Wed, 10 Nov 2021 15:17:45 -0500 Received: from mail-qv1-xf2b.google.com (mail-qv1-xf2b.google.com [IPv6:2607:f8b0:4864:20::f2b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id ABCF2C061764 for ; Wed, 10 Nov 2021 12:14:57 -0800 (PST) Received: by mail-qv1-xf2b.google.com with SMTP id jo22so2618163qvb.13 for ; Wed, 10 Nov 2021 12:14:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=aBUk2cArVvEwez5VE+87HZJGc9HIWulLuJzNnuBNwzE=; b=Z3LbEDT1ykj4OO5Esc0p8XMdsxxrXMvE582gGb9NsTMIToYRpewfxiAybSsgbuzpJy bxYeHVhgYQf0lZYcr3/BDEETWzCOfPzBLuc+QTLCY1ZRalktLQxmuKRQzjgdV8vaKn7H l0ibQ++1XkJwUeff8tqsn1XOrHppmI9Jysg5pc0qyeJkQmlY3NyHF4eDR/1zcR1JNRo2 OP31cx7LhPVLO/6QARTUUHTXl9hwnWVnz0WKOI1+hs3/pzUdWwHNwgjx1nXgt7cNJFMW wWKnj1X7+xj+BB1IwzKocml+35KTVBYM3mVK8P2m2WF59nAozLQuCaui64Cq9YSQXzzJ LxRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=aBUk2cArVvEwez5VE+87HZJGc9HIWulLuJzNnuBNwzE=; b=UNgykiCMVTYgFEkizhHSimHTkkSEW1n13ksFpH2NdQ4aI6Q/qV6yGlJ5/xkNC+TqKO RnDmTg7VlZUqsForcTLtsTuhZzN/kqhsApQeDIypThqdda/4NT9sLK4k7KU/BXY9+PR8 WkyawhXgRZoYyiMUKeeHL1RIc9yhwz2uRcU5tDuCBo7l7g9LgrPOceaaOzGDYej/JFRG rJngTa33UsnB6c5KUHAGDVMcDT6VLTlvxMC/wM+2Lli+i8xLSGZEoJLIZ0LvIhdWT8lx DHDTK0KTvF3qX+Icuv54f594+V1W5kN1bkmz+PJqC6U6T7dJR8+tdGPcdomsb3wVvZgc dF3g== X-Gm-Message-State: AOAM531iEIWPXx0d53tSMOt/3tcDkQ59FrNkcX8ltkzACo9sm54x1Raf uLu/+RfbyqAuPulTIeL586yg90fCR6vbqg== X-Google-Smtp-Source: ABdhPJz6BAK2XMwRZt3N0gM9aNg39TOKnyh0kyiVHvXJb9KjkukW2EcrYcX1u+An7MeWHxhwIxvuLw== X-Received: by 2002:a05:6214:1c8a:: with SMTP id ib10mr1773279qvb.46.1636575296579; Wed, 10 Nov 2021 12:14:56 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id y14sm483367qta.86.2021.11.10.12.14.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:14:56 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 07/30] btrfs-progs: check: fill csum root from all extent roots Date: Wed, 10 Nov 2021 15:14:19 -0500 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We may have multiple extent roots, so cycle through all of the extent roots and populate the csum tree based on the content of every extent root we have in the file system. Signed-off-by: Josef Bacik --- check/main.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/check/main.c b/check/main.c index 175fe616..5fb28216 100644 --- a/check/main.c +++ b/check/main.c @@ -9690,9 +9690,9 @@ out: return ret; } -static int fill_csum_tree_from_extent(struct btrfs_trans_handle *trans) +static int fill_csum_tree_from_extent(struct btrfs_trans_handle *trans, + struct btrfs_root *extent_root) { - struct btrfs_root *extent_root = btrfs_extent_root(gfs_info, 0); struct btrfs_root *csum_root; struct btrfs_path path; struct btrfs_extent_item *ei; @@ -9766,10 +9766,26 @@ static int fill_csum_tree_from_extent(struct btrfs_trans_handle *trans) static int fill_csum_tree(struct btrfs_trans_handle *trans, int search_fs_tree) { + struct btrfs_root *root; + struct rb_node *n; + int ret; + if (search_fs_tree) return fill_csum_tree_from_fs(trans); - else - return fill_csum_tree_from_extent(trans); + + root = btrfs_extent_root(gfs_info, 0); + while (1) { + ret = fill_csum_tree_from_extent(trans, root); + if (ret) + break; + n = rb_next(&root->rb_node); + if (!n) + break; + root = rb_entry(n, struct btrfs_root, rb_node); + if (root->root_key.objectid != BTRFS_EXTENT_TREE_OBJECTID) + break; + } + return ret; } static void free_roots_info_cache(void) From patchwork Wed Nov 10 20:14:20 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612877 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6C572C433FE for ; Wed, 10 Nov 2021 20:15:01 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 56A8861247 for ; Wed, 10 Nov 2021 20:15:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232490AbhKJURs (ORCPT ); Wed, 10 Nov 2021 15:17:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36578 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232179AbhKJURq (ORCPT ); Wed, 10 Nov 2021 15:17:46 -0500 Received: from mail-qk1-x72c.google.com (mail-qk1-x72c.google.com [IPv6:2607:f8b0:4864:20::72c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0AABDC061764 for ; Wed, 10 Nov 2021 12:14:59 -0800 (PST) Received: by mail-qk1-x72c.google.com with SMTP id bm28so3669108qkb.9 for ; Wed, 10 Nov 2021 12:14:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=QnkCVniF1guvZj/nG5J4jMpI4BWPXl1J45QuBunC7eE=; b=3Csjp6DUlQhlncYxKtv0elq4/QDLFseEeBsPJ3ilwEIzcTqukOiELhNo6nB9QSJAM1 gtGu0in6tRCYIGIEWZTwjqQEwyP4lsv5LxHbg4ni7Dx04U2XVuIxck6gFEICVErCEGgm vwF1t0PlFQwg2NPZum7XxrB/hOtnHtlTdfcUXOcs6/ES6msAKIDk2KGtes7jY60OqDSz K+HGbF8Ts+ZgwoHUd0cwjBDTnWQU1Ybxm5oEiE8hReYaAeSoKaEoG++ag7k6EmtLMOT+ XhLqOFtv1BJy9G9OomRYpEBQjhMbVwG4SmKzV/P90sQfJsSXhqu/OaeieKIEeLeKzW+D XWoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=QnkCVniF1guvZj/nG5J4jMpI4BWPXl1J45QuBunC7eE=; b=wP+DPqxtVjhkKS5RfP30SS+H+CA9U/cPBMAIKkZpQpmZwLjV6ZAEYXpyRRMIdBl2+u JvN3MLkqHqaCfhY9qm80uTEEzzIz7GuhlQSnQczQxWR2pQBxHWCqUd9WsIEqO92VsHfX j2JWk/cIRsJVTYXnOQ/JbuyRLv0Zk0Y0YZxDU43U6ws6E1TSItr93ucHwFj8Q/xsEp4n HpHL5C4VJa0JazrfpEXpMjPv12Txu2dBv3dOwqvk3H/TOQXhkjL2docB7b8EDGZbSSZZ iQXyDCVSkRiWVscpDmer8Xe8Jl1ey33UPxq/2zuA0pOkyDUjtjzXJhnTWX9euHcThraz 3Zvw== X-Gm-Message-State: AOAM532IE/qwGetit8eu8c6VVeg1Nlc8OUKRbsdkkGK5QTm9AyiAeMxv gO84zi+OITDKg7lzvVL1CkPMVehj3ggY3A== X-Google-Smtp-Source: ABdhPJwaMNOgDTkWRVP1xJHmjvo/JCyECLrxsEhUnoSvLcYP9yN3Ih/LwzjiFk/ZAN5+RZ5tJE+Rbw== X-Received: by 2002:a37:4041:: with SMTP id n62mr1669579qka.225.1636575297934; Wed, 10 Nov 2021 12:14:57 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id z10sm531377qtj.64.2021.11.10.12.14.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:14:57 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 08/30] btrfs-progs: common: search all extent roots for marking used space Date: Wed, 10 Nov 2021 15:14:20 -0500 Message-Id: <03e397030d8d3cf26f755873adf3a020d0d620b5.1636575146.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We could have multiple extent roots, so add a helper to mark all the used space in the FS based on any extent roots we find, and then use this extent io tree to fixup the block group accounting. Signed-off-by: Josef Bacik --- common/repair.c | 142 +++++++++++++++++++++++++++++++++--------------- common/repair.h | 2 + 2 files changed, 100 insertions(+), 44 deletions(-) diff --git a/common/repair.c b/common/repair.c index 41520b32..f8c3f89c 100644 --- a/common/repair.c +++ b/common/repair.c @@ -152,47 +152,27 @@ int btrfs_mark_used_tree_blocks(struct btrfs_fs_info *fs_info, return ret; } -/* - * Fixup block accounting. The initial block accounting created by - * make_block_groups isn't accuracy in this case. - */ -int btrfs_fix_block_accounting(struct btrfs_trans_handle *trans) +static int populate_used_from_extent_root(struct btrfs_root *root, + struct extent_io_tree *io_tree) { - int ret = 0; - int slot; - u64 start = 0; - u64 bytes_used = 0; + struct btrfs_fs_info *fs_info = root->fs_info; + struct extent_buffer *leaf; struct btrfs_path path; struct btrfs_key key; - struct extent_buffer *leaf; - struct btrfs_block_group *cache; - struct btrfs_fs_info *fs_info = trans->fs_info; - struct btrfs_root *root = btrfs_extent_root(fs_info, 0); - - ret = btrfs_run_delayed_refs(trans, -1); - if (ret) - return ret; - - while(1) { - cache = btrfs_lookup_first_block_group(fs_info, start); - if (!cache) - break; - - start = cache->start + cache->length; - cache->used = 0; - cache->space_info->bytes_used = 0; - if (list_empty(&cache->dirty_list)) - list_add_tail(&cache->dirty_list, &trans->dirty_bgs); - } + int slot; + int ret; btrfs_init_path(&path); key.offset = 0; key.objectid = 0; key.type = BTRFS_EXTENT_ITEM_KEY; - ret = btrfs_search_slot(trans, root, &key, &path, 0, 0); + ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0); if (ret < 0) return ret; + while(1) { + u64 start, end; + leaf = path.nodes[0]; slot = path.slots[0]; if (slot >= btrfs_header_nritems(leaf)) { @@ -205,23 +185,97 @@ int btrfs_fix_block_accounting(struct btrfs_trans_handle *trans) slot = path.slots[0]; } btrfs_item_key_to_cpu(leaf, &key, slot); - if (key.type == BTRFS_EXTENT_ITEM_KEY) { - bytes_used += key.offset; - ret = btrfs_update_block_group(trans, - key.objectid, key.offset, 1, 0); - BUG_ON(ret); - } else if (key.type == BTRFS_METADATA_ITEM_KEY) { - bytes_used += fs_info->nodesize; - ret = btrfs_update_block_group(trans, - key.objectid, fs_info->nodesize, 1, 0); - if (ret) - goto out; - } + start = end = key.objectid; + if (key.type == BTRFS_EXTENT_ITEM_KEY) + end = start + key.offset - 1; + else if (key.type == BTRFS_METADATA_ITEM_KEY) + end = start + fs_info->nodesize - 1; + + if (start != end) + set_extent_dirty(io_tree, start, end); + path.slots[0]++; } - btrfs_set_super_bytes_used(root->fs_info->super_copy, bytes_used); + btrfs_release_path(&path); + return 0; +} + +int btrfs_mark_used_blocks(struct btrfs_fs_info *fs_info, + struct extent_io_tree *tree) +{ + struct btrfs_root *root; + struct rb_node *n; + int ret; + + root = btrfs_extent_root(fs_info, 0); + while (1) { + ret = populate_used_from_extent_root(root, tree); + if (ret) + break; + n = rb_next(&root->rb_node); + if (!n) + break; + root = rb_entry(n, struct btrfs_root, rb_node); + if (root->root_key.objectid != BTRFS_EXTENT_TREE_OBJECTID) + break; + } + + return ret; +} + +/* + * Fixup block accounting. The initial block accounting created by + * make_block_groups isn't accuracy in this case. + */ +int btrfs_fix_block_accounting(struct btrfs_trans_handle *trans) +{ + struct extent_io_tree used; + struct btrfs_fs_info *fs_info = trans->fs_info; + struct btrfs_block_group *cache; + u64 start, end; + u64 bytes_used = 0; + int ret = 0; + + ret = btrfs_run_delayed_refs(trans, -1); + if (ret) + return ret; + + extent_io_tree_init(&used); + + ret = btrfs_mark_used_blocks(fs_info, &used); + if (ret) + goto out; + + start = 0; + while(1) { + cache = btrfs_lookup_first_block_group(fs_info, start); + if (!cache) + break; + + start = cache->start + cache->length; + cache->used = 0; + cache->space_info->bytes_used = 0; + if (list_empty(&cache->dirty_list)) + list_add_tail(&cache->dirty_list, &trans->dirty_bgs); + } + + start = 0; + while (1) { + ret = find_first_extent_bit(&used, 0, &start, &end, + EXTENT_DIRTY); + if (ret) + break; + + bytes_used += end - start + 1; + ret = btrfs_update_block_group(trans, start, end - start + 1, + 1, 0); + if (ret) + goto out; + clear_extent_dirty(&used, start, end); + } + btrfs_set_super_bytes_used(fs_info->super_copy, bytes_used); ret = 0; out: - btrfs_release_path(&path); + extent_io_tree_cleanup(&used); return ret; } diff --git a/common/repair.h b/common/repair.h index 793ebcd2..1b19739d 100644 --- a/common/repair.h +++ b/common/repair.h @@ -35,5 +35,7 @@ int btrfs_add_corrupt_extent_record(struct btrfs_fs_info *info, int btrfs_fix_block_accounting(struct btrfs_trans_handle *trans); int btrfs_mark_used_tree_blocks(struct btrfs_fs_info *fs_info, struct extent_io_tree *tree); +int btrfs_mark_used_blocks(struct btrfs_fs_info *fs_info, + struct extent_io_tree *tree); #endif From patchwork Wed Nov 10 20:14:21 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612879 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id BB10BC433EF for ; Wed, 10 Nov 2021 20:15:02 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 9C34A6124C for ; Wed, 10 Nov 2021 20:15:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232518AbhKJURt (ORCPT ); Wed, 10 Nov 2021 15:17:49 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36586 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232179AbhKJURs (ORCPT ); Wed, 10 Nov 2021 15:17:48 -0500 Received: from mail-qt1-x835.google.com (mail-qt1-x835.google.com [IPv6:2607:f8b0:4864:20::835]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D8167C061764 for ; Wed, 10 Nov 2021 12:15:00 -0800 (PST) Received: by mail-qt1-x835.google.com with SMTP id o17so3317626qtk.1 for ; Wed, 10 Nov 2021 12:15:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=EsrZbE5IMa4+oE32EaQaDzUdZDifMpyNY3/MtyR/nVg=; b=5jcc1T9GYSmgoxYn86xVZ/O78xRFzH4tOEb/aDpkLLMvo6/AFNStL4dV2juzztEBES /cTgSQp1Ob9W2h2cXesVgvxBNkKGhyVcibStA9m/eVZgsEqRX2atwYqLAye6dNl85LyB gFcakb9X0zDFDJ4DMdPbkfNtI8ZzoKX6NaIMOMBGw/xeUTz+GRD4N1jqImA6+KYr+PUi 6rRyC3dihvjeor7KqFkvAoikBPbdiJ+VfRHor4LF38xIVH+GHyBtN28i82IlFbUzWi8T 3a+tF+JWVmluewIM9PozQYCBlc11hJkq4rw1BIMmT0REisrL0blatK3jhhPmBt2x7FHS DUww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=EsrZbE5IMa4+oE32EaQaDzUdZDifMpyNY3/MtyR/nVg=; b=lgmkN1Ph1f/J4RrlDbnpiuyCk0ZOX5Lb6xVU6ZUxsJHImD5rEA6w2slUFLTGzB0CzW ELmRgI/bosQQMgOamLHhv2Z+Haxr4szxG9eKaRqkmXuerp+WYu4f2HPA82QqKPnovIKC 8VXmooJQGaK+3MiGTIWfCA5MokaN3X4Zdy/IKnbyA5aYrYBYQ3d/4CMmsgvLkpGro4u+ GW23c499GE7EFaruavckf2LoBnFwaKLRP6tL3TjdMY/h9ZwatAibeBO9s005LZXsLE1p OeMQE5XP5hRC3Tds/Gwn+l4kkjSZmj8u9hLhB25OmzOxokdwdqkYswNBka1X/JNLCPTM CWTg== X-Gm-Message-State: AOAM530TuO7a+I+O071mpsDWBWdH5UJEnyqvBsY/yisJ77RRzpKrlW0D meL4V7nAVsx1l9o2hF0p4JEjtfqEsmzMzw== X-Google-Smtp-Source: ABdhPJyhoq5Z2EiWgqdsnoFV7E3J3y6uNNEX+2cKQczHo02s70vyJ8uQpE8UwdM6MMpe1Uo0/5JuGw== X-Received: by 2002:ac8:5cd1:: with SMTP id s17mr1840909qta.159.1636575299784; Wed, 10 Nov 2021 12:14:59 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id w1sm489904qtj.28.2021.11.10.12.14.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:14:59 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 09/30] btrfs-progs: common: allow users to select extent-tree-v2 option Date: Wed, 10 Nov 2021 15:14:21 -0500 Message-Id: <9d422ce7a5a601d38bb161cd01b57a5277e49175.1636575146.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We want to enable developers to test the extent tree v2 features as they are added, add the ability to mkfs an extent tree v2 fs if we have experimental enabled. Signed-off-by: Josef Bacik --- common/fsfeatures.c | 11 +++++++++++ kernel-shared/ctree.h | 18 ++++++++++++++++++ mkfs/main.c | 6 ++++++ 3 files changed, 35 insertions(+) diff --git a/common/fsfeatures.c b/common/fsfeatures.c index df1bb8f7..23a92c21 100644 --- a/common/fsfeatures.c +++ b/common/fsfeatures.c @@ -131,6 +131,17 @@ static const struct btrfs_feature mkfs_features[] = { VERSION_NULL(default), .desc = "support zoned devices" }, +#endif +#if EXPERIMENTAL + { + .name = "extent-tree-v2", + .flag = BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2, + .sysfs_name = "extent_tree_v2", + VERSION_TO_STRING2(compat, 5,15), + VERSION_NULL(safe), + VERSION_NULL(default), + .desc = "new extent tree format" + }, #endif /* Keep this one last */ { diff --git a/kernel-shared/ctree.h b/kernel-shared/ctree.h index 12a8165d..8a46306e 100644 --- a/kernel-shared/ctree.h +++ b/kernel-shared/ctree.h @@ -507,6 +507,23 @@ struct btrfs_super_block { (BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE | \ BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE_VALID) +#if EXPERIMENTAL +#define BTRFS_FEATURE_INCOMPAT_SUPP \ + (BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF | \ + BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL | \ + BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO | \ + BTRFS_FEATURE_INCOMPAT_COMPRESS_ZSTD | \ + BTRFS_FEATURE_INCOMPAT_BIG_METADATA | \ + BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF | \ + BTRFS_FEATURE_INCOMPAT_RAID56 | \ + BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS | \ + BTRFS_FEATURE_INCOMPAT_SKINNY_METADATA | \ + BTRFS_FEATURE_INCOMPAT_NO_HOLES | \ + BTRFS_FEATURE_INCOMPAT_RAID1C34 | \ + BTRFS_FEATURE_INCOMPAT_METADATA_UUID | \ + BTRFS_FEATURE_INCOMPAT_ZONED | \ + BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2) +#else #define BTRFS_FEATURE_INCOMPAT_SUPP \ (BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF | \ BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL | \ @@ -521,6 +538,7 @@ struct btrfs_super_block { BTRFS_FEATURE_INCOMPAT_RAID1C34 | \ BTRFS_FEATURE_INCOMPAT_METADATA_UUID | \ BTRFS_FEATURE_INCOMPAT_ZONED) +#endif /* * A leaf is full of items. offset and size tell us where to find diff --git a/mkfs/main.c b/mkfs/main.c index d0c863fd..2c4b7b00 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -1223,6 +1223,12 @@ int BOX_MAIN(mkfs)(int argc, char **argv) features |= BTRFS_FEATURE_INCOMPAT_RAID1C34; } + /* Extent tree v2 comes with a set of mandatory features. */ + if (features & BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2) { + features |= BTRFS_FEATURE_INCOMPAT_NO_HOLES; + runtime_features |= BTRFS_RUNTIME_FEATURE_FREE_SPACE_TREE; + } + if (zoned) { if (source_dir_set) { error("the option -r and zoned mode are incompatible"); From patchwork Wed Nov 10 20:14:22 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612881 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2041AC433F5 for ; Wed, 10 Nov 2021 20:15:05 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 0A1A161241 for ; Wed, 10 Nov 2021 20:15:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232550AbhKJURu (ORCPT ); Wed, 10 Nov 2021 15:17:50 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36594 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232179AbhKJURu (ORCPT ); Wed, 10 Nov 2021 15:17:50 -0500 Received: from mail-qt1-x833.google.com (mail-qt1-x833.google.com [IPv6:2607:f8b0:4864:20::833]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7E060C061764 for ; Wed, 10 Nov 2021 12:15:02 -0800 (PST) Received: by mail-qt1-x833.google.com with SMTP id l8so3299323qtk.6 for ; Wed, 10 Nov 2021 12:15:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=ukiHwVRSTF97BrpJRCvegP8HUEp6Hx3PHsedxexcM84=; b=7S+R6cLa+iGBd5+oHlaMn+3ZWgCElnt9cx5PQpFsN2f0gaYHG1xYHjpdBvjbRySqTK zdBS0uBN0CYZ6bE2UkQL3iQQF44arlyRv9x2dctS3rO4lRMx40PxsBB9T1PchP+ZhCIQ nGtyaFgUPG4Fja+bORr1g6id8XIgfYNhVdhZLM9LTnoWlVR/5FVIH416YyhXIqUTbmA1 9D9narlu23zao267hOhxYMFi3NGpWfa3+Xaw7Kr6LtJFWweI5xYp+bAIQ4DlfRSrKpRY z9nQLObccDpGHONQCowSbuIJExDDpJhAs8RJIq9xeQohSu7hg6YT0gTs9OfHp28r0JCH NnaQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ukiHwVRSTF97BrpJRCvegP8HUEp6Hx3PHsedxexcM84=; b=MKP0kiTZnE3zB20Tjk4mBKdc6yToai9V3ChFcLjYbMbLk0QznwNnCdZS0iIBRIOj3c LGWKlRDokZwmmxoQFi3/PNVOuM38Yebc9HQ6fDz4Mm12o/4vHk8D+kEQUP/44zp5vI9+ 7WwS4V50m1QSY+Zsl4MqzKkd8z6efaeYGafsy7N47nhfS8z5ebuaP04B9SFJZ1NO1DS5 Krdfr1P/Ia9TA4n4EnPX7cZah5OomVsiHUyU94xVPM7/XzTu/IanRKhdPfmc3MyQv7Ks fC+/++vA8tNVGxEbN+70jr2JcL0L0fWLmzH8RzrL6o36Te/pQWdNMl+CfIGM6S8Toueh zl1A== X-Gm-Message-State: AOAM533cuCmME1S6X/ClklGbKkrzKDffQYtzAM4/n8Q9dkRxknhlyinG 7chJvmx157u7BYCn2rsSEPYFTOY5u4OILg== X-Google-Smtp-Source: ABdhPJx+XDRbRGLyrC23XQBszheiV7yKj/RjqhpmUDKX3cpOhDuU/c0w9QGqwDQfpMkd+CKMBieCHQ== X-Received: by 2002:ac8:5711:: with SMTP id 17mr1959318qtw.138.1636575301384; Wed, 10 Nov 2021 12:15:01 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id s13sm526715qtw.33.2021.11.10.12.15.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:15:00 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 10/30] btrfs-progs: add definitions for the block group tree Date: Wed, 10 Nov 2021 15:14:22 -0500 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Add the on disk definitions for the block group tree. This will be part of the super block so we need to add the appropriate helpers to the super block, as well as adding it to the backup roots. Signed-off-by: Josef Bacik --- cmds/inspect-dump-tree.c | 7 ++++++- kernel-shared/ctree.h | 29 ++++++++++++++++++++++++++++- kernel-shared/disk-io.c | 14 ++++++++++++++ kernel-shared/print-tree.c | 3 +++ libbtrfsutil/btrfs_tree.h | 3 +++ 5 files changed, 54 insertions(+), 2 deletions(-) diff --git a/cmds/inspect-dump-tree.c b/cmds/inspect-dump-tree.c index e1c90be7..6332b46d 100644 --- a/cmds/inspect-dump-tree.c +++ b/cmds/inspect-dump-tree.c @@ -155,7 +155,8 @@ static u64 treeid_from_string(const char *str, const char **end) { "TREE_LOG_FIXUP", BTRFS_TREE_LOG_FIXUP_OBJECTID }, { "TREE_LOG", BTRFS_TREE_LOG_OBJECTID }, { "TREE_RELOC", BTRFS_TREE_RELOC_OBJECTID }, - { "DATA_RELOC", BTRFS_DATA_RELOC_TREE_OBJECTID } + { "DATA_RELOC", BTRFS_DATA_RELOC_TREE_OBJECTID }, + { "BLOCK_GROUP_TREE", BTRFS_BLOCK_GROUP_TREE_OBJECTID }, }; if (strncasecmp("BTRFS_", str, strlen("BTRFS_")) == 0) @@ -695,6 +696,10 @@ again: printf("multiple"); } break; + case BTRFS_BLOCK_GROUP_TREE_OBJECTID: + if (!skip) + printf("block group"); + break; default: if (!skip) { printf("file"); diff --git a/kernel-shared/ctree.h b/kernel-shared/ctree.h index 8a46306e..17216053 100644 --- a/kernel-shared/ctree.h +++ b/kernel-shared/ctree.h @@ -85,6 +85,9 @@ struct btrfs_free_space_ctl; /* tracks free space in block groups. */ #define BTRFS_FREE_SPACE_TREE_OBJECTID 10ULL +/* hold the block group items. */ +#define BTRFS_BLOCK_GROUP_TREE_OBJECTID 11ULL + /* device stats in the device tree */ #define BTRFS_DEV_STATS_OBJECTID 0ULL @@ -456,8 +459,14 @@ struct btrfs_super_block { __le64 uuid_tree_generation; u8 metadata_uuid[BTRFS_FSID_SIZE]; + + __le64 block_group_root; + __le64 block_group_root_generation; + u8 block_group_root_level; + /* future expansion */ - __le64 reserved[28]; + u8 reserved8[7]; + __le64 reserved[25]; u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE]; struct btrfs_root_backup super_roots[BTRFS_NUM_BACKUP_ROOTS]; } __attribute__ ((__packed__)); @@ -2281,6 +2290,17 @@ BTRFS_SETGET_STACK_FUNCS(backup_bytes_used, struct btrfs_root_backup, BTRFS_SETGET_STACK_FUNCS(backup_num_devices, struct btrfs_root_backup, num_devices, 64); +/* + * Extent tree v2 doesn't have a global csum or extent root, so we use the + * extent root slot for the block group root. + */ +BTRFS_SETGET_STACK_FUNCS(backup_block_group_root, struct btrfs_root_backup, + extent_root, 64); +BTRFS_SETGET_STACK_FUNCS(backup_block_group_root_gen, struct btrfs_root_backup, + extent_root_gen, 64); +BTRFS_SETGET_STACK_FUNCS(backup_block_group_root_level, struct btrfs_root_backup, + extent_root_level, 8); + /* struct btrfs_super_block */ BTRFS_SETGET_STACK_FUNCS(super_bytenr, struct btrfs_super_block, bytenr, 64); @@ -2331,6 +2351,13 @@ BTRFS_SETGET_STACK_FUNCS(super_cache_generation, struct btrfs_super_block, BTRFS_SETGET_STACK_FUNCS(super_uuid_tree_generation, struct btrfs_super_block, uuid_tree_generation, 64); BTRFS_SETGET_STACK_FUNCS(super_magic, struct btrfs_super_block, magic, 64); +BTRFS_SETGET_STACK_FUNCS(super_block_group_root, struct btrfs_super_block, + block_group_root, 64); +BTRFS_SETGET_STACK_FUNCS(super_block_group_root_generation, + struct btrfs_super_block, + block_group_root_generation, 64); +BTRFS_SETGET_STACK_FUNCS(super_block_group_root_level, + struct btrfs_super_block, block_group_root_level, 8); static inline unsigned long btrfs_leaf_data(struct extent_buffer *l) { diff --git a/kernel-shared/disk-io.c b/kernel-shared/disk-io.c index a1866d9f..3242bf68 100644 --- a/kernel-shared/disk-io.c +++ b/kernel-shared/disk-io.c @@ -1721,6 +1721,20 @@ int btrfs_check_super(struct btrfs_super_block *sb, unsigned sbflags) goto error_out; } + if (btrfs_super_incompat_flags(sb) & BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2) { + if (btrfs_super_block_group_root_level(sb) >= BTRFS_MAX_LEVEL) { + error("block_group_root level too big: %d >= %d", + btrfs_super_block_group_root_level(sb), + BTRFS_MAX_LEVEL); + goto error_out; + } + if (!IS_ALIGNED(btrfs_super_block_group_root(sb), 4096)) { + error("block_group_root block unaligned: %llu", + btrfs_super_block_group_root(sb)); + goto error_out; + } + } + if (btrfs_super_incompat_flags(sb) & BTRFS_FEATURE_INCOMPAT_METADATA_UUID) metadata_uuid = sb->metadata_uuid; else diff --git a/kernel-shared/print-tree.c b/kernel-shared/print-tree.c index 39655590..6748c33f 100644 --- a/kernel-shared/print-tree.c +++ b/kernel-shared/print-tree.c @@ -787,6 +787,9 @@ void print_objectid(FILE *stream, u64 objectid, u8 type) case BTRFS_MULTIPLE_OBJECTIDS: fprintf(stream, "MULTIPLE"); break; + case BTRFS_BLOCK_GROUP_TREE_OBJECTID: + fprintf(stream, "BLOCK_GROUP_TREE"); + break; case (u64)-1: fprintf(stream, "-1"); break; diff --git a/libbtrfsutil/btrfs_tree.h b/libbtrfsutil/btrfs_tree.h index d3b752ee..1df9efd6 100644 --- a/libbtrfsutil/btrfs_tree.h +++ b/libbtrfsutil/btrfs_tree.h @@ -48,6 +48,9 @@ /* tracks free space in block groups. */ #define BTRFS_FREE_SPACE_TREE_OBJECTID 10ULL +/* hold the block group items. */ +#define BTRFS_BLOCK_GROUP_TREE_OBJECTID 11ULL + /* device stats in the device tree */ #define BTRFS_DEV_STATS_OBJECTID 0ULL From patchwork Wed Nov 10 20:14:23 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612883 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2FBD6C433EF for ; Wed, 10 Nov 2021 20:15:06 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 1A6646109F for ; Wed, 10 Nov 2021 20:15:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232591AbhKJURw (ORCPT ); Wed, 10 Nov 2021 15:17:52 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36600 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232585AbhKJURv (ORCPT ); Wed, 10 Nov 2021 15:17:51 -0500 Received: from mail-qk1-x72e.google.com (mail-qk1-x72e.google.com [IPv6:2607:f8b0:4864:20::72e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CAA72C061764 for ; Wed, 10 Nov 2021 12:15:03 -0800 (PST) Received: by mail-qk1-x72e.google.com with SMTP id j2so3677058qkl.7 for ; Wed, 10 Nov 2021 12:15:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=QKXiyseXhQbPFFyxX7MyImwdI7hDpamDr18fg7TVr34=; b=pkyuFes1n1IymtzcqQKwZ9Dw4fKLUT1C4SPYQFBJgMNBSMwyOnrHIJmX0LkKZka7fc 2bDvW19T97aySe/X8V7gf6eZ7pLQ/6Hie8pw1KKZo/8DvFq2YDn+viL7WQ/1pnoKryWr eGlpWQCji/MEIrhBxyNcWg/GmryEM8f/kGrMOUxemWmF/C11L4rlqyIwmHAo5/i0CtaM gdEV7bBPAJP8UKVl7uyu1kRH5pa4l6JTg83sOu7qqPEy41TSVwvnJznYsjEB4jJfl52O JXR2GPQr1dEAKZYS0In7O18e+3rrzVAtRVMUJ5M34OVtCAYf9WI6sBhkOMG33wbRuk9f visw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=QKXiyseXhQbPFFyxX7MyImwdI7hDpamDr18fg7TVr34=; b=DK03alBl2eSqcvWD9BFmWzeerjDAS7PqpSVjAxHdn0YPp5TKv2o0BM+dQ8RNM4OmwL p5mt0oL14TJVc4B7kM6pu2vkLij8SyPz9RczCJBi+9jx4s3UTo00mz/EH11kkpxcdHKy rUw1/sqI7K//CeD76WCIRTdsCRtzPgHhjzfdRWY2bujxamY3iTOi+9HbqGMoTb70Iuu+ ul/u2wFJ9NpaoKs4DtMJ0zDfFPax4YFgUDTEIBsYK+X3z3g+CeGEoGr8pmujMo/qsZvt f0PWRvGlldmBQOPZH328UMVFrT+ubH/EYCwv6FB895HuWeZufzJpaA2Akj0eSPGejMtJ LYoA== X-Gm-Message-State: AOAM532APxQqtnlasIWnQDE6D5GwXGjHoN7hpsZEt+vgO3nVpk4tN5Pi ETRXX46579O5FIpOk5OkfCVjZbgw8vZ2xw== X-Google-Smtp-Source: ABdhPJycI2G5DJrhwGfghTpC+jXxsAnKVcXeKBV/EaL1wdP5WwQS8ZIIkWwitSgNjhfVyLAW6FrfMw== X-Received: by 2002:a05:620a:228c:: with SMTP id o12mr1695283qkh.367.1636575302762; Wed, 10 Nov 2021 12:15:02 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id m68sm396273qkb.105.2021.11.10.12.15.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:15:02 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 11/30] btrfs-progs: add on disk pointers to global tree ids Date: Wed, 10 Nov 2021 15:14:23 -0500 Message-Id: <80e94990528f7c02caf66e06d41e5d430b974258.1636575146.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We are going to start creating multiple sets of global trees, which at the moment are the free space tree, csum tree, and extent tree. Generally we will assign these at block group creation time, but Dave would like to be able to have them per-subvolume at some point, so reserve a slot for that as well. Signed-off-by: Josef Bacik --- kernel-shared/ctree.h | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/kernel-shared/ctree.h b/kernel-shared/ctree.h index 17216053..e54e03c4 100644 --- a/kernel-shared/ctree.h +++ b/kernel-shared/ctree.h @@ -824,7 +824,13 @@ struct btrfs_root_item { struct btrfs_timespec otime; struct btrfs_timespec stime; struct btrfs_timespec rtime; - __le64 reserved[8]; /* for future */ + + /* + * If we want to use a specific set of fst/checksum/extent roots for + * this root. + */ + __le64 global_tree_id; + __le64 reserved[7]; /* for future */ } __attribute__ ((__packed__)); /* @@ -1709,6 +1715,12 @@ BTRFS_SETGET_FUNCS(block_group_flags, BTRFS_SETGET_STACK_FUNCS(stack_block_group_flags, struct btrfs_block_group_item, flags, 64); +/* extent tree v2 uses chunk_objectid for the global tree id. */ +BTRFS_SETGET_STACK_FUNCS(stack_block_group_global_tree_id, + struct btrfs_block_group_item, chunk_objectid, 64); +BTRFS_SETGET_FUNCS(block_group_global_tree_id, struct btrfs_block_group_item, + chunk_objectid, 64); + /* struct btrfs_free_space_info */ BTRFS_SETGET_FUNCS(free_space_extent_count, struct btrfs_free_space_info, extent_count, 32); From patchwork Wed Nov 10 20:14:24 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612885 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C4E6DC433F5 for ; Wed, 10 Nov 2021 20:15:08 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id AE22D6109F for ; Wed, 10 Nov 2021 20:15:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232634AbhKJURz (ORCPT ); Wed, 10 Nov 2021 15:17:55 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36612 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232585AbhKJURx (ORCPT ); Wed, 10 Nov 2021 15:17:53 -0500 Received: from mail-qt1-x832.google.com (mail-qt1-x832.google.com [IPv6:2607:f8b0:4864:20::832]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F1C1AC061764 for ; Wed, 10 Nov 2021 12:15:05 -0800 (PST) Received: by mail-qt1-x832.google.com with SMTP id c12so3288282qtd.5 for ; Wed, 10 Nov 2021 12:15:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=NF+R/fJPxy7AZlW6NBSSDK6dTxfarIOHvkiUHyBJ/ls=; b=L/T61LW69F7RSGub1yFuWDEJ6I6ZY1FrwfD+VGbVy4f/3H5aGJI+r19cJfODtl3vCc UKOGpCRWUZoffkJnxkfX1PBuGL393ibiGdpGnp+0YRx0RsFF2/9ItZC7uednc6uOVPEe w7zqjqxfMHdPTcj90h2kW7VBIAIqKpf5+Svgk2gLwUbVS97xuvTe+pv9yNPB4+5Gm9GG rNE7i2joxpJCOvqCpnmbbugQ0CoJR/UIaWaqFxhu7kKIp83dTuiATlXV50ji+eeI++Wj WGrUgqLcxmLVy5ednp9eE/2gr8t3uljWk6Do4WgRpjvfC0boH5ujob0yYY2awY1Dz1Cs 13tA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=NF+R/fJPxy7AZlW6NBSSDK6dTxfarIOHvkiUHyBJ/ls=; b=4WWD55LyJikXnZmT/P9hh+LxNR6Tx/m8LjjAjZ2Q4iPV4mYo0UAAbj0hAywskQWAtZ sXP65AqSpExAhdDQz0Mh1QootCLl9TxzqGVYhUNp/1kLqHauu4oMIWEAS3PzruyBsQlR MQ0zgQOAi7U7Z/kz7yTjC4jJKorY+LNqes+RRSKXxnfU/lojukx1npr2UFp8qTjhn0Qq k8hPTiIKFe2/K1Tpp+1p6ZIJWirNN6uazqrVIDIq+zG8ZLF9xniA2Q7QWpawMZjVnH5B TURagkEs4dntBFkHejH3e9nNtnpwmBoswpS3CZWV8ct9D3UbjYvxIvLJyQ393LGMqXLz Jzog== X-Gm-Message-State: AOAM533uzbH3Z8jzOsryPGAShZXqilBMY/wgYPM7GX2UNNH5XX8pId4s 1GafGSBiK6Z2IvnqTmLZC1hgU79jTu0qUA== X-Google-Smtp-Source: ABdhPJxjY5qaPCwmRS9x/iTlc3iuZ+n/bWmpRI44xX5k/auQNgcxVgBGoamRDA5LdQExGQD0AwpkTg== X-Received: by 2002:ac8:5c13:: with SMTP id i19mr1873085qti.282.1636575304796; Wed, 10 Nov 2021 12:15:04 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id b2sm435583qtg.88.2021.11.10.12.15.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:15:03 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 12/30] btrfs-progs: add support for loading the block group root Date: Wed, 10 Nov 2021 15:14:24 -0500 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org This adds the ability to load the block group root, as well as make sure the various backup super block and super block updates are made appropriately. Signed-off-by: Josef Bacik --- kernel-shared/ctree.h | 1 + kernel-shared/disk-io.c | 161 +++++++++++++++++++++++++++--------- kernel-shared/disk-io.h | 10 ++- kernel-shared/extent-tree.c | 8 +- kernel-shared/transaction.c | 2 + 5 files changed, 138 insertions(+), 44 deletions(-) diff --git a/kernel-shared/ctree.h b/kernel-shared/ctree.h index e54e03c4..27e31e03 100644 --- a/kernel-shared/ctree.h +++ b/kernel-shared/ctree.h @@ -1195,6 +1195,7 @@ struct btrfs_fs_info { struct btrfs_root *dev_root; struct btrfs_root *quota_root; struct btrfs_root *uuid_root; + struct btrfs_root *block_group_root; struct rb_root global_roots_tree; struct rb_root fs_root_tree; diff --git a/kernel-shared/disk-io.c b/kernel-shared/disk-io.c index 3242bf68..9295cb5c 100644 --- a/kernel-shared/disk-io.c +++ b/kernel-shared/disk-io.c @@ -849,6 +849,9 @@ struct btrfs_root *btrfs_read_fs_root(struct btrfs_fs_info *fs_info, root = btrfs_global_root(fs_info, location); return root ? root : ERR_PTR(-ENOENT); } + if (location->objectid == BTRFS_BLOCK_GROUP_TREE_OBJECTID) + return fs_info->block_group_root ? fs_info->block_group_root : + ERR_PTR(-ENOENT); BUG_ON(location->objectid == BTRFS_TREE_RELOC_OBJECTID); @@ -887,6 +890,7 @@ void btrfs_free_fs_info(struct btrfs_fs_info *fs_info) free(fs_info->chunk_root); free(fs_info->dev_root); free(fs_info->uuid_root); + free(fs_info->block_group_root); free(fs_info->super_copy); free(fs_info->log_root_tree); free(fs_info); @@ -905,10 +909,12 @@ struct btrfs_fs_info *btrfs_new_fs_info(int writable, u64 sb_bytenr) fs_info->dev_root = calloc(1, sizeof(struct btrfs_root)); fs_info->quota_root = calloc(1, sizeof(struct btrfs_root)); fs_info->uuid_root = calloc(1, sizeof(struct btrfs_root)); + fs_info->block_group_root = calloc(1, sizeof(struct btrfs_root)); fs_info->super_copy = calloc(1, BTRFS_SUPER_INFO_SIZE); if (!fs_info->tree_root || !fs_info->chunk_root || !fs_info->dev_root || - !fs_info->quota_root || !fs_info->uuid_root || !fs_info->super_copy) + !fs_info->quota_root || !fs_info->uuid_root || + !fs_info->block_group_root || !fs_info->super_copy) goto free_all; extent_io_tree_init(&fs_info->extent_cache); @@ -1028,7 +1034,7 @@ static int read_root_or_create_block(struct btrfs_fs_info *fs_info, static inline bool maybe_load_block_groups(struct btrfs_fs_info *fs_info, u64 flags) { - struct btrfs_root *root = btrfs_extent_root(fs_info, 0); + struct btrfs_root *root = btrfs_block_group_root(fs_info); if (flags & OPEN_CTREE_NO_BLOCK_GROUPS) return false; @@ -1039,7 +1045,6 @@ static inline bool maybe_load_block_groups(struct btrfs_fs_info *fs_info, return false; } - static int load_global_roots_objectid(struct btrfs_fs_info *fs_info, struct btrfs_path *path, u64 objectid, unsigned flags, char *str) @@ -1138,43 +1143,99 @@ out: return ret; } -int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info, u64 root_tree_bytenr, - unsigned flags) +static int load_important_roots(struct btrfs_fs_info *fs_info, + u64 root_tree_bytenr, unsigned flags) { struct btrfs_super_block *sb = fs_info->super_copy; + struct btrfs_root_backup *backup = NULL; struct btrfs_root *root; - struct btrfs_key key; - u64 generation; + u64 bytenr, gen; int level; + int index = -1; int ret; - root = fs_info->tree_root; - btrfs_setup_root(root, fs_info, BTRFS_ROOT_TREE_OBJECTID); - generation = btrfs_super_generation(sb); - level = btrfs_super_root_level(sb); - - if (!root_tree_bytenr && !(flags & OPEN_CTREE_BACKUP_ROOT)) { - root_tree_bytenr = btrfs_super_root(sb); - } else if (flags & OPEN_CTREE_BACKUP_ROOT) { - struct btrfs_root_backup *backup; - int index = find_best_backup_root(sb); + if (flags & OPEN_CTREE_BACKUP_ROOT) { + index = find_best_backup_root(sb); if (index >= BTRFS_NUM_BACKUP_ROOTS) { fprintf(stderr, "Invalid backup root number\n"); return -EIO; } - backup = fs_info->super_copy->super_roots + index; - root_tree_bytenr = btrfs_backup_tree_root(backup); - generation = btrfs_backup_tree_root_gen(backup); + backup = sb->super_roots + index; + } + + if (!btrfs_fs_incompat(fs_info, EXTENT_TREE_V2)) { + free(fs_info->block_group_root); + fs_info->block_group_root = NULL; + goto tree_root; + } + + if (backup) { + bytenr = btrfs_backup_block_group_root(backup); + gen = btrfs_backup_block_group_root_gen(backup); + level = btrfs_backup_block_group_root_level(backup); + } else { + bytenr = btrfs_super_block_group_root(sb); + gen = btrfs_super_block_group_root_generation(sb); + level = btrfs_super_block_group_root_level(sb); + } + root = fs_info->block_group_root; + btrfs_setup_root(root, fs_info, BTRFS_BLOCK_GROUP_TREE_OBJECTID); + + ret = read_root_node(fs_info, root, bytenr, gen, level); + if (ret) { + fprintf(stderr, "Couldn't read block group root\n"); + return -EIO; + } + + if (maybe_load_block_groups(fs_info, flags)) { + int ret = btrfs_read_block_groups(fs_info); + if (ret < 0 && ret != -ENOENT) { + errno = -ret; + error("failed to read block groups: %m"); + return ret; + } + } + +tree_root: + if (backup) { + bytenr = btrfs_backup_tree_root(backup); + gen = btrfs_backup_tree_root_gen(backup); level = btrfs_backup_tree_root_level(backup); + } else { + if (root_tree_bytenr) + bytenr = root_tree_bytenr; + else + bytenr = btrfs_super_root(sb); + gen = btrfs_super_generation(sb); + level = btrfs_super_root_level(sb); } - ret = read_root_node(fs_info, root, root_tree_bytenr, generation, - level); + fs_info->generation = gen; + fs_info->last_trans_committed = gen; + root = fs_info->tree_root; + btrfs_setup_root(root, fs_info, BTRFS_ROOT_TREE_OBJECTID); + + ret = read_root_node(fs_info, root, bytenr, gen, level); if (ret) { fprintf(stderr, "Couldn't read tree root\n"); return -EIO; } + return 0; +} + +int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info, u64 root_tree_bytenr, + unsigned flags) +{ + struct btrfs_super_block *sb = fs_info->super_copy; + struct btrfs_root *root = fs_info->tree_root; + struct btrfs_key key; + int ret; + + ret = load_important_roots(fs_info, root_tree_bytenr, flags); + if (ret) + return ret; + ret = load_global_roots(fs_info, flags); if (ret) return ret; @@ -1212,9 +1273,8 @@ int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info, u64 root_tree_bytenr, return -EIO; } - fs_info->generation = generation; - fs_info->last_trans_committed = generation; - if (maybe_load_block_groups(fs_info, flags)) { + if (!btrfs_fs_incompat(fs_info, EXTENT_TREE_V2) && + maybe_load_block_groups(fs_info, flags)) { ret = btrfs_read_block_groups(fs_info); /* * If we don't find any blockgroups (ENOENT) we're either @@ -1257,6 +1317,8 @@ static void release_global_roots(struct btrfs_fs_info *fs_info) void btrfs_release_all_roots(struct btrfs_fs_info *fs_info) { release_global_roots(fs_info); + if (fs_info->block_group_root) + free_extent_buffer(fs_info->block_group_root->node); if (fs_info->quota_root) free_extent_buffer(fs_info->quota_root->node); if (fs_info->dev_root) @@ -1996,8 +2058,6 @@ static int write_dev_supers(struct btrfs_fs_info *fs_info, static void backup_super_roots(struct btrfs_fs_info *info) { struct btrfs_root_backup *root_backup; - struct btrfs_root *csum_root = btrfs_csum_root(info, 0); - struct btrfs_root *extent_root = btrfs_extent_root(info, 0); int next_backup; int last_backup; @@ -2029,11 +2089,6 @@ static void backup_super_roots(struct btrfs_fs_info *info) btrfs_set_backup_chunk_root_level(root_backup, btrfs_header_level(info->chunk_root->node)); - btrfs_set_backup_extent_root(root_backup, extent_root->node->start); - btrfs_set_backup_extent_root_gen(root_backup, - btrfs_header_generation(extent_root->node)); - btrfs_set_backup_extent_root_level(root_backup, - btrfs_header_level(extent_root->node)); /* * we might commit during log recovery, which happens before we set * the fs_root. Make sure it is valid before we fill it in. @@ -2053,18 +2108,37 @@ static void backup_super_roots(struct btrfs_fs_info *info) btrfs_set_backup_dev_root_level(root_backup, btrfs_header_level(info->dev_root->node)); - btrfs_set_backup_csum_root(root_backup, csum_root->node->start); - btrfs_set_backup_csum_root_gen(root_backup, - btrfs_header_generation(csum_root->node)); - btrfs_set_backup_csum_root_level(root_backup, - btrfs_header_level(csum_root->node)); - btrfs_set_backup_total_bytes(root_backup, btrfs_super_total_bytes(info->super_copy)); btrfs_set_backup_bytes_used(root_backup, btrfs_super_bytes_used(info->super_copy)); btrfs_set_backup_num_devices(root_backup, btrfs_super_num_devices(info->super_copy)); + + if (btrfs_fs_incompat(info, EXTENT_TREE_V2)) { + btrfs_set_backup_block_group_root(root_backup, + info->block_group_root->node->start); + btrfs_set_backup_block_group_root_gen(root_backup, + btrfs_header_generation(info->block_group_root->node)); + btrfs_set_backup_block_group_root_level(root_backup, + btrfs_header_level(info->block_group_root->node)); + } else { + struct btrfs_root *csum_root = btrfs_csum_root(info, 0); + struct btrfs_root *extent_root = btrfs_extent_root(info, 0); + + btrfs_set_backup_csum_root(root_backup, csum_root->node->start); + btrfs_set_backup_csum_root_gen(root_backup, + btrfs_header_generation(csum_root->node)); + btrfs_set_backup_csum_root_level(root_backup, + btrfs_header_level(csum_root->node)); + + btrfs_set_backup_extent_root(root_backup, + extent_root->node->start); + btrfs_set_backup_extent_root_gen(root_backup, + btrfs_header_generation(extent_root->node)); + btrfs_set_backup_extent_root_level(root_backup, + btrfs_header_level(extent_root->node)); + } } int write_all_supers(struct btrfs_fs_info *fs_info) @@ -2111,7 +2185,7 @@ int write_ctree_super(struct btrfs_trans_handle *trans) struct btrfs_fs_info *fs_info = trans->fs_info; struct btrfs_root *tree_root = fs_info->tree_root; struct btrfs_root *chunk_root = fs_info->chunk_root; - + struct btrfs_root *block_group_root = fs_info->block_group_root; if (fs_info->readonly) return 0; @@ -2128,6 +2202,15 @@ int write_ctree_super(struct btrfs_trans_handle *trans) btrfs_set_super_chunk_root_generation(fs_info->super_copy, btrfs_header_generation(chunk_root->node)); + if (btrfs_fs_incompat(fs_info, EXTENT_TREE_V2)) { + btrfs_set_super_block_group_root(fs_info->super_copy, + block_group_root->node->start); + btrfs_set_super_block_group_root_generation(fs_info->super_copy, + btrfs_header_generation(block_group_root->node)); + btrfs_set_super_block_group_root_level(fs_info->super_copy, + btrfs_header_level(block_group_root->node)); + } + ret = write_all_supers(fs_info); if (ret) fprintf(stderr, "failed to write new super block err %d\n", ret); diff --git a/kernel-shared/disk-io.h b/kernel-shared/disk-io.h index 0d2f505f..a96a9dfb 100644 --- a/kernel-shared/disk-io.h +++ b/kernel-shared/disk-io.h @@ -219,9 +219,17 @@ struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans, u64 objectid); struct btrfs_root *btrfs_csum_root(struct btrfs_fs_info *fs_info, u64 bytenr); struct btrfs_root *btrfs_extent_root(struct btrfs_fs_info *fs_inf, u64 bytenr); -struct btrfs_root *btrfs_block_group_root(struct btrfs_fs_info *fs_info); struct btrfs_root *btrfs_global_root(struct btrfs_fs_info *fs_info, struct btrfs_key *key); int btrfs_global_root_insert(struct btrfs_fs_info *fs_info, struct btrfs_root *root); + +static inline struct btrfs_root *btrfs_block_group_root( + struct btrfs_fs_info *fs_info) +{ + if (btrfs_fs_incompat(fs_info, EXTENT_TREE_V2)) + return fs_info->block_group_root; + return btrfs_extent_root(fs_info, 0); +} + #endif diff --git a/kernel-shared/extent-tree.c b/kernel-shared/extent-tree.c index 3713452b..a1c061fa 100644 --- a/kernel-shared/extent-tree.c +++ b/kernel-shared/extent-tree.c @@ -1540,7 +1540,7 @@ static int update_block_group_item(struct btrfs_trans_handle *trans, { int ret; struct btrfs_fs_info *fs_info = trans->fs_info; - struct btrfs_root *root = btrfs_extent_root(fs_info, 0); + struct btrfs_root *root = btrfs_block_group_root(fs_info); unsigned long bi; struct btrfs_block_group_item bgi; struct extent_buffer *leaf; @@ -2731,7 +2731,7 @@ int btrfs_read_block_groups(struct btrfs_fs_info *fs_info) int ret; struct btrfs_key key; - root = btrfs_extent_root(fs_info, 0); + root = btrfs_block_group_root(fs_info); key.objectid = 0; key.offset = 0; key.type = BTRFS_BLOCK_GROUP_ITEM_KEY; @@ -2812,7 +2812,7 @@ static int insert_block_group_item(struct btrfs_trans_handle *trans, key.type = BTRFS_BLOCK_GROUP_ITEM_KEY; key.offset = block_group->length; - root = btrfs_extent_root(fs_info, 0); + root = btrfs_block_group_root(fs_info); return btrfs_insert_item(trans, root, &key, &bgi, sizeof(bgi)); } @@ -2929,7 +2929,7 @@ static int remove_block_group_item(struct btrfs_trans_handle *trans, { struct btrfs_fs_info *fs_info = trans->fs_info; struct btrfs_key key; - struct btrfs_root *root = btrfs_extent_root(fs_info, 0); + struct btrfs_root *root = btrfs_block_group_root(fs_info); int ret = 0; key.objectid = block_group->start; diff --git a/kernel-shared/transaction.c b/kernel-shared/transaction.c index 5b991651..02012266 100644 --- a/kernel-shared/transaction.c +++ b/kernel-shared/transaction.c @@ -185,6 +185,8 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans, goto commit_tree; if (root == root->fs_info->chunk_root) goto commit_tree; + if (root == root->fs_info->block_group_root) + goto commit_tree; free_extent_buffer(root->commit_root); root->commit_root = NULL; From patchwork Wed Nov 10 20:14:25 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612887 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 01612C433FE for ; Wed, 10 Nov 2021 20:15:10 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D711E61248 for ; Wed, 10 Nov 2021 20:15:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232643AbhKJUR4 (ORCPT ); Wed, 10 Nov 2021 15:17:56 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36618 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232631AbhKJURz (ORCPT ); Wed, 10 Nov 2021 15:17:55 -0500 Received: from mail-qk1-x733.google.com (mail-qk1-x733.google.com [IPv6:2607:f8b0:4864:20::733]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3BBBBC061764 for ; Wed, 10 Nov 2021 12:15:07 -0800 (PST) Received: by mail-qk1-x733.google.com with SMTP id i9so3704180qki.3 for ; Wed, 10 Nov 2021 12:15:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=h1NeF227byL+FeSrIu8FVFd3clBfFlMtGbhud9NMqlA=; b=7h44IQJpCXCOISIYxQvxtngAGSq9tU4nkq0F9sZzc8W1+IZDBDbhDx9BjjtbaWmGrI J9Vs/aVTjV3rqwpo88WxeXkwSGIWdjDrCkoz+NOikn7+3P2Y5D4rb4+VuYImMWxtZJUw P3ZJRkW9eS5PV+WF3LaN1c/grbQ6VsdFBAbNz3MEESEPWvbu/v3oo1PiUQqoZ3LyNthG z81595MKBmdzIuY0dTrOeZ5WIOL6iwWThptfGUL1wvSOYZFNwa6KHcGFHFzo8uT0qsre 7mXXJyO4nPc/cdaNi5Wn9djvY3rTtaDlityCKUpadpIbGhGqFPJyKaN+NCl/0cKaYngg iG5w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=h1NeF227byL+FeSrIu8FVFd3clBfFlMtGbhud9NMqlA=; b=VXxe/YaeMf122EhKFOSEa9mMcReUQ726uvl/jX0YDGoYn1nhjm+pDTdt3cCBT1401T mUY2nxPe03rgqUMdB1I8u2sCxy4vp2MW+/AE2gqrs2bdV5Rrfmv0KA4HI6yb+lPL888s G169lXrrr94uY93cKpkT0K3Tz5QRM2CyUkYvaZ8EllfqZZ7uqkw/3DbDfKWzGJj6WHw0 unArA5VBde4G3deMbRDIP5U99QXv+HwTV95h/VhEJFVyjmZ+5dd7sC3CEYjaK2N7xlvD l57hrdZLKq3pp6rq4MErN9sUlTultyHKkpyMmdfw+wC/P8TcQS9p7FmBDTJy/m8KI2Pt 1V1g== X-Gm-Message-State: AOAM533ukV9uswnRdsS1uEDuyqmnDpmgbupCRKivO5qUdJ4KOzU5l5EC Oeq7lSXl2hl8irXpKt7Al5dmFqXfWslNVg== X-Google-Smtp-Source: ABdhPJwK90j3FdzX7P0PpFiSw9wEopWTtwvoA7NYdMAHp4TURD/vX1wphosS3N6806Pj2yVnB73nkw== X-Received: by 2002:a37:2e87:: with SMTP id u129mr1780200qkh.208.1636575306135; Wed, 10 Nov 2021 12:15:06 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id h8sm469101qtb.1.2021.11.10.12.15.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:15:05 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 13/30] btrfs-progs: add print support for the block group tree Date: Wed, 10 Nov 2021 15:14:25 -0500 Message-Id: <11756f4bca3b45d0f231f287a78ec1c699a85a05.1636575146.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Add the appropriate support to the print tree and dump tree code to spit out the block group tree. Signed-off-by: Josef Bacik --- cmds/inspect-dump-tree.c | 30 +++++++++++++++++++++++++++++- kernel-shared/print-tree.c | 23 +++++++++++++++++++---- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/cmds/inspect-dump-tree.c b/cmds/inspect-dump-tree.c index 6332b46d..daa7f925 100644 --- a/cmds/inspect-dump-tree.c +++ b/cmds/inspect-dump-tree.c @@ -83,8 +83,14 @@ out: static void print_old_roots(struct btrfs_super_block *super) { + const char *extent_tree_str = "extent root"; struct btrfs_root_backup *backup; int i; + bool extent_tree_v2 = (btrfs_super_incompat_flags(super) & + BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2); + + if (extent_tree_v2) + extent_tree_str = "block group root"; for (i = 0; i < BTRFS_NUM_BACKUP_ROOTS; i++) { backup = super->super_roots + i; @@ -93,7 +99,7 @@ static void print_old_roots(struct btrfs_super_block *super) (unsigned long long)btrfs_backup_tree_root_gen(backup), (unsigned long long)btrfs_backup_tree_root(backup)); - printf("\t\textent root gen %llu block %llu\n", + printf("\t\t%s gen %llu block %llu\n", extent_tree_str, (unsigned long long)btrfs_backup_extent_root_gen(backup), (unsigned long long)btrfs_backup_extent_root(backup)); @@ -510,6 +516,11 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd, info->log_root_tree->node->start, btrfs_header_level( info->log_root_tree->node)); + if (info->block_group_root) + printf("block group tree: %llu level %d\n", + info->block_group_root->node->start, + btrfs_header_level( + info->block_group_root->node)); } else { if (info->tree_root->node) { printf("root tree\n"); @@ -528,6 +539,12 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd, btrfs_print_tree(info->log_root_tree->node, BTRFS_PRINT_TREE_FOLLOW | print_mode); } + + if (info->block_group_root) { + printf("block group tree\n"); + btrfs_print_tree(info->block_group_root->node, + BTRFS_PRINT_TREE_FOLLOW | print_mode); + } } } tree_root_scan = info->tree_root; @@ -573,6 +590,17 @@ again: goto close_root; } + if (tree_id && tree_id == BTRFS_BLOCK_GROUP_TREE_OBJECTID) { + if (!info->block_group_root) { + error("cannot print block group tree, invalid pointer"); + goto close_root; + } + printf("block group tree\n"); + btrfs_print_tree(info->block_group_root->node, + BTRFS_PRINT_TREE_FOLLOW | print_mode); + goto close_root; + } + key.offset = 0; key.objectid = 0; key.type = BTRFS_ROOT_ITEM_KEY; diff --git a/kernel-shared/print-tree.c b/kernel-shared/print-tree.c index 6748c33f..d2699e6c 100644 --- a/kernel-shared/print-tree.c +++ b/kernel-shared/print-tree.c @@ -1860,8 +1860,14 @@ static int empty_backup(struct btrfs_root_backup *backup) return 0; } -static void print_root_backup(struct btrfs_root_backup *backup) +static void print_root_backup(struct btrfs_root_backup *backup, + bool extent_tree_v2) { + const char *extent_tree_str = "backup_extent_root"; + + if (extent_tree_v2) + extent_tree_str = "backup_block_group_root"; + printf("\t\tbackup_tree_root:\t%llu\tgen: %llu\tlevel: %d\n", btrfs_backup_tree_root(backup), btrfs_backup_tree_root_gen(backup), @@ -1870,7 +1876,8 @@ static void print_root_backup(struct btrfs_root_backup *backup) btrfs_backup_chunk_root(backup), btrfs_backup_chunk_root_gen(backup), btrfs_backup_chunk_root_level(backup)); - printf("\t\tbackup_extent_root:\t%llu\tgen: %llu\tlevel: %d\n", + printf("\t\t%s:\t%llu\tgen: %llu\tlevel: %d\n", + extent_tree_str, btrfs_backup_extent_root(backup), btrfs_backup_extent_root_gen(backup), btrfs_backup_extent_root_level(backup)); @@ -1882,7 +1889,7 @@ static void print_root_backup(struct btrfs_root_backup *backup) btrfs_backup_dev_root(backup), btrfs_backup_dev_root_gen(backup), btrfs_backup_dev_root_level(backup)); - printf("\t\tbackup_csum_root:\t%llu\tgen: %llu\tlevel: %d\n", + printf("\t\tcsum_root:\t%llu\tgen: %llu\tlevel: %d\n", btrfs_backup_csum_root(backup), btrfs_backup_csum_root_gen(backup), btrfs_backup_csum_root_level(backup)); @@ -1900,12 +1907,14 @@ static void print_backup_roots(struct btrfs_super_block *sb) { struct btrfs_root_backup *backup; int i; + bool extent_tree_v2 = (btrfs_super_incompat_flags(sb) & + BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2); for (i = 0; i < BTRFS_NUM_BACKUP_ROOTS; i++) { backup = sb->super_roots + i; if (!empty_backup(backup)) { printf("\tbackup %d:\n", i); - print_root_backup(backup); + print_root_backup(backup, extent_tree_v2); } } } @@ -2022,6 +2031,12 @@ void btrfs_print_superblock(struct btrfs_super_block *sb, int full) (unsigned long long)btrfs_super_cache_generation(sb)); printf("uuid_tree_generation\t%llu\n", (unsigned long long)btrfs_super_uuid_tree_generation(sb)); + printf("block_group_root\t%llu\n", + (unsigned long long)btrfs_super_block_group_root(sb)); + printf("block_group_root_generation\t%llu\n", + (unsigned long long)btrfs_super_block_group_root_generation(sb)); + printf("block_group_root_level\t%llu\n", + (unsigned long long)btrfs_super_block_group_root_level(sb)); uuid_unparse(sb->dev_item.uuid, buf); printf("dev_item.uuid\t\t%s\n", buf); From patchwork Wed Nov 10 20:14:26 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612889 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9D76DC433EF for ; Wed, 10 Nov 2021 20:15:11 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 86C7E6109F for ; Wed, 10 Nov 2021 20:15:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232659AbhKJUR6 (ORCPT ); Wed, 10 Nov 2021 15:17:58 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36626 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232656AbhKJUR5 (ORCPT ); Wed, 10 Nov 2021 15:17:57 -0500 Received: from mail-qv1-xf2e.google.com (mail-qv1-xf2e.google.com [IPv6:2607:f8b0:4864:20::f2e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9445FC061766 for ; Wed, 10 Nov 2021 12:15:08 -0800 (PST) Received: by mail-qv1-xf2e.google.com with SMTP id b17so2628069qvl.9 for ; Wed, 10 Nov 2021 12:15:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=zXWlqsbvJdBA7V1RQ7p0gyG+qJq1hALP23Ng+qoqb4c=; b=3REE7/VvmhKfC49BWOqACgWrEgFh0vJvoxaRZ/Ne46G/PJG5jYxyuLNncVSXLOxCPY V3/XUEsSChlMoMoE83HF6lKMU2OIuquUsTIhecuRQQL0cNfULeiydpurR7du4CQccX5x 7ZYd4xN+sIhj65k7kZ9MG4D2545PXBNTu6XhXUob+9tsxcMAe4lVZEVUp1u5zg100z5G mzlal50MqMm9OBg2nPosdsXGHD9wELMRwt7X+udOASwIGz4I/x+csjf5e/jKlG46Hun9 Exh5pzrxqSiH874WVtBmFOcKDkjRu5OzNunibgDjkO2rOPS7CmfGaLUmsS9k608CfpGc pIRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=zXWlqsbvJdBA7V1RQ7p0gyG+qJq1hALP23Ng+qoqb4c=; b=KharFO0KhJHVdlKzY96WyXaRc8UML7U13pptaaIy38JnbFWSFI05uDmi9lYQs2J5hW 8d8DRHjHu9tTZYhAO3+v2pF1pXz3qqBMHPczrDQiNn1ULr/bunSGsrGqL+xSoC6XSUW5 Q7GOidv2hfQMtkBIEJwlUafbR5Hn4p5WG5UkyAzax602FLxFRbzpi/4LZr+ggo9NLjsp oMzLw68NRR+vnEK4ke7XSzdWyWESGBAr+T8GlVmrNVdWifqiu4hY74zTQFZwgIb9JCxq OJYBEs1DpMkxL2efdtwKcFtidB041wEm/n3v0zoKo1zSf0m5pM9wrBgpqqI6qD6jiDB/ EsJg== X-Gm-Message-State: AOAM530ZPzzlkrkuMfQ+CriBXlbAYtx+K8DUYzfRze2ZY/Kdoj1JqG+W lw1NjHGZjgLCv42AhbSJdbiWLDOGOG311A== X-Google-Smtp-Source: ABdhPJxnlgqJ7CUPC8QKchFgIe0FdfFRUhmR4pBXeRvonm191ATMW+je8mV7s9waWZGKgax0LsCgcQ== X-Received: by 2002:a05:6214:2a45:: with SMTP id jf5mr1756509qvb.50.1636575307491; Wed, 10 Nov 2021 12:15:07 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id o5sm379641qkl.50.2021.11.10.12.15.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:15:07 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 14/30] btrfs-progs: mkfs: use the btrfs_block_group_root helper Date: Wed, 10 Nov 2021 15:14:26 -0500 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Instead of accessing the extent root directory for modifying block groups, use the helper which will do the correct thing based on the flags of the file system. Signed-off-by: Josef Bacik --- check/main.c | 4 ++-- mkfs/main.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/check/main.c b/check/main.c index 5fb28216..7735cce1 100644 --- a/check/main.c +++ b/check/main.c @@ -9387,6 +9387,7 @@ static int reinit_global_roots(struct btrfs_trans_handle *trans, u64 objectid) static int reinit_extent_tree(struct btrfs_trans_handle *trans, bool pin) { + struct btrfs_root *bg_root = btrfs_block_group_root(trans->fs_info); u64 start = 0; int ret; @@ -9460,7 +9461,6 @@ again: while (1) { struct btrfs_block_group_item bgi; struct btrfs_block_group *cache; - struct btrfs_root *extent_root = btrfs_extent_root(gfs_info, 0); struct btrfs_key key; cache = btrfs_lookup_first_block_group(gfs_info, start); @@ -9474,7 +9474,7 @@ again: key.objectid = cache->start; key.type = BTRFS_BLOCK_GROUP_ITEM_KEY; key.offset = cache->length; - ret = btrfs_insert_item(trans, extent_root, &key, &bgi, + ret = btrfs_insert_item(trans, bg_root, &key, &bgi, sizeof(bgi)); if (ret) { fprintf(stderr, "Error adding block group\n"); diff --git a/mkfs/main.c b/mkfs/main.c index 2c4b7b00..9a57cef8 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -596,7 +596,7 @@ static int cleanup_temp_chunks(struct btrfs_fs_info *fs_info, { struct btrfs_trans_handle *trans = NULL; struct btrfs_block_group_item *bgi; - struct btrfs_root *root = btrfs_extent_root(fs_info, 0); + struct btrfs_root *root = btrfs_block_group_root(fs_info); struct btrfs_key key; struct btrfs_key found_key; struct btrfs_path path; From patchwork Wed Nov 10 20:14:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612891 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A140FC433F5 for ; Wed, 10 Nov 2021 20:15:12 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 8B6F061241 for ; Wed, 10 Nov 2021 20:15:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232667AbhKJUR7 (ORCPT ); Wed, 10 Nov 2021 15:17:59 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36634 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232637AbhKJUR6 (ORCPT ); Wed, 10 Nov 2021 15:17:58 -0500 Received: from mail-qt1-x82e.google.com (mail-qt1-x82e.google.com [IPv6:2607:f8b0:4864:20::82e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 20CE0C061764 for ; Wed, 10 Nov 2021 12:15:10 -0800 (PST) Received: by mail-qt1-x82e.google.com with SMTP id v4so3269043qtw.8 for ; Wed, 10 Nov 2021 12:15:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=KNkMciKNt/whslgMekzPaIvfMEwa+U3L0W4rFrYFXc4=; b=MmxxJ9Yvtv5siczmPo7zYv1EBdtA6GdWvPV0CPgCeEsNjvJ6vtVC3yZs7iCwpcxXpF qskNMZWn7tGoVAfwT5CPmXkzqdzabVKHWV1/Fv6uLQ4mXpHANpFD891tQoAskaA2V7Dw BQN3UVHgcFWlaoAE6/tG34JjrBm3GgWSb/qXxJt/3n4JB5Id8VmVeQZTWQCHXsNKrvLi 5X1PBUllT9OIih6elwrjUhep/RufxevHSEjbb9ACfBDUnppt2pt/YtHrhrFHnEwRp1Wk 0aHoa45UQ621WHwPyE6HCQqSV/egrhVG10TZDhgDLwJ3axhxKwTWeAZXCOeWDYuzr0TH CxRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=KNkMciKNt/whslgMekzPaIvfMEwa+U3L0W4rFrYFXc4=; b=2v3UeLBte+zZpT52NwbmMd5LbBd5AYmyNYqOhlqLk4zTyOUzMLT+HvF4USTO6qRXGS aROlsGZ4kVG2S662Xm+a+C+Vpmuza4Cc8iabKIWwtOpLjS6nTTUUSIxyx40lvZU4C3y/ ZI2Cz+Yj9yA6/xBQIh54K62BeHthCcafa0WbMPB/81VOSc7y32tkAkRgZji4llsnAdkO J/Q8r6npquQAz2r8XvTOiKLrLnofRkgRR1sR1xZGlx2TvoYqpjd5GMABhapVIUTgfho3 PbKbCzdsJBdLgHuNoVk9FsBj+xDLmFytBfh24u8ppFbjouVvsV8Ea1UPCcGyvBXWfBN4 BPCQ== X-Gm-Message-State: AOAM530VrYI0Toi9gTWEdK1jz6EO0zmoLYhTYBZ9tFk9hq/6iZ/FTUQK 3HAuRqAg9a2OGNdzH6q6lNQMJBu3Vg9XDA== X-Google-Smtp-Source: ABdhPJyJQn7WVL1SDnItdaYOFjz5GdqkCq+tXO2SdzbCp6TVErp7QhqwNRB8TwMujB/u88yddkHZ+Q== X-Received: by 2002:ac8:5c13:: with SMTP id i19mr1873579qti.282.1636575309102; Wed, 10 Nov 2021 12:15:09 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id s8sm488791qkp.17.2021.11.10.12.15.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:15:08 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 15/30] btrfs-progs: check-lowmem: use the btrfs_block_group_root helper Date: Wed, 10 Nov 2021 15:14:27 -0500 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org When we're messing with block group items use the btrfs_block_group_root() helper to get the correct root to search, and this will do the right thing based on the file system flags. Signed-off-by: Josef Bacik --- check/mode-lowmem.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/check/mode-lowmem.c b/check/mode-lowmem.c index cc6773cd..263b56d1 100644 --- a/check/mode-lowmem.c +++ b/check/mode-lowmem.c @@ -266,7 +266,7 @@ static int modify_block_group_cache(struct btrfs_block_group *block_group, int c */ static int modify_block_groups_cache(u64 flags, int cache) { - struct btrfs_root *root = btrfs_extent_root(gfs_info, 0); + struct btrfs_root *root = btrfs_block_group_root(gfs_info); struct btrfs_key key; struct btrfs_path path; struct btrfs_block_group *bg_cache; @@ -331,7 +331,7 @@ static int clear_block_groups_full(u64 flags) static int create_chunk_and_block_group(u64 flags, u64 *start, u64 *nbytes) { struct btrfs_trans_handle *trans; - struct btrfs_root *root = btrfs_extent_root(gfs_info, 0); + struct btrfs_root *root = btrfs_block_group_root(gfs_info); int ret; if ((flags & BTRFS_BLOCK_GROUP_TYPE_MASK) == 0) @@ -419,7 +419,7 @@ static int is_chunk_almost_full(u64 start) { struct btrfs_path path; struct btrfs_key key; - struct btrfs_root *root = btrfs_extent_root(gfs_info, 0); + struct btrfs_root *root = btrfs_block_group_root(gfs_info); struct btrfs_block_group_item *bi; struct btrfs_block_group_item bg_item; struct extent_buffer *eb; @@ -4591,7 +4591,7 @@ next: static int find_block_group_item(struct btrfs_path *path, u64 bytenr, u64 len, u64 type) { - struct btrfs_root *root = btrfs_extent_root(gfs_info, 0); + struct btrfs_root *root = btrfs_block_group_root(gfs_info); struct btrfs_block_group_item bgi; struct btrfs_key key; int ret; From patchwork Wed Nov 10 20:14:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612893 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4645EC433FE for ; Wed, 10 Nov 2021 20:15:14 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 31EC16109F for ; Wed, 10 Nov 2021 20:15:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231759AbhKJUSA (ORCPT ); Wed, 10 Nov 2021 15:18:00 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36640 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232681AbhKJUR7 (ORCPT ); Wed, 10 Nov 2021 15:17:59 -0500 Received: from mail-qv1-xf2c.google.com (mail-qv1-xf2c.google.com [IPv6:2607:f8b0:4864:20::f2c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9D264C061764 for ; Wed, 10 Nov 2021 12:15:11 -0800 (PST) Received: by mail-qv1-xf2c.google.com with SMTP id u16so2644631qvk.4 for ; Wed, 10 Nov 2021 12:15:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=zzGoFbPaHjYxOdEvMNYA2KUeGYoOWZmWRW9btUenLJA=; b=l71HG4rrF1bch7aFnY+4ss8kw+V0MPubtB8XLE0T2hYY1+yYSBNiCCbRKCor4jSLRC eczMUCPlV5inu+RM5LoIZEz/Bve6N+NmECqzfD7W15IUOni8yMc/6U0qbbuySnZPXD8C QD2pUsV/NKutbNVs3RSwCrSd1u9TuvehsBNnHpi+LmB2XrG8EdltKcAPQlxHas1gMsdE GTKN04spw2axtpRrP5W9E0dr+VoWmKbcb0HFE8glpdmvPZMU3FkUMp0ohCycCpFLWmHj eQGNUtrVvq+C0j1fiCSh6iMdUq39pwcf1ig/5nn2SE25khR4/NkPcXgdHMKk4gjwrZc1 vpXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=zzGoFbPaHjYxOdEvMNYA2KUeGYoOWZmWRW9btUenLJA=; b=D3apiNw4HEXmyTFngyt/yIOTCGaaZKOVmpezHwXHnZFih3Vz7MPafSb/9GFJRwtMXx yy6vAp+S7ePJ6sBIkR9JWcQicxWznjgUVxvfVP1XoqgYeV0Al83ImLc1+JzvBiQFNG6z B2OSa7l1ow+khlB+Zp/O454Z4fe1LScVE84VaGhwEzx+x5XxB8cwuKjm5JMYIz4ZUnSQ 2pooQfeHqDnRHZnlucfmcxc/kMy61AwABnuccRM0ic6gCuwZiY8eoXZz0HrbZb4kCnJP 2qOjSm0+4HoHpPuR5qCSq7PAjWw/smgjS5DDhr+2+1sQS/sbbaEJ65IRSKb34VS50iRe e6mw== X-Gm-Message-State: AOAM530vgdw7Z1V0b5XmspkuBS+GW3u1I6/NET7pOUiExPmizwwq8PV/ vIF7JR6WTwzL1guFfFxw5gv3+7ucnFetzQ== X-Google-Smtp-Source: ABdhPJzm/Ou4WYQYM8vZtV8VGFKNh+CpDuLmfGC1yU8OGqNLUlXEYmoG1Ab3dC24LSPCFglOOWGuHg== X-Received: by 2002:a05:6214:2606:: with SMTP id gu6mr1374713qvb.30.1636575310565; Wed, 10 Nov 2021 12:15:10 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id v17sm405327qkl.123.2021.11.10.12.15.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:15:10 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 16/30] btrfs-progs: handle no bg item in extent tree for free space tree Date: Wed, 10 Nov 2021 15:14:28 -0500 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We have an ASSERT(ret == 0) when populating the free space tree as we should at least find the block group item with extent tree v1. However with v2 we no longer have the block group item in the extent tree, so fix the population logic to handle an empty block group (which occurs during mkfs) and only assert if ret != 0 and we don't have extent tree v2 turned on. Signed-off-by: Josef Bacik --- kernel-shared/free-space-tree.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/kernel-shared/free-space-tree.c b/kernel-shared/free-space-tree.c index 0fdf5004..896bd3a2 100644 --- a/kernel-shared/free-space-tree.c +++ b/kernel-shared/free-space-tree.c @@ -1057,6 +1057,9 @@ int populate_free_space_tree(struct btrfs_trans_handle *trans, if (ret) goto out; + start = block_group->start; + end = block_group->start + block_group->length; + /* * Iterate through all of the extent and metadata items in this block * group, adding the free space between them and the free space at the @@ -1071,10 +1074,11 @@ int populate_free_space_tree(struct btrfs_trans_handle *trans, ret = btrfs_search_slot_for_read(extent_root, &key, path, 1, 0); if (ret < 0) goto out; - ASSERT(ret == 0); + if (ret > 0) { + ASSERT(btrfs_fs_incompat(trans->fs_info, EXTENT_TREE_V2)); + goto done; + } - start = block_group->start; - end = block_group->start + block_group->length; while (1) { btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]); @@ -1106,6 +1110,7 @@ int populate_free_space_tree(struct btrfs_trans_handle *trans, if (ret) break; } +done: if (start < end) { ret = __add_to_free_space_tree(trans, block_group, path2, start, end - start); From patchwork Wed Nov 10 20:14:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612895 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9EC7BC433EF for ; Wed, 10 Nov 2021 20:15:15 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 866E061247 for ; Wed, 10 Nov 2021 20:15:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232108AbhKJUSC (ORCPT ); Wed, 10 Nov 2021 15:18:02 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36650 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232681AbhKJUSB (ORCPT ); Wed, 10 Nov 2021 15:18:01 -0500 Received: from mail-qt1-x834.google.com (mail-qt1-x834.google.com [IPv6:2607:f8b0:4864:20::834]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 64D78C061764 for ; Wed, 10 Nov 2021 12:15:13 -0800 (PST) Received: by mail-qt1-x834.google.com with SMTP id z9so3269684qtj.9 for ; Wed, 10 Nov 2021 12:15:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=Fx5zkf+JCd5xeyOZgGTbI6N5LU0o9nCwDJxj2dtLvFE=; b=e+NMsnBKHBcq8GZj4ENbFPLatIlrcZaJ8vgdHc2XS1mb2197JwCYajCYYQH/9ypNkp r0gnWbIzfqVN1dsMViVU8gVhTIunJ6BHqmbEtm0jz7T8gSv9lk5SqTF5w7Aj2Q+sIIsV a9yT9DSsxjvBLR+GZTj2ZkyGRrjq0FYFgXuynh1Kgq4PH1PnCekktE8WPeHpDihJ54+x 2JKfbxCUtUNsHosVofgARwz7nBsSYnBOsEjfI7SKc9m1+phiCU2N59ukMhU+nS7X78yh gKEXoytC0+MTpo2XavR8SWv6sqfNXk6n5D4bQ9uW6u2kg7/WAggEa7MU6yrnEDff2x12 KQjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Fx5zkf+JCd5xeyOZgGTbI6N5LU0o9nCwDJxj2dtLvFE=; b=lJR1C3xS5jHiUXgwQL1CbABvREFjNT+VYMpjvU0pWCBz6MU8AiXmYHyOQ/fhb00AY1 jYUSPUi7i2YcCbPEVV1IPyJWhJ/4MASP/E1mvEVXF+pM1tsWJCn9ENPG7QeCT8giqyAK VcA3S7zNiNQbwcqkD37c1Y90L7F4ve0iauGr2f6MGBdSiIKk6qCMhd7lFzHfV9sjAdKh ToIkUalwOaBPp8slw3b/q3R1AJODg2nK4fqgkow0Y6sh2+iGGarzLwftbHZS6xFMTRUp S1zTY7O/3vXA37ec0km4spdQOmfzRyrTe6ZD4bxAXPa3ZQskmt60Zikev1JPL5OvgcxS /gSw== X-Gm-Message-State: AOAM531mu8U43kXO8d1VsXsI41jK9K4SmZsJOkByHMD3OpUuwCmWfuPh EMslUQqRCla/4DlzmgR7jjTHOpTqsslaDQ== X-Google-Smtp-Source: ABdhPJyp8zd62nCmyisKU+vFD76CBSnRPQi9U0HhwoDzH2iK77oi6Evo6+dYCP3prH0J9wEvG/+XBQ== X-Received: by 2002:a05:622a:1a93:: with SMTP id s19mr1913974qtc.414.1636575312117; Wed, 10 Nov 2021 12:15:12 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id m20sm488418qkp.78.2021.11.10.12.15.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:15:11 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 17/30] btrfs-progs: mkfs: add support for the block group tree Date: Wed, 10 Nov 2021 15:14:29 -0500 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Add the extent tree v2 table with the block group tree as a root, and then create the empty root and use the proper root for cleanup up the temporary block groups. Signed-off-by: Josef Bacik --- mkfs/common.c | 93 ++++++++++++++++++++++++++++++++++++++++----------- mkfs/common.h | 12 +++++++ mkfs/main.c | 5 +++ 3 files changed, 91 insertions(+), 19 deletions(-) diff --git a/mkfs/common.c b/mkfs/common.c index ca5393d5..71589c0d 100644 --- a/mkfs/common.c +++ b/mkfs/common.c @@ -39,6 +39,7 @@ static u64 reference_root_table[] = { [MKFS_FS_TREE] = BTRFS_FS_TREE_OBJECTID, [MKFS_CSUM_TREE] = BTRFS_CSUM_TREE_OBJECTID, [MKFS_FREE_SPACE_TREE] = BTRFS_FREE_SPACE_TREE_OBJECTID, + [MKFS_BLOCK_GROUP_TREE] = BTRFS_BLOCK_GROUP_TREE_OBJECTID, }; static int btrfs_write_empty_tree(int fd, struct btrfs_mkfs_config *cfg, @@ -97,7 +98,8 @@ static int btrfs_create_tree_root(int fd, struct btrfs_mkfs_config *cfg, for (i = 0; i < blocks_nr; i++) { blk = blocks[i]; - if (blk == MKFS_ROOT_TREE || blk == MKFS_CHUNK_TREE) + if (blk == MKFS_ROOT_TREE || blk == MKFS_CHUNK_TREE || + blk == MKFS_BLOCK_GROUP_TREE) continue; btrfs_set_root_bytenr(&root_item, cfg->blocks[blk]); @@ -188,6 +190,50 @@ static int create_free_space_tree(int fd, struct btrfs_mkfs_config *cfg, return 0; } +static void write_block_group_item(struct extent_buffer *buf, u32 nr, + u64 objectid, u64 offset, u64 used, + u32 itemoff) +{ + struct btrfs_block_group_item *bg_item; + struct btrfs_disk_key disk_key; + + btrfs_set_disk_key_objectid(&disk_key, objectid); + btrfs_set_disk_key_offset(&disk_key, offset); + btrfs_set_disk_key_type(&disk_key, BTRFS_BLOCK_GROUP_ITEM_KEY); + btrfs_set_item_key(buf, &disk_key, nr); + btrfs_set_item_offset(buf, btrfs_item_nr(nr), itemoff); + btrfs_set_item_size(buf, btrfs_item_nr(nr), sizeof(*bg_item)); + + bg_item = btrfs_item_ptr(buf, nr, struct btrfs_block_group_item); + btrfs_set_block_group_used(buf, bg_item, used); + btrfs_set_block_group_flags(buf, bg_item, BTRFS_BLOCK_GROUP_SYSTEM); + btrfs_set_block_group_chunk_objectid(buf, bg_item, + BTRFS_FIRST_CHUNK_TREE_OBJECTID); +} + +static int create_block_group_tree(int fd, struct btrfs_mkfs_config *cfg, + struct extent_buffer *buf, + u64 bg_offset, u64 bg_size, u64 bg_used) +{ + int ret; + + memset(buf->data + sizeof(struct btrfs_header), 0, + cfg->nodesize - sizeof(struct btrfs_header)); + write_block_group_item(buf, 0, bg_offset, bg_size, bg_used, + __BTRFS_LEAF_DATA_SIZE(cfg->nodesize) - + sizeof(struct btrfs_block_group_item)); + btrfs_set_header_bytenr(buf, cfg->blocks[MKFS_BLOCK_GROUP_TREE]); + btrfs_set_header_owner(buf, BTRFS_BLOCK_GROUP_TREE_OBJECTID); + btrfs_set_header_nritems(buf, 1); + csum_tree_block_size(buf, btrfs_csum_type_size(cfg->csum_type), 0, + cfg->csum_type); + ret = pwrite(fd, buf->data, cfg->nodesize, + cfg->blocks[MKFS_BLOCK_GROUP_TREE]); + if (ret != cfg->nodesize) + return ret < 0 ? -errno : -EIO; + return 0; +} + /* * @fs_uuid - if NULL, generates a UUID, returns back the new filesystem UUID * @@ -240,11 +286,19 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg) bool add_block_group = true; bool free_space_tree = !!(cfg->runtime_features & BTRFS_RUNTIME_FEATURE_FREE_SPACE_TREE); + bool extent_tree_v2 = !!(cfg->features & + BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2); /* Don't include the free space tree in the blocks to process. */ if (!free_space_tree) blocks_nr--; + if (extent_tree_v2) { + blocks = extent_tree_v2_blocks; + blocks_nr = ARRAY_SIZE(extent_tree_v2_blocks); + add_block_group = false; + } + if ((cfg->features & BTRFS_FEATURE_INCOMPAT_ZONED)) { system_group_offset = cfg->zone_size * BTRFS_NR_SB_LOG_ZONES; system_group_size = cfg->zone_size; @@ -309,6 +363,12 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg) btrfs_set_super_compat_ro_flags(&super, ro_flags); } + if (extent_tree_v2) { + btrfs_set_super_block_group_root(&super, + cfg->blocks[MKFS_BLOCK_GROUP_TREE]); + btrfs_set_super_block_group_root_generation(&super, 1); + btrfs_set_super_block_group_root_level(&super, 0); + } if (cfg->label) __strncpy_null(super.label, cfg->label, BTRFS_LABEL_SIZE - 1); @@ -340,25 +400,12 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg) /* Add the block group item for our temporary chunk. */ if (cfg->blocks[blk] > system_group_offset && add_block_group) { - struct btrfs_block_group_item *bg_item; - + itemoff -= sizeof(struct btrfs_block_group_item); + write_block_group_item(buf, nritems, + system_group_offset, + system_group_size, total_used, + itemoff); add_block_group = false; - - itemoff -= sizeof(*bg_item); - btrfs_set_disk_key_objectid(&disk_key, system_group_offset); - btrfs_set_disk_key_offset(&disk_key, system_group_size); - btrfs_set_disk_key_type(&disk_key, BTRFS_BLOCK_GROUP_ITEM_KEY); - btrfs_set_item_key(buf, &disk_key, nritems); - btrfs_set_item_offset(buf, btrfs_item_nr(nritems), itemoff); - btrfs_set_item_size(buf, btrfs_item_nr(nritems), sizeof(*bg_item)); - - bg_item = btrfs_item_ptr(buf, nritems, - struct btrfs_block_group_item); - btrfs_set_block_group_used(buf, bg_item, total_used); - btrfs_set_block_group_flags(buf, bg_item, - BTRFS_BLOCK_GROUP_SYSTEM); - btrfs_set_block_group_chunk_objectid(buf, bg_item, - BTRFS_FIRST_CHUNK_TREE_OBJECTID); nritems++; } @@ -579,6 +626,14 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg) goto out; } + if (extent_tree_v2) { + ret = create_block_group_tree(fd, cfg, buf, + system_group_offset, + system_group_size, total_used); + if (ret) + goto out; + } + /* and write out the super block */ memset(buf->data, 0, BTRFS_SUPER_INFO_SIZE); memcpy(buf->data, &super, sizeof(super)); diff --git a/mkfs/common.h b/mkfs/common.h index 66c9d9d0..6a48aa52 100644 --- a/mkfs/common.h +++ b/mkfs/common.h @@ -51,6 +51,7 @@ enum btrfs_mkfs_block { MKFS_FS_TREE, MKFS_CSUM_TREE, MKFS_FREE_SPACE_TREE, + MKFS_BLOCK_GROUP_TREE, MKFS_BLOCK_COUNT }; @@ -69,6 +70,17 @@ static const enum btrfs_mkfs_block extent_tree_v1_blocks[] = { MKFS_FREE_SPACE_TREE, }; +static const enum btrfs_mkfs_block extent_tree_v2_blocks[] = { + MKFS_ROOT_TREE, + MKFS_EXTENT_TREE, + MKFS_CHUNK_TREE, + MKFS_DEV_TREE, + MKFS_FS_TREE, + MKFS_CSUM_TREE, + MKFS_FREE_SPACE_TREE, + MKFS_BLOCK_GROUP_TREE, +}; + struct btrfs_mkfs_config { /* Label of the new filesystem */ const char *label; diff --git a/mkfs/main.c b/mkfs/main.c index 9a57cef8..1653ab32 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -299,6 +299,11 @@ static int recow_roots(struct btrfs_trans_handle *trans, ret = __recow_root(trans, info->dev_root); if (ret) return ret; + if (btrfs_fs_incompat(info, EXTENT_TREE_V2)) { + ret = __recow_root(trans, info->block_group_root); + if (ret) + return ret; + } ret = recow_global_roots(trans); if (ret) return ret; From patchwork Wed Nov 10 20:14:30 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612897 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 75E15C433F5 for ; Wed, 10 Nov 2021 20:15:16 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 58AB761247 for ; Wed, 10 Nov 2021 20:15:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232419AbhKJUSD (ORCPT ); Wed, 10 Nov 2021 15:18:03 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36654 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232311AbhKJUSC (ORCPT ); Wed, 10 Nov 2021 15:18:02 -0500 Received: from mail-qt1-x82c.google.com (mail-qt1-x82c.google.com [IPv6:2607:f8b0:4864:20::82c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 957ADC061764 for ; Wed, 10 Nov 2021 12:15:14 -0800 (PST) Received: by mail-qt1-x82c.google.com with SMTP id c12so3288685qtd.5 for ; Wed, 10 Nov 2021 12:15:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=NgjFqZGVD9HRaKdcAlbgdVyDXPsWjIlOZJ4QF7DdavQ=; b=Qk8uLO9R1IBWkaxhsn74Y4bfexmxfNH7Dv6NXlftEBS/wuQSeFGD7iSAMGZ7s8ACsw hKj5MKRcqxPlZGUbItqPyx723xr41P32836GsPk7GaWGdjOx/aaSGPiyCRJ5p9MbAiVE kIEzGBPqBrQgKzithpeUK7+lFoMVR6I3xK7eggue7KD6dT6U49p6UaawInfAVOBHMDuf gvsRjZqil5s7zE+YbjM6FoBaxUx7AD2QmCaxKWzIy1N+cLDA7W6pa50uhj7XQAgfaE4W naQkpcq+tvF4uDW4lm6wPvnzLBNwFJwB7sBjErdnITfGkUex0a+vcCGm0se7/smfL2yy hCTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=NgjFqZGVD9HRaKdcAlbgdVyDXPsWjIlOZJ4QF7DdavQ=; b=UV3olwWXt5xHCZ1YC1Fcsrt845g3dBV3FedbmwPitqdTBkGyh3tA9hC/MLYcYh5OPw BsjLL5FM1qfxo82+XLCVMoidXsOqSAZujfeGaUPw3A4EznDpKAbBRvQqOq/kws6ZVHNW cco6nVT6D4fzXi2JKE8u5D1UCsSiHLRCY67vSQixKZ4xt1Wc2gUGP2gKIhbYNDwVHAhW DZIoUExlt7dLCrlv4i9/mc5Tr+/QtZUC0l1pgNYJ6iNVGYggH6XIHQ8CRFH+v0djl9vV DnktiPNxQOsW2SbfntomxDJ9bnUCDi0ysCNLFuIYBd6sRgMjkA/mqxTZsURHYFTE0VfM 92hA== X-Gm-Message-State: AOAM533fuCwggmVoqfHwnLkF+UkuTSY1qJ/o1/q4MEw1VMYS4q4R8L08 BYIvTfgwnSTv9Kanp+JIc6BehsSCaLd5eQ== X-Google-Smtp-Source: ABdhPJwdUcVNxBkMffQuo93VaMuZNd7E9L1YerFtAIBo9nkvGWT8CWe7x1dJKvOgYHla/yhBrS+eIA== X-Received: by 2002:a05:622a:410:: with SMTP id n16mr1841348qtx.369.1636575313505; Wed, 10 Nov 2021 12:15:13 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id r10sm511249qta.27.2021.11.10.12.15.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:15:13 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 18/30] btrfs-progs: check: add block group tree support Date: Wed, 10 Nov 2021 15:14:30 -0500 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org This makes the appropriate changes to enable the block group tree checking for both lowmem and normal check modes. This is relatively straightforward, simply need to use the helper to get the right root for dealing with block groups. Signed-off-by: Josef Bacik --- check/main.c | 21 ++++++++++++++++++++- check/mode-lowmem.c | 4 ++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/check/main.c b/check/main.c index 7735cce1..46d08040 100644 --- a/check/main.c +++ b/check/main.c @@ -6229,10 +6229,17 @@ static int check_type_with_root(u64 rootid, u8 key_type) break; case BTRFS_EXTENT_ITEM_KEY: case BTRFS_METADATA_ITEM_KEY: - case BTRFS_BLOCK_GROUP_ITEM_KEY: if (rootid != BTRFS_EXTENT_TREE_OBJECTID) goto err; break; + case BTRFS_BLOCK_GROUP_ITEM_KEY: + if (btrfs_fs_incompat(gfs_info, EXTENT_TREE_V2)) { + if (rootid != BTRFS_BLOCK_GROUP_TREE_OBJECTID) + goto err; + } else if (rootid != BTRFS_EXTENT_TREE_OBJECTID) { + goto err; + } + break; case BTRFS_ROOT_ITEM_KEY: if (rootid != BTRFS_ROOT_TREE_OBJECTID) goto err; @@ -9453,6 +9460,18 @@ again: return ret; } + /* + * If we are extent tree v2 then we can reint the block group root as + * well. + */ + if (btrfs_fs_incompat(gfs_info, EXTENT_TREE_V2)) { + ret = btrfs_fsck_reinit_root(trans, gfs_info->block_group_root); + if (ret) { + fprintf(stderr, "block group initialization failed\n"); + return ret; + } + } + /* * Now we have all the in-memory block groups setup so we can make * allocations properly, and the metadata we care about is safe since we diff --git a/check/mode-lowmem.c b/check/mode-lowmem.c index 263b56d1..7be12e6b 100644 --- a/check/mode-lowmem.c +++ b/check/mode-lowmem.c @@ -5530,7 +5530,7 @@ int check_chunks_and_extents_lowmem(void) key.offset = 0; key.type = BTRFS_ROOT_ITEM_KEY; - ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0); + ret = btrfs_search_slot(NULL, gfs_info->tree_root, &key, &path, 0, 0); if (ret) { error("cannot find extent tree in tree_root"); goto out; @@ -5565,7 +5565,7 @@ int check_chunks_and_extents_lowmem(void) if (ret) goto out; next: - ret = btrfs_next_item(root, &path); + ret = btrfs_next_item(gfs_info->tree_root, &path); if (ret) goto out; } From patchwork Wed Nov 10 20:14:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612899 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3A038C433F5 for ; Wed, 10 Nov 2021 20:15:18 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 23F6961248 for ; Wed, 10 Nov 2021 20:15:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232512AbhKJUSE (ORCPT ); Wed, 10 Nov 2021 15:18:04 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36664 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232311AbhKJUSE (ORCPT ); Wed, 10 Nov 2021 15:18:04 -0500 Received: from mail-qv1-xf2e.google.com (mail-qv1-xf2e.google.com [IPv6:2607:f8b0:4864:20::f2e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 39A06C061764 for ; Wed, 10 Nov 2021 12:15:16 -0800 (PST) Received: by mail-qv1-xf2e.google.com with SMTP id b17so2628280qvl.9 for ; Wed, 10 Nov 2021 12:15:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=MsHd+omzg3fLiFS+pOt2YWV8wr0jRWzNLntxMRqjGoU=; b=zfJtMMkeOcrXjQhBn/jt1I0SSMiU7vKIdeSpQiIYAXMbuOXd19gBbDN1eoGw5Fa8ph PyByE8cwdngIOvn0ndYRd4YkyBXgjGNh+FSArCgC9HbDweK/XFHtHEm+dv+2Hy6eDHXi 5hfmNBwIGyiV1y4Zvek3g2zj47ui1xIP6owDpE4s4BTr9fVnmufFnRze/fB9f7kiKivo GvuMhbYUF3VueHIbhr5NtOyldrReDL2rmSz3swssQ3n5M+2JAzvCVY22xGN7MyYAJiwY ap3ThmNoNpT7lY9KIO7qMeZ0GYOVB05wtl9rxqBbKA1+cRlLWu5vaWT3yWKwhlMv9D8I OcvQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=MsHd+omzg3fLiFS+pOt2YWV8wr0jRWzNLntxMRqjGoU=; b=xE/GWRD19CH8RnnTKZUuvk/mBbUoFHjpEniY0sQJ9h087wdV/LVhGjj4UcUSCGiADn eeNXu6b8T6aLy2vZtf/YJlqE4N3WIfrDTAlhZsVOw6V0r/su2W3/CffR9DmLTKjaMCAs MeOxcB3ddyogNKPFeIYBIdujwO+nU2Y0DKF84/l0P/EsNnmrfJkwodHGf2JS6ksKwBy+ EKRLeLw2ZGb6mMBvEO2HTgCMhCuAAo4hUgJqT2jEOneoQUT2YStWDut7aF1jHisjWWAD oEa1D/sRcvq/F+E3QCTimpdjakKjtsvb6MB4PdjTCNkvhb2eyX5eSvoNnmogwMi2OUvd 1p6Q== X-Gm-Message-State: AOAM533VK0JIKc1nswmyoLu5I54/vJR4egG6D1ZtPk1ki//q8kcHNZj7 l8StdsdgfmiMU7pzBtHomVT9j7P91YP1Cg== X-Google-Smtp-Source: ABdhPJwErUy4bfzh9IkJzAeOpJdyPzbQZEXbKl54DXkuFcWoV5u/grMBXipYKRtW6tvs99IJNGCvfw== X-Received: by 2002:a05:6214:29ed:: with SMTP id jv13mr1578751qvb.8.1636575315140; Wed, 10 Nov 2021 12:15:15 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id 139sm396790qkn.37.2021.11.10.12.15.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:15:14 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 19/30] btrfs-progs: qgroup-verify: scan extents based on block groups Date: Wed, 10 Nov 2021 15:14:31 -0500 Message-Id: <505a3728582df29d13becae5738b0edf8e879dc1.1636575146.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org When we switch to per-block group extent roots we'll need to scan each individual extent root. To make this easier in the future go ahead and use the range of the block groups to scan the extents. Signed-off-by: Josef Bacik --- check/qgroup-verify.c | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/check/qgroup-verify.c b/check/qgroup-verify.c index 0813b841..45007d8c 100644 --- a/check/qgroup-verify.c +++ b/check/qgroup-verify.c @@ -1400,6 +1400,7 @@ static bool is_bad_qgroup(struct qgroup_count *count) */ int qgroup_verify_all(struct btrfs_fs_info *info) { + struct rb_node *n; int ret; bool found_err = false; bool skip_err = false; @@ -1430,10 +1431,17 @@ int qgroup_verify_all(struct btrfs_fs_info *info) /* * Put all extent refs into our rbtree */ - ret = scan_extents(info, 0, ~0ULL); - if (ret) { - fprintf(stderr, "ERROR: while scanning extent tree: %d\n", ret); - goto out; + for (n = rb_first(&info->block_group_cache_tree); n; n = rb_next(n)) { + struct btrfs_block_group *bg; + + bg = rb_entry(n, struct btrfs_block_group, cache_node); + ret = scan_extents(info, bg->start, + bg->start + bg->length - 1); + if (ret) { + fprintf(stderr, "ERROR: while scanning extent tree: %d\n", + ret); + goto out; + } } ret = map_implied_refs(info); @@ -1507,6 +1515,7 @@ static void print_subvol_info(u64 subvolid, u64 bytenr, u64 num_bytes, int print_extent_state(struct btrfs_fs_info *info, u64 subvol) { + struct rb_node *n; int ret; tree_blocks = ulist_alloc(0); @@ -1519,10 +1528,17 @@ int print_extent_state(struct btrfs_fs_info *info, u64 subvol) /* * Put all extent refs into our rbtree */ - ret = scan_extents(info, 0, ~0ULL); - if (ret) { - fprintf(stderr, "ERROR: while scanning extent tree: %d\n", ret); - goto out; + for (n = rb_first(&info->block_group_cache_tree); n; n = rb_next(n)) { + struct btrfs_block_group *bg; + + bg = rb_entry(n, struct btrfs_block_group, cache_node); + ret = scan_extents(info, bg->start, + bg->start + bg->length - 1); + if (ret) { + fprintf(stderr, "ERROR: while scanning extent tree: %d\n", + ret); + goto out; + } } ret = map_implied_refs(info); From patchwork Wed Nov 10 20:14:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612901 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4401DC433EF for ; Wed, 10 Nov 2021 20:15:30 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 2DB6961247 for ; Wed, 10 Nov 2021 20:15:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232617AbhKJUSH (ORCPT ); Wed, 10 Nov 2021 15:18:07 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36672 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232311AbhKJUSG (ORCPT ); Wed, 10 Nov 2021 15:18:06 -0500 Received: from mail-qt1-x82f.google.com (mail-qt1-x82f.google.com [IPv6:2607:f8b0:4864:20::82f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 88F67C061764 for ; Wed, 10 Nov 2021 12:15:18 -0800 (PST) Received: by mail-qt1-x82f.google.com with SMTP id j17so3297726qtx.2 for ; Wed, 10 Nov 2021 12:15:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=OxZHNbFkK+aqNyGYkT8WGjyYAA0mg2WTPkkDCaYEn3c=; b=NYPQQCKwAynw7Q6bwh3fiW0jKaMl6BPuB/2RMbBypdC9sdqJNuVL4e2DxUA8Ugbbs1 TjPo0USEDZSclYGTTozxyPUwcoBSFTjzjErgjko6NUju+hpruSmpcIdyFsIdaJzgou+s 5TJDrCSrbEjOuy9EVfXaXYfhmYQXNd75E2yr+xrtGOMJNumJuqPdK5gNKN2vNBkkL+Za s7/a3t7o7PE34D3jDLnSvgsE6MlNXEVBsw2fVh+t3tV8gM2HW5wL6da+1jI3b9+dJp/0 0VGczPtllHiNIEssOezky3hTJqsTTNKRvq6TNnohtyqoAMPdrAMcmge6s3GrQ3sYhpar kQ2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=OxZHNbFkK+aqNyGYkT8WGjyYAA0mg2WTPkkDCaYEn3c=; b=7SKtCfFLjTRHq1m6lxrt2Kz1oHo9VqNZlvY42Gp9ROFYlmp34mp/IsL2xWmu89Zi2B 6sKPKRxeSdvVVcNuDEyOZDDw4UVy+BhsnRSAEoEav6+Mw5BINbccLZNQGCU4T9OMSCIb sH++ur0A/x4Dqy6CdzMQ0ZpSUdYXl5paZ5tsnGF8no1iNFpWCSbQjPqXgbqs4sPKc+E6 PRccOO8ocAplEMhQXU1kX2hZu5nYIhbg7xYx2Z0hgd8MN+9moYOlYO/0aDIUdIRGBZl7 w1nQk8INLE4wiBDpAmHBaRn7lHY33igzdZGcKsstYdS1Pcejfel9mAMx+j63b9llyT26 Uq0g== X-Gm-Message-State: AOAM532vAuOOoI+e+32HdJXRmUeRyrbla0rrixp9cKqcFJZO6HC+hmWN uLvVYucYO7rfsSr734eVoT1x3+AQhIasAg== X-Google-Smtp-Source: ABdhPJxtbEtz/NhBu3/NhTgYGmJ4gyj1SCi+2cwqLepkJ0W/q0pqd1LPZmNYiiWjYvbjvt47k0p1JQ== X-Received: by 2002:ac8:5996:: with SMTP id e22mr1869379qte.373.1636575317320; Wed, 10 Nov 2021 12:15:17 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id j15sm541546qtx.67.2021.11.10.12.15.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:15:16 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 20/30] btrfs-progs: check: make free space tree validation extent tree v2 aware Date: Wed, 10 Nov 2021 15:14:32 -0500 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org The free space tree needs to be validated against all referenced blocks in the file system, so use the btrfs_mark_used_blocks() helper to check the free space tree and free space cache against. This will do the right thing for both extent tree v1 and extent tree v2. Signed-off-by: Josef Bacik --- check/main.c | 90 ++++++++++++++++++---------------------------------- 1 file changed, 31 insertions(+), 59 deletions(-) diff --git a/check/main.c b/check/main.c index 46d08040..6252a890 100644 --- a/check/main.c +++ b/check/main.c @@ -5611,72 +5611,38 @@ static int check_cache_range(struct btrfs_root *root, } static int verify_space_cache(struct btrfs_root *root, - struct btrfs_block_group *cache) + struct btrfs_block_group *cache, + struct extent_io_tree *used) { - struct btrfs_path path; - struct extent_buffer *leaf; - struct btrfs_key key; - u64 last; + u64 start, end, last_end, bg_end; int ret = 0; - root = btrfs_extent_root(root->fs_info, cache->start); + start = cache->start; + bg_end = cache->start + cache->length; + last_end = start; - last = max_t(u64, cache->start, BTRFS_SUPER_INFO_OFFSET); - - btrfs_init_path(&path); - key.objectid = last; - key.offset = 0; - key.type = BTRFS_EXTENT_ITEM_KEY; - ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0); - if (ret < 0) - goto out; - ret = 0; - while (1) { - if (path.slots[0] >= btrfs_header_nritems(path.nodes[0])) { - ret = btrfs_next_leaf(root, &path); - if (ret < 0) - goto out; - if (ret > 0) { - ret = 0; - break; - } - } - leaf = path.nodes[0]; - btrfs_item_key_to_cpu(leaf, &key, path.slots[0]); - if (key.objectid >= cache->start + cache->length) + while (start < bg_end) { + ret = find_first_extent_bit(used, cache->start, &start, &end, + EXTENT_DIRTY); + if (ret || start >= bg_end) { + ret = 0; break; - if (key.type != BTRFS_EXTENT_ITEM_KEY && - key.type != BTRFS_METADATA_ITEM_KEY) { - path.slots[0]++; - continue; } - - if (last == key.objectid) { - if (key.type == BTRFS_EXTENT_ITEM_KEY) - last = key.objectid + key.offset; - else - last = key.objectid + gfs_info->nodesize; - path.slots[0]++; - continue; + if (last_end < start) { + ret = check_cache_range(root, cache, last_end, + start - last_end); + if (ret) + return ret; } - - ret = check_cache_range(root, cache, last, - key.objectid - last); - if (ret) - break; - if (key.type == BTRFS_EXTENT_ITEM_KEY) - last = key.objectid + key.offset; - else - last = key.objectid + gfs_info->nodesize; - path.slots[0]++; + end = min(end, bg_end - 1); + clear_extent_dirty(used, start, end); + start = end + 1; + last_end = start; } - if (last < cache->start + cache->length) - ret = check_cache_range(root, cache, last, - cache->start + cache->length - last); - -out: - btrfs_release_path(&path); + if (last_end < bg_end) + ret = check_cache_range(root, cache, last_end, + bg_end - last_end); if (!ret && !RB_EMPTY_ROOT(&cache->free_space_ctl->free_space_offset)) { @@ -5690,11 +5656,17 @@ out: static int check_space_cache(struct btrfs_root *root) { + struct extent_io_tree used; struct btrfs_block_group *cache; u64 start = BTRFS_SUPER_INFO_OFFSET + BTRFS_SUPER_INFO_SIZE; int ret; int error = 0; + extent_io_tree_init(&used); + ret = btrfs_mark_used_blocks(gfs_info, &used); + if (ret) + return ret; + while (1) { ctx.item_count++; cache = btrfs_lookup_first_block_group(gfs_info, start); @@ -5739,14 +5711,14 @@ static int check_space_cache(struct btrfs_root *root) continue; } - ret = verify_space_cache(root, cache); + ret = verify_space_cache(root, cache, &used); if (ret) { fprintf(stderr, "cache appears valid but isn't %llu\n", cache->start); error++; } } - + extent_io_tree_cleanup(&used); return error ? -EINVAL : 0; } From patchwork Wed Nov 10 20:14:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612903 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 87A22C433F5 for ; Wed, 10 Nov 2021 20:15:31 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 6FBEB6109F for ; Wed, 10 Nov 2021 20:15:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231983AbhKJUSS (ORCPT ); Wed, 10 Nov 2021 15:18:18 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36684 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232681AbhKJUSI (ORCPT ); Wed, 10 Nov 2021 15:18:08 -0500 Received: from mail-qv1-xf2b.google.com (mail-qv1-xf2b.google.com [IPv6:2607:f8b0:4864:20::f2b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 307F2C061764 for ; Wed, 10 Nov 2021 12:15:20 -0800 (PST) Received: by mail-qv1-xf2b.google.com with SMTP id gu12so2633378qvb.6 for ; Wed, 10 Nov 2021 12:15:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=Qm6QdLoaHt3GIfEOPEVQJ1gYB6ReYMf83vFJ1g2HpPQ=; b=jHJOW5l+3RynYyBNMKrQrs7fW9ecyc5XzRXuLTaeeaNCeneOQkhO+B1VK8M9Q5Kw9p UT8yzgPvuvwBSN6pV5TcjnA7W3Cz4AGqbdtCYQSO3ZUQX6VIOQVggMXPiPYvbliV2b7J 4p8/DGm5G7jJx6t2Hl/pmec2yQyAnO8kIU+L1T6eEN+2UB/sEIF3MQhDNZlTPF20FCnv C38/tYr63HZPMH6CTV7TYNW5IYLate74Ko0ev4NXcmcApjb7ZokNiQJBawLwMiXWylQH cUELPsf+wIGM/VsLN0MfsVPQ7zYOANnlCXeESmdrGAj857XOV3lOQdrIImTxWzVfoX2p ZC4g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Qm6QdLoaHt3GIfEOPEVQJ1gYB6ReYMf83vFJ1g2HpPQ=; b=x+sDsALEvAqx26SVww9s5uC9F7HK49JPNjm8bKzpgkXoKKqtz4yAtAs8Qr/5SeDLuS 7QJs2eUNKBC7orKjHOluDA6qwVg6eayaMXJsrfSXmB6h+iPcc5GhtTk049BsyLSG0fif kLKd+W/RvIshdhfnkaUSdBnNwNMiDzkIRfUhSsiuGJDsEvlYLvc8lDknrvx8onuxeV0H rKYpUqQRSqu0oLn4ew/1I+ZXHeW/3PANXqb+Erof85GmqkMDNk1YU8azJuY9OBG9jgXE l9t2cPegh+RaCI45nCjfBZH4n98HzPeF4ER8QAL7QWcYebVuPIGmotkSaboQuLSDnjYx lVdQ== X-Gm-Message-State: AOAM532Gd6Lx3H8jML/PzSxs9UufssrRTpbAC0us27Vy1ggQJRYeVCiH ryya2C25JB4G1IH7wFP/imAgQHgP4/rekw== X-Google-Smtp-Source: ABdhPJy+nHaoIL85UcwS/A61W534jvJMBMHeePzgDuKYBSW7FWIhvRg4g5sEG9+2Ri+yjcBMD2dcpg== X-Received: by 2002:a0c:ecc7:: with SMTP id o7mr1550192qvq.46.1636575318951; Wed, 10 Nov 2021 12:15:18 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id d3sm515658qte.4.2021.11.10.12.15.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:15:18 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 21/30] btrfs-progs: check: add helper to reinit the root based on a key Date: Wed, 10 Nov 2021 15:14:33 -0500 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org In the case of per-bg roots we may be missing the root items. To re-initialize them we want to add the root item as well as allocate the empty block. To achieve this extract out the reinit root logic to a helper that just takes the root key and then does the appropriate work to allocate an empty root and update the root item. Fix the normal reinit root helper to use this new helper. Signed-off-by: Josef Bacik --- check/main.c | 88 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 58 insertions(+), 30 deletions(-) diff --git a/check/main.c b/check/main.c index 6252a890..d2d27694 100644 --- a/check/main.c +++ b/check/main.c @@ -9090,29 +9090,34 @@ static int do_check_chunks_and_extents(void) return ret; } -static int btrfs_fsck_reinit_root(struct btrfs_trans_handle *trans, - struct btrfs_root *root) +static struct extent_buffer *btrfs_fsck_clear_root( + struct btrfs_trans_handle *trans, + struct btrfs_key *key) { + struct btrfs_root_item ri = {}; + struct btrfs_path *path; struct extent_buffer *c; - struct extent_buffer *old = root->node; - int level; + struct btrfs_disk_key disk_key = {}; int ret; - struct btrfs_disk_key disk_key = {0,0,0}; - level = 0; + path = btrfs_alloc_path(); + if (!path) + return ERR_PTR(-ENOMEM); - c = btrfs_alloc_free_block(trans, root, gfs_info->nodesize, - root->root_key.objectid, - &disk_key, level, 0, 0); - if (IS_ERR(c)) - return PTR_ERR(c); + c = btrfs_alloc_free_block(trans, gfs_info->tree_root, + gfs_info->nodesize, key->objectid, + &disk_key, 0, 0, 0); + if (IS_ERR(c)) { + btrfs_free_path(path); + return c; + } memset_extent_buffer(c, 0, 0, sizeof(struct btrfs_header)); - btrfs_set_header_level(c, level); + btrfs_set_header_level(c, 0); btrfs_set_header_bytenr(c, c->start); btrfs_set_header_generation(c, trans->transid); btrfs_set_header_backref_rev(c, BTRFS_MIXED_BACKREF_REV); - btrfs_set_header_owner(c, root->root_key.objectid); + btrfs_set_header_owner(c, key->objectid); write_extent_buffer(c, gfs_info->fs_devices->metadata_uuid, btrfs_header_fsid(), BTRFS_FSID_SIZE); @@ -9122,25 +9127,48 @@ static int btrfs_fsck_reinit_root(struct btrfs_trans_handle *trans, BTRFS_UUID_SIZE); btrfs_mark_buffer_dirty(c); + /* - * this case can happen in the following case: - * - * reinit reloc data root, this is because we skip pin - * down reloc data tree before which means we can allocate - * same block bytenr here. + * The root item may not exist, try to insert an empty one so it exists, + * otherwise simply update the existing one with the correct settings. */ - if (old->start == c->start) { - btrfs_set_root_generation(&root->root_item, - trans->transid); - root->root_item.level = btrfs_header_level(root->node); - ret = btrfs_update_root(trans, gfs_info->tree_root, - &root->root_key, &root->root_item); - if (ret) { - free_extent_buffer(c); - return ret; - } - } - free_extent_buffer(old); + ret = btrfs_insert_empty_item(trans, gfs_info->tree_root, path, key, + sizeof(ri)); + if (ret == -EEXIST) { + read_extent_buffer(path->nodes[0], &ri, + btrfs_item_ptr_offset(path->nodes[0], + path->slots[0]), + sizeof(ri)); + } else if (ret) { + btrfs_free_path(path); + free_extent_buffer(c); + return ERR_PTR(ret); + } + btrfs_set_root_bytenr(&ri, c->start); + btrfs_set_root_generation(&ri, trans->transid); + btrfs_set_root_refs(&ri, 1); + btrfs_set_root_used(&ri, c->len); + btrfs_set_root_generation_v2(&ri, trans->transid); + + write_extent_buffer(path->nodes[0], &ri, + btrfs_item_ptr_offset(path->nodes[0], + path->slots[0]), + sizeof(ri)); + btrfs_mark_buffer_dirty(path->nodes[0]); + btrfs_free_path(path); + return c; +} + +static int btrfs_fsck_reinit_root(struct btrfs_trans_handle *trans, + struct btrfs_root *root) +{ + struct extent_buffer *c; + + c = btrfs_fsck_clear_root(trans, &root->root_key); + if (IS_ERR(c)) + return PTR_ERR(c); + + free_extent_buffer(root->node); root->node = c; add_root_to_dirty_list(root); return 0; From patchwork Wed Nov 10 20:14:34 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612905 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3D8C0C433FE for ; Wed, 10 Nov 2021 20:15:32 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 28F8C61247 for ; Wed, 10 Nov 2021 20:15:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233004AbhKJUSS (ORCPT ); Wed, 10 Nov 2021 15:18:18 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36692 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232705AbhKJUSK (ORCPT ); Wed, 10 Nov 2021 15:18:10 -0500 Received: from mail-qt1-x82a.google.com (mail-qt1-x82a.google.com [IPv6:2607:f8b0:4864:20::82a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 467D6C061764 for ; Wed, 10 Nov 2021 12:15:22 -0800 (PST) Received: by mail-qt1-x82a.google.com with SMTP id v4so3269614qtw.8 for ; Wed, 10 Nov 2021 12:15:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=z+IJLZcvD3oJ305oxDfRwffTMJaiUlJ2jT0X4QnGJE0=; b=RkljGn9Lfp5w4hFx+4n2xZmWGnprHMA1EMkwgIdc1uvJZITRHRTref5rF4/xDXm9p1 ue8CFwBIaC9PSCtjCe+RA6I66rRzQOtE5XVTf+KDa6lBnYfu0cK4hsiyXuMD+2yNJ6T0 h8gJfwws5VRrJKbOzAzuAe16xR+juYHNdKFSNznlVaQEIhmqggIDpt/f/pV49fe7WiUy ObJy4n93u7UipL38hqQ2/6cGlLERFYvzGrFNzB2+PBjz8zyCGGX7zsnIvl1HBcLbMAnS rKT6RAw2kWVO4mynbmdPMw/ZQEfMiCZgS02LIKsmGss3II74Yprs0jF5wvOCfsClDl6R Z/WQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=z+IJLZcvD3oJ305oxDfRwffTMJaiUlJ2jT0X4QnGJE0=; b=16j1q347mrIX7qtMwZJb4KgRCZ0+sXMEB9SKZ9pNzjybwlj8jacXZQvKnu+7rZGO1e z5YlpzFAU4iu1EjHbKFtI/Op3WjVOyON23a5CmohpWFJW78DiTZ2rV5hM8PMkocG1S/q mntKrxIxBkTP8miVQwZvvAP2S9Fu2rDtafeYsiB/F1bPIlKS736u8jJ1g/CbGLP08kXl UKMKCWoctRFSwxp4UrDLn+WxhoDf/Gm4sfDNwrkSqN0Q+MU5B9mGhlgfC6IRpFAZYDVs nttColsJgPDLfXmw7N1lraIKCm/se6Sc6aqmRwIq9d7Q2Eb9P9ETqnNB/FkvD9N3rNP0 DC6g== X-Gm-Message-State: AOAM533V4mkdCdL3iTDdhbkRjFHPTCpe0Rfp5F12/twvEs8IaLNKjBDI ZI+aZxmVF2LRV5xX21ZhmG8zONouD+B4EA== X-Google-Smtp-Source: ABdhPJx5pYtZaLeBbGD8NiJbXcwdP75czsTA1lZQo2SZREL7W3kqDYKE/D+M/J58ddYcKHNaD6CJJw== X-Received: by 2002:a05:622a:5cd:: with SMTP id d13mr1845153qtb.361.1636575320776; Wed, 10 Nov 2021 12:15:20 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id w10sm519570qkp.121.2021.11.10.12.15.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:15:20 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 22/30] btrfs-progs: check: handle the block group tree properly Date: Wed, 10 Nov 2021 15:14:34 -0500 Message-Id: <97d52f7d44916c71203ee49c9e11ac5f863e7bd1.1636575147.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We need to make sure we process the block group root, and mark its blocks as used for the free space tree checking. Signed-off-by: Josef Bacik --- check/main.c | 27 +++++++++++++++++---------- common/repair.c | 3 +++ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/check/main.c b/check/main.c index d2d27694..c28fa2f3 100644 --- a/check/main.c +++ b/check/main.c @@ -8908,6 +8908,18 @@ out: return ret; } +static int load_super_root(struct list_head *head, struct btrfs_root *root) +{ + u8 level; + + if (!root) + return 0; + + level = btrfs_header_level(root->node); + return add_root_item_to_list(head, root->root_key.objectid, + root->node->start, 0, level, 0, NULL); +} + static int check_chunks_and_extents(void) { struct rb_root dev_cache; @@ -8926,9 +8938,7 @@ static int check_chunks_and_extents(void) int bits_nr; struct list_head dropping_trees; struct list_head normal_trees; - struct btrfs_root *root1; struct btrfs_root *root; - u8 level; root = gfs_info->fs_root; dev_cache = RB_ROOT; @@ -8961,16 +8971,13 @@ static int check_chunks_and_extents(void) } again: - root1 = gfs_info->tree_root; - level = btrfs_header_level(root1->node); - ret = add_root_item_to_list(&normal_trees, root1->root_key.objectid, - root1->node->start, 0, level, 0, NULL); + ret = load_super_root(&normal_trees, gfs_info->tree_root); + if (ret < 0) + goto out; + ret = load_super_root(&normal_trees, gfs_info->chunk_root); if (ret < 0) goto out; - root1 = gfs_info->chunk_root; - level = btrfs_header_level(root1->node); - ret = add_root_item_to_list(&normal_trees, root1->root_key.objectid, - root1->node->start, 0, level, 0, NULL); + ret = load_super_root(&normal_trees, gfs_info->block_group_root); if (ret < 0) goto out; diff --git a/common/repair.c b/common/repair.c index f8c3f89c..9071e627 100644 --- a/common/repair.c +++ b/common/repair.c @@ -149,6 +149,9 @@ int btrfs_mark_used_tree_blocks(struct btrfs_fs_info *fs_info, ret = traverse_tree_blocks(tree, fs_info->chunk_root->node, 0); if (!ret) ret = traverse_tree_blocks(tree, fs_info->tree_root->node, 1); + if (!ret && fs_info->block_group_root) + ret = traverse_tree_blocks(tree, + fs_info->block_group_root->node, 0); return ret; } From patchwork Wed Nov 10 20:14:35 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612915 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C0A7AC433FE for ; Wed, 10 Nov 2021 20:15:36 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id AAAB961241 for ; Wed, 10 Nov 2021 20:15:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233007AbhKJUST (ORCPT ); Wed, 10 Nov 2021 15:18:19 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36702 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232824AbhKJUSM (ORCPT ); Wed, 10 Nov 2021 15:18:12 -0500 Received: from mail-qv1-xf31.google.com (mail-qv1-xf31.google.com [IPv6:2607:f8b0:4864:20::f31]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F12A3C061764 for ; Wed, 10 Nov 2021 12:15:23 -0800 (PST) Received: by mail-qv1-xf31.google.com with SMTP id s9so2621797qvk.12 for ; Wed, 10 Nov 2021 12:15:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=SKGRoZVyRIhIFS9j5yih7mnRt9o7yGL40NFu4E9zMZ8=; b=b5RmU1ZEMmfBp0/FXC+NREO0+Z9nWWCQ50h3iOiNBgttc9H1SwLYSDlwZSbNRxf8ez dCCWW7WoGy/XaWQFS6HLewUqCSkQyISV+M/f3PBm2BYsnub8OCpw8qtRaepYwqqLvHYv dKOtXOP75t1EgF2+6qJcExF78e/NeHj0vXcg+B+t1+c1WZJ1TwVhhBOX7DXfHQjYJOyk U0vA3EdWv0hw0KBhRYkWZuVEHNPEHznWijMkvtbb3dKHVC0xJD8OJLV8Vu82lrkZqTA6 LS3klhguDtDNyb6Vj8kRG6JeQnIPBWQrlNayEWdYV1OCMLhROmAAIZ9Wj5Vy6uft2NhK ddoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=SKGRoZVyRIhIFS9j5yih7mnRt9o7yGL40NFu4E9zMZ8=; b=C2yst83CeMCv33YmksVxd6133C8Fe/VEa6X9mpaSzOzFHg5r5LL+zQHOcDQKGlWAmC ipn+Oc2lFoZn8+mMlPFimL9Sou/BpucGkUWlM/FX+gljmycimlJxQKavrMFoVb2NF5gl VXJ/ZqpfoIq8SNUfbFy42pFzuQPk+8xUS9LckgEnDt7JdT9Os5bOPGKOH67mfO2jjSAN FkMkRNficjx8Bx3PmKTdGmJ7GQJxTet0dWJVVrpcKCVsn1k2qtzmKRLNhmqV0s1CJluJ /Xq6dIIJmSKtDfG96NYo37prq1AC5/oIoZ/tavZDp3Qus9+lnUbl9gx6m1Vz46NlJnXS V2Rg== X-Gm-Message-State: AOAM533sw3GC97QZZ4vRLS6jLRWim5AzloYKyHxBbGZpNTE3gMfTVabC dxi0HZW5mqizZAto9tK5A43zo8rukhDWgg== X-Google-Smtp-Source: ABdhPJzzEr9rzK9OlIchu0kEwbGHhS2e0DWOScb9fUgjFvhGl6/Rk8ozQ09qAwsL9d11v1Rc/OOw2Q== X-Received: by 2002:ad4:5f88:: with SMTP id jp8mr1320444qvb.57.1636575322920; Wed, 10 Nov 2021 12:15:22 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id w9sm495296qkp.12.2021.11.10.12.15.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:15:21 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 23/30] btrfs-progs: load the number of global roots into the fs_info Date: Wed, 10 Nov 2021 15:14:35 -0500 Message-Id: <41917010546bdd5fa0ff84a0cbf0947d14818967.1636575147.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We need to know how many global roots we have in order to round robin assign block groups to their specific global root. Signed-off-by: Josef Bacik --- kernel-shared/ctree.h | 2 ++ kernel-shared/disk-io.c | 42 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/kernel-shared/ctree.h b/kernel-shared/ctree.h index 27e31e03..c7346fee 100644 --- a/kernel-shared/ctree.h +++ b/kernel-shared/ctree.h @@ -1262,6 +1262,8 @@ struct btrfs_fs_info { u32 sectorsize; u32 stripesize; + u64 num_global_roots; + /* * Zone size > 0 when in ZONED mode, otherwise it's used for a check * if the mode is enabled diff --git a/kernel-shared/disk-io.c b/kernel-shared/disk-io.c index 9295cb5c..de868085 100644 --- a/kernel-shared/disk-io.c +++ b/kernel-shared/disk-io.c @@ -1450,6 +1450,44 @@ int btrfs_setup_chunk_tree_and_device_map(struct btrfs_fs_info *fs_info, return 0; } +static int btrfs_get_global_roots_count(struct btrfs_fs_info *fs_info) +{ + struct btrfs_key key = { + .objectid = BTRFS_EXTENT_TREE_OBJECTID, + .type = BTRFS_ROOT_ITEM_KEY, + .offset = (u64)-1, + }; + struct btrfs_path *path; + int ret; + + if (!btrfs_fs_incompat(fs_info, EXTENT_TREE_V2)) + return 0; + + path = btrfs_alloc_path(); + if (!path) + return -ENOMEM; + ret = btrfs_search_slot(NULL, fs_info->tree_root, &key, path, 0, 0); + if (ret < 0) + goto out; + if (ret == 0) { + ret = -EINVAL; + error("Found a corrupt root item looking for global roots count"); + goto out; + } + ret = btrfs_previous_item(fs_info->tree_root, path, key.objectid, + key.type); + if (ret) { + ret = -EINVAL; + error("Didn't find a extent root looking for global roots count"); + goto out; + } + btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]); + fs_info->num_global_roots = key.offset + 1; +out: + btrfs_free_path(path); + return ret; +} + static struct btrfs_fs_info *__open_ctree_fd(int fp, struct open_ctree_flags *ocf) { struct btrfs_fs_info *fs_info; @@ -1596,6 +1634,10 @@ static struct btrfs_fs_info *__open_ctree_fd(int fp, struct open_ctree_flags *oc !fs_info->ignore_chunk_tree_error) goto out_chunk; + ret = btrfs_get_global_roots_count(fs_info); + if (ret && !(flags & OPEN_CTREE_PARTIAL)) + goto out_chunk; + return fs_info; out_chunk: From patchwork Wed Nov 10 20:14:36 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612909 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B6B8DC433F5 for ; Wed, 10 Nov 2021 20:15:36 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 9D9086109F for ; Wed, 10 Nov 2021 20:15:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233055AbhKJUSU (ORCPT ); Wed, 10 Nov 2021 15:18:20 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36708 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232850AbhKJUSN (ORCPT ); Wed, 10 Nov 2021 15:18:13 -0500 Received: from mail-qt1-x832.google.com (mail-qt1-x832.google.com [IPv6:2607:f8b0:4864:20::832]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 70414C061764 for ; Wed, 10 Nov 2021 12:15:25 -0800 (PST) Received: by mail-qt1-x832.google.com with SMTP id n15so3351848qta.0 for ; Wed, 10 Nov 2021 12:15:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=fzk10UiYe8dmnumDviLBZk8cB1wJHzBBqErKSxm/ZmI=; b=S0WwrdvR2V2hK7EEOr5X9kKnIzfA7mgt0u3XYL4fmf8rJjMvxafpde4rG4B16BSHDi f0Clb5fcSyHug2qLCtXcoe4UqxD3vMumqTXljLQiot29rJyOY2Ulb1JZtGC7vqai3oRO E6DZTmOuOsuMpzin5GtVXGpvzELYuard0g2T/mxrLP2/XwjPeObfcWY8+Nl01eqDJN+4 1M1x9cN+csAgBodYToO1P3IkgRsNNADIE/CIJ1vtwCP/DXVcUTwgFK8FU5cU+y0hBJsn e9OBYsu9TOl58m1oRTVmQjpzbjuvlOq916xFouCsyJ1lNVhevi2XV7cwSBObWoie517U A2uA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=fzk10UiYe8dmnumDviLBZk8cB1wJHzBBqErKSxm/ZmI=; b=KKqPg24O95kv1/wz+WKfoFQ7sg4T9zr8Z9ZvjDLn63ioINn1tMdsvBZeGRguNd/ILH ypigPeF3tEpqlJb+8yVMDXufuIfEbqTIKBLnXXlPz5yogUG9AFTsCoq8EXk5ekdMb8gC 6udZhQI93fZtFgN0RSTD4ZFEfwQqU+PxcivtAMTyGAifkQZD+KXjcEhisWKHu7+zcCTc pSg1zjYnewm/08Vi+82+MhCTGH/xRmVpCFJ4lDsWo9ULSa0n89Ri1kafhWh3BchWgxtz 2DmJlKheILiybkRIivLC/2B7Wp4zaa0wnZkrji1DExQNL/otRcWCSlO7zUMCPMfPF6gH vCCg== X-Gm-Message-State: AOAM531EOiJmivyt3MuChJ6y0dlvLW6OmZbTSIFJJYbuokWCkHchbYfZ 5iGkq9Eb8Y0tOBrSFCQW6cvFlkZFUDT0og== X-Google-Smtp-Source: ABdhPJyFiVSc0OqbH8UbrBidZG2dQRdGP5r+MnMe9mXdOYKe3cKBERHkEHeHDwV/xeDahR0yz+EyyQ== X-Received: by 2002:a05:622a:1cd:: with SMTP id t13mr1949600qtw.31.1636575324310; Wed, 10 Nov 2021 12:15:24 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id bi18sm410689qkb.29.2021.11.10.12.15.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:15:23 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 24/30] btrfs-progs: handle the per-block group global root id Date: Wed, 10 Nov 2021 15:14:36 -0500 Message-Id: <8f4dfa66859d62dabb45639878e165704f8451cd.1636575147.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We will now be using block_group->chunk_objectid to point at the global root id for this particular block group. For now we'll assign this based on mod'ing the offset of the block group against the number of global root id's and handle the block_group_item updating appropriately. Signed-off-by: Josef Bacik --- kernel-shared/ctree.h | 2 ++ kernel-shared/disk-io.c | 24 ++++++++++++++++++++++-- kernel-shared/disk-io.h | 1 + kernel-shared/extent-tree.c | 24 ++++++++++++++++++++++-- kernel-shared/free-space-tree.c | 3 +++ 5 files changed, 50 insertions(+), 4 deletions(-) diff --git a/kernel-shared/ctree.h b/kernel-shared/ctree.h index c7346fee..3914000d 100644 --- a/kernel-shared/ctree.h +++ b/kernel-shared/ctree.h @@ -1182,6 +1182,8 @@ struct btrfs_block_group { */ u64 alloc_offset; u64 write_offset; + + u64 global_root_id; }; struct btrfs_device; diff --git a/kernel-shared/disk-io.c b/kernel-shared/disk-io.c index de868085..cb871db7 100644 --- a/kernel-shared/disk-io.c +++ b/kernel-shared/disk-io.c @@ -798,13 +798,33 @@ struct btrfs_root *btrfs_global_root(struct btrfs_fs_info *fs_info, return NULL; } +u64 btrfs_global_root_id(struct btrfs_fs_info *fs_info, u64 bytenr) +{ + struct btrfs_block_group *block_group; + u64 ret = 0; + + if (!btrfs_fs_incompat(fs_info, EXTENT_TREE_V2)) + return ret; + + /* + * We use this because we won't have this many global roots, and -1 is + * special, so we need something that'll not be found if we have any + * errors from here on. + */ + ret = BTRFS_LAST_FREE_OBJECTID; + block_group = btrfs_lookup_first_block_group(fs_info, bytenr); + if (block_group) + ret = block_group->global_root_id; + return ret; +} + struct btrfs_root *btrfs_csum_root(struct btrfs_fs_info *fs_info, u64 bytenr) { struct btrfs_key key = { .objectid = BTRFS_CSUM_TREE_OBJECTID, .type = BTRFS_ROOT_ITEM_KEY, - .offset = 0, + .offset = btrfs_global_root_id(fs_info, bytenr), }; return btrfs_global_root(fs_info, &key); @@ -816,7 +836,7 @@ struct btrfs_root *btrfs_extent_root(struct btrfs_fs_info *fs_info, struct btrfs_key key = { .objectid = BTRFS_EXTENT_TREE_OBJECTID, .type = BTRFS_ROOT_ITEM_KEY, - .offset = 0, + .offset = btrfs_global_root_id(fs_info, bytenr), }; return btrfs_global_root(fs_info, &key); diff --git a/kernel-shared/disk-io.h b/kernel-shared/disk-io.h index a96a9dfb..e2c2f3d9 100644 --- a/kernel-shared/disk-io.h +++ b/kernel-shared/disk-io.h @@ -221,6 +221,7 @@ struct btrfs_root *btrfs_csum_root(struct btrfs_fs_info *fs_info, u64 bytenr); struct btrfs_root *btrfs_extent_root(struct btrfs_fs_info *fs_inf, u64 bytenr); struct btrfs_root *btrfs_global_root(struct btrfs_fs_info *fs_info, struct btrfs_key *key); +u64 btrfs_global_root_id(struct btrfs_fs_info *fs_info, u64 bytenr); int btrfs_global_root_insert(struct btrfs_fs_info *fs_info, struct btrfs_root *root); diff --git a/kernel-shared/extent-tree.c b/kernel-shared/extent-tree.c index a1c061fa..1469f5c3 100644 --- a/kernel-shared/extent-tree.c +++ b/kernel-shared/extent-tree.c @@ -1561,7 +1561,7 @@ static int update_block_group_item(struct btrfs_trans_handle *trans, btrfs_set_stack_block_group_used(&bgi, cache->used); btrfs_set_stack_block_group_flags(&bgi, cache->flags); btrfs_set_stack_block_group_chunk_objectid(&bgi, - BTRFS_FIRST_CHUNK_TREE_OBJECTID); + cache->global_root_id); write_extent_buffer(leaf, &bgi, bi, sizeof(bgi)); btrfs_mark_buffer_dirty(leaf); fail: @@ -2658,6 +2658,7 @@ static int read_block_group_item(struct btrfs_block_group *cache, sizeof(bgi)); cache->used = btrfs_stack_block_group_used(&bgi); cache->flags = btrfs_stack_block_group_flags(&bgi); + cache->global_root_id = btrfs_stack_block_group_chunk_objectid(&bgi); return 0; } @@ -2765,6 +2766,24 @@ error: return ret; } +/* + * For extent tree v2 we use the block_group_item->chunk_offset to point at our + * global root id. For v1 it's always set to BTRFS_FIRST_CHUNK_TREE_OBJECTID. + */ +static u64 calculate_global_root_id(struct btrfs_fs_info *fs_info, u64 offset) +{ + u64 div = SZ_1G; + + if (!btrfs_fs_incompat(fs_info, EXTENT_TREE_V2)) + return BTRFS_FIRST_CHUNK_TREE_OBJECTID; + + /* If we have a smaller fs index based on 128m. */ + if (btrfs_super_total_bytes(fs_info->super_copy) <= (SZ_1G * 10ULL)) + div = SZ_128M; + + return (div_u64(offset, div) % fs_info->num_global_roots); +} + struct btrfs_block_group * btrfs_add_block_group(struct btrfs_fs_info *fs_info, u64 bytes_used, u64 type, u64 chunk_offset, u64 size) @@ -2776,6 +2795,7 @@ btrfs_add_block_group(struct btrfs_fs_info *fs_info, u64 bytes_used, u64 type, BUG_ON(!cache); cache->start = chunk_offset; cache->length = size; + cache->global_root_id = calculate_global_root_id(fs_info, chunk_offset); ret = btrfs_load_block_group_zone_info(fs_info, cache); BUG_ON(ret); @@ -2806,7 +2826,7 @@ static int insert_block_group_item(struct btrfs_trans_handle *trans, btrfs_set_stack_block_group_used(&bgi, block_group->used); btrfs_set_stack_block_group_chunk_objectid(&bgi, - BTRFS_FIRST_CHUNK_TREE_OBJECTID); + block_group->global_root_id); btrfs_set_stack_block_group_flags(&bgi, block_group->flags); key.objectid = block_group->start; key.type = BTRFS_BLOCK_GROUP_ITEM_KEY; diff --git a/kernel-shared/free-space-tree.c b/kernel-shared/free-space-tree.c index 896bd3a2..a82865d3 100644 --- a/kernel-shared/free-space-tree.c +++ b/kernel-shared/free-space-tree.c @@ -34,6 +34,9 @@ static struct btrfs_root *btrfs_free_space_root(struct btrfs_fs_info *fs_info, .offset = 0, }; + if (btrfs_fs_incompat(fs_info, EXTENT_TREE_V2)) + key.offset = block_group->global_root_id; + return btrfs_global_root(fs_info, &key); } From patchwork Wed Nov 10 20:14:37 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612907 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D4C9BC433EF for ; Wed, 10 Nov 2021 20:15:36 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B915561250 for ; Wed, 10 Nov 2021 20:15:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233102AbhKJUSU (ORCPT ); Wed, 10 Nov 2021 15:18:20 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36714 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232898AbhKJUSO (ORCPT ); Wed, 10 Nov 2021 15:18:14 -0500 Received: from mail-qk1-x733.google.com (mail-qk1-x733.google.com [IPv6:2607:f8b0:4864:20::733]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 04BE6C061767 for ; Wed, 10 Nov 2021 12:15:26 -0800 (PST) Received: by mail-qk1-x733.google.com with SMTP id az8so3705941qkb.2 for ; Wed, 10 Nov 2021 12:15:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=hK+DUEse65OIeR4kIxbcnXMkjLbLFWKs91jzLeYR7rg=; b=uy0LSjMBkq9wreFbne3KD4lFHqm87y96McLu5z9aj75tHbT4AHaDYJkCJWrC1Fh9zd 4tL8wJ4j5Rz+qiPjrSoTt9EoRyFj8KOgTvraNjgUiBRMuAgAqg3TMiMuSywK002aBD5q gzOKN6liS0UTTm1yZRNBmIV5IJ19kufe9snQEk8LDLs8DH4zHchOeh7BfqDyHrkoVWty BkY5RQKsH/xcYIrs7VqyMWS+r/+j562fkXZlydinBq71Wh+uh/wr3W3CBV7N/iah5g71 KilhjON7fzeIBVC6fjtxDsOcrUNO3KdzJjiKMpBmgC1phCk6ZKXivJwVNj4h0GNB71+Y DMeg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=hK+DUEse65OIeR4kIxbcnXMkjLbLFWKs91jzLeYR7rg=; b=8FPTRpw2chql5gQCXsBJ9D56xQI3v+SvaUaC/7XED8VyIolL6/IXpWq3FwzfLIuMsr EXvGNe5BTVxi5FcgN60Wx0em5n2yhN6Z7EaEJYJiee7nzgTGutpZQL7L94wECw0fIZ+5 ri5CxC3gNgaRC/QuRLFWTyO7jZt5vKzc+BSrEQWg39Ozud+FOTNzCBFwR5OpTfklWXCt lcWJFd0e8AnJOSP2DoJ8Tj5A5UyGehBTc5WiKJOwfylnAxaGE7IQ2Gd8dR5qgZyIEZXK rjsDa+UdQATs2WkR2HG96mV4KaTjb/SvCDN8eBDRUkb4LtEAJUAwImFgBMUBvPusvFJE zyqQ== X-Gm-Message-State: AOAM533iiGlt4G53fOpq7/L7ctsyv8zSsS6iQe/bjg7P9tJyJyyV9ukX l7qz97T526GTIBUM8v9hUzIproEEcjEEog== X-Google-Smtp-Source: ABdhPJyURuLY1Wb+92mpgYarvRZSeaxhxv9W3rCnOl+DwsLcv4KO93EU/qSArDbctHo3HlVHPhPt0A== X-Received: by 2002:a05:620a:d81:: with SMTP id q1mr1801278qkl.432.1636575325858; Wed, 10 Nov 2021 12:15:25 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id i67sm379823qkd.90.2021.11.10.12.15.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:15:25 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 25/30] btrfs-progs: add a btrfs_delete_and_free_root helper Date: Wed, 10 Nov 2021 15:14:37 -0500 Message-Id: <97aad5a2f5d87b260b407bcea2b62bb6f3a26d76.1636575147.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org The free space tree code already does this, but we need it for cleaning up per block group roots. Abstract this code out into a helper so that we can use it in multiple places in the future. Signed-off-by: Josef Bacik --- kernel-shared/disk-io.c | 25 +++++++++++++++++++++++++ kernel-shared/disk-io.h | 2 ++ kernel-shared/free-space-tree.c | 24 +++--------------------- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/kernel-shared/disk-io.c b/kernel-shared/disk-io.c index cb871db7..13234605 100644 --- a/kernel-shared/disk-io.c +++ b/kernel-shared/disk-io.c @@ -2367,6 +2367,31 @@ int btrfs_set_buffer_uptodate(struct extent_buffer *eb) return set_extent_buffer_uptodate(eb); } +int btrfs_delete_and_free_root(struct btrfs_trans_handle *trans, + struct btrfs_root *root) +{ + struct btrfs_fs_info *fs_info = root->fs_info; + struct btrfs_root *tree_root = fs_info->tree_root; + int ret; + + ret = btrfs_del_root(trans, tree_root, &root->root_key); + if (ret) + return ret; + + list_del(&root->dirty_list); + ret = clean_tree_block(root->node); + if (ret) + return ret; + ret = btrfs_free_tree_block(trans, root, root->node, 0, 1); + if (ret) + return ret; + rb_erase(&root->rb_node, &fs_info->global_roots_tree); + free_extent_buffer(root->node); + free_extent_buffer(root->commit_root); + kfree(root); + return 0; +} + struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans, struct btrfs_fs_info *fs_info, u64 objectid) diff --git a/kernel-shared/disk-io.h b/kernel-shared/disk-io.h index e2c2f3d9..fa4d41f3 100644 --- a/kernel-shared/disk-io.h +++ b/kernel-shared/disk-io.h @@ -217,6 +217,8 @@ int btrfs_fs_roots_compare_roots(struct rb_node *node1, struct rb_node *node2); struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans, struct btrfs_fs_info *fs_info, u64 objectid); +int btrfs_delete_and_free_root(struct btrfs_trans_handle *trans, + struct btrfs_root *root); struct btrfs_root *btrfs_csum_root(struct btrfs_fs_info *fs_info, u64 bytenr); struct btrfs_root *btrfs_extent_root(struct btrfs_fs_info *fs_inf, u64 bytenr); struct btrfs_root *btrfs_global_root(struct btrfs_fs_info *fs_info, diff --git a/kernel-shared/free-space-tree.c b/kernel-shared/free-space-tree.c index a82865d3..0a13b1d6 100644 --- a/kernel-shared/free-space-tree.c +++ b/kernel-shared/free-space-tree.c @@ -1257,27 +1257,9 @@ int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info) if (ret) goto abort; - ret = btrfs_del_root(trans, tree_root, &free_space_root->root_key); - if (ret) - goto abort; - - list_del(&free_space_root->dirty_list); - - ret = clean_tree_block(free_space_root->node); - if (ret) - goto abort; - ret = btrfs_free_tree_block(trans, free_space_root, - free_space_root->node, 0, 1); - if (ret) - goto abort; - - rb_erase(&free_space_root->rb_node, &fs_info->global_roots_tree); - free_extent_buffer(free_space_root->node); - free_extent_buffer(free_space_root->commit_root); - kfree(free_space_root); - - ret = btrfs_commit_transaction(trans, tree_root); - + ret = btrfs_delete_and_free_root(trans, free_space_root); + if (!ret) + ret = btrfs_commit_transaction(trans, tree_root); abort: return ret; } From patchwork Wed Nov 10 20:14:38 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612911 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DBF7FC4332F for ; Wed, 10 Nov 2021 20:15:36 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C6B7461241 for ; Wed, 10 Nov 2021 20:15:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233120AbhKJUSV (ORCPT ); Wed, 10 Nov 2021 15:18:21 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36724 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232911AbhKJUSQ (ORCPT ); Wed, 10 Nov 2021 15:18:16 -0500 Received: from mail-qk1-x72c.google.com (mail-qk1-x72c.google.com [IPv6:2607:f8b0:4864:20::72c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 46A02C0613F5 for ; Wed, 10 Nov 2021 12:15:28 -0800 (PST) Received: by mail-qk1-x72c.google.com with SMTP id bl12so3645284qkb.13 for ; Wed, 10 Nov 2021 12:15:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=AkCQ2BcBy4V2mlHKFbwaIlcHABtcv/nGbJ+ZWF8MQr8=; b=upWhVrDm3xaaqym66OBpq7hQeoOg+chVqgTp+oMyUCOH7JJu4OXrVJ+Jl1tv0I7kbL nateOkz2Ohc1/mdAWrMgq1BRCD0fj2faIIKtNbeYFxP1Astb6oZ8l/X1pg0PTptURBsm lrDNIQJ5n5sxVydBZ1LXFtYFWSVJZa3Dcf2PCYmLGa/m646CKl4xN0jiaOnVTWc4bJqH 1nvsbDJmr04R/EWxuvVMa3r7JONkJICVMvbTgxjnVYXEh2Uob/uBIpQFwNoLCwbn3HmT CCQLfRFLd0Dab3rOSB98QXArlz8kbecYtbfM98QvwmYYKO21sfeyG+ybP3Z0G5L6lk2D Nd/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=AkCQ2BcBy4V2mlHKFbwaIlcHABtcv/nGbJ+ZWF8MQr8=; b=6bMnhu6BdAG5PuZKsjlt3BLJJwG5tgbOgu5XvIzYyjE64eHNSSNXQ0MyWUJJMmgaTj uLG8E/YJ7fIwkBk6SWwiGfr5m6QcyltMqIzUAo3MG51oiiTFGimOUwTfyEbeW8ITcXJ0 044KOhirkUW1yln9YXj6Wq3WoqNq0GndsTcZcJo9fiJqBhG6fnbGRj3BmqN0CgOQ/UaU Jyk7/9B7X46cKWZtH7PeTU+Greh7/jhy/fA9STb36hMaTb82+8m88mPnBsJhraGjgIic e1QzqHkNjVvFohDtEf1G0CjH62sWWMp/gVVReA3+QvuMDWSgX58sDivPF+6MXhH4ZSI1 21Dw== X-Gm-Message-State: AOAM5306HtBH87DuYW3fKvd2Bnx70kfHoKS/iwQHn9UiloG6LT3plGsH fnjtHHjDWhC3HSSKiGir20Jfi24fv+77bw== X-Google-Smtp-Source: ABdhPJyVH7yzkTNxFJnInEp1vTQGlCIeQ8K+gGvDc5bMORs/IXp8VaR3FIGB8yjhrb5e9li8Zo5fnA== X-Received: by 2002:a05:620a:298e:: with SMTP id r14mr1712968qkp.509.1636575327224; Wed, 10 Nov 2021 12:15:27 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id o15sm458385qtm.8.2021.11.10.12.15.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:15:26 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 26/30] btrfs-progs: make btrfs_clear_free_space_tree extent tree v2 aware Date: Wed, 10 Nov 2021 15:14:38 -0500 Message-Id: <67784f92356144887bb350f4769acd5b027e883e.1636575147.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org With extent tree v2 we'll have multiple free space trees, and we can't just unset the feature flags for the free space tree. Fix this to loop through all of the free space trees and clear them out properly. Signed-off-by: Josef Bacik --- kernel-shared/free-space-tree.c | 37 ++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/kernel-shared/free-space-tree.c b/kernel-shared/free-space-tree.c index 0a13b1d6..70306175 100644 --- a/kernel-shared/free-space-tree.c +++ b/kernel-shared/free-space-tree.c @@ -1248,18 +1248,35 @@ int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info) if (IS_ERR(trans)) return PTR_ERR(trans); - features = btrfs_super_compat_ro_flags(fs_info->super_copy); - features &= ~(BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE_VALID | - BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE); - btrfs_set_super_compat_ro_flags(fs_info->super_copy, features); + if (btrfs_fs_incompat(fs_info, EXTENT_TREE_V2)) { + struct btrfs_key key = { + .objectid = BTRFS_FREE_SPACE_TREE_OBJECTID, + .type = BTRFS_ROOT_ITEM_KEY, + .offset = 0, + }; + + while (key.offset < fs_info->num_global_roots) { + free_space_root = btrfs_global_root(fs_info, &key); + ret = clear_free_space_tree(trans, free_space_root); + if (ret) + goto abort; + key.offset++; + } + } else { + features = btrfs_super_compat_ro_flags(fs_info->super_copy); + features &= ~(BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE_VALID | + BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE); + btrfs_set_super_compat_ro_flags(fs_info->super_copy, features); - ret = clear_free_space_tree(trans, free_space_root); - if (ret) - goto abort; + ret = clear_free_space_tree(trans, free_space_root); + if (ret) + goto abort; - ret = btrfs_delete_and_free_root(trans, free_space_root); - if (!ret) - ret = btrfs_commit_transaction(trans, tree_root); + ret = btrfs_delete_and_free_root(trans, free_space_root); + if (ret) + goto abort; + } + ret = btrfs_commit_transaction(trans, tree_root); abort: return ret; } From patchwork Wed Nov 10 20:14:39 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612913 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id BD9FAC43217 for ; Wed, 10 Nov 2021 20:15:37 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A897F6109F for ; Wed, 10 Nov 2021 20:15:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232824AbhKJUSY (ORCPT ); Wed, 10 Nov 2021 15:18:24 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36736 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232877AbhKJUSS (ORCPT ); Wed, 10 Nov 2021 15:18:18 -0500 Received: from mail-qk1-x735.google.com (mail-qk1-x735.google.com [IPv6:2607:f8b0:4864:20::735]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8775EC061764 for ; Wed, 10 Nov 2021 12:15:30 -0800 (PST) Received: by mail-qk1-x735.google.com with SMTP id r8so3693548qkp.4 for ; Wed, 10 Nov 2021 12:15:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=TjOid4Bvsqc58RjLt+F3EaWa1C5KV09HVSsJcS/ZFk4=; b=wqc/yw1DsCqompVm/mHHo6xkmEkrJ3NLQj2BVRjyZNDf+xnPq1aE+GOjkKZgLZFFkX nPWFbR2Qb2q+/AoykvywUvGwdIPtjKFBbTGwGUbBKF3nUnOs/TeycqXgMhvv0JZDAiWg +PKHi+Ic/5sX5QylDrp7b4eCogxSz/AIgoOsf/Bn7FDA+MVcwi5+gfnB9oYBxTwr6pso Y0aZ6MSAYKtXOHYJRB8c3fHN8mF6Fwk7+LvhMTYICHdhx4PDqcO5W5AFOQXuJJdwIpjA cqvWpppy6Hu/m5jaPxm0TEyqC/bOQWzDGnEqRVUP68QjOgBFNEqbgag/PvqDsj/7g32k DGeA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=TjOid4Bvsqc58RjLt+F3EaWa1C5KV09HVSsJcS/ZFk4=; b=od46IVAdYDkR5MTnQkF1A3x1l9Xxxh7VEkUB8cYywniGJ1b35+5fj3OM7MVjYLEf/X PFP12fos/4ZeBvvwz9PLK2ch2B6c9U/yNJRf487pYDyI3TaPeyEs3HuGpRe5pFlNUwOA lw3TvpJFK1/k6ersea2wI2BNXTeQGBYujQeFj3p6LwAa7EbspVzUDD2p75rP3hrwrQN6 tEIKld2SmUiVDyfRnIwdPmgzQ6k3UZK3ManOL0Kw1kO8eIUYJS2tWZrevWQEcAw8Gb7h EUunDNAsR1r1w8MzU+6fH/MePIzI21LKujzEecvHYu0VSq2yqLlRETHMehIFNqj3PWqe KwMg== X-Gm-Message-State: AOAM533nu37ZTgza4aIdz3XhWrfGAA/Ba1Qrd/lC+RhNZYe+dMi5UoYl +YdxTtlvjG2hp5JqKprlkjBsKUAPPmgXEQ== X-Google-Smtp-Source: ABdhPJxC5eiL/6fQS1oEeJAqVB9Lxcm8rcxyIgMO4Uk7rk1aZNpK/1vdrWfSZ0YYXuv14np40zYtDQ== X-Received: by 2002:a05:620a:458c:: with SMTP id bp12mr1759553qkb.409.1636575329433; Wed, 10 Nov 2021 12:15:29 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id o18sm494689qta.34.2021.11.10.12.15.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:15:28 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 27/30] btrfs-progs: make btrfs_create_tree take a key for the root key Date: Wed, 10 Nov 2021 15:14:39 -0500 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We're going to start create global roots from mkfs, and we need to have a offset set for the root key. Make the btrfs_create_tree() take a key for the root_key instead of just the objectid so we can setup these new style roots properly. Signed-off-by: Josef Bacik --- kernel-shared/disk-io.c | 21 ++++++++------------- kernel-shared/disk-io.h | 2 +- kernel-shared/free-space-tree.c | 7 +++++-- mkfs/main.c | 13 ++++++++++--- 4 files changed, 24 insertions(+), 19 deletions(-) diff --git a/kernel-shared/disk-io.c b/kernel-shared/disk-io.c index 13234605..0e200714 100644 --- a/kernel-shared/disk-io.c +++ b/kernel-shared/disk-io.c @@ -2394,25 +2394,22 @@ int btrfs_delete_and_free_root(struct btrfs_trans_handle *trans, struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans, struct btrfs_fs_info *fs_info, - u64 objectid) + struct btrfs_key *key) { struct extent_buffer *leaf; struct btrfs_root *tree_root = fs_info->tree_root; struct btrfs_root *root; - struct btrfs_key key; int ret = 0; root = kzalloc(sizeof(*root), GFP_KERNEL); if (!root) return ERR_PTR(-ENOMEM); - btrfs_setup_root(root, fs_info, objectid); - root->root_key.objectid = objectid; - root->root_key.type = BTRFS_ROOT_ITEM_KEY; - root->root_key.offset = 0; + btrfs_setup_root(root, fs_info, key->objectid); + memcpy(&root->root_key, key, sizeof(struct btrfs_key)); - leaf = btrfs_alloc_free_block(trans, root, fs_info->nodesize, objectid, - NULL, 0, 0, 0); + leaf = btrfs_alloc_free_block(trans, root, fs_info->nodesize, + root->root_key.objectid, NULL, 0, 0, 0); if (IS_ERR(leaf)) { ret = PTR_ERR(leaf); leaf = NULL; @@ -2423,7 +2420,7 @@ struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans, btrfs_set_header_bytenr(leaf, leaf->start); btrfs_set_header_generation(leaf, trans->transid); btrfs_set_header_backref_rev(leaf, BTRFS_MIXED_BACKREF_REV); - btrfs_set_header_owner(leaf, objectid); + btrfs_set_header_owner(leaf, root->root_key.objectid); root->node = leaf; write_extent_buffer(leaf, fs_info->fs_devices->metadata_uuid, btrfs_header_fsid(), BTRFS_FSID_SIZE); @@ -2448,10 +2445,8 @@ struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans, memset(root->root_item.uuid, 0, BTRFS_UUID_SIZE); root->root_item.drop_level = 0; - key.objectid = objectid; - key.type = BTRFS_ROOT_ITEM_KEY; - key.offset = 0; - ret = btrfs_insert_root(trans, tree_root, &key, &root->root_item); + ret = btrfs_insert_root(trans, tree_root, &root->root_key, + &root->root_item); if (ret) goto fail; diff --git a/kernel-shared/disk-io.h b/kernel-shared/disk-io.h index fa4d41f3..9214b56f 100644 --- a/kernel-shared/disk-io.h +++ b/kernel-shared/disk-io.h @@ -216,7 +216,7 @@ int write_and_map_eb(struct btrfs_fs_info *fs_info, struct extent_buffer *eb); int btrfs_fs_roots_compare_roots(struct rb_node *node1, struct rb_node *node2); struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans, struct btrfs_fs_info *fs_info, - u64 objectid); + struct btrfs_key *key); int btrfs_delete_and_free_root(struct btrfs_trans_handle *trans, struct btrfs_root *root); struct btrfs_root *btrfs_csum_root(struct btrfs_fs_info *fs_info, u64 bytenr); diff --git a/kernel-shared/free-space-tree.c b/kernel-shared/free-space-tree.c index 70306175..23fb67bf 100644 --- a/kernel-shared/free-space-tree.c +++ b/kernel-shared/free-space-tree.c @@ -1475,14 +1475,17 @@ int btrfs_create_free_space_tree(struct btrfs_fs_info *fs_info) struct btrfs_root *free_space_root; struct btrfs_block_group *block_group; u64 start = BTRFS_SUPER_INFO_OFFSET + BTRFS_SUPER_INFO_SIZE; + struct btrfs_key root_key = { + .objectid = BTRFS_FREE_SPACE_TREE_OBJECTID, + .type = BTRFS_ROOT_ITEM_KEY, + }; int ret; trans = btrfs_start_transaction(tree_root, 0); if (IS_ERR(trans)) return PTR_ERR(trans); - free_space_root = btrfs_create_tree(trans, fs_info, - BTRFS_FREE_SPACE_TREE_OBJECTID); + free_space_root = btrfs_create_tree(trans, fs_info, &root_key); if (IS_ERR(free_space_root)) { ret = PTR_ERR(free_space_root); goto abort; diff --git a/mkfs/main.c b/mkfs/main.c index 1653ab32..fd40c70e 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -717,12 +717,15 @@ static int create_data_reloc_tree(struct btrfs_trans_handle *trans) struct btrfs_inode_item *inode; struct btrfs_root *root; struct btrfs_path path; - struct btrfs_key key; + struct btrfs_key key = { + .objectid = BTRFS_DATA_RELOC_TREE_OBJECTID, + .type = BTRFS_ROOT_ITEM_KEY, + }; u64 ino = BTRFS_FIRST_FREE_OBJECTID; char *name = ".."; int ret; - root = btrfs_create_tree(trans, fs_info, BTRFS_DATA_RELOC_TREE_OBJECTID); + root = btrfs_create_tree(trans, fs_info, &key); if (IS_ERR(root)) { ret = PTR_ERR(root); goto out; @@ -782,10 +785,14 @@ static int create_uuid_tree(struct btrfs_trans_handle *trans) { struct btrfs_fs_info *fs_info = trans->fs_info; struct btrfs_root *root; + struct btrfs_key key = { + .objectid = BTRFS_UUID_TREE_OBJECTID, + .type = BTRFS_ROOT_ITEM_KEY, + }; int ret = 0; ASSERT(fs_info->uuid_root == NULL); - root = btrfs_create_tree(trans, fs_info, BTRFS_UUID_TREE_OBJECTID); + root = btrfs_create_tree(trans, fs_info, &key); if (IS_ERR(root)) { ret = PTR_ERR(root); goto out; From patchwork Wed Nov 10 20:14:40 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612917 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6DA87C43219 for ; Wed, 10 Nov 2021 20:15:38 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5CC4361247 for ; Wed, 10 Nov 2021 20:15:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232877AbhKJUSZ (ORCPT ); Wed, 10 Nov 2021 15:18:25 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36742 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233030AbhKJUST (ORCPT ); Wed, 10 Nov 2021 15:18:19 -0500 Received: from mail-qt1-x836.google.com (mail-qt1-x836.google.com [IPv6:2607:f8b0:4864:20::836]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E3DC9C061764 for ; Wed, 10 Nov 2021 12:15:31 -0800 (PST) Received: by mail-qt1-x836.google.com with SMTP id j17so3298380qtx.2 for ; Wed, 10 Nov 2021 12:15:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=/FJNx6VxGzdc1ZIFGXKzziSVuIBNTd7ofz7OLEjtAkM=; b=WH2HqM4BlwNmXWA8IesMWoMzLnVg3W/U6jft4pNgzhRSXQnqOfh5RMAV2qq8P1+0qx I3ovcC0AybEgkMdwKA/gcD/pkjoOcQuAgWbQ9EVpF14xi05XxF7ikGy1TywvZk2W2J+T 2I784LqJpRRbeIca274LkXvhMxf7Z7Y1A8qzQ1wZWqbyMSCc3jFZaiUIcM701t3E++Hk vZq91WSwT/5mgt08uDvg9BO8/w2HaFJxvfZw6KYozlEtbaPzBa3YzokCFm9WVb0H7dxY 9zntkICazMHUNilqJUo2qXubvEhUn9Z81T4fjzG9IrBkpuUfHYLsCY3zKPmFtu0f0Fdy 1Fgg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=/FJNx6VxGzdc1ZIFGXKzziSVuIBNTd7ofz7OLEjtAkM=; b=CHWjvn7lX+cFbTlT+4/KFfYq0V3Rw+eOPwuOUXzJlyl5TazC7qT7q2Up++s61wg86G S4dGPz1k43JzN/3+03M87eJQAF+lz9azi3SWwMh8AOZ7wal4n/RmMAiUKhOqWQ+B5YQj nFNNcgsBVs5Kmttt1YDeb6iCVoWzKL/fCmz/C5bZXDj+KqismGjucoD5RUO4IwpKsiaM oEDWkdhFV4KnR0xH6XU36O9SPysObwcamXLAQghttj06/w7t3EFuKc3fjTiloPfwnZof YAtO1ek4+MqAyoydHgLujHK28+YLrLycx/2TeMeAQPl7aB9ze/O8NOwrhZA2FiuU5z6L dGqA== X-Gm-Message-State: AOAM531Ytf8eyUvHEfJQWM48lfOc0vp7CvOo5f1+1YAZeDivcTYT2vWQ LkPtEWUbbvuVL7cY1Fq+NXDKivUgAnSqDg== X-Google-Smtp-Source: ABdhPJwv2yi9GBOmD6KQrKG/kUogsP8pDXYcTQx7Rw9cHtXf3zdjmpvn4ByqPCyHYPWYwMaT0xlZIg== X-Received: by 2002:ac8:5e10:: with SMTP id h16mr1857141qtx.261.1636575330847; Wed, 10 Nov 2021 12:15:30 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id h11sm462831qkp.46.2021.11.10.12.15.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:15:30 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 28/30] btrfs-progs: mkfs: set chunk_item_objectid properly for extent tree v2 Date: Wed, 10 Nov 2021 15:14:40 -0500 Message-Id: <5615450f3dc9e4847a51205eb57b3fbf9821c036.1636575147.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Our initial block group will use global root id 0 with extent tree v2, so adjust the helper to take the chunk_objectid as an argument, as we'll set this to 0 for extent tree v2 and then BTRFS_FIRST_CHUNK_TREE_OBJECTID for extent tree v1. Signed-off-by: Josef Bacik --- mkfs/common.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mkfs/common.c b/mkfs/common.c index 71589c0d..479b1150 100644 --- a/mkfs/common.c +++ b/mkfs/common.c @@ -192,7 +192,7 @@ static int create_free_space_tree(int fd, struct btrfs_mkfs_config *cfg, static void write_block_group_item(struct extent_buffer *buf, u32 nr, u64 objectid, u64 offset, u64 used, - u32 itemoff) + u64 chunk_objectid, u32 itemoff) { struct btrfs_block_group_item *bg_item; struct btrfs_disk_key disk_key; @@ -207,8 +207,7 @@ static void write_block_group_item(struct extent_buffer *buf, u32 nr, bg_item = btrfs_item_ptr(buf, nr, struct btrfs_block_group_item); btrfs_set_block_group_used(buf, bg_item, used); btrfs_set_block_group_flags(buf, bg_item, BTRFS_BLOCK_GROUP_SYSTEM); - btrfs_set_block_group_chunk_objectid(buf, bg_item, - BTRFS_FIRST_CHUNK_TREE_OBJECTID); + btrfs_set_block_group_chunk_objectid(buf, bg_item, chunk_objectid); } static int create_block_group_tree(int fd, struct btrfs_mkfs_config *cfg, @@ -219,7 +218,7 @@ static int create_block_group_tree(int fd, struct btrfs_mkfs_config *cfg, memset(buf->data + sizeof(struct btrfs_header), 0, cfg->nodesize - sizeof(struct btrfs_header)); - write_block_group_item(buf, 0, bg_offset, bg_size, bg_used, + write_block_group_item(buf, 0, bg_offset, bg_size, bg_used, 0, __BTRFS_LEAF_DATA_SIZE(cfg->nodesize) - sizeof(struct btrfs_block_group_item)); btrfs_set_header_bytenr(buf, cfg->blocks[MKFS_BLOCK_GROUP_TREE]); @@ -404,6 +403,7 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg) write_block_group_item(buf, nritems, system_group_offset, system_group_size, total_used, + BTRFS_FIRST_CHUNK_TREE_OBJECTID, itemoff); add_block_group = false; nritems++; From patchwork Wed Nov 10 20:14:41 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612919 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7F3A0C433EF for ; Wed, 10 Nov 2021 20:15:39 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 6748661241 for ; Wed, 10 Nov 2021 20:15:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232911AbhKJUSZ (ORCPT ); Wed, 10 Nov 2021 15:18:25 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36752 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233121AbhKJUSV (ORCPT ); Wed, 10 Nov 2021 15:18:21 -0500 Received: from mail-qk1-x733.google.com (mail-qk1-x733.google.com [IPv6:2607:f8b0:4864:20::733]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E4C9EC061764 for ; Wed, 10 Nov 2021 12:15:33 -0800 (PST) Received: by mail-qk1-x733.google.com with SMTP id 132so3653332qkj.11 for ; Wed, 10 Nov 2021 12:15:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=4NDH1tuc2pvqldmE4sy7rWt9BZCp5dsON+4fNMVLQ3Y=; b=WrMr9+Hh8TOz87UnQpBAgjFhOz7Px2Bqy6AnpxsdKyL6O7pQVJcPo1PS5SnjhXragK KAcLpf5nGjoLI/+BzaU0xkhI+izIi/HWSOP7cd0z2VHHZmKHGugJ5DearSxuMWHMyQy0 h8T81BGXockDwi8DArCujH1WmWTLv5FocLwhk7ta6XkWNYR0xo+3x6eNGuVG+GPdx0kh WyNQhZOPLfplkBrtnd/oLsigRVSA4W7WcH+7JDhhMIiHmdefl67WaYXvy/z0M7OdDC7i No5ytkSsRCVHD2fvljm7V0nPVdsJSHh0i64yDEUsjKi+fcV7Pts+yNkVYK1Sx9r0giK6 ACUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=4NDH1tuc2pvqldmE4sy7rWt9BZCp5dsON+4fNMVLQ3Y=; b=6T6tuSHIrpvrOJ4YpJvhpBAedKUQF80uJdyFLE770i5HJZWD2wXZX9NBNBGyCBn1+s YupNfETYTUNTEHK600CzxbhNSpusStHVYLAfc0xiPY3fCqNq4j6cVBWx5B/JfDmy4FjC W65uqJH3EFXNNTPRbkmRyC+/KL+KYPKfGeWS98LpOyyTAH2LFNrSq35vySk/dyOB8Ctc uAvk6E4Jvdz87gD7jChSAQFDvndsIix6WKeQ+nL5v9i7PcIJ4aL+AUcZlK+1m4ogiB2q SQn9QrnDHRONi1jgS4dGG53uQnokISDBKajX6AbY5/UQft9RBS7/Olv+GKJPYiJzDW1k F7Vw== X-Gm-Message-State: AOAM5336eeIqZUnZqSU11VPLbb9c7pgCqhX21saCVHARGAclSKV6Rnqs V491tuCF/sT6uO+pJrzeswERdfXB7nOFaQ== X-Google-Smtp-Source: ABdhPJy1RO9jLZEnqhMLjPe7yaHY01qxJuPhMZXamp6DpxixVBQT7mYwCqMyYA9YkPsjLyyogiLKYQ== X-Received: by 2002:a05:620a:407:: with SMTP id 7mr1762132qkp.506.1636575332669; Wed, 10 Nov 2021 12:15:32 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id p18sm449001qtk.76.2021.11.10.12.15.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:15:31 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 29/30] btrfs-progs: mkfs: create the global root's Date: Wed, 10 Nov 2021 15:14:41 -0500 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Now that we have all of the supporting code, add the ability to create all of the global roots for an extent tree v2 fs. This will default to nr_cpu's, but also allow the user to specify how many global roots they would like. Signed-off-by: Josef Bacik --- mkfs/main.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/mkfs/main.c b/mkfs/main.c index fd40c70e..8959fd8b 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -810,6 +810,50 @@ out: return ret; } +static int create_global_root(struct btrfs_trans_handle *trans, u64 objectid, + int root_id) +{ + struct btrfs_fs_info *fs_info = trans->fs_info; + struct btrfs_root *root; + struct btrfs_key key = { + .objectid = objectid, + .type = BTRFS_ROOT_ITEM_KEY, + .offset = root_id, + }; + int ret = 0; + + root = btrfs_create_tree(trans, fs_info, &key); + if (IS_ERR(root)) { + ret = PTR_ERR(root); + goto out; + } + ret = btrfs_global_root_insert(fs_info, root); +out: + if (ret) + btrfs_abort_transaction(trans, ret); + return ret; +} + +static int create_global_roots(struct btrfs_trans_handle *trans, + int nr_global_roots) +{ + int ret, i; + + for (i = 1; i < nr_global_roots; i++) { + ret = create_global_root(trans, BTRFS_EXTENT_TREE_OBJECTID, i); + if (ret) + return ret; + ret = create_global_root(trans, BTRFS_CSUM_TREE_OBJECTID, i); + if (ret) + return ret; + ret = create_global_root(trans, BTRFS_FREE_SPACE_TREE_OBJECTID, i); + if (ret) + return ret; + } + + return 0; +} + static int insert_qgroup_items(struct btrfs_trans_handle *trans, struct btrfs_fs_info *fs_info, u64 qgroupid) @@ -966,13 +1010,18 @@ int BOX_MAIN(mkfs)(int argc, char **argv) struct btrfs_mkfs_config mkfs_cfg; enum btrfs_csum_type csum_type = BTRFS_CSUM_TYPE_CRC32; u64 system_group_size; + int nr_global_roots = sysconf(_SC_NPROCESSORS_ONLN); crc32c_optimization_init(); btrfs_config_init(); while(1) { int c; - enum { GETOPT_VAL_SHRINK = 257, GETOPT_VAL_CHECKSUM }; + enum { + GETOPT_VAL_SHRINK = 257, + GETOPT_VAL_CHECKSUM, + GETOPT_VAL_GLOBAL_ROOTS, + }; static const struct option long_options[] = { { "byte-count", required_argument, NULL, 'b' }, { "csum", required_argument, NULL, @@ -996,6 +1045,7 @@ int BOX_MAIN(mkfs)(int argc, char **argv) { "quiet", 0, NULL, 'q' }, { "verbose", 0, NULL, 'v' }, { "shrink", no_argument, NULL, GETOPT_VAL_SHRINK }, + { "num-global-roots", required_argument, NULL, GETOPT_VAL_GLOBAL_ROOTS }, { "help", no_argument, NULL, GETOPT_VAL_HELP }, { NULL, 0, NULL, 0} }; @@ -1100,6 +1150,9 @@ int BOX_MAIN(mkfs)(int argc, char **argv) case GETOPT_VAL_CHECKSUM: csum_type = parse_csum_type(optarg); break; + case GETOPT_VAL_GLOBAL_ROOTS: + nr_global_roots = (int)arg_strtou64(optarg); + break; case GETOPT_VAL_HELP: default: print_usage(c != GETOPT_VAL_HELP); @@ -1239,6 +1292,11 @@ int BOX_MAIN(mkfs)(int argc, char **argv) if (features & BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2) { features |= BTRFS_FEATURE_INCOMPAT_NO_HOLES; runtime_features |= BTRFS_RUNTIME_FEATURE_FREE_SPACE_TREE; + + if (!nr_global_roots) { + error("you must set a non-zero num-global-roots value"); + exit(1); + } } if (zoned) { @@ -1466,6 +1524,14 @@ int BOX_MAIN(mkfs)(int argc, char **argv) goto error; } + if (features & BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2) { + ret = create_global_roots(trans, nr_global_roots); + if (ret) { + error("failed to create global roots: %d", ret); + goto error; + } + } + ret = make_root_dir(trans, root); if (ret) { error("failed to setup the root directory: %d", ret); From patchwork Wed Nov 10 20:14:42 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12612921 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 12938C433F5 for ; Wed, 10 Nov 2021 20:15:40 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 019ED61247 for ; Wed, 10 Nov 2021 20:15:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233121AbhKJUS0 (ORCPT ); Wed, 10 Nov 2021 15:18:26 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36758 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233141AbhKJUSW (ORCPT ); Wed, 10 Nov 2021 15:18:22 -0500 Received: from mail-qk1-x730.google.com (mail-qk1-x730.google.com [IPv6:2607:f8b0:4864:20::730]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0F112C061766 for ; Wed, 10 Nov 2021 12:15:35 -0800 (PST) Received: by mail-qk1-x730.google.com with SMTP id i9so3705402qki.3 for ; Wed, 10 Nov 2021 12:15:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=VqlW8Ff7L0gtbA1t8/6orQznL1yuBGiq9DS1EvM7OV4=; b=syw13GvioH7GNQo1fIrziZEb5VBtIIvf+CWAzWk0wCZa+XTVzVZPhUS8yU9mom33tj uM2zpXNJk+UP2f8e2k47fp5aGaqIhVwwlLnnByiJLS9t+XLfwJl8EPXljKNxooHCgKrM vRhqUA8h7ckPmwyRevMsXmcZg1aCQo6EtI6wjx8T6xJpk2ArE5wlmMzLRE8WZ617BTFh soaN1taNA8uYDQnNY45yqpg+nNYsx1WEQZyA+43ynWy0EaFPtsloUmmxwQxg0m15wlHR Ln9fzyOKIp7qiayOXEq1P75S1T/+I8bhlcf52h1/aR14D0b70dLoz9toYSTQ93w/sB8p 888g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=VqlW8Ff7L0gtbA1t8/6orQznL1yuBGiq9DS1EvM7OV4=; b=eEn6jSohPo796ETv3BMzaHrhwSCw2UoBxku9dC4fewLQ0MZY8b2jOLUx3TcuGTjxga zNYuTGS5JsR6u6tn7w1OTciQGFpdbaij0Mgna3L1Yb0wR8wauKT3yYxUsEi+vEtFG4zs ZMZNlM4TiKRJti5sIcFDyWLdOk8BlLD/2laXKm5rw61UGsRxLpmFzKctj3qurOV1tXe9 AaoF0pcsxtTmxjRZLjiaM+s6cXvB/LWC92qxSB8teiKPOphsDetmiPrUkq8iNCuylj5a cEIgLmH6Zy4y0UdECKIx+Y9P1w1q9KlHkqoMXfVAlQp9QYYA5yyUit5iKU11cVOQO6FC FkEQ== X-Gm-Message-State: AOAM532EcuSk8F4dr/yMb+oDmFGgPeh5y1MPL+3l3LBCiDL8R4i5yeyV MgfQ/6EgQnTC0TFbvYWnodeOnwMN5HzsJQ== X-Google-Smtp-Source: ABdhPJyRCWbCodUymuppLzIgI4ZmPUfi251pvPLil8Zpcv7q64rVJzCkyQhdrTBnLHKrdGXh5ExGTg== X-Received: by 2002:a05:620a:430d:: with SMTP id u13mr1749020qko.93.1636575333963; Wed, 10 Nov 2021 12:15:33 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id x188sm385891qkd.31.2021.11.10.12.15.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Nov 2021 12:15:33 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 30/30] btrfs-progs: check: don't do the root item check for extent tree v2 Date: Wed, 10 Nov 2021 15:14:42 -0500 Message-Id: <837bbfcf023cc9bd88ac1673d69260eb0e57789b.1636575147.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org With the current set of changes we could probably do this check, but it would involve changing the code quite a bit, and in the future we're not going to track the metadata in the extent tree at all. Since this check was for a very old kernel just skip it for extent tree v2. Signed-off-by: Josef Bacik --- check/main.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/check/main.c b/check/main.c index c28fa2f3..0bd87685 100644 --- a/check/main.c +++ b/check/main.c @@ -10065,6 +10065,9 @@ static int repair_root_items(void) int bad_roots = 0; int need_trans = 0; + if (btrfs_fs_incompat(gfs_info, EXTENT_TREE_V2)) + return 0; + btrfs_init_path(&path); ret = build_roots_info_cache();