From patchwork Fri Nov 5 20:40: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: 12605689 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 9BF5CC433FE for ; Fri, 5 Nov 2021 20:40:55 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 8673A6126A for ; Fri, 5 Nov 2021 20:40:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233035AbhKEUne (ORCPT ); Fri, 5 Nov 2021 16:43:34 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55096 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233106AbhKEUnb (ORCPT ); Fri, 5 Nov 2021 16:43:31 -0400 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 C8708C061714 for ; Fri, 5 Nov 2021 13:40:51 -0700 (PDT) Received: by mail-qt1-x833.google.com with SMTP id g13so7868436qtk.12 for ; Fri, 05 Nov 2021 13:40:51 -0700 (PDT) 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=5VVfLPwzESgxECkpYQUwUfROrecejyuIhmRPNhQu1deupZ5U31lpUzuexDr2cH+wzk ih13u/zaHXF7ferjjnwWkvvti5dSocG2WrktZNiFRCZk76XJSq/HSNFOb5UWK2ONxul+ pDDXm9tQnMCu7drQiWlcotkSRE2hvSy/N0T/wyFXPZ2ix2DFflaUnhqlS7v0PFnBcUBF duooVaGcc2zVZk3mjX0xmJqBePYtZ8lDyEfBktK5ppvlh3LAc2mcp1pCLLrhd4JsCDrM OU2xgYueUwifqtHK676WvM/Qwohci+J9QHLFFul0zXqvMGxZxb5VHGjXi7ccEMA3impr i/hQ== 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=4C7CBVyrvodJCeLbhmMja0CMUOB4ueREPBf3Hru4ne9AUKiYSZboXRCk1xe+YeqBH8 EMjDeuvjEzrnoFXNHrpudRr/qr/k7KyJU8OknYellgd154n/bl2saUd26kVM0+1ahOPL kV2mWYEQCy111VMC0eIxTlZx+1ASiTKLlHCAWIyBeIc2GH9e+B1eOD+2DTtTqt1WX0kP RlxcyIKgCRp55UaYDAX0a+VsUbDrAmLeDMPCjpdpHnqeB9OS1VntNeK/7XdrwRcHjG9o 7Mz/BLkWsIwjpvhuuiYj9iHaYbAqCBUNBGyfExRLMW3CS40CoNUUpG6jhe7EhQKO4jW/ sv9g== X-Gm-Message-State: AOAM530Aokm5kpa8/u6dqRoxQmkCbS1YhvgT/O46BEy6tGvh7ZGugzOK oR+vFCoaRmLdhVzC3Qcd7bN8gQyeI6fNFA== X-Google-Smtp-Source: ABdhPJwcq9OlB6HfoKW4crRtI/yC5fRjd3QvViLDEWABXWU9fvQSNcwUHzZMjwQFdWm/LIdGy4XKGw== X-Received: by 2002:a05:622a:2d5:: with SMTP id a21mr46231690qtx.48.1636144850766; Fri, 05 Nov 2021 13:40:50 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id de26sm3935872qkb.81.2021.11.05.13.40.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:40:50 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 01/22] btrfs-progs: common: allow users to select extent-tree-v2 option Date: Fri, 5 Nov 2021 16:40:27 -0400 Message-Id: <7745f8ddba3c384a28cbe9e81f1cdf1572b251c7.1636144275.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 Fri Nov 5 20:40: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: 12605691 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 081DFC433EF for ; Fri, 5 Nov 2021 20:40:57 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D75416126A for ; Fri, 5 Nov 2021 20:40:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233372AbhKEUnf (ORCPT ); Fri, 5 Nov 2021 16:43:35 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55106 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233251AbhKEUnd (ORCPT ); Fri, 5 Nov 2021 16:43:33 -0400 Received: from mail-qk1-x732.google.com (mail-qk1-x732.google.com [IPv6:2607:f8b0:4864:20::732]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 39FC9C061714 for ; Fri, 5 Nov 2021 13:40:53 -0700 (PDT) Received: by mail-qk1-x732.google.com with SMTP id az8so9883952qkb.2 for ; Fri, 05 Nov 2021 13:40:53 -0700 (PDT) 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=csAKOwrGhO/qzscAF9xMFLHlyD6eOKXg6fyFvdHydhI=; b=3tc6pd5JkAgfE8O06ETTBkRkoz1oPLQMbr4iKW5gD94sPHid5EQHRcmURC4GYunJPv 5lZxw269GhihtaFEF6UXaH4KsK3WwwbwTjl2QBx9nT+xgimqvVFl9qmJunN6ILvS+ecM f97WI+Zn0b8TsHYb73Ra5zjrYq/MUwt2myl4yWmoL7NIlRpcNv3EOwea1TY3vgIM+QdC R6VXguvTveRtYVGsf9ROSvLiSiZon8hVj8T15qTPmiN67iVK2MeH7m96etymiAXXUI+6 8RBG/xsw3LMiOgldDGxtf2MREpKAHti4hL11KhgQcHBI3YMV94aLz6FSitzxXBq7qAuY H5yg== 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=csAKOwrGhO/qzscAF9xMFLHlyD6eOKXg6fyFvdHydhI=; b=4e3/Ef3BXsmkVVUVdLHMWXNFSfN4hK2GzIc5NBDt5Y1pfVOBKbnUTl0Q4DYrouVPcA jRNDfjdioLagRRVE9Q2Nstn8S9/ZVoUgXTjSwBC2R8WXFSD801fRyuXoq0XbxPQTFK8H hOwBeDmt4hYsjXUQ26XX80LWneMcrRihgHKGyFaHmUn31CP21DAwOPHBbv0fiXIzrD0b WHJkhzbj8c8sYEEAG8D33L5Uj+oZ4azGYHv79ljukl7Y2NSWYGVJXgakcXNXVxnbputC wbUWIJw33jKcPHRjruMECnet0UD+PBbxWCMA6qFGyoupX0QMpjcdpluEA8QUbpk+P6T7 TL9w== X-Gm-Message-State: AOAM531uf+Js84WovKvM4MMmPZRqlFGC/AVWQX/R3plbRTzd4n9Jk1cH Tw1xUCg8lyLUNYVFNf7SLVEu7MClcnh9UA== X-Google-Smtp-Source: ABdhPJySCYnIx9uccGgLEjemcyhsJL00oEm5tTasHmJ2aX5K9SL6tyoqpfyfg8LiUF8GO1anDmUGyg== X-Received: by 2002:a05:620a:2101:: with SMTP id l1mr5607906qkl.358.1636144852104; Fri, 05 Nov 2021 13:40:52 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id d11sm7037761qtx.81.2021.11.05.13.40.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:40:51 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 02/22] btrfs-progs: add definitions for the block group tree Date: Fri, 5 Nov 2021 16:40:28 -0400 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 981ac4f8..bea42556 100644 --- a/kernel-shared/disk-io.c +++ b/kernel-shared/disk-io.c @@ -1704,6 +1704,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 Fri Nov 5 20:40: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: 12605693 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 CAC26C433F5 for ; Fri, 5 Nov 2021 20:40:57 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B78AB61279 for ; Fri, 5 Nov 2021 20:40:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233445AbhKEUng (ORCPT ); Fri, 5 Nov 2021 16:43:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55112 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233311AbhKEUne (ORCPT ); Fri, 5 Nov 2021 16:43:34 -0400 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 6F31AC061714 for ; Fri, 5 Nov 2021 13:40:54 -0700 (PDT) Received: by mail-qk1-x730.google.com with SMTP id bq14so9888942qkb.1 for ; Fri, 05 Nov 2021 13:40:54 -0700 (PDT) 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=OqaTupeS5aiXtgXBmh7BoZ0XpU6wD4P8P8g5bMlLxIWicarrRWQd+Cy1p959pZ/Se2 U40hw7bZfXr/dPTyHcMdt5NGmrbUGT5F0xtNJq9R0SE1U3DqzyaFcQPhDEMnEBgVm+06 jbla9eiA6fj39wuHT+NP6YtKFP0juY98E8qtT2bGG86dR0DTDuztAQHQTDgCDydyz6yt txF/4syBKi4jdbmYyCBsQVYt61lZzVcHWWzraytO8TGrr1LYtk8zyaY/RbpJWlqfTh3x NFXc9kLkdVASRYhIVsEAp0vCYLVSoLJHdUVuGrWiC6Wq2BMseDkQvPcAmDMboPCHTUQP 5nuw== 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=VYyZdicdS+SbhwdTZiI2pSM9KQfpBjoQQHSkxdnA/6kYJu20PHUFpaTynUjy3SoVrq E4wttrQipNyS3yaUXQxi2HLcmSFn6qKyXxvYpZzRdoAINR8Ho8YtuuS7lEo4QgAWwjZv H0LV3wgb1LKvbyL7uxdiZKkaF7tFInJwmLatjcIU8iM+3dyb2ttlMd/pYCb/hrT2c9Y9 4ouXdS1BQygEjiu4auIOyKKYz2E4+OaRLr1aQkpRUq2VLyQVnzBAYN0ortjZv391+lk4 id/Z/QhLM4X9YX5RXOAhkmYyKa1VgGiW71dkagsWDneTs/yxYMu/KJkDEOXGm1dXmmoU /U5A== X-Gm-Message-State: AOAM532WyMpTJCEUZlT6WPDuurqNmrxWpkPLSe8AU64ajeSQBFJS+zva KLwc0Ar4FKGiK0cyutOC5wsOukVDWOX2dA== X-Google-Smtp-Source: ABdhPJxF65SLOKndqMAVkqSFHlbYDsbWlgkBtntKtPgTkoi+1IbU7YoTYJxcWLjJcTfVEnGPJRBU8g== X-Received: by 2002:ae9:f405:: with SMTP id y5mr20361577qkl.233.1636144853366; Fri, 05 Nov 2021 13:40:53 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id e10sm6409570qtx.66.2021.11.05.13.40.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:40:53 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 03/22] btrfs-progs: add on disk pointers to global tree ids Date: Fri, 5 Nov 2021 16:40:29 -0400 Message-Id: <7dfbff180e23ed8a82a81ee3a9c0320b4d2969df.1636144275.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 Fri Nov 5 20:40: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: 12605695 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 0C603C433EF for ; Fri, 5 Nov 2021 20:40:59 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id ED76C6128A for ; Fri, 5 Nov 2021 20:40:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233489AbhKEUnh (ORCPT ); Fri, 5 Nov 2021 16:43:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55118 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233389AbhKEUnf (ORCPT ); Fri, 5 Nov 2021 16:43:35 -0400 Received: from mail-qk1-x72a.google.com (mail-qk1-x72a.google.com [IPv6:2607:f8b0:4864:20::72a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D870BC061714 for ; Fri, 5 Nov 2021 13:40:55 -0700 (PDT) Received: by mail-qk1-x72a.google.com with SMTP id bj27so8213734qkb.11 for ; Fri, 05 Nov 2021 13:40:55 -0700 (PDT) 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=zuXTanVtAmU5hafC3sTJP3ckr76sXqiL4fVGmIS5Ezs=; b=1ALNbYAtfP7SF/XjRN1ybOD0KU9E1eq/vJiPOjPy7hKywP4ps+CzgEjr2LeOcqgcRU OZ3HpposxB5prdvF6vOTSEeqnsi7zcvSaeDnMJe6KJRcBlfwrGys6nUGC3oHFWfkFj0k fg1Ks6LJnZ8XkvkvsQzqSkSf1nSFkHo6xt/5ZOuGtMeWoSGwL3Q9PUysXgcPoAgkNzEY 4GeBtJvzg6iXu7j3PmBtlS1gWFtZGJC6/owQ5+oeObcftoDvy4UF3kvqMMMSRv20wrrb AFBXeT3LobCtizU47cS9uy3XhhhJ5BIoPRcaKmhIPdTmv5pNCnTrdxGI1SxaiSgIXD2l lMfA== 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=zuXTanVtAmU5hafC3sTJP3ckr76sXqiL4fVGmIS5Ezs=; b=hW2NJDD/esSLG3RZDD3NvI/u8hCacWyw5bjE2q6CbJdgWHLMa82h9rB4Aj2z1ExHO6 v+y9MdXJV4fGyqBber/pdFT7zpEXIQlXtCD2dsG37HfVMAJBOkdgvb/JqAzWUX3RYwYZ uiQvXVc9OLxhILpjZADEoCCR3jAWQ8OKIaLsfpaqlwZr0syUaL/DNF1BJx8lb/j75AhG YAEcUHMVlaCy4oW5CcUC6wasCh0QQ0/GJMWHqmddLxphdnDccnZN3c90jtmPluFiomMB ixk0D5aYuV6NnDrdzgDMfJYE218PWSbYL4duyYiFzlNfkE9CE5Izjo3+yHF9V4CbMH31 l6Tw== X-Gm-Message-State: AOAM530WoN0ApZQz4UVPGoeixjtDv3mZ6BYu/z9RthEk+oHK6nYYAHgb jc0tWf5EPCWaDFlFps132zyYdtTBV4kgaQ== X-Google-Smtp-Source: ABdhPJwIC5Dhvtr4RGIQkE223dJxsLmQBaYjaJNaGaOH9dnmt5VFC36X7BrLHQgVQe+9EyJbX3zkGg== X-Received: by 2002:a05:620a:448f:: with SMTP id x15mr9997341qkp.230.1636144854703; Fri, 05 Nov 2021 13:40:54 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id r10sm6677072qta.27.2021.11.05.13.40.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:40:54 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 04/22] btrfs-progs: add support for loading the block group root Date: Fri, 5 Nov 2021 16:40:30 -0400 Message-Id: <2c32382719d5e8771b2db03cdf8c75d06ad1e3f8.1636144275.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 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 | 156 +++++++++++++++++++++++++++--------- kernel-shared/disk-io.h | 10 ++- kernel-shared/extent-tree.c | 8 +- kernel-shared/transaction.c | 2 + 5 files changed, 135 insertions(+), 42 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 bea42556..38741819 100644 --- a/kernel-shared/disk-io.c +++ b/kernel-shared/disk-io.c @@ -838,6 +838,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); @@ -876,6 +879,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); @@ -894,10 +898,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); @@ -1016,7 +1022,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; @@ -1027,7 +1033,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) @@ -1125,39 +1130,94 @@ 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 index = -1; int ret; - root = fs_info->tree_root; - btrfs_setup_root(root, fs_info, BTRFS_ROOT_TREE_OBJECTID); - generation = btrfs_super_generation(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); + } else { + bytenr = btrfs_super_block_group_root(sb); + gen = btrfs_super_block_group_root_generation(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); + 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); + } else { + if (root_tree_bytenr) + bytenr = root_tree_bytenr; + else + bytenr = btrfs_super_root(sb); + gen = btrfs_super_generation(sb); } - ret = read_root_node(fs_info, root, root_tree_bytenr, generation); + 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); 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; @@ -1195,9 +1255,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 @@ -1240,6 +1299,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) @@ -1979,8 +2040,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; @@ -2012,11 +2071,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. @@ -2036,18 +2090,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) @@ -2094,7 +2167,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; @@ -2111,6 +2184,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 Fri Nov 5 20:40: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: 12605697 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 E0E1CC433F5 for ; Fri, 5 Nov 2021 20:40:59 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CAFF761262 for ; Fri, 5 Nov 2021 20:40:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233431AbhKEUni (ORCPT ); Fri, 5 Nov 2021 16:43:38 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55130 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233485AbhKEUnh (ORCPT ); Fri, 5 Nov 2021 16:43:37 -0400 Received: from mail-qv1-xf33.google.com (mail-qv1-xf33.google.com [IPv6:2607:f8b0:4864:20::f33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3BA73C061714 for ; Fri, 5 Nov 2021 13:40:57 -0700 (PDT) Received: by mail-qv1-xf33.google.com with SMTP id u16so8063611qvk.4 for ; Fri, 05 Nov 2021 13:40:57 -0700 (PDT) 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=Hj2pGFmhW7cajSxBVXpZWXEdxeQtVrZYJDImWq6sK1P06fs8SyZkUkXebZTXbbtYSF ErYQw9jgWg0ChRBb1KoltYy9eACO+bBmJFzA7tTW0HYxFS2xXBi6nN5yQzh4MdyV9rpm 8yA6uBHfNeGeH1DxfyFt5at+cJ5UR94H0DUtXgB1/PmL+Ap3PNv7/b/5NGx/S+hzxm+Y nhN291m5zbvwA08kmrv5KovFbjeggZW0rG0zqo1hPNv38IYqGtF/BOEKal1pyPS03Rnb KQMCLwQn0cYjup1BBfX0IIWfvw0+52yeZ/sFcjgrukzD7q1FHrfYz8EC2s0BaQRMOlrg +qVg== 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=FCy9laLxh9fchm39H0AjpVuWABnPe+hJ/xGVa4A9cwlvcOwa2PjJTcZVpnJnvm+pel nYFr9y64pjyFCwG7WNLxFfRwZS9vC07xhZ6JKrEu9oeFdKI6IheZ6C/NXzET8DUDom0B F3Tc1XCjbyzZ/NTJP3d803aDPtdh6utKInOCI2WIItmJnXoC8Insno9ACXChVNSqAijU PZKur1QM5HNEHfsLrc6721di89cDCilk8YitEEVXfBfpmL2v4P1mK1d+rFXJIi40FNbm iRHLkwTdiB9U7ujxGmUD5VmJMn+i2nTRBl7PqHCjEdNrqZnzMJtdcryp2/L1FNvPQsv8 QEQA== X-Gm-Message-State: AOAM532CB5M0FzB5DZ53t8Mb2Wx1Cgpt2WSTLSuZUjn/TsnTXItDJ8fo 2fZxBIOC7SX8UNJsR9XY/iFbhUn71uSpjw== X-Google-Smtp-Source: ABdhPJweb7+joCFFCpkYom+F0Qar+6r9zQPSGHvn3bI6LyDIE3r7Avv0xBAeCabfaksVT4bvPdDtYA== X-Received: by 2002:ad4:4246:: with SMTP id l6mr1433248qvq.65.1636144856140; Fri, 05 Nov 2021 13:40:56 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id w22sm6081883qto.15.2021.11.05.13.40.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:40:55 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 05/22] btrfs-progs: add print support for the block group tree Date: Fri, 5 Nov 2021 16:40:31 -0400 Message-Id: <9de77d7660cd983627a10767ce5f94c0e8614366.1636144275.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 Fri Nov 5 20:40: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: 12605699 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 9589FC4332F for ; Fri, 5 Nov 2021 20:41:00 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7D9EF61279 for ; Fri, 5 Nov 2021 20:41:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233498AbhKEUnj (ORCPT ); Fri, 5 Nov 2021 16:43:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55134 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233425AbhKEUni (ORCPT ); Fri, 5 Nov 2021 16:43:38 -0400 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 7486CC061714 for ; Fri, 5 Nov 2021 13:40:58 -0700 (PDT) Received: by mail-qv1-xf2c.google.com with SMTP id g25so8025095qvf.13 for ; Fri, 05 Nov 2021 13:40:58 -0700 (PDT) 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=I5JuZoD4fCGaqRiOjEfYn9PHP9jn616z8pbtiotgoDfAcwQvk0wSu5gwOtv28bLHcL gboKti0TD9aBCkqekBzE4WBY0liplfo7+f8PSWidhizMhLRRa2UIJauSQKWtMNBaFjHm eIJL02RcT1Q2PzAPlDssVw8lHTi45QH92Ewa5S0fiK7t3TAKDpBFUbkW85vn1+YrlFcG qsRu1cpRWOEB3KRLG7O2AovG9XVihSpTaSgN43P+xfBfND38ohtq0WRiR7Q1otigx9ER Ah6JcOe9yAF/1T+18Y+23WEpifEdM2XL2nGpnZNrOXLudQCHyTVx+dH/i9/2yln2u1cS y1IQ== 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=UUkqptruoV0P9rgPcynBoiNGjB9ehdUZuqE2i/6pimo9ifIo3yy0HOYjTqI5wKNkZN chFPjed8iZJrDDu413Mx5YC34xiHaCJZOcym0hdmeQmEvDmZqnuvbzv42/2fKCmp1TTV gSIVP+BJXz6zFbuIFhkAd+SDkMoTwQrFoKdG3jxHt2S5ZTi//3SUO8Dp8WkXUuD3XPxa RFnZdwMREeAwzB2+czLjQ9wViiQCAo1GZfiqCBGlfstsMKAL7lF4uCGrdIiRtkNoNQAf wSnrRktOAq6D3JXCKWP8S8Yiic0yQIYLSyIoIGFs9dDjH1v7ih426QOLKvnSZ8T5ay4u M5yg== X-Gm-Message-State: AOAM530G1AqeeGnYoHA4GMjAW0OHZnbuh0JetXUCnDzp1QTxsMgA39zE d7+h1pummHJV66BDW68TKWKtDEMF3POw4Q== X-Google-Smtp-Source: ABdhPJwgS4YSbk2tJ8JLIDSMOsTaQr3zAdfAfBnSDXcLEh4pxmjUV5l9Mu25EcxIFdiYvoDIiVpbTA== X-Received: by 2002:a05:6214:1c4a:: with SMTP id if10mr45175783qvb.13.1636144857386; Fri, 05 Nov 2021 13:40:57 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id az14sm5899352qkb.125.2021.11.05.13.40.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:40:57 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 06/22] btrfs-progs: mkfs: use the btrfs_block_group_root helper Date: Fri, 5 Nov 2021 16:40:32 -0400 Message-Id: <742e40465dc7ab1c055900a0468a059c77be5087.1636144275.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 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 Fri Nov 5 20:40: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: 12605701 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 75C2FC433FE for ; Fri, 5 Nov 2021 20:41:01 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5EF4161262 for ; Fri, 5 Nov 2021 20:41:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233511AbhKEUnk (ORCPT ); Fri, 5 Nov 2021 16:43:40 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55140 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232537AbhKEUnj (ORCPT ); Fri, 5 Nov 2021 16:43:39 -0400 Received: from mail-qv1-xf2d.google.com (mail-qv1-xf2d.google.com [IPv6:2607:f8b0:4864:20::f2d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C08CFC061714 for ; Fri, 5 Nov 2021 13:40:59 -0700 (PDT) Received: by mail-qv1-xf2d.google.com with SMTP id g25so8025122qvf.13 for ; Fri, 05 Nov 2021 13:40:59 -0700 (PDT) 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=GCXTXk+U7vgTVifJvLJ5J7+4WyIhRnW49iLN28P/Fsn+gSuYXwIbDT6d95HF3+NMBf EvQEdsrLVCUKbeIErjpSlfdKdevC/xkTAXHMSsY37jhbT/idcFJBO+F4ZXe4GPqsjs96 ZyS7L9JzuIb1ij9ablF4qLpyeJUWTYrZnn1dUstRnklbYATiexnrv9OqDeaweXdwR8oq yiDinz+/zB2DE8UkW3uGj1cGu7GHQ6PdgyoCJNe0kUo2Nf0Rbghf+JFWC8iOplfvV6YU aw81iZFGmPJW8qKb0WlA7DZYJunfsU4y3v06qS/KiGPYBw9C5v1TRkh61LwGOYePMqBA cW3w== 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=VB6fCwPDLqiCyHFHIARjTMkrK0kEOpoTPVDY/5xh9TKEH5+TS3w9qitB8AyjgIPG1E 5YQ9Y4DzEZbFM7yhjO7/ldqch1yD0xp9BBHtjhNB7Mn0lG6V7CCGvQUfuGZzsJpPcM3r 4nsQfoXDoRda4DracAWWEIukRRwCN4ORAwQHW7vZiWt86DU9e6yuCcqgeUoDGGpxR588 oZAnKguhwp+43CVkMAYHNvdlRQUAXiVLP7O0+AHpbYEc0Rv8aF7iqSVJaIDwMXwkt8Ik D36ZVUB7pzS/D/ijf3ljXg2P1QJmDj6pCmQ4YMaKs12cL7t4kLnJ5OMTghfTtpHb3Cp6 YGrQ== X-Gm-Message-State: AOAM532IoC71ykIElfJMG41L7P6fHvW8LeEJ7U+YZ2tQKs+4z3M1oy1Z w+iHqS4jg87TkJzOYlh9QxT6uXrXRbSayA== X-Google-Smtp-Source: ABdhPJxt5+HOWeMVo/eYPd4ZUpY68D99McrYsZBU8b9fHFc81sI1+vknOA0G6ZG+sCIXWls/OyKOhg== X-Received: by 2002:ad4:5bc4:: with SMTP id t4mr1502151qvt.3.1636144858670; Fri, 05 Nov 2021 13:40:58 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id v18sm6816202qkp.129.2021.11.05.13.40.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:40:58 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 07/22] btrfs-progs: check-lowmem: use the btrfs_block_group_root helper Date: Fri, 5 Nov 2021 16:40:33 -0400 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 Fri Nov 5 20:40: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: 12605703 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 02C30C433F5 for ; Fri, 5 Nov 2021 20:41:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E4B1761262 for ; Fri, 5 Nov 2021 20:41:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233517AbhKEUnm (ORCPT ); Fri, 5 Nov 2021 16:43:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55146 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232537AbhKEUnl (ORCPT ); Fri, 5 Nov 2021 16:43:41 -0400 Received: from mail-qt1-x82d.google.com (mail-qt1-x82d.google.com [IPv6:2607:f8b0:4864:20::82d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0DEBEC061714 for ; Fri, 5 Nov 2021 13:41:01 -0700 (PDT) Received: by mail-qt1-x82d.google.com with SMTP id l12so7805588qtx.7 for ; Fri, 05 Nov 2021 13:41:01 -0700 (PDT) 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=5Qs6M2XnHVQAjrLa+CxL0+IA+lmWK/E+yEYNijk2ca4P+NC/XezobHPNMHsS6E4P1J EEUmRwqCtFQSfSIJTSov2reA77Y+ToDcgN2wah8iqrsutsveVpeiqMJbwMpkG/u0kXDU Q153qAMMnLX0cPQAxG1Gp9zQFn5yx3p3l3rM2AaIqh3/FbKmLHWmvC02MmVgGosivKZv WOdkyVKwKhFilHsOWNXtS8OQ0K78PjC58G5XOE4h4ChdDPT1Pt6Pteei1+E/NalQDjz0 9e6xL/wVT11rsZFwMe3/szCd0pl4L+vSF6//HXyGFwgBK2toh4bYoZ4cHESO9SwJtuiS GWxg== 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=2Je/olpEBfSrOTCMcZlwoJHUCYX8U4TmKEhU+AKZS4mfm6zX4uzSvCCMOKxgOAN+kz Pmb75LiKedhZkkN3p6RKNyWQIX1lGM1a74PSn4pIkfQGw+L+p4wh9wB3cg/72kEw5JsR wo/n0EA+6CFL+G6fkhjfD87vhgSTVfonQul/7XtelIy18yrG2CBaYHn/XzVHgKPZVDdL FhbAM5e8hjAxJRyxuC7vo4VSsZnYUaz96RzZFQkKUg2Lcs7SXJadg1gAYa3wWAwjVb1A +tppBZqwWZzPqBaQQqioeIn/2J3oGrYCPSmEgTaJL7KVp5HHgcapx+X4rKCUxf/8Uubv +02g== X-Gm-Message-State: AOAM532TOgCvq04WzacDgliqSK3ucUOzEpJIhiMS8TNnjqCuAU8wHCox go52P8ZYxQVmK1vHiTmPHhMBWRjmy3DdQg== X-Google-Smtp-Source: ABdhPJxaSB6kv9HZ1QBBj/8wcoXZC8JjHqihfBxvme6LMbV+N2MvrJC45PMfQD527IKnvofoibjjTg== X-Received: by 2002:a05:622a:394:: with SMTP id j20mr65502268qtx.386.1636144859995; Fri, 05 Nov 2021 13:40:59 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id w9sm6181896qko.19.2021.11.05.13.40.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:40:59 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 08/22] btrfs-progs: handle no bg item in extent tree for free space tree Date: Fri, 5 Nov 2021 16:40:34 -0400 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 Fri Nov 5 20:40: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: 12605705 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 8CD62C4332F for ; Fri, 5 Nov 2021 20:41:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 798D56127A for ; Fri, 5 Nov 2021 20:41:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233525AbhKEUnn (ORCPT ); Fri, 5 Nov 2021 16:43:43 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55154 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233501AbhKEUnm (ORCPT ); Fri, 5 Nov 2021 16:43:42 -0400 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 8327DC061714 for ; Fri, 5 Nov 2021 13:41:02 -0700 (PDT) Received: by mail-qk1-x730.google.com with SMTP id bl12so9817303qkb.13 for ; Fri, 05 Nov 2021 13:41:02 -0700 (PDT) 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=dELx8Bczi0CntxCqBFxC5MyHPQCozzlIuPNqWfaYScl6gmlIp7YP0ceL/5+U8hSTph TdxtLF5PVkI27x2R8gWWvT5wP01Eeu8V5bcd3Tz8EmsznyA0YBcv9qBRAWxk0J2HzVf6 QOFPTO6iJNYIENfoOSNCymSQ5jSMR5rijNJAuK5EpX1LSDw3036w5jSllBYN4w7tq8w4 dXyPDCtC0C84RJsEblTa2BfHT4aVrIT0XcTb+es3PseeQ30CJHBjcB09Xxy7RUZk4SP5 3xZSSUC8p+EwLo+3urVz/jfaauLjZXnPZDazHGfncFw49SudRtu3B1wAQepai/1LmtzL zfiA== 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=e1w/Y3zyDAV43uEbmWS5iYGnbiHLXdXORFVsOpy04NHrhrSMESje0GE/OiVTJoAzZZ R7hduH0117M9RXB/F/QJTqZivIOdRGdhNgCMdd2EnGuiG3D+rQSppE2jGZ7VGi8VZdQS JHn/BFef2QDVq/gyqaKx8FlIOoCq6ocgGYTkhha68F0IUdTCNVtkh7DLO/Iz5xKGEVBM DvgGBRWMm9qcss7StoyOUikasjY05Ato3LUj4rdUy9eMne9uL/FnXyTatSaMCNyXHCE9 ept5aHSKsdQPfARpG+lpOKIqdiHnUcWzfhvfTdWHBIFR8sJLZ/ZZEYLgFI3UpLfGhfzB YnQA== X-Gm-Message-State: AOAM531TQpAyoE1txhkek2bcLB3RiVWj8SuL7PYPoNPargzWG3W5W1ME 6uOWjSb+dVuxm4nqDViEuU5nt/FFxg/uwA== X-Google-Smtp-Source: ABdhPJxefNGYKiqT3QkjOxtDdC4S3/No/I0fSOgHM97lE9qZdRF8qW2h8g7q2LNepkHpPJcmP9BqCg== X-Received: by 2002:a37:4041:: with SMTP id n62mr48014326qka.225.1636144861357; Fri, 05 Nov 2021 13:41:01 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id bp40sm6267289qkb.114.2021.11.05.13.41.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:41:00 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 09/22] btrfs-progs: mkfs: add support for the block group tree Date: Fri, 5 Nov 2021 16:40:35 -0400 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 Fri Nov 5 20:40: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: 12605707 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 BEB91C433F5 for ; Fri, 5 Nov 2021 20:41:05 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id AB0CC6126A for ; Fri, 5 Nov 2021 20:41:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233535AbhKEUno (ORCPT ); Fri, 5 Nov 2021 16:43:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55160 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233226AbhKEUnn (ORCPT ); Fri, 5 Nov 2021 16:43:43 -0400 Received: from mail-qv1-xf30.google.com (mail-qv1-xf30.google.com [IPv6:2607:f8b0:4864:20::f30]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C2699C061714 for ; Fri, 5 Nov 2021 13:41:03 -0700 (PDT) Received: by mail-qv1-xf30.google.com with SMTP id g25so8025190qvf.13 for ; Fri, 05 Nov 2021 13:41:03 -0700 (PDT) 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=X4E7XR+Onretol8ftjkpU20vMi1K6xIIup3XQX6m1aoW8QD/ATqebvutDICow9MnKb krO3Knfll+YZjyG05F9/8e2EtPSw4GmZzDzOYZsoa5htruAUgJiaSTICD1b2nRq1vJHK sheNyOaJbrJjDusAGxjIu7gfirMi7FPHpbwzCOj+uvuhyrI09mxQbbDiw/ONGSQjgWIu 3YldFAry7S+5rsx3m69Z5FSsDHA0gDQVwfj+s6BWlZogtejEIf1qCOs84bZLaPDRp5FL hwM1UPWRoCvV56zYhnXqJ2Fq1b2W0/VX1witlcwu06nD3uO8RpAdl80BBj+A4VK8UXoD 9/cw== 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=obxLDUnyLYfmxrBcxyFQMhTSqbWVuLXfmcNqNxMlSuFQLlfk+MDl+9tGYhNZjg/o1I z58JN8L4wHtAdfIeonmuyEYKFlV8yBuZx6UdkKkxqdbF3CHM8ptkOoAtNQa5ckYRcN+C qlP+WkR6LLPD4dz4vqb4eiKwVxfl0sKCdPxvRsoWX4WUj0nKFYmTurZrUfZA1GEMmFq5 KtKBB2YEnvnIXMfLNZyPepPEc7hcx48d6n/6Sm6Igu1pN0F7EwfcA6zZh24h30aIjkJU HQBmT9mjd3HEdPlMkvzKAuXTH7gD/ZsIKEwk63NVIpkUbtym384w5YEFLwFGL6ez1N0A c64Q== X-Gm-Message-State: AOAM532Rrt5g58+xnrlB2drH6tzoYdPsfaYzOiGZtEIIvgLzbwgjdfpe gik4JP3Bmg9VVxkPXj7SMEWBkpII0udArA== X-Google-Smtp-Source: ABdhPJz6t7oIJ8FhVme4rPf480MOCNGFqcED/PzzgaXzcq8M0haKlgMjHAlvpWRl/gXPCSSUZ9fQ1w== X-Received: by 2002:a05:6214:16ca:: with SMTP id d10mr15865185qvz.14.1636144862721; Fri, 05 Nov 2021 13:41:02 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id 13sm5813040qkc.40.2021.11.05.13.41.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:41:02 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 10/22] btrfs-progs: check: add block group tree support Date: Fri, 5 Nov 2021 16:40:36 -0400 Message-Id: <13b95fc146d37942685812ed8b8a911d2e01a379.1636144275.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 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 Fri Nov 5 20:40: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: 12605709 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 64EE7C433EF for ; Fri, 5 Nov 2021 20:41:08 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 14C09611C0 for ; Fri, 5 Nov 2021 20:41:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233544AbhKEUnp (ORCPT ); Fri, 5 Nov 2021 16:43:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55170 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233226AbhKEUnp (ORCPT ); Fri, 5 Nov 2021 16:43:45 -0400 Received: from mail-qk1-x72a.google.com (mail-qk1-x72a.google.com [IPv6:2607:f8b0:4864:20::72a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 30953C061714 for ; Fri, 5 Nov 2021 13:41:05 -0700 (PDT) Received: by mail-qk1-x72a.google.com with SMTP id bi29so9876066qkb.5 for ; Fri, 05 Nov 2021 13:41:05 -0700 (PDT) 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=aR5jQS8Zx11ayiXlANVEXg+iDYGpzC/9eM7qEUbwprRf1zi6zfYPJxQeyHRhgTsVpM ydX2dUmZXy0qUeW2E/oovN/nyWArHKMo0jr5UVsVBRHnJOst/cQajDBQlrT8+Rmja1NI OFet/wGUYVVajo6d6YXntT4L9ZXYDchoOOGSzfWRuoBytkRDM43PG0+KJ0wM8U6MgGpu 9ivS6ZAmMVjH5mj9NZiYrvJ8ZrAUPug/EaP+P/XGjrpAIRzXb3h0q9TE2IIjqKd4qBko x+1xOYOmATSLzDIGkzMM3k6UHJI/Lv1suhIJeKYN03c3gNaXPBSDr647nNXDQUvkacih Ek8A== 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=pf7hoRhd4aXZ7aGW3u9VOLxzwjKVQ1M9cPicCLvIwB1tuXY5Fcm9I6gMPqPGUXIfS4 KBJfRlp1vfFp852qYNWMK8NMmpsFh9xeD/Mn+K43F5QiWHuzoWWoJEiQ+m7SA5YcWvdC gDRCsYWhleD1w9f8j7iFrJg0jL/M4k1T6AAjJH84972yT9OjXnvKbqeu9yH0ImPAQrc4 lGcAfIjBv/ByjZb2MYb1Qjw0BEyKDiRVHsEz/H4It12oDnZJyf0v55swKVsBosI+47Ag VEL5M3KlhIug77nmfYCuSao8w6eLjTitYpHEuTUHzKjdXXUan/73Q0ZFJt0AjwPIm6is YJHA== X-Gm-Message-State: AOAM532SEbPaPs9EuNQWxeZRaQVjgqkVSNTCabUuerMxO252w7VmcVW3 eswtjheAByrRkNU7XI2Raf7PgeQYnrBEEw== X-Google-Smtp-Source: ABdhPJyG9qzwr9DsCpDDIC1ge8MCckBDT0xVjZr0s68/0zsV2lEky9B16LW3PNcfBHk96grxoNGcJA== X-Received: by 2002:a05:620a:430a:: with SMTP id u10mr50087260qko.53.1636144864096; Fri, 05 Nov 2021 13:41:04 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id 76sm5007609qkn.77.2021.11.05.13.41.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:41:03 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 11/22] btrfs-progs: qgroup-verify: scan extents based on block groups Date: Fri, 5 Nov 2021 16:40:37 -0400 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 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 Fri Nov 5 20:40: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: 12605711 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 4FB7CC433F5 for ; Fri, 5 Nov 2021 20:41:12 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3E12D611C0 for ; Fri, 5 Nov 2021 20:41:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233576AbhKEUnv (ORCPT ); Fri, 5 Nov 2021 16:43:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55174 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232468AbhKEUnq (ORCPT ); Fri, 5 Nov 2021 16:43:46 -0400 Received: from mail-qk1-x72b.google.com (mail-qk1-x72b.google.com [IPv6:2607:f8b0:4864:20::72b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C4101C061714 for ; Fri, 5 Nov 2021 13:41:06 -0700 (PDT) Received: by mail-qk1-x72b.google.com with SMTP id bj27so8214135qkb.11 for ; Fri, 05 Nov 2021 13:41:06 -0700 (PDT) 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=QMUop7ZdrBdhsfQOeIIty/vojIEVecWWnzyortvcpmyds24PSd+pUrpFFo82XY0nCk jjskrtGR2yKwFKXcTKYh0XaGSGdyT0yWNt787TZRUaJrRw2db+85eNpBOb8wO8QIdZCj C84QymHgNzw3xlm0GEC0oa+TqD1EEnHcBOy73jCczlz3oTWQqK97ZFOcgpOb9Nxi8PEa In0agmazuV6sJxYwJdKDv6044+cBguHbe4IND6I9J4+LADYfm3opysS0lHFxgCgNZxXi 99/2lrb5M4QlBMLMfAIqwHHC9LHGvHqTOs33gnsD0qKVHqUeZIYL3e+s6HWyQLPPWEUJ qqsQ== 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=GFh1PeOWKKMQcg8Uv19CB0UtMEmVgX3Euey+dAmt8gXO3HOE3l592OXndr4+RokeZZ 9xhU4/Q54ky+C2QruxPELpyp9Cre63VUZr8t0qJ+zPW1kkK0s7g6Xec/7KaKXjH2j3Oc 0krjMW8nfnBi8wkxq9OCgNWLrJbnZdM+rVzxPbLzQYIDw/NNTpZkMIcjPzZyhlqOtt0i D2Gj8xoue3hLBhuEtDQooNJACNtwlx/ewzpKHl60zzMLjIZULokST/jwrqWUWXX6gkDz rq5WbgmG1m2p+rWPIhDC6FiKe2Pufp9dNwYrA3kMc5GVLrdgccvtOnxIEC9hgvMtDyjl OCBA== X-Gm-Message-State: AOAM5305CpJyIh8/fSzsHCouE0/FFiSx84p1T4xkRbJlBbGIacc6scC0 osswR5fT18GXjDkaK7HXwG9VTWPuq1F6EQ== X-Google-Smtp-Source: ABdhPJzuJleqS3oPVxCNYaysWtw9R8Q5oCMjyx4bfTpu0YNOcdZp4nWUT2oBtHYZg/th/tFREHNz9w== X-Received: by 2002:a37:6003:: with SMTP id u3mr20468630qkb.508.1636144865708; Fri, 05 Nov 2021 13:41:05 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id s10sm6922534qkp.132.2021.11.05.13.41.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:41:05 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 12/22] btrfs-progs: check: make free space tree validation extent tree v2 aware Date: Fri, 5 Nov 2021 16:40:38 -0400 Message-Id: <3126aa7cdb414b430e182fc0718b72a3f5705991.1636144275.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 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 Fri Nov 5 20:40: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: 12605713 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 1092CC4332F for ; Fri, 5 Nov 2021 20:41:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E7225611C0 for ; Fri, 5 Nov 2021 20:41:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232468AbhKEUnv (ORCPT ); Fri, 5 Nov 2021 16:43:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55184 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233226AbhKEUns (ORCPT ); Fri, 5 Nov 2021 16:43:48 -0400 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 20F88C061205 for ; Fri, 5 Nov 2021 13:41:08 -0700 (PDT) Received: by mail-qv1-xf2e.google.com with SMTP id a24so8049357qvb.5 for ; Fri, 05 Nov 2021 13:41:08 -0700 (PDT) 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=bx3BQCO4ihSxGZ57KZjfcm2eBqPncsXYj7HLHePaWAKw3Nq5q6RDxm0w+3Em1jEwj/ JDQ7Eji0Dgr/ruX4gQttCEtWX0tuwRHSfDXRtp9jCO/5BM8vCJj2mdauH6SB3jvoce8X lD+aRxIEpe5XC2LynD/MNf6uytvuYljI/PIZaOMXoj0anLVcX2X33/9FFeFWeqwwVsdV ku6NTYgjv+KANGhZjkpgCgPZTopnIVQYYL3+rZB8vmouV0tO75yz1hNKswnpvGJAgxJ1 EgcLMUUaXzCaTWDY7eMLEdGT+S1+jIHB8gCJY97K+cTyZPeRplTxS+/vAr26qenMU+1p /X0A== 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=nnOmW7PqHcUzsGnJoNYDtE2Cw1+N4KBIULZ1wjZg/yzILUB8U/5q7O1h5s+rOuslsy HYEWNcmQu3grmlvoTFeUqBZGF62jfVXt0wzgS8uz3mvfqCv+NyEj8h9CQ0Gs37u9Rk40 NdrPyVfhmD7L6vSvm4J2GhjENr2ysxH+AUklzm4kuabkj7pwS+qh+XcBcfY9Kl+2kGqr gX0yBVC1yOWT5JBpYGv1E9x/opfERe8SL+27ar8BFYCxR1cg2gN2TePVh3jL1QmzRqba 85MeSgaAI9o5iT0hHhm7IUbm1n6gMoKq90XSN4faRKb+kFFL56qDtFlnJGtVGK2hNclz PtBQ== X-Gm-Message-State: AOAM531U5zoGiSuVgdXPIdqcqekklMeZpOi1Z7lHaKyJVfSrUGPeFtFq Wim7gGKljJ6h2qXulwDUj4XfRNAifU5ycg== X-Google-Smtp-Source: ABdhPJz40Y+2Kyk4BlB+u9kah1v9ZJcBWmqJ8XSSSk6+/imOdk7di2KOFpQ7okKXQgDRtVi/w83JWQ== X-Received: by 2002:a05:6214:d8e:: with SMTP id e14mr4315292qve.50.1636144867058; Fri, 05 Nov 2021 13:41:07 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id x188sm5791568qkd.31.2021.11.05.13.41.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:41:06 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 13/22] btrfs-progs: check: add helper to reinit the root based on a key Date: Fri, 5 Nov 2021 16:40:39 -0400 Message-Id: <735ba0b8ef8ed3a99a28b174983a29b7652cd80f.1636144275.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 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 Fri Nov 5 20:40: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: 12605715 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 B1498C43219 for ; Fri, 5 Nov 2021 20:41:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 9DDCB61283 for ; Fri, 5 Nov 2021 20:41:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233634AbhKEUnw (ORCPT ); Fri, 5 Nov 2021 16:43:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55190 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233501AbhKEUnt (ORCPT ); Fri, 5 Nov 2021 16:43:49 -0400 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 90111C061208 for ; Fri, 5 Nov 2021 13:41:09 -0700 (PDT) Received: by mail-qt1-x836.google.com with SMTP id w9so3222499qtk.13 for ; Fri, 05 Nov 2021 13:41:09 -0700 (PDT) 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=/NuTtoBNsybpfBVHpAeVbpWdKUn/l/A2EBdpVMoGPks=; b=kFaWrKi6o+KXMRDIAlyM0vFa61R344X/VUFBmcVote/kL5GDuRAt97/t7/SyuSJu3Q brB0IeTh8Cut8Q7Qhybsb/W9t/ZVrexAL222bpxoNzESy3efPlWxI2gDqx1x+VSPhPBB WtsLaopqdt+PkfkyRYdkcIVIhHsYgv51ks0bO0S7HPnbJWXAEuxmyEAfH4mjvWj8iWbF bYl/hOPJfsb0Hn0MFnJ6EAmgM4dTgs6AhVoA9u23qK2flrR6ZbVnlun/S3yQ8nFDKIBg RmR82Szphr9cxEbQ+TMbuyBRsq1gLIy0KQ1bbaf96TrNGVj0QDqNRR3aZEjLA3xXPOij F4rg== 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=/NuTtoBNsybpfBVHpAeVbpWdKUn/l/A2EBdpVMoGPks=; b=XUGNo5GZ0dlSZ31Zt86QorluXVwURw5iLpEGFc79eN21SEMoM5suXaufp/xMVhIThz dxfsjJ+bzvswLnJw1ONccKcmRzeHp8UCuzeIQTHTNSTq9WP73MgI1xk0AuJG06dC9OmM CPRQsajsyisOH2IBzDMDRujgBvqPzIglg5YCKY0IjQuL7XoebYjArlrdOTNRmNH/2BP0 inxxQuX5jpvnOfS05I82+djYjVsjyQT+OelrsIOuAD+Y0fIdljsDK4h5ttgrs51yJVdN 7BXN+cEF/4HFcbrV0atCDf24VRYKY2NTvA27UvOp3NYH6q3fe7juGQXLNZPZLErCwbRQ oUaA== X-Gm-Message-State: AOAM533iN6jIU63SCDaVfaTWMyuXmjVwhp5OtI8GUOc9OrXpU/XR30FL 1duZtcOkfoof89BqIpdSxYInZT0hFscHNw== X-Google-Smtp-Source: ABdhPJzccxHaLbchzrRwOHHb8yocx628595/V7fmkwrxk6ddSh3PP+Rgbd0LpDiuwyRuSZUhSLLIRg== X-Received: by 2002:a05:622a:118f:: with SMTP id m15mr8347416qtk.81.1636144868435; Fri, 05 Nov 2021 13:41:08 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id o15sm6221058qtm.8.2021.11.05.13.41.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:41:08 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 14/22] btrfs-progs: check: handle the block group tree properly Date: Fri, 5 Nov 2021 16:40:40 -0400 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 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 0feaf6c3..3e35ad44 100644 --- a/common/repair.c +++ b/common/repair.c @@ -150,6 +150,9 @@ int btrfs_mark_used_tree_blocks(struct btrfs_fs_info *fs_info, if (!ret) ret = traverse_tree_blocks(fs_info, tree, fs_info->tree_root->node, 1); + if (!ret && fs_info->block_group_root) + ret = traverse_tree_blocks(fs_info, tree, + fs_info->block_group_root->node, 0); return ret; } From patchwork Fri Nov 5 20:40: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: 12605717 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 09CBFC433EF for ; Fri, 5 Nov 2021 20:41:14 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id EC7AD61284 for ; Fri, 5 Nov 2021 20:41:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233501AbhKEUnw (ORCPT ); Fri, 5 Nov 2021 16:43:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55194 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233555AbhKEUnu (ORCPT ); Fri, 5 Nov 2021 16:43:50 -0400 Received: from mail-qt1-x82b.google.com (mail-qt1-x82b.google.com [IPv6:2607:f8b0:4864:20::82b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D81C3C061714 for ; Fri, 5 Nov 2021 13:41:10 -0700 (PDT) Received: by mail-qt1-x82b.google.com with SMTP id u7so8324947qtc.1 for ; Fri, 05 Nov 2021 13:41:10 -0700 (PDT) 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=v1VEdjxQzSY4ZUs/yFQe7Ds7wpaDkCuSP8xUp5cDKnw=; b=fa7t4j57tlqFEUQzsHSk/WE9sHuyPuMiOcIYwIxc6NuljQSJm+pVm13AIFRyXC2Bch JV5lKLn5FZbpkklgMvHBASQIvSh+bciNASyWiBO/SsgfB/DPQp/yyrrEsuOri897FntF xrmoGHb+vNicnIIvZrTW9J/ou4tbulg2Hv1Z78NMg9yM5kKv7xaqphAjLDRLIsqg3NE3 ntlhsDBC2DWf5DcgzDW6GxrUWgPvRzjnVNYQ9B1uE2a9zRRG/bq3vgURcP347uZgNa1U JMi1ofNMQs7sOm9gUoILWLysoUSaFXrilwfbUNeXmDesMP0OnebfqyDwnw1BOMaeeGAE 7eEQ== 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=v1VEdjxQzSY4ZUs/yFQe7Ds7wpaDkCuSP8xUp5cDKnw=; b=bAAPrblb0uYssuwK6bxN3t8r0mZKT7vv4rszZvWEsfo10HZ1UfzXLa2+ZHYa0N8BM1 MBh+06fzj+L8hOjnjXT5NUh/cMug+iBRL1V0uXpoiGhS6sPYGzpYFKu5jLcUNmEJ6D2j hA3nnUUhUkycpMY5/ZNFseU4LKfjCHXAe7u+M/KJ16kx+eISUti1lbYGh6gg9d6ME+8E /erl7t+dot60z687v4dxwtu6rm0HQsTnfVMb9u5z6VlRpB1kLLvgWUqO2+KcKP8BewkU Cw5Me92z5DILXtncr6zch7pyPGc2Ar5GOGn5LdpknMbDm5WSxg03GDeuDIjcfMgafPZI tRsg== X-Gm-Message-State: AOAM532+a11Dc//iFs0erzHtYe8RNBFLteIaDAD74nXIam1W2YloSs9D lE6MI8hxqp8FI9M+u7QbA2iirVCn/ebiYA== X-Google-Smtp-Source: ABdhPJwhflzqtWx7yKWNXzTYVTGmHM34VA5FIDeys9zgtWn5Yey9pDCJsCnu/w36zFVLYQZMG3Tq3Q== X-Received: by 2002:ac8:7746:: with SMTP id g6mr17369558qtu.23.1636144869730; Fri, 05 Nov 2021 13:41:09 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id 17sm6412460qtw.16.2021.11.05.13.41.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:41:09 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 15/22] btrfs-progs: load the number of global roots into the fs_info Date: Fri, 5 Nov 2021 16:40:41 -0400 Message-Id: <0762dc7bd56880f6835b6059c49dc3b914f02cc1.1636144276.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 38741819..4c613b52 100644 --- a/kernel-shared/disk-io.c +++ b/kernel-shared/disk-io.c @@ -1432,6 +1432,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; @@ -1578,6 +1616,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 Fri Nov 5 20:40: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: 12605719 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 35A1EC433EF for ; Fri, 5 Nov 2021 20:41:16 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 2515061279 for ; Fri, 5 Nov 2021 20:41:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233584AbhKEUny (ORCPT ); Fri, 5 Nov 2021 16:43:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55204 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233593AbhKEUnw (ORCPT ); Fri, 5 Nov 2021 16:43:52 -0400 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 43DF4C061714 for ; Fri, 5 Nov 2021 13:41:12 -0700 (PDT) Received: by mail-qt1-x834.google.com with SMTP id d21so8285501qtw.11 for ; Fri, 05 Nov 2021 13:41:12 -0700 (PDT) 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=ARHRe7EzU08RbrofPgn4nDVLlnjVMvpSfrA7E4kkZnQ=; b=CFW+qWxYyBlRtoTRWYb+ZszB2XgDFI2+g7d8YZSxgF4SMkfaXRXAtiW/JGLUhBj5J+ gvu2AR9D1E4ITm1zhSLJ2yxqqSDsrmInkW9XmSG6y03RFZ/UTwWyy3shvdjKw6MarVIJ BQ7IZuia2ouoeB55buz+iFWhYhIdxhPB0MV93YqYroRKcqK6OSWU6Ht6Gq7kXqo4EqxW oVHi1WsGS86g4PkSZdBQie23Z80t4wyLKvSWhMlM1sGwg57P51J8vm+EEuI7LYoK6Imx fHnNxKxlblXPKFercpw3zSRrF5B0zOsXUfRH0L7RmFmGfFQl7M6N2o2R3Hlp0doq0pyV OK5A== 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=ARHRe7EzU08RbrofPgn4nDVLlnjVMvpSfrA7E4kkZnQ=; b=doedjhH0/AWK+Yb9RBefL2ufw90qlVuxA/UXYvGY+AeQkzm6KhqFcmDJHHST8Lbzd/ feQ6ZtriaPLSmHmGcat6Z/K4YUO42Mnf4n+zBQQuaHlVrpU/YAxluoMyv8WsSJrLgM07 OvS21agGKMnke1l18PpRK85aLnhKgKoLS3nHwBOeICjztPgBD6Ll+5w+2rhhfTXPqFql TEmnsd7Ni3UglKAAU1PAt12cD5Y0O1RreqmPASCYC0xuS24b7+68+nd3iF61pYEfjUSQ 2hYbtXwdEdTn8g/tFYNdpr/AhRmIh6c0L6MywFvHiVtXyKxwhXo2OZnX/PJo4SA2Kn9o YZ0g== X-Gm-Message-State: AOAM530IuU44+CWoLl+62ERWqBQUk/OI6Fehd/zIkJ4+0OSmB7o5obC8 85eqyy2aLpJTYGEUjO+Xm4jbpzM7Z47mng== X-Google-Smtp-Source: ABdhPJzzFOt1knpGqye05fr8ID+CghTMN+UDgP4yel0Z0BQBmQ3wJy3Qe9i9YzsfZj8hcai0FWno5A== X-Received: by 2002:a05:622a:607:: with SMTP id z7mr28852453qta.237.1636144871195; Fri, 05 Nov 2021 13:41:11 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id e14sm672763qty.18.2021.11.05.13.41.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:41:10 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 16/22] btrfs-progs: handle the per-block group global root id Date: Fri, 5 Nov 2021 16:40:42 -0400 Message-Id: <73e494b6b45b77ae90b3838b991e89c14cbb45ff.1636144276.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 | 17 +++++++++++++++-- kernel-shared/free-space-tree.c | 3 +++ 5 files changed, 43 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 4c613b52..af29a7ae 100644 --- a/kernel-shared/disk-io.c +++ b/kernel-shared/disk-io.c @@ -787,13 +787,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); @@ -805,7 +825,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..b282491e 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; } @@ -2777,6 +2778,18 @@ btrfs_add_block_group(struct btrfs_fs_info *fs_info, u64 bytes_used, u64 type, cache->start = chunk_offset; cache->length = size; + /* + * If we have extent tree v2 set then set it to the next global root id + * based on our offset. Otherwise set it to + * BTRFS_FIRST_CHUNK_TREE_OBJECTID so that extent tree v1 has the + * appropriate setting. + */ + if (btrfs_fs_incompat(fs_info, EXTENT_TREE_V2)) + cache->global_root_id = div_u64(chunk_offset, SZ_1G) % + fs_info->num_global_roots; + else + cache->global_root_id = BTRFS_FIRST_CHUNK_TREE_OBJECTID; + ret = btrfs_load_block_group_zone_info(fs_info, cache); BUG_ON(ret); @@ -2806,7 +2819,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 Fri Nov 5 20:40:43 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605721 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 EA191C4332F for ; Fri, 5 Nov 2021 20:41:16 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D6CDE61288 for ; Fri, 5 Nov 2021 20:41:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233658AbhKEUnz (ORCPT ); Fri, 5 Nov 2021 16:43:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55210 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233555AbhKEUnx (ORCPT ); Fri, 5 Nov 2021 16:43:53 -0400 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 D6373C061205 for ; Fri, 5 Nov 2021 13:41:13 -0700 (PDT) Received: by mail-qk1-x735.google.com with SMTP id bi29so9876350qkb.5 for ; Fri, 05 Nov 2021 13:41:13 -0700 (PDT) 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=cjyp+iyJMKE7dQvZXu1Jjrqc82IKIZ7caisFHeyE2BM=; b=W9MxFDN99w2FLMOzEsOcxgYFsvqCz0gabhIEOa/EJDHvy2CTAOonwHcfudSo4j2DOz DvJGndSBYgyEqtZp2xxKeBebSdKPqgxquNTEDaczLZ2R7vlKahSERD0/+gdQvaerNQT6 lyyRcXiv07brBtPQGLovVyw7UIHY0gTcuIvnsSvILT3nTyjRaX/ei8H00rqmgnvbmFP4 UNIU43FBoqN/wdDD03An4JCryNl5AMFYhRRdwp+b0M3CFhVqUgUYlovvLrKfZ5GGJKNZ 1dDxOMO3Rqpv6S15L+QL3Mg7ohvLP4lOb3TNj5bz94tTxoUme1bQGIe/Ga2hNkGP14yA puzw== 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=cjyp+iyJMKE7dQvZXu1Jjrqc82IKIZ7caisFHeyE2BM=; b=0udNIgmgPkvVWskI2DItOFAPP5FwiH9M+T6SRnHLJnf2JCuizrVAJ0OIws8GQK2A+I Ms0g7qkQG6gtTnt3vI/KMDMTxoWPX/uMjlqyk5BUvOdVR02g7UWHYM5d/OGeiZ9/yJK1 4LwxAwVViJ9A32b4Hpbqbo4lNAJC/BDfxdQ2K33BU0z3y6qCqCjT5IXs/yf33Y1Y02an ODtuWOQfs6zlW51+NxDQkq+PkzEx+CPiD4neWYcaT+ksz2iABIli6cL0qGn6UGNCSf2q dRaTHz3O4HqQGTHqUpLaVjgTleXCqm/6XBfEjwlpnf/1US3CvCHH7JmMIoDOJ/zk6dAl VK3w== X-Gm-Message-State: AOAM533JiXV6CDg9H+hXJHV8wqa/NOT67joNqpSPKw90dlj/BBh7i5f4 mEu9JBp2zBA7mRhMLh1S/63x097ViQsJoQ== X-Google-Smtp-Source: ABdhPJwFaVd6RxBXY3pikPiYGESmpK9PGX6utm9D5fs7QFqvItWnPw2Ii+No/tvSMy7EZJJAQryd9Q== X-Received: by 2002:a37:a847:: with SMTP id r68mr4820955qke.293.1636144872668; Fri, 05 Nov 2021 13:41:12 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id c64sm10552qkg.25.2021.11.05.13.41.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:41:12 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 17/22] btrfs-progs: add a btrfs_delete_and_free_root helper Date: Fri, 5 Nov 2021 16:40:43 -0400 Message-Id: <669d869249be8b9e3d7fa186ff7905a71d63eb80.1636144276.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 af29a7ae..c35bdff4 100644 --- a/kernel-shared/disk-io.c +++ b/kernel-shared/disk-io.c @@ -2349,6 +2349,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 Fri Nov 5 20:40:44 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605723 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 A97FBC433EF for ; Fri, 5 Nov 2021 20:41:21 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 8F0E56126A for ; Fri, 5 Nov 2021 20:41:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233661AbhKEUn5 (ORCPT ); Fri, 5 Nov 2021 16:43:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55218 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233593AbhKEUnz (ORCPT ); Fri, 5 Nov 2021 16:43:55 -0400 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 2DFC9C061714 for ; Fri, 5 Nov 2021 13:41:15 -0700 (PDT) Received: by mail-qt1-x835.google.com with SMTP id g13so7869318qtk.12 for ; Fri, 05 Nov 2021 13:41:15 -0700 (PDT) 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=zYdTab9LMs5VccWP27FYcSWd6EZt4Qxu95CFHalLB7/QRXyOhbi9Kn8SI5u310K83m m/whxXfKm+cxgoWdNlNYrfa08QnY11Tlr1rFzSlp2HnTGpuLYODIjgqOxBggIOJJ1ju4 rnRNCV/r7J/NUb2VwBLkMTr3D1xl17uVDovdOvFtVEIpABm3ho1afZpXsTlKu1tlxE4p WI0+m1WT78Kh+otkKdEtZCj9ebVKl9oOrrkx68ndxxzw5PbNxYdVaRDzlNQESGC1h0UR OKsEqOR6HlUEu9nfC91liE9QedLjC0XexxfKHRRvkiHyP4ZLQybkKinGNp2HhPRc4KY8 /JuQ== 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=jRZK7zsmN3VYgY0R1DT3LXrEA80UtoVa9zuh4f8lRBc0c5lVV5Kkzzm3M7Uv53/KVD FcHpjBjk1rU5EKDEjqkZOAQoe4vbzOM/iG+OD8vDl8FRy+IbpBn0I7fSCp5E15GDExHQ 2PC8xLZmxOYsnaXRSg+2KTsj/EIeugKINQFHVvyrS4/G3XPrGyOstVx0REXJEa5Cqh83 L0wT42UrqdTZpa4IeY4Ev/6Jo7eq+ZkaOArZcnE2cUypGpzLPnWidLo8J75VN+iDdgAt gxFCrEh6U+RqI7pxF4uBTjUQRJYaJmbZncE8KgeNtl4hIN0pfrs/4H2KF7k5prIA/Fng cmcg== X-Gm-Message-State: AOAM531zgCW4nzoHUGEiIBe2RdblGmfuFre6s5PMkaXk0I5NTtc9oozr X8Xmpuv3d5nGlHwqvOc3CigetEdYV6xTLA== X-Google-Smtp-Source: ABdhPJxHcgU2MVCVThWGmlLpbFkgQD1QF1fT5I/zWjchv/ngI2dWSK2xnsQ1qRzaLVtiF+0EEq3OZQ== X-Received: by 2002:ac8:1ca:: with SMTP id b10mr63882499qtg.327.1636144874120; Fri, 05 Nov 2021 13:41:14 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id u26sm1594260qtc.70.2021.11.05.13.41.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:41:13 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 18/22] btrfs-progs: make btrfs_clear_free_space_tree extent tree v2 aware Date: Fri, 5 Nov 2021 16:40:44 -0400 Message-Id: <7c11a6aef78ff3379ff69c7ccfbd3dd7069a15c9.1636144276.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 Fri Nov 5 20:40:45 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605725 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 99F16C433EF for ; Fri, 5 Nov 2021 20:41:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 79DE26127A for ; Fri, 5 Nov 2021 20:41:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233668AbhKEUoA (ORCPT ); Fri, 5 Nov 2021 16:44:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55224 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233555AbhKEUn4 (ORCPT ); Fri, 5 Nov 2021 16:43:56 -0400 Received: from mail-qv1-xf32.google.com (mail-qv1-xf32.google.com [IPv6:2607:f8b0:4864:20::f32]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B5165C061205 for ; Fri, 5 Nov 2021 13:41:16 -0700 (PDT) Received: by mail-qv1-xf32.google.com with SMTP id u25so8068552qve.2 for ; Fri, 05 Nov 2021 13:41:16 -0700 (PDT) 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=snlyzzHwKlhpr0FQR9GhCGgA3WjohVRVuCPwmLb6mTw=; b=7AjyZwDgBRbKVGHkIU2ZtEu3aS7P4SNCFaWgSxyO50Ux9nNAghyiUlHtWcY5DFpzNi pB70LVJM355chvOXXNFmO1pNwRHRL4pRF0anzz9Ey9p2So7vsrwvrEQw+U3JDrVbrPwx /RLplNtnF2Ln83oE67WT8V9cIsv6NrH8ZwOVXNWJS1KsXzFSHX0/VI0FdkgFWAyyEQEd yjGR9qS6UkdWHW3qAZaK2E7+lGqaaeph0WH99N2qARXYqv/cYKDN6ZbT0XF/d5aeGrcC cZQtJ3u6Fb2FUUqYVstaN4y3szE3cLW1+C6/c3wXgHlAWGsx1bj4eQ5XxVDHu9p0og50 WGzg== 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=snlyzzHwKlhpr0FQR9GhCGgA3WjohVRVuCPwmLb6mTw=; b=4Cfzo6c/IY1ut6/c3I83X1OCUy9eghRnpukioS/dqzX2YHEpK5VB4yOKTGM/e81JLM XjFhek4g7MojADP5maZyKkr1UdI9Ihs4hP00Htv66G8N2dtozaZdAbAtVDApRaENIjbZ T2UikQKCdmKQchNzKufhwplPy5FdHWmgvYGQAxcNanidEoCfq1bHenEORARbCX2V2kv2 +q4xJchxNi75nubOHSyyntcJk7ma0x6rUzrBK+2rAXIzUL7UFcqJv8JstT1iXrMAE3EM M+8t1G36jykx3RDNhcAozRL6UYZ4nUWRWEoLEp0tF96lxuk9lIxVDEbNJr/MJE/88Zk4 /GGw== X-Gm-Message-State: AOAM530n2kaBF4k6BfEWRZq7Se0vcV/o6ArXFPW6DcJ8APxyu+vfgAIW ZpqZ4OpuTwI6chtwQ4K3Hkicn/4cw4OsaQ== X-Google-Smtp-Source: ABdhPJzNq3Js9jqevijME91e6V2yHBsLRMEZwH9ZR2jyS/qtafjQAMxL3/Jip10XF1BDJH2DiuUoSw== X-Received: by 2002:a05:6214:29ed:: with SMTP id jv13mr1552532qvb.8.1636144875456; Fri, 05 Nov 2021 13:41:15 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id v38sm6948506qtc.63.2021.11.05.13.41.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:41:15 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 19/22] btrfs-progs: make btrfs_create_tree take a key for the root key Date: Fri, 5 Nov 2021 16:40:45 -0400 Message-Id: <51cefdd03afdcca168991826b26a22d038785a53.1636144276.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'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 c35bdff4..b9ee2505 100644 --- a/kernel-shared/disk-io.c +++ b/kernel-shared/disk-io.c @@ -2376,25 +2376,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; @@ -2405,7 +2402,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); @@ -2430,10 +2427,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 Fri Nov 5 20:40:46 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605727 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 81A2CC4332F for ; Fri, 5 Nov 2021 20:41:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 6DBC76126A for ; Fri, 5 Nov 2021 20:41:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233672AbhKEUoD (ORCPT ); Fri, 5 Nov 2021 16:44:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55230 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233660AbhKEUn5 (ORCPT ); Fri, 5 Nov 2021 16:43:57 -0400 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 D74FDC061714 for ; Fri, 5 Nov 2021 13:41:17 -0700 (PDT) Received: by mail-qt1-x835.google.com with SMTP id v4so8306259qtw.8 for ; Fri, 05 Nov 2021 13:41:17 -0700 (PDT) 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=NSL7sFouUoz3EnbD1F+IjpkB42ksgwQL364gwjyb50W9TXGB7aLVmYQ62jX+sByYRI G+7In+m2IFZwaiROIX9atM0n0dgypNJRp150XGDZOfFSSjdqj5O60UThnDm4QpRMxoWh 4k3+wQfpHQWZyucp1yJsEiRN/UH/N547lA7d3xaEzZZ4E5/PbWfqm/+jQOCKLwsoblv6 xUY/SM+kGTOdvNnI1pS0I7jl0Z1CF5EN4A0U4FgQSvTU6VSAq0+K4302++DaepgtE3yS u4RFKBiwvQ+drvyreN7zSmaJJfx3wlRfcJBWGdxEQ9+13g5BBsy6gD1NXJloM4proUMS 9Qsw== 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=oeigeDjwC0RDYEmKihr+LWvyRs39bE44W3nLj7i85L8Ru+uhcbjsi3Bm5uVtv0Q3Db jY+bFbnYLWIpRfySCsge1yEjMHcQgbeH0Wf9uqP73G+pJFb1MRLB8nApJPtFzS98J9qG lsnoo8urRfCZTL/aKCmi8VNNYavxW7Ko9zfVkled9E/ElG1s25uN3m24S1gBfW4v3xmb sc7X1S8lt6LzOHvwdt7mtvDBb/8qAW35e0+HKFI+Q2QfswMStPRX390P3eHahRwLtjt2 dmWIVe8MlPv8wqwja8E/9OjsJVzfEeNjX4x2z8FDRHwz9RxNA373vibM0rDrTFxU7Z59 r8CA== X-Gm-Message-State: AOAM5310feQ/dES6yebMwSDB4QsNDNdHabP1DQzTDG2N8/c4MwvN8zEx 3uuLEzbEIvp3bwQVCJCWKIjhQeuOYOv+mA== X-Google-Smtp-Source: ABdhPJwQNZjghGGyMhEkRQw94bFnV2h9cfs6/7mpnKYd7TtQV7mBZ0FimDR6PW8F89L51ImPPgPenQ== X-Received: by 2002:ac8:5d49:: with SMTP id g9mr43735437qtx.380.1636144876753; Fri, 05 Nov 2021 13:41:16 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id y7sm6592113qtj.39.2021.11.05.13.41.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:41:16 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 20/22] btrfs-progs: mkfs: set chunk_item_objectid properly for extent tree v2 Date: Fri, 5 Nov 2021 16:40:46 -0400 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 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 Fri Nov 5 20:40:47 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605729 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 D2A60C433EF for ; Fri, 5 Nov 2021 20:41:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C04D761279 for ; Fri, 5 Nov 2021 20:41:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232258AbhKEUoE (ORCPT ); Fri, 5 Nov 2021 16:44:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55234 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233663AbhKEUn7 (ORCPT ); Fri, 5 Nov 2021 16:43:59 -0400 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 1B957C061205 for ; Fri, 5 Nov 2021 13:41:19 -0700 (PDT) Received: by mail-qt1-x82a.google.com with SMTP id v4so8306316qtw.8 for ; Fri, 05 Nov 2021 13:41:19 -0700 (PDT) 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=m1QaAzYgnQ3xYPu9J4/KEv922sAn4FVhcv1U9rAGQl8jzzmdFL+5+Y9Fy229i/jzY/ PbehpEmj6q8mOwp86Jcuihcuxg4u0NN8lAXMI+yHN/cJmrvSHNbQhn6j5SWkNunFbk3d 2QcKkmXoyE74sPlM20T4KyWte0jl2djiJveeNGTyl4lCabXxaoCuTowTA814glzK96f9 AEKrqr3K1z7baZrjV0zagef/5jEVwCNDt8+4qzQjfF43JxaveQ8YGKH95t6YjNhQaVcp mcCA3UAHUtzgiDMFPyfmymDZbd9uM3S8D404EEktCa8SU87K6mptg7UiYMhnwueesl0K RGNA== 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=2Beb58SxAPH41eF8Cx58a+nS+Fl9Ac1mh7ScySWiDEJ96U3KecUPqHqIWfj+qh44PS 2P2TgJT0Q+Y5pg9nAY5vMCiBAueUeaLhBKVKNMNRTtfRot0LxVIPjlcZCs4LHgZ6BfDc LHeUJYPd0g4YbCdPo5jjbdtgsJAisZ++UzKN/FNxbgQkBiUg2U7HvsFDD7Jahq/kQ888 TND9De4GMAi9QzG+4rs6NNrh6QGFGxlzwrPSd1KqPU/C8WsXrWUaY5gjgsT1u6+YQ3T/ MGDClJgZIY5BiwUMEdjklADoO+gU7LFnQj2Axd+Cxadr1HTb7Fr57CbyLyIMNK3QwmRU HIhA== X-Gm-Message-State: AOAM533cg9W87Eu3W3ZLhcfU1S4FCoAN7aEkd2fZYaquD5ZVLtTt5qlt MJviSo7stc1851gRGYfQhrBNjwINWZ/Rlw== X-Google-Smtp-Source: ABdhPJysB6oQu0u6UsHPUtN64Kaga0uy+RidSVwnFUjrBHUDypEy/IrUo9xY04eJW39qSSepoBNpfg== X-Received: by 2002:a05:622a:90:: with SMTP id o16mr44715818qtw.84.1636144878069; Fri, 05 Nov 2021 13:41:18 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id e12sm6162972qtj.13.2021.11.05.13.41.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:41:17 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 21/22] btrfs-progs: mkfs: create the global root's Date: Fri, 5 Nov 2021 16:40:47 -0400 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 Fri Nov 5 20:40:48 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12605731 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 C828FC4332F for ; Fri, 5 Nov 2021 20:41:27 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B470361284 for ; Fri, 5 Nov 2021 20:41:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233660AbhKEUoG (ORCPT ); Fri, 5 Nov 2021 16:44:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55244 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233665AbhKEUoA (ORCPT ); Fri, 5 Nov 2021 16:44:00 -0400 Received: from mail-qv1-xf2a.google.com (mail-qv1-xf2a.google.com [IPv6:2607:f8b0:4864:20::f2a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 806E2C061714 for ; Fri, 5 Nov 2021 13:41:20 -0700 (PDT) Received: by mail-qv1-xf2a.google.com with SMTP id u25so8068633qve.2 for ; Fri, 05 Nov 2021 13:41:20 -0700 (PDT) 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=rrzm5vCZDjiEXy9mvLmEpPhHgVkR1Z2fVz3BA/K9oYza4Yc7obQ9JB0E9scqMzfpWy k88waPZvhWGaGi2TAwib2PYZYalBozTLAHDQJEIEnvYHU2P/SvpqFTPq9sofOwcV3xqx NQW2tqi6TcS192oa5/WZiswapY6U90ZEluq3+e/SH65OrAEs0Cqc6YWSpZAMJCjZAusj yWXRM5ILgJxXZUax/2NxTgY1GwDqpes+YwrF4tB3M3gTsBWQDdR/4gqJQBOv+xnfK2lU mpaYFLMG6hWbnkDyTLUu9mmn4TCW3RCT6CI05jjWuxhYmSWUQaHNhumYvmU32lHynFIK gSiw== 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=zo4SkPFdlIlbxybH9mca3JYpa4QTkyXc94elqd5QpBiVyImsfPi6MxkXqRLixk7/gl QTMzbNL6opP3Rotsd5NP8Niax6IFXaIUcwWkWImrNNgWWh+PId8+orB+gnCLLOBQbNhX hcpjcirvgFlbyGYpKdxRL868pPCNu1zy4IkwNNjNiyhY4JStCTb91c1Wqye2gThJ+EBC S8ds+5vNQkPqlOtME5o5MkeGI56ZuzTRICo+AEGeDVxEA5/sQMP2+s5sE3ltDhAgY+qb c7I4Oj0BUDKMN7jSP549m5L9zd1nFxcbpwq7TWly+GfwKxUG171Q6yOKQ8Di37JOZEZZ bB2g== X-Gm-Message-State: AOAM532ix1esH0In5yeWgwCYWAWKiEvyRhqFEx9B8Q8iWx7Od85rav0l 5wioqb/orcX/bEOZ9JGU/UPJN7Kb2CNCzQ== X-Google-Smtp-Source: ABdhPJxoKPxzPlRz8uHR+OodS5PLsLobq2HqSmVvkNECjVEf+2tRtefgEcAhTgGYl9++xYE06kUWCw== X-Received: by 2002:ad4:5c6c:: with SMTP id i12mr33581965qvh.42.1636144879380; Fri, 05 Nov 2021 13:41:19 -0700 (PDT) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id o20sm6288485qkp.100.2021.11.05.13.41.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:41:19 -0700 (PDT) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 22/22] btrfs-progs: check: don't do the root item check for extent tree v2 Date: Fri, 5 Nov 2021 16:40:48 -0400 Message-Id: <9a358c6ff608f81db52e8f2aa674b753cf711df6.1636144276.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();