From patchwork Wed Dec 1 18:16:55 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12650649 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 207B8C433F5 for ; Wed, 1 Dec 2021 18:17:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352042AbhLASUr (ORCPT ); Wed, 1 Dec 2021 13:20:47 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42476 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1352197AbhLASUl (ORCPT ); Wed, 1 Dec 2021 13:20:41 -0500 Received: from mail-qt1-x832.google.com (mail-qt1-x832.google.com [IPv6:2607:f8b0:4864:20::832]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 395D8C061748 for ; Wed, 1 Dec 2021 10:17:20 -0800 (PST) Received: by mail-qt1-x832.google.com with SMTP id t11so24974134qtw.3 for ; Wed, 01 Dec 2021 10:17:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=HuGfPdSGj3prkysuHHWnX3MA/RiJrsDPJ2DhpnRJ6Yw=; b=3hmNh5RFEyUEaSLEvgsNgOBsw6LfnECgnYFlS4r5PwXgAsZsrMuRPBhBXon7VRpclq oJ9pqGCFTLueNoxlsJGgDvOtTn8onoCcVpcBw+UcxSbCPl0A9y0fbVoCDgz2rrpZScP2 egiTRyrpczJU0AX+7v/PCQoz1COFRzPQ9IWgJh9rpH/8fqYjF2W2lvwRJ25OMmt5gaE8 17HMatMG49hv1zz/y4HpfuSInMHZHfAMnQaYvYiq9g9IrC/yoRYb/7SrSXJOqm3sNVqT 5LFwRckEbT622bDXPDNNiWqyX57fr7q/iKH0jHXw91LIgBEvTyr1R55z/sNlu49g3sRP nXcQ== 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=HuGfPdSGj3prkysuHHWnX3MA/RiJrsDPJ2DhpnRJ6Yw=; b=MQgVlwtRbd1iY0JsiXUcFp4qG6eOHnlZUfq6fR9cAh0vJDSz6+99RkVfY31InRrx/2 J5rBslcXwpUyGOD0tYx5Z45JY7f3mnyb+fRcfCZAPcnOgt1gAQVDwT48P04IN0bujKe9 ruLMVgJLX6lfpg5g2MY1c3O4/ecc7Yzb6W+kkpeWyGaqZC+JxIcDxJKKAH5eOtIK5eyG ST68iZNuK+djBIQqKU+kMFKFsj4YD2M0AY49hYkDc++VsLcaIzL2jp7/SOF8W8pJdU2Y vQ0OADps+7tzviwDrZAw1i3oJTXDLlooReHsM70hHcc4AtG57N/0Q6vTVHSCZGWUjZ+L Y47g== X-Gm-Message-State: AOAM530ToAlz18l5/R4hJOTM0Uk5cT01DhsfMzYKFHJp6znv4h3XfqVF OupoMeE+cGgmFB3B8aL1bGUP8VwdOkMbxw== X-Google-Smtp-Source: ABdhPJx+Bw2+IIcqUvKcKfjHG6X4yOfx6LZsxta06YY5QVZ3C1OIOyL4SSsCNrdELCEi/gY/aEDvxg== X-Received: by 2002:ac8:7e8d:: with SMTP id w13mr8789225qtj.527.1638382639126; Wed, 01 Dec 2021 10:17:19 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id f12sm223525qtj.93.2021.12.01.10.17.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Dec 2021 10:17:18 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 01/22] btrfs-progs: common: allow users to select extent-tree-v2 option Date: Wed, 1 Dec 2021 13:16:55 -0500 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We 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 7a80fa0c..9f7ccd38 100644 --- a/kernel-shared/ctree.h +++ b/kernel-shared/ctree.h @@ -513,6 +513,23 @@ BUILD_ASSERT(sizeof(struct btrfs_super_block) == BTRFS_SUPER_INFO_SIZE); (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 | \ @@ -527,6 +544,7 @@ BUILD_ASSERT(sizeof(struct btrfs_super_block) == BTRFS_SUPER_INFO_SIZE); BTRFS_FEATURE_INCOMPAT_RAID1C34 | \ BTRFS_FEATURE_INCOMPAT_METADATA_UUID | \ BTRFS_FEATURE_INCOMPAT_ZONED) +#endif /* * A leaf is full of items. offset and size tell us where to find diff --git a/mkfs/main.c b/mkfs/main.c index d0c863fd..2c4b7b00 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -1223,6 +1223,12 @@ int BOX_MAIN(mkfs)(int argc, char **argv) features |= BTRFS_FEATURE_INCOMPAT_RAID1C34; } + /* Extent tree v2 comes with a set of mandatory features. */ + if (features & BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2) { + features |= BTRFS_FEATURE_INCOMPAT_NO_HOLES; + runtime_features |= BTRFS_RUNTIME_FEATURE_FREE_SPACE_TREE; + } + if (zoned) { if (source_dir_set) { error("the option -r and zoned mode are incompatible"); From patchwork Wed Dec 1 18:16:56 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12650651 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id BBAF2C433EF for ; Wed, 1 Dec 2021 18:17:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352231AbhLASUs (ORCPT ); Wed, 1 Dec 2021 13:20:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42482 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244714AbhLASUn (ORCPT ); Wed, 1 Dec 2021 13:20:43 -0500 Received: from mail-qv1-xf29.google.com (mail-qv1-xf29.google.com [IPv6:2607:f8b0:4864:20::f29]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 965C5C061756 for ; Wed, 1 Dec 2021 10:17:21 -0800 (PST) Received: by mail-qv1-xf29.google.com with SMTP id u16so22542054qvk.4 for ; Wed, 01 Dec 2021 10:17:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=HUqDivCvEZHNPDSFN5CTZt8XmRbPAPkLoUSfQ6dlVW4=; b=HybOCUQJZNxZY2NzDe/VjrTWhnICEZniKN0vuBB+wkJW0VATRgDZkk6uNLeIKwtjq0 b8snxJuvHen7IXNYVIuwMM7xuORNq3vqYWYYLpeOa29p5NZl6zd/dA8ctGI/xmHe3WOe A1Wjdzcgab0s/TOuvAe8WDTYa7J28kzAEgDzAC+bkW0TsBx0Ee4XoWrTr21+M71PDw/O 4tYZ9P6TEeXqsPPXQkM1PbkeV+d31gfLiz4tThy3ZfHEHBhIL+qG1H53Z1xCbDXaTcGr VqZKAJot5vPM2fdLAbz5MQkBwI8iTihVK2iNieNJLlw/jwJH/Wwbb+mtL+Ibg+5mqNyl H90Q== 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=HUqDivCvEZHNPDSFN5CTZt8XmRbPAPkLoUSfQ6dlVW4=; b=IqvWqvhezgdmK/Dt/h8XJIfCU+YeCJoyCSUbjV/rzbp7x3udakEBQ/COXB6UlbdCXI 4LhZZCVuvsY+9V7w9iqLLoeBS2w+P+ZOLAek4Kix4dl18+lA2VOonnhiG4SRWzvabAOF OHSGmw2cIaH1denXSmCjS8xKsX8FvbiQfiUD9/nmG2347HSpFjHUMHhFK2uQ7P8+ZeEB +a/iyyST7bCP7fTNwsaaUY9QLtV2bfsl1EW94Qw6gD12Nj9hSJT4v3FtM03yV9+w2eE7 a63Ka0cDdIKFU+a4F8xF1VYJvVggaoIpBs3clxLDyG1MJ1QBs2S0oy2Cf0RDLia0eEI/ RVmQ== X-Gm-Message-State: AOAM533kCBLoTibWhuLklgNMAlbg+PF58FD6OIbBuzJf3j+GYyblWQWn S5X4yJODkMVPTa0d9MuicrxLetmS4cLUcA== X-Google-Smtp-Source: ABdhPJyagBEI3X07A1RuHJFyEBVCqv8u886t33/uJ+QU20MrduDznMhANbwKarZfvGOa0MkuRW3yZQ== X-Received: by 2002:a05:6214:4107:: with SMTP id kc7mr7844379qvb.12.1638382640525; Wed, 01 Dec 2021 10:17:20 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id v12sm272512qkl.50.2021.12.01.10.17.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Dec 2021 10:17:20 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 02/22] btrfs-progs: add definitions for the block group tree Date: Wed, 1 Dec 2021 13:16:56 -0500 Message-Id: <65497cc771a88eae9639977aaf3d17149ead560a.1638382588.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 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 9f7ccd38..eb815b2d 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 @@ -459,8 +462,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]; /* Padded to 4096 bytes */ @@ -2289,6 +2298,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); @@ -2339,6 +2359,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 8100748a..364a0bd8 100644 --- a/kernel-shared/disk-io.c +++ b/kernel-shared/disk-io.c @@ -1723,6 +1723,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 c7748f15..73f969c3 100644 --- a/kernel-shared/print-tree.c +++ b/kernel-shared/print-tree.c @@ -784,6 +784,9 @@ void print_objectid(FILE *stream, u64 objectid, u8 type) case BTRFS_MULTIPLE_OBJECTIDS: fprintf(stream, "MULTIPLE"); break; + case BTRFS_BLOCK_GROUP_TREE_OBJECTID: + fprintf(stream, "BLOCK_GROUP_TREE"); + break; case (u64)-1: fprintf(stream, "-1"); break; diff --git a/libbtrfsutil/btrfs_tree.h b/libbtrfsutil/btrfs_tree.h index d3b752ee..1df9efd6 100644 --- a/libbtrfsutil/btrfs_tree.h +++ b/libbtrfsutil/btrfs_tree.h @@ -48,6 +48,9 @@ /* tracks free space in block groups. */ #define BTRFS_FREE_SPACE_TREE_OBJECTID 10ULL +/* hold the block group items. */ +#define BTRFS_BLOCK_GROUP_TREE_OBJECTID 11ULL + /* device stats in the device tree */ #define BTRFS_DEV_STATS_OBJECTID 0ULL From patchwork Wed Dec 1 18:16:57 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12650655 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2194CC433FE for ; Wed, 1 Dec 2021 18:17:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352241AbhLASUv (ORCPT ); Wed, 1 Dec 2021 13:20:51 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42492 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1352188AbhLASUo (ORCPT ); Wed, 1 Dec 2021 13:20:44 -0500 Received: from mail-qk1-x730.google.com (mail-qk1-x730.google.com [IPv6:2607:f8b0:4864:20::730]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3325FC061574 for ; Wed, 1 Dec 2021 10:17:23 -0800 (PST) Received: by mail-qk1-x730.google.com with SMTP id d2so31943491qki.12 for ; Wed, 01 Dec 2021 10:17:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=FPMZiIUukGoAhWjf9kofCFi0oyiXOwzbciV86nJNAPc=; b=LI35VM2M++YlUGkgjgg1qZfmP0xiEjO12nkexonwNYGmp2Gwkk0D63xZXuYdUIQ/ZL 1wgudQtR2PpB0yB2WaZHKAh494Rcn1/YrgU1Njbs8b2sSZOnTeW0p1U9NXlPa5Mmf5AC A+sc6CJ2hfL5cM+yixmtbAh19hh/scskOiy8rjW65BSzZ9rNeC+fBwdzJb+tSjApJC0+ uMEQ6wj406Ae8RDuc7K03DEtVVqtOOTZTqXkXcrmYDj1LSomfQfL8w2urModggWF7Tec Du+2QDwPgCUsSg2vd6tHyJ2+j25d4OUDGmHT9An3w9syv0WXA/gR7hq5Ann6GHCXzDm9 gnOg== 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=FPMZiIUukGoAhWjf9kofCFi0oyiXOwzbciV86nJNAPc=; b=2l8wnifdQX9W4NqmP6mO+ByItROQHUfOIsadB4aXPe7BO85BYANYJ0SI+lKK4A5hQu h5gRq2+cu2utyeITNuGyWWnlsXIddrwa4Br+9VqfhvVJSLRCkrF8q9Nq9L6N9gP06CLA vaDrKhwsiobkBTKAlXfneC/BIU4ZHXWDbgoEGUGvqj0TmjUYqqnUaXoVP4j7EP6bQ/ZR b/qx1s2qzA9aV9SEVJo3HRRXz2P9KDsVFL2lbeF0/E2nQVrXdhRkFcjEseK1dtL9TfV2 jwGJad4fO/WVyHBIXbyeH9eWcPWvLq6W1tbfJDJRyBoFm8i64rGFtbh/iYSBJldDBW/k sKRg== X-Gm-Message-State: AOAM533C1O18OClKLPkT03OssC1+orIKktDLABkBlvogWcbpPoTalc0k 9GmFynZE891GACZTARJRA5t8rOuzcjt7uw== X-Google-Smtp-Source: ABdhPJxi7Xbu8wVTM0a5ELZRQqiGP9ujfNIg216pF1US8bl0//TY/1Xapon9T2eyFJzMstX3eMLIrA== X-Received: by 2002:a05:620a:c11:: with SMTP id l17mr7975595qki.493.1638382641964; Wed, 01 Dec 2021 10:17:21 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id k18sm290527qta.24.2021.12.01.10.17.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Dec 2021 10:17:21 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 03/22] btrfs-progs: add on disk pointers to global tree ids Date: Wed, 1 Dec 2021 13:16:57 -0500 Message-Id: <2885ee70b934ee809c7c3ddc8045938112b957fd.1638382588.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 eb815b2d..6ca49c09 100644 --- a/kernel-shared/ctree.h +++ b/kernel-shared/ctree.h @@ -830,7 +830,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__)); /* @@ -1717,6 +1723,12 @@ BTRFS_SETGET_FUNCS(block_group_flags, BTRFS_SETGET_STACK_FUNCS(stack_block_group_flags, struct btrfs_block_group_item, flags, 64); +/* extent tree v2 uses chunk_objectid for the global tree id. */ +BTRFS_SETGET_STACK_FUNCS(stack_block_group_global_tree_id, + struct btrfs_block_group_item, chunk_objectid, 64); +BTRFS_SETGET_FUNCS(block_group_global_tree_id, struct btrfs_block_group_item, + chunk_objectid, 64); + /* struct btrfs_free_space_info */ BTRFS_SETGET_FUNCS(free_space_extent_count, struct btrfs_free_space_info, extent_count, 32); From patchwork Wed Dec 1 18:16:58 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12650653 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 01014C433F5 for ; Wed, 1 Dec 2021 18:17:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352208AbhLASUu (ORCPT ); Wed, 1 Dec 2021 13:20:50 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42496 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1352217AbhLASUp (ORCPT ); Wed, 1 Dec 2021 13:20:45 -0500 Received: from mail-qt1-x831.google.com (mail-qt1-x831.google.com [IPv6:2607:f8b0:4864:20::831]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A23FCC061748 for ; Wed, 1 Dec 2021 10:17:24 -0800 (PST) Received: by mail-qt1-x831.google.com with SMTP id a2so24930745qtx.11 for ; Wed, 01 Dec 2021 10:17:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=hm2yI38I9ID5y3UEXT7HkQX1tP0i/6Ck8jfOq1nCQQ4=; b=LC+Rz7708404b8GEHGkVmGUSV3NZMgEEv7hFj2xcbmdftcY4lV4JOccs1qu+DS6ACh kgF+PCDdIo+04iCjvLe3PmjkgW3pTei8D5VGALG1vKJQdM8El6essZgmpRteJ1ENinxV 2TL3We+vp6pC8NIZSKEZORcrYCseEgN52iXJtfiOxESMiG2rxcfgRXtZDMkn6QrJrGjY wA5BazBaNAuFl9jLm0fF86X8V2SpPsFdeuzLizXU7z8jtAqrTRjFsnty0zgr2xI2AIMu Nn01N+jICXHgrsSdSZ7T4n+vuSH8QCH5NJ8uAcxwxK1mNe5xvaWdGsKUSTGwg66JD0Pv bdDA== 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=hm2yI38I9ID5y3UEXT7HkQX1tP0i/6Ck8jfOq1nCQQ4=; b=PAyWdSoa1mUwhOgL2YUrHj8U0jaxJLuKe0F83o97nq/KQPqMu29NpA8s7na7/CZNo/ ZRPBkc6VIDR3LDVcSm+iBLuPQNcUtodCOShdRpuGLTPgHnk/YmQP0g3Pl96mDLo/YJrx yYCSDnrxLAnSQJjtHLA+lWbmieQcbxuuAC8WqhDbFh+bPsv1fpFo3RfgqkYPKagiG0jJ YScA03tZJD96/X/px8NFwRVBT1gabTQfj1J1aV8PP1r1xusCEpctYlmjnnrK8Aibqamu +tuSehVO6LkkylTh/ECKZG8wcyVrURzBbNazjaWKn2nuRupQC0Cr8tP2D/Lo2LPSztBa 6+lQ== X-Gm-Message-State: AOAM531b55lzine5eFGFeQk3p0fpSy7unt6dNEEnE5znXmiHtJdSTtgU MWnAfJDeWIxZLw1Co6LAZfxIsv+xIrVJGQ== X-Google-Smtp-Source: ABdhPJwYJtRbdJi+gSPSTjrwxGksjSRTWgP1I2/O+Zj0LpbLx6XCdfqEqK2iQj2JPumoVY0GwdIwlg== X-Received: by 2002:ac8:7d47:: with SMTP id h7mr9002115qtb.486.1638382643419; Wed, 01 Dec 2021 10:17:23 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id m4sm250006qtu.87.2021.12.01.10.17.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Dec 2021 10:17:23 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 04/22] btrfs-progs: add support for loading the block group root Date: Wed, 1 Dec 2021 13:16:58 -0500 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org This adds the ability to load the block group root, as well as make sure the various backup super block and super block updates are made appropriately. Signed-off-by: Josef Bacik --- kernel-shared/ctree.h | 1 + kernel-shared/disk-io.c | 161 +++++++++++++++++++++++++++--------- kernel-shared/disk-io.h | 10 ++- kernel-shared/extent-tree.c | 8 +- kernel-shared/transaction.c | 2 + 5 files changed, 138 insertions(+), 44 deletions(-) diff --git a/kernel-shared/ctree.h b/kernel-shared/ctree.h index 6ca49c09..944bec36 100644 --- a/kernel-shared/ctree.h +++ b/kernel-shared/ctree.h @@ -1201,6 +1201,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 364a0bd8..d6cc7fd3 100644 --- a/kernel-shared/disk-io.c +++ b/kernel-shared/disk-io.c @@ -849,6 +849,9 @@ struct btrfs_root *btrfs_read_fs_root(struct btrfs_fs_info *fs_info, root = btrfs_global_root(fs_info, location); return root ? root : ERR_PTR(-ENOENT); } + if (location->objectid == BTRFS_BLOCK_GROUP_TREE_OBJECTID) + return fs_info->block_group_root ? fs_info->block_group_root : + ERR_PTR(-ENOENT); BUG_ON(location->objectid == BTRFS_TREE_RELOC_OBJECTID); @@ -887,6 +890,7 @@ void btrfs_free_fs_info(struct btrfs_fs_info *fs_info) free(fs_info->chunk_root); free(fs_info->dev_root); free(fs_info->uuid_root); + free(fs_info->block_group_root); free(fs_info->super_copy); free(fs_info->log_root_tree); free(fs_info); @@ -905,10 +909,12 @@ struct btrfs_fs_info *btrfs_new_fs_info(int writable, u64 sb_bytenr) fs_info->dev_root = calloc(1, sizeof(struct btrfs_root)); fs_info->quota_root = calloc(1, sizeof(struct btrfs_root)); fs_info->uuid_root = calloc(1, sizeof(struct btrfs_root)); + fs_info->block_group_root = calloc(1, sizeof(struct btrfs_root)); fs_info->super_copy = calloc(1, BTRFS_SUPER_INFO_SIZE); if (!fs_info->tree_root || !fs_info->chunk_root || !fs_info->dev_root || - !fs_info->quota_root || !fs_info->uuid_root || !fs_info->super_copy) + !fs_info->quota_root || !fs_info->uuid_root || + !fs_info->block_group_root || !fs_info->super_copy) goto free_all; extent_io_tree_init(&fs_info->extent_cache); @@ -1028,7 +1034,7 @@ static int read_root_or_create_block(struct btrfs_fs_info *fs_info, static inline bool maybe_load_block_groups(struct btrfs_fs_info *fs_info, u64 flags) { - struct btrfs_root *root = btrfs_extent_root(fs_info, 0); + struct btrfs_root *root = btrfs_block_group_root(fs_info); if (flags & OPEN_CTREE_NO_BLOCK_GROUPS) return false; @@ -1039,7 +1045,6 @@ static inline bool maybe_load_block_groups(struct btrfs_fs_info *fs_info, return false; } - static int load_global_roots_objectid(struct btrfs_fs_info *fs_info, struct btrfs_path *path, u64 objectid, unsigned flags, char *str) @@ -1138,43 +1143,99 @@ out: return ret; } -int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info, u64 root_tree_bytenr, - unsigned flags) +static int load_important_roots(struct btrfs_fs_info *fs_info, + u64 root_tree_bytenr, unsigned flags) { struct btrfs_super_block *sb = fs_info->super_copy; + struct btrfs_root_backup *backup = NULL; struct btrfs_root *root; - struct btrfs_key key; - u64 generation; + u64 bytenr, gen; int level; + int index = -1; int ret; - root = fs_info->tree_root; - btrfs_setup_root(root, fs_info, BTRFS_ROOT_TREE_OBJECTID); - generation = btrfs_super_generation(sb); - level = btrfs_super_root_level(sb); - - if (!root_tree_bytenr && !(flags & OPEN_CTREE_BACKUP_ROOT)) { - root_tree_bytenr = btrfs_super_root(sb); - } else if (flags & OPEN_CTREE_BACKUP_ROOT) { - struct btrfs_root_backup *backup; - int index = find_best_backup_root(sb); + if (flags & OPEN_CTREE_BACKUP_ROOT) { + index = find_best_backup_root(sb); if (index >= BTRFS_NUM_BACKUP_ROOTS) { fprintf(stderr, "Invalid backup root number\n"); return -EIO; } - backup = fs_info->super_copy->super_roots + index; - root_tree_bytenr = btrfs_backup_tree_root(backup); - generation = btrfs_backup_tree_root_gen(backup); + backup = sb->super_roots + index; + } + + if (!btrfs_fs_incompat(fs_info, EXTENT_TREE_V2)) { + free(fs_info->block_group_root); + fs_info->block_group_root = NULL; + goto tree_root; + } + + if (backup) { + bytenr = btrfs_backup_block_group_root(backup); + gen = btrfs_backup_block_group_root_gen(backup); + level = btrfs_backup_block_group_root_level(backup); + } else { + bytenr = btrfs_super_block_group_root(sb); + gen = btrfs_super_block_group_root_generation(sb); + level = btrfs_super_block_group_root_level(sb); + } + root = fs_info->block_group_root; + btrfs_setup_root(root, fs_info, BTRFS_BLOCK_GROUP_TREE_OBJECTID); + + ret = read_root_node(fs_info, root, bytenr, gen, level); + if (ret) { + fprintf(stderr, "Couldn't read block group root\n"); + return -EIO; + } + + if (maybe_load_block_groups(fs_info, flags)) { + int ret = btrfs_read_block_groups(fs_info); + if (ret < 0 && ret != -ENOENT) { + errno = -ret; + error("failed to read block groups: %m"); + return ret; + } + } + +tree_root: + if (backup) { + bytenr = btrfs_backup_tree_root(backup); + gen = btrfs_backup_tree_root_gen(backup); level = btrfs_backup_tree_root_level(backup); + } else { + if (root_tree_bytenr) + bytenr = root_tree_bytenr; + else + bytenr = btrfs_super_root(sb); + gen = btrfs_super_generation(sb); + level = btrfs_super_root_level(sb); } - ret = read_root_node(fs_info, root, root_tree_bytenr, generation, - level); + fs_info->generation = gen; + fs_info->last_trans_committed = gen; + root = fs_info->tree_root; + btrfs_setup_root(root, fs_info, BTRFS_ROOT_TREE_OBJECTID); + + ret = read_root_node(fs_info, root, bytenr, gen, level); if (ret) { fprintf(stderr, "Couldn't read tree root\n"); return -EIO; } + return 0; +} + +int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info, u64 root_tree_bytenr, + unsigned flags) +{ + struct btrfs_super_block *sb = fs_info->super_copy; + struct btrfs_root *root = fs_info->tree_root; + struct btrfs_key key; + int ret; + + ret = load_important_roots(fs_info, root_tree_bytenr, flags); + if (ret) + return ret; + ret = load_global_roots(fs_info, flags); if (ret) return ret; @@ -1212,9 +1273,8 @@ int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info, u64 root_tree_bytenr, return -EIO; } - fs_info->generation = generation; - fs_info->last_trans_committed = generation; - if (maybe_load_block_groups(fs_info, flags)) { + if (!btrfs_fs_incompat(fs_info, EXTENT_TREE_V2) && + maybe_load_block_groups(fs_info, flags)) { ret = btrfs_read_block_groups(fs_info); /* * If we don't find any blockgroups (ENOENT) we're either @@ -1257,6 +1317,8 @@ static void release_global_roots(struct btrfs_fs_info *fs_info) void btrfs_release_all_roots(struct btrfs_fs_info *fs_info) { release_global_roots(fs_info); + if (fs_info->block_group_root) + free_extent_buffer(fs_info->block_group_root->node); if (fs_info->quota_root) free_extent_buffer(fs_info->quota_root->node); if (fs_info->dev_root) @@ -1997,8 +2059,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; @@ -2030,11 +2090,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. @@ -2054,18 +2109,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) @@ -2112,7 +2186,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; @@ -2129,6 +2203,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 b315e16e..cb1ba4e2 100644 --- a/kernel-shared/disk-io.h +++ b/kernel-shared/disk-io.h @@ -216,9 +216,17 @@ struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans, u64 objectid); struct btrfs_root *btrfs_csum_root(struct btrfs_fs_info *fs_info, u64 bytenr); struct btrfs_root *btrfs_extent_root(struct btrfs_fs_info *fs_inf, u64 bytenr); -struct btrfs_root *btrfs_block_group_root(struct btrfs_fs_info *fs_info); struct btrfs_root *btrfs_global_root(struct btrfs_fs_info *fs_info, struct btrfs_key *key); int btrfs_global_root_insert(struct btrfs_fs_info *fs_info, struct btrfs_root *root); + +static inline struct btrfs_root *btrfs_block_group_root( + struct btrfs_fs_info *fs_info) +{ + if (btrfs_fs_incompat(fs_info, EXTENT_TREE_V2)) + return fs_info->block_group_root; + return btrfs_extent_root(fs_info, 0); +} + #endif diff --git a/kernel-shared/extent-tree.c b/kernel-shared/extent-tree.c index 3713452b..a1c061fa 100644 --- a/kernel-shared/extent-tree.c +++ b/kernel-shared/extent-tree.c @@ -1540,7 +1540,7 @@ static int update_block_group_item(struct btrfs_trans_handle *trans, { int ret; struct btrfs_fs_info *fs_info = trans->fs_info; - struct btrfs_root *root = btrfs_extent_root(fs_info, 0); + struct btrfs_root *root = btrfs_block_group_root(fs_info); unsigned long bi; struct btrfs_block_group_item bgi; struct extent_buffer *leaf; @@ -2731,7 +2731,7 @@ int btrfs_read_block_groups(struct btrfs_fs_info *fs_info) int ret; struct btrfs_key key; - root = btrfs_extent_root(fs_info, 0); + root = btrfs_block_group_root(fs_info); key.objectid = 0; key.offset = 0; key.type = BTRFS_BLOCK_GROUP_ITEM_KEY; @@ -2812,7 +2812,7 @@ static int insert_block_group_item(struct btrfs_trans_handle *trans, key.type = BTRFS_BLOCK_GROUP_ITEM_KEY; key.offset = block_group->length; - root = btrfs_extent_root(fs_info, 0); + root = btrfs_block_group_root(fs_info); return btrfs_insert_item(trans, root, &key, &bgi, sizeof(bgi)); } @@ -2929,7 +2929,7 @@ static int remove_block_group_item(struct btrfs_trans_handle *trans, { struct btrfs_fs_info *fs_info = trans->fs_info; struct btrfs_key key; - struct btrfs_root *root = btrfs_extent_root(fs_info, 0); + struct btrfs_root *root = btrfs_block_group_root(fs_info); int ret = 0; key.objectid = block_group->start; diff --git a/kernel-shared/transaction.c b/kernel-shared/transaction.c index 5b991651..02012266 100644 --- a/kernel-shared/transaction.c +++ b/kernel-shared/transaction.c @@ -185,6 +185,8 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans, goto commit_tree; if (root == root->fs_info->chunk_root) goto commit_tree; + if (root == root->fs_info->block_group_root) + goto commit_tree; free_extent_buffer(root->commit_root); root->commit_root = NULL; From patchwork Wed Dec 1 18:16:59 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12650657 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id BC949C433EF for ; Wed, 1 Dec 2021 18:17:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352243AbhLASUw (ORCPT ); Wed, 1 Dec 2021 13:20:52 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42506 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244486AbhLASUr (ORCPT ); Wed, 1 Dec 2021 13:20:47 -0500 Received: from mail-qk1-x72c.google.com (mail-qk1-x72c.google.com [IPv6:2607:f8b0:4864:20::72c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 181E4C061574 for ; Wed, 1 Dec 2021 10:17:26 -0800 (PST) Received: by mail-qk1-x72c.google.com with SMTP id 193so32004478qkh.10 for ; Wed, 01 Dec 2021 10:17:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=y5pCcCIHgqihEAKf9GAY8gVsSoBwrxGFlyrKMuXvKEE=; b=Sr4mXJhz7tucEoDPmL9TCwIJ9K2A/bJlPY+qDT9gMKp95oTEYCmIdNL7BJKJeXdoni qkISYL8PBKaALvznVpJ2xPIjLq7fRNF6OYkvoRLzUWk7CTU5MI3TudXWSGKqsPAX0Q/V EYTnvl0JmJa8oZ1VKcqY92VKhnggMUuEhn4TWbNIxEhZ6jzF0JlGNoKe34Q5i99BfF36 1CLZ5UAJhWVGhXdxu8ByutH88LYC7aBcXeMbPRiXyUlJ2mthXx4Yr+asPPiw0K+U4HW9 VdH8A9WTj12CZPeQxyT/vP98x0frF/cy0yqU2HDrslcya3zwCWb8qb4owsj1yyHq0Jc6 79gg== 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=y5pCcCIHgqihEAKf9GAY8gVsSoBwrxGFlyrKMuXvKEE=; b=uxJcl6zCrywO+MCS2rCP2z0WCD7IwB35oLzzJCnnEpm8LcoE/jyapZB+eOZfZONA7G GSTXAKNvIwxpvJRLWpb8ImiCa0AywOz9WJw6iu1BEzUoqNmYIEaKt/3j7dxrZMBKt0bW bBXDp3b5/0vX1d32o0bRj44u7UQ+XPv0GIOX0VJWt637SVbIh6xyvhBIwDdhwdvfXIkB 3UEqNrr6pup3rcrXjKOBzLS63YywjaInRjOrGn4OMTjSasgG5V2ym8cdSPFeC8GO8Nv3 YLCISlaJPtyj9yMvIuAPuXHHEsVem+Kl7Z8ZwbwKgEdhh7E81FpiolSH5UQFXYPt9Yqc Qghw== X-Gm-Message-State: AOAM532OI5LAgyjyw6CtYJltknsIHqCsbm2K3t9roazddpYcKiINDN+d uBg4/83sRn407wTF7SmBh3oRCFgtYbTykA== X-Google-Smtp-Source: ABdhPJwKiRghZxMJSrV5GTRJN7ip99H/IdY+YFyFYUFjmTYZUbQo/GNc2amXk8LYAGZ8s6UySXO9aw== X-Received: by 2002:a05:620a:131a:: with SMTP id o26mr7883617qkj.71.1638382644771; Wed, 01 Dec 2021 10:17:24 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id v21sm302131qta.0.2021.12.01.10.17.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Dec 2021 10:17:24 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 05/22] btrfs-progs: add print support for the block group tree Date: Wed, 1 Dec 2021 13:16:59 -0500 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Add the 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 73f969c3..a612c3d9 100644 --- a/kernel-shared/print-tree.c +++ b/kernel-shared/print-tree.c @@ -1858,8 +1858,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), @@ -1868,7 +1874,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)); @@ -1880,7 +1887,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)); @@ -1898,12 +1905,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); } } } @@ -2020,6 +2029,12 @@ void btrfs_print_superblock(struct btrfs_super_block *sb, int full) (unsigned long long)btrfs_super_cache_generation(sb)); printf("uuid_tree_generation\t%llu\n", (unsigned long long)btrfs_super_uuid_tree_generation(sb)); + printf("block_group_root\t%llu\n", + (unsigned long long)btrfs_super_block_group_root(sb)); + printf("block_group_root_generation\t%llu\n", + (unsigned long long)btrfs_super_block_group_root_generation(sb)); + printf("block_group_root_level\t%llu\n", + (unsigned long long)btrfs_super_block_group_root_level(sb)); uuid_unparse(sb->dev_item.uuid, buf); printf("dev_item.uuid\t\t%s\n", buf); From patchwork Wed Dec 1 18:17:00 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12650659 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8C603C433F5 for ; Wed, 1 Dec 2021 18:17:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352253AbhLASU5 (ORCPT ); Wed, 1 Dec 2021 13:20:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42512 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1352221AbhLASUs (ORCPT ); Wed, 1 Dec 2021 13:20:48 -0500 Received: from mail-qv1-xf2f.google.com (mail-qv1-xf2f.google.com [IPv6:2607:f8b0:4864:20::f2f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5C52AC061748 for ; Wed, 1 Dec 2021 10:17:27 -0800 (PST) Received: by mail-qv1-xf2f.google.com with SMTP id i13so22537550qvm.1 for ; Wed, 01 Dec 2021 10:17:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=M5UJeG4Uv5lgjGhkC7NOs0vewswjeS1CW8LEfH64gL0=; b=AbtjkBCJ4ZqA2q4Me4nr7e70S6gFsPFC/wIj9BBtwbrLG4aTdTSsD5iAijYmHtn4Ee vNqBRoTKwMam1xg3+xyD9on7bf5zFIzgxqaFuo7XaGjQZ0VHoWhvLhdk7yasuGtwJuLR 8iSYei8R4ZqwWQ0MC2BrpBL5ARGjAHA9PiLjHuzl8opo+Jb570lQGgeM8CQJ/PCl/mVL 7zIBmrv09g0y7FmRwfs7mTLxQ216tY+cVheg0v1zEMnut4u5TsQ+MS4QPcUs91G5xqGx 1Ji4udpOJbSvRFPyqfCCO0V52/sO64+BjjgQV10XDIqvVIBDcVTQwiSFAfm2288P/9nd 7Gig== 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=M5UJeG4Uv5lgjGhkC7NOs0vewswjeS1CW8LEfH64gL0=; b=gpYrzGeWOoed6rtNqt9EpO36xHhznEA/U7F9fIlNzqQvWxlWEd0ws8ySX6rtU5get8 VNf4PZe4MgCsUd3DbZEN4eVt5cM+ds9glvWM7MCVCgOLtCSO1Mx3zGJe4bY7tEwUZ/sj TOxhLAtLP1fOzqfQsJSWxBGvNZACcMtWXYlhkQF4gtyWy+5hfyLhvWPJWqVAVkJJ2hn5 fnqfvrSJxH2QitVsUsu1NQbzdHDs20sOAEv3z3dLracLClTVvoHkVw/ghES88dvwUsm9 FkrIq47Ji2oT4S2qgm9O1a+cSKTkuZbdgOKLJLzcE8BQAVjnC+EaLN3djjkktWC6iAhS BP2w== X-Gm-Message-State: AOAM531DaWDAmhPfvFQXGtLDUqEjklK1DvoLyV241B7U/X3hVChMsNBC DoBSA/XVKlxmplOd2HQulcix+/cxs1IDBA== X-Google-Smtp-Source: ABdhPJxgTL8gyzXHo18UC+JFG3+5I8pd6M11Io2c6apjrO+kfIdaVJfBcESMP6LBZ3voAfY5rirDnA== X-Received: by 2002:a05:6214:246f:: with SMTP id im15mr8472080qvb.21.1638382646072; Wed, 01 Dec 2021 10:17:26 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id a15sm292760qtb.5.2021.12.01.10.17.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Dec 2021 10:17:25 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 06/22] btrfs-progs: mkfs: use the btrfs_block_group_root helper Date: Wed, 1 Dec 2021 13:17:00 -0500 Message-Id: <792e8cb51282e6dcaa0160c6ca469fc9225089a2.1638382588.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 5d1eed52..b3563ee1 100644 --- a/check/main.c +++ b/check/main.c @@ -9400,6 +9400,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; @@ -9473,7 +9474,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); @@ -9487,7 +9487,7 @@ again: key.objectid = cache->start; key.type = BTRFS_BLOCK_GROUP_ITEM_KEY; key.offset = cache->length; - ret = btrfs_insert_item(trans, extent_root, &key, &bgi, + ret = btrfs_insert_item(trans, bg_root, &key, &bgi, sizeof(bgi)); if (ret) { fprintf(stderr, "Error adding block group\n"); diff --git a/mkfs/main.c b/mkfs/main.c index 2c4b7b00..9a57cef8 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -596,7 +596,7 @@ static int cleanup_temp_chunks(struct btrfs_fs_info *fs_info, { struct btrfs_trans_handle *trans = NULL; struct btrfs_block_group_item *bgi; - struct btrfs_root *root = btrfs_extent_root(fs_info, 0); + struct btrfs_root *root = btrfs_block_group_root(fs_info); struct btrfs_key key; struct btrfs_key found_key; struct btrfs_path path; From patchwork Wed Dec 1 18:17:01 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12650661 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 78528C4332F for ; Wed, 1 Dec 2021 18:17:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352235AbhLASU7 (ORCPT ); Wed, 1 Dec 2021 13:20:59 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42516 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1352138AbhLASUt (ORCPT ); Wed, 1 Dec 2021 13:20:49 -0500 Received: from mail-qt1-x82a.google.com (mail-qt1-x82a.google.com [IPv6:2607:f8b0:4864:20::82a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 83C85C061574 for ; Wed, 1 Dec 2021 10:17:28 -0800 (PST) Received: by mail-qt1-x82a.google.com with SMTP id t11so24974555qtw.3 for ; Wed, 01 Dec 2021 10:17:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=KNkMciKNt/whslgMekzPaIvfMEwa+U3L0W4rFrYFXc4=; b=ozQEK13C4UGocityLoPRYdX/KS0Bi2XuvgniD4UHMzTLThE+dL5hbz9uvOByrPVwUA mgfM/V+p1dTU42//N+W1ZI4dJ8li8ounWQUAu/+/L+SacvblUt7q/w+tfeWAs7PbhXAd oa5MBWAn63Bp9fSqbbhDw6lYEiXjmS6eu76Rk1OtDipI1JwNmpGRmw5EiKT6zuRFG979 q5bjuhqokZXwIczWGg5QcGBhcc1zPBUp01yTFhOVYQBGrIPBLG4uyNQEHIb+h4Kj42LG vVxxp8px3FauNN3MUo0wA6sr/r5rTI+Sm06LxZv7JPiNp9xGRuZDNXidqDil7uB/TfyO WzLQ== 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=QGkV+shDlpndkP5bgSGqAZIV671UPFTTcQYPVMdf0meyU7twl6Q0/qVfOK4egVWi0Q zAdVR/SWdGc8jLWnAfEsM5hZmKCzlMIX0zWOgXKGDQNkwOzFp4Tjbai/lMKQAbwm6m2x 8vXZLl3qnLcXjHeaoLN/46su2NINzwH3VNk3xLq7DuVFdl48eMN1sy+4KYkpPaF+ACiF PnU6Rm9+8DnbzsSKYMOe1co3L1H6mqmdeh0el7IcfdFZwhoMJ95fdeUZiHUbEVKrA8Kb j+6ogxhEyeWtGj+raR93/KvIbunDp9SVmjEXVcF6dgEpLVrewgm1T+kMSXTp3bXCsurY HskQ== X-Gm-Message-State: AOAM530c1IG6kIxVkJWb18baE32rXrzzF799NjfIzY6j1uVy6Qlpavnz Gc1Yzqo0NhNQDzDI09fulfzaJRzqX9j8/g== X-Google-Smtp-Source: ABdhPJxS+5uFpIm7DyThHTE43bsQ6Q+JBu9YrOSVzd+jwREstvx1t23bVdw4DwLB+2OEQoYoZ/jbGg== X-Received: by 2002:a05:622a:38d:: with SMTP id j13mr8721573qtx.159.1638382647457; Wed, 01 Dec 2021 10:17:27 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id f7sm260852qkp.107.2021.12.01.10.17.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Dec 2021 10:17:26 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 07/22] btrfs-progs: check-lowmem: use the btrfs_block_group_root helper Date: Wed, 1 Dec 2021 13:17:01 -0500 Message-Id: <695ed52c2aa658a89ecfc1ebe656c5b41e7f8126.1638382588.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org When we're messing with block group items use the btrfs_block_group_root() helper to get the correct root to search, and this will do the right thing based on the file system flags. Signed-off-by: Josef Bacik --- check/mode-lowmem.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/check/mode-lowmem.c b/check/mode-lowmem.c index cc6773cd..263b56d1 100644 --- a/check/mode-lowmem.c +++ b/check/mode-lowmem.c @@ -266,7 +266,7 @@ static int modify_block_group_cache(struct btrfs_block_group *block_group, int c */ static int modify_block_groups_cache(u64 flags, int cache) { - struct btrfs_root *root = btrfs_extent_root(gfs_info, 0); + struct btrfs_root *root = btrfs_block_group_root(gfs_info); struct btrfs_key key; struct btrfs_path path; struct btrfs_block_group *bg_cache; @@ -331,7 +331,7 @@ static int clear_block_groups_full(u64 flags) static int create_chunk_and_block_group(u64 flags, u64 *start, u64 *nbytes) { struct btrfs_trans_handle *trans; - struct btrfs_root *root = btrfs_extent_root(gfs_info, 0); + struct btrfs_root *root = btrfs_block_group_root(gfs_info); int ret; if ((flags & BTRFS_BLOCK_GROUP_TYPE_MASK) == 0) @@ -419,7 +419,7 @@ static int is_chunk_almost_full(u64 start) { struct btrfs_path path; struct btrfs_key key; - struct btrfs_root *root = btrfs_extent_root(gfs_info, 0); + struct btrfs_root *root = btrfs_block_group_root(gfs_info); struct btrfs_block_group_item *bi; struct btrfs_block_group_item bg_item; struct extent_buffer *eb; @@ -4591,7 +4591,7 @@ next: static int find_block_group_item(struct btrfs_path *path, u64 bytenr, u64 len, u64 type) { - struct btrfs_root *root = btrfs_extent_root(gfs_info, 0); + struct btrfs_root *root = btrfs_block_group_root(gfs_info); struct btrfs_block_group_item bgi; struct btrfs_key key; int ret; From patchwork Wed Dec 1 18:17:02 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12650673 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B2DBAC43217 for ; Wed, 1 Dec 2021 18:17:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352249AbhLASVH (ORCPT ); Wed, 1 Dec 2021 13:21:07 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42526 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1352240AbhLASUv (ORCPT ); Wed, 1 Dec 2021 13:20:51 -0500 Received: from mail-qt1-x82f.google.com (mail-qt1-x82f.google.com [IPv6:2607:f8b0:4864:20::82f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2F3C3C061574 for ; Wed, 1 Dec 2021 10:17:30 -0800 (PST) Received: by mail-qt1-x82f.google.com with SMTP id l8so24991201qtk.6 for ; Wed, 01 Dec 2021 10:17:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=zzGoFbPaHjYxOdEvMNYA2KUeGYoOWZmWRW9btUenLJA=; b=rWD1nK7qpDbeO90wudJouXkeaxvIPY45tTCHg4q5aCsHRRaPOFHlTPVR4mMSuHZ4dN L1iD3pmzX/gn34cRA9O8beq2TDXUDvsf/1eIcT31/Mng53H0DUBVYX+Ce1Td5r6VD7p+ BVX6pFBLM0/TvbRbmi4DQ161oI1MEgsgdQIp9BL/Tny56dnz4El/DJt/WKSge6fbPLJI cpYTRxaqrliMO2oOgLizKXiDsJkIqQ/lUNr6cBaLKQphgvYYHHV2C5BVY/TR2vsNy9RZ WA24nlhJj2NgdoDFSx3JcHhuNkOx6h9/5vidaEf1bwdzgaXXmodCpS3QOWsUS6SyqSSh IFpg== 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=ufJ/BMk2Rcsfn9vQduL/D44UWdL9F0MqZ59zEyLQAMb9SbhzhMDk66IXZMwEGaFoCL 9MfZ4q+BAduARLlIt7d4HO0uUtJ9WyZJf+sQW8Ynoyh5uw6ymIdVtZj2xFcq+IxhpyLN 8ZxVuZQECn6/nzMtAFCTEWzKOc2qi/ieHD63tWGubFalVlxf5/R58GER/2UbWhgf/PEN Du6b336KZQB45zs+sdOHVkkvrtd6Vdtm1hIXvR87P19zIiQpWWFoNurZvJGkXJAlVwsq t7yZQLzOvfEBGtSrjoCcVUR4qhMJDEcdn65qNNIACnk1hFVCs25Dcwor4Ib8EYYHh0rf lf/A== X-Gm-Message-State: AOAM531u6pVYE7YOTgpu5KhniYzqpBVk+qrMBcFJQrn1HW1SUxYdX0Ei tgy1MOwxGxYwYvifKJgO+RceGxEBO3zfuw== X-Google-Smtp-Source: ABdhPJwt+l4ag2J9vwmTUfL+n9k3gkkUlO+b2CN25uFFAlIB0EqdSVnaQVn1fYe0GLK9Oo9F+izeHA== X-Received: by 2002:a05:622a:1312:: with SMTP id v18mr8527479qtk.177.1638382649073; Wed, 01 Dec 2021 10:17:29 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id m9sm247079qkn.59.2021.12.01.10.17.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Dec 2021 10:17:28 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 08/22] btrfs-progs: handle no bg item in extent tree for free space tree Date: Wed, 1 Dec 2021 13:17:02 -0500 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We have an ASSERT(ret == 0) when populating the free space tree as we should at least find the block group item with extent tree v1. However with v2 we no longer have the block group item in the extent tree, so fix the population logic to handle an empty block group (which occurs during mkfs) and only assert if ret != 0 and we don't have extent tree v2 turned on. Signed-off-by: Josef Bacik --- kernel-shared/free-space-tree.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/kernel-shared/free-space-tree.c b/kernel-shared/free-space-tree.c index 0fdf5004..896bd3a2 100644 --- a/kernel-shared/free-space-tree.c +++ b/kernel-shared/free-space-tree.c @@ -1057,6 +1057,9 @@ int populate_free_space_tree(struct btrfs_trans_handle *trans, if (ret) goto out; + start = block_group->start; + end = block_group->start + block_group->length; + /* * Iterate through all of the extent and metadata items in this block * group, adding the free space between them and the free space at the @@ -1071,10 +1074,11 @@ int populate_free_space_tree(struct btrfs_trans_handle *trans, ret = btrfs_search_slot_for_read(extent_root, &key, path, 1, 0); if (ret < 0) goto out; - ASSERT(ret == 0); + if (ret > 0) { + ASSERT(btrfs_fs_incompat(trans->fs_info, EXTENT_TREE_V2)); + goto done; + } - start = block_group->start; - end = block_group->start + block_group->length; while (1) { btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]); @@ -1106,6 +1110,7 @@ int populate_free_space_tree(struct btrfs_trans_handle *trans, if (ret) break; } +done: if (start < end) { ret = __add_to_free_space_tree(trans, block_group, path2, start, end - start); From patchwork Wed Dec 1 18:17:03 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12650663 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 17DE8C433EF for ; Wed, 1 Dec 2021 18:17:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352138AbhLASVA (ORCPT ); Wed, 1 Dec 2021 13:21:00 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42532 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1352246AbhLASUw (ORCPT ); Wed, 1 Dec 2021 13:20:52 -0500 Received: from mail-qk1-x736.google.com (mail-qk1-x736.google.com [IPv6:2607:f8b0:4864:20::736]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B6017C061748 for ; Wed, 1 Dec 2021 10:17:31 -0800 (PST) Received: by mail-qk1-x736.google.com with SMTP id i9so32011447qki.3 for ; Wed, 01 Dec 2021 10:17:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=OahoTkH0eZVBdEIwK7y7ronVUT5278dpzKaHJf6ikjA=; b=UU32txONr8OXVn93utyTF71nBg+d+P8QR74wl1rX4MQ01yXeUt+jfwlNfQpht8e1tN WrszIys62JQ/gslLHFBYmkmxfJkVs7NZtHViMkw16VwM03dUcw9sdAYvzRmxi1xqsKDs JKSLP+08KUQJO6WCe2B8wdtRWrybl18wRnzztRRTRQobb/N2tb4VDhn1zU67c/PgS/g4 peuqhRY+uhGUMe2QyT11IWk9bZbP2cljuMU1fyZXNATz5/NWa1vtD8jB3Ta+oy6Eh87F Al7oh0PR+4VOtUIqm4YCjfkEfRNOA5maENrO2ZN8mGzNtKUqQlWjzRtETXdP30V00/TW +avw== 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=OahoTkH0eZVBdEIwK7y7ronVUT5278dpzKaHJf6ikjA=; b=irjhhhFf6RsfZuK4FL7pXjPZqHbRi4vCrgT5jxK1QEP6JYd8ncaRriCaAuwfmJuQFK MvvKDffOHUEdYpmYwZARfk+Fdk5bi50z99CToytGooOzxLq9KkdSUUjhYGZHBvD7v8Pf 87dNXvn6jhaIDyHv9kqm0bOe/9sPHSDFf0RNhX86E6a1km/oq0aU//g2AgpdPDz29bXt iPJ5LHAH1uASerXcYLulyjSxMWfWOsdAzgBbDfA7ZKYWpY2xslmQ/fXJsUo/EUgEFXmh 8cFey/f3l/1SSCZlWFEu79nYEEtm0ipg2IokZ0proVCJ6Zb3sUoQbAE1imRWJV2hVrky aqxw== X-Gm-Message-State: AOAM532r1tcCwRM6L3bRQwUxfdv1ZbaEPOXQmmquuZe8NW4OAgktbSSF oc9TmpOFIKSwwrpCfGHidKnVmyjIeWH2gw== X-Google-Smtp-Source: ABdhPJwhDEXRIxVOaOuojVuHyYBO4bXOH00jphpMmf7j7q4Sv3ECwSzj3N+royCsu/cvjai5VIkUhw== X-Received: by 2002:a37:68d3:: with SMTP id d202mr8062442qkc.70.1638382650479; Wed, 01 Dec 2021 10:17:30 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id f16sm236173qkk.16.2021.12.01.10.17.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Dec 2021 10:17:29 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 09/22] btrfs-progs: mkfs: add support for the block group tree Date: Wed, 1 Dec 2021 13:17:03 -0500 Message-Id: <06ab652a52b3247df9c677cddb6e08a0543b3618.1638382588.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 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 fec23e64..d91b1e6f 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; @@ -310,6 +364,12 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg) btrfs_set_super_compat_ro_flags(&super, ro_flags); btrfs_set_super_cache_generation(&super, 0); } + 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); @@ -341,25 +401,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++; } @@ -580,6 +627,14 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg) goto out; } + if (extent_tree_v2) { + ret = create_block_group_tree(fd, cfg, buf, + system_group_offset, + system_group_size, total_used); + if (ret) + goto out; + } + /* and write out the super block */ memset(buf->data, 0, BTRFS_SUPER_INFO_SIZE); memcpy(buf->data, &super, sizeof(super)); diff --git a/mkfs/common.h b/mkfs/common.h index 66c9d9d0..6a48aa52 100644 --- a/mkfs/common.h +++ b/mkfs/common.h @@ -51,6 +51,7 @@ enum btrfs_mkfs_block { MKFS_FS_TREE, MKFS_CSUM_TREE, MKFS_FREE_SPACE_TREE, + MKFS_BLOCK_GROUP_TREE, MKFS_BLOCK_COUNT }; @@ -69,6 +70,17 @@ static const enum btrfs_mkfs_block extent_tree_v1_blocks[] = { MKFS_FREE_SPACE_TREE, }; +static const enum btrfs_mkfs_block extent_tree_v2_blocks[] = { + MKFS_ROOT_TREE, + MKFS_EXTENT_TREE, + MKFS_CHUNK_TREE, + MKFS_DEV_TREE, + MKFS_FS_TREE, + MKFS_CSUM_TREE, + MKFS_FREE_SPACE_TREE, + MKFS_BLOCK_GROUP_TREE, +}; + struct btrfs_mkfs_config { /* Label of the new filesystem */ const char *label; diff --git a/mkfs/main.c b/mkfs/main.c index 9a57cef8..1653ab32 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -299,6 +299,11 @@ static int recow_roots(struct btrfs_trans_handle *trans, ret = __recow_root(trans, info->dev_root); if (ret) return ret; + if (btrfs_fs_incompat(info, EXTENT_TREE_V2)) { + ret = __recow_root(trans, info->block_group_root); + if (ret) + return ret; + } ret = recow_global_roots(trans); if (ret) return ret; From patchwork Wed Dec 1 18:17:04 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12650665 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 63019C433EF for ; Wed, 1 Dec 2021 18:17:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352218AbhLASVB (ORCPT ); Wed, 1 Dec 2021 13:21:01 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42540 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1352248AbhLASU4 (ORCPT ); Wed, 1 Dec 2021 13:20:56 -0500 Received: from mail-qk1-x735.google.com (mail-qk1-x735.google.com [IPv6:2607:f8b0:4864:20::735]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0B793C06174A for ; Wed, 1 Dec 2021 10:17:33 -0800 (PST) Received: by mail-qk1-x735.google.com with SMTP id p4so31991539qkm.7 for ; Wed, 01 Dec 2021 10:17:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=S8rLavpX0K8kRyVpzqSbFoyoKf5rceaTacSOQ9Yu2Ug=; b=gbIt8i1qZhllQy7k79UF6MwsjuBIgK4B44WYR+sZSYq+CSzRsHgiqp4aiZ9ZJ8yFgJ uwYxhYjzczcQgrhTxaTxOwlx6Xj3dwdRsahqQOBlLnCUVEsxhPFpu6QpBy8M6cX9tXXf xQ6d6DNGtGPg5cqAZr9RZMG5/m/GUilSYlzXfPvoMyDbtR8tGEDanJ1EHECAZ5T0e+PP dRuhTWmNoaY/ZOA5+vkam/qeYR9BSj7FpZo9zEGknuJJwDrEHb5k17ZEMz8rOg8csxns eVZrBBr8xj+eLdJ908P5GGmMcBL7lc77djD8hqPf0VkyVYUX8CeiOEdkfYXsK2SxRRhP P6+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=S8rLavpX0K8kRyVpzqSbFoyoKf5rceaTacSOQ9Yu2Ug=; b=iOwAOzQwUlK8P/WR4isG3YDpvcfIaFpieoku1uWmKx4OJYZUakqLewxEqjGYbvTifm 5tfaDG15cNz9guM1vDfhZItQqkToK3Asf9aNd1/BO7T0EZAFr8QDC4ywKX6Va6ep90I/ 43m5wZPTK56SLHZkszzZJ6Ju0dEtA7ssK/9k+a9hIxvVoD0Pebf/cMMl8oNwifsZe3Ja Q9RlaD8usPlRLG9mN1pnWuAEuHMinVRrZ+ndz4hivAyZ4pzV5I0pAYn1a0YCc4IyB//K +tL4UoE9JiyIVxsbBL4cNzQPRuXGl8WL9C5wYPLI6pQIj5tEuTm5/aWSX4H29ExJ2c7O 0auA== X-Gm-Message-State: AOAM530oblWeyVPjIqX+KyBZYlP/dYhZ5BXpvmV3TSNFpHfAUJ9l88qF DCNvAbK5JFJGYoVWwPg7TJsrmalZb3eF4w== X-Google-Smtp-Source: ABdhPJyBfMX/TJ3F1rAGPHKBv3C5LrzEyErKIRxg1wqBoY1kCFKSdemAVB//3k4k45ti9wXaEeLtTA== X-Received: by 2002:a05:620a:2486:: with SMTP id i6mr8056514qkn.522.1638382651880; Wed, 01 Dec 2021 10:17:31 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id o10sm291173qtx.33.2021.12.01.10.17.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Dec 2021 10:17:31 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 10/22] btrfs-progs: check: add block group tree support Date: Wed, 1 Dec 2021 13:17:04 -0500 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org This makes the appropriate changes to enable the block group tree checking for both lowmem and normal check modes. This is relatively straightforward, simply need to use the helper to get the right root for dealing with block groups. Signed-off-by: Josef Bacik --- check/main.c | 21 ++++++++++++++++++++- check/mode-lowmem.c | 4 ++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/check/main.c b/check/main.c index b3563ee1..6341dd43 100644 --- a/check/main.c +++ b/check/main.c @@ -6242,10 +6242,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; @@ -9466,6 +9473,18 @@ again: return ret; } + /* + * If we are extent tree v2 then we can reint the block group root as + * well. + */ + if (btrfs_fs_incompat(gfs_info, EXTENT_TREE_V2)) { + ret = btrfs_fsck_reinit_root(trans, gfs_info->block_group_root); + if (ret) { + fprintf(stderr, "block group initialization failed\n"); + return ret; + } + } + /* * Now we have all the in-memory block groups setup so we can make * allocations properly, and the metadata we care about is safe since we diff --git a/check/mode-lowmem.c b/check/mode-lowmem.c index 263b56d1..7be12e6b 100644 --- a/check/mode-lowmem.c +++ b/check/mode-lowmem.c @@ -5530,7 +5530,7 @@ int check_chunks_and_extents_lowmem(void) key.offset = 0; key.type = BTRFS_ROOT_ITEM_KEY; - ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0); + ret = btrfs_search_slot(NULL, gfs_info->tree_root, &key, &path, 0, 0); if (ret) { error("cannot find extent tree in tree_root"); goto out; @@ -5565,7 +5565,7 @@ int check_chunks_and_extents_lowmem(void) if (ret) goto out; next: - ret = btrfs_next_item(root, &path); + ret = btrfs_next_item(gfs_info->tree_root, &path); if (ret) goto out; } From patchwork Wed Dec 1 18:17:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12650671 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id AF49FC4332F for ; Wed, 1 Dec 2021 18:17:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242537AbhLASVG (ORCPT ); Wed, 1 Dec 2021 13:21:06 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42546 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1352249AbhLASU4 (ORCPT ); Wed, 1 Dec 2021 13:20:56 -0500 Received: from mail-qv1-xf2e.google.com (mail-qv1-xf2e.google.com [IPv6:2607:f8b0:4864:20::f2e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6ED21C061756 for ; Wed, 1 Dec 2021 10:17:34 -0800 (PST) Received: by mail-qv1-xf2e.google.com with SMTP id i13so22537837qvm.1 for ; Wed, 01 Dec 2021 10:17:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=MsHd+omzg3fLiFS+pOt2YWV8wr0jRWzNLntxMRqjGoU=; b=YZkaszH9jigDJOick8L0pON+svsTUOhYu/Dwzo0+LwkUlLTXj2rEwKBBzV6hVCCxRn 9mZbxdI44kf7Box9gMa/+nU4tHow1UtO1gPiKKM0S1oJk5yygoCWM+BaSHfwPvuw0ggE nyK9nUr1b+NFa3/j7x10uGD1VBZq4ZqERrtZD086TqYxYKoKNZyJ9zxvrfr497x4mDMS f+FwFC1l00A+1wlHtBktaERPaBLUCBsxBLq02s4SGXzG0gBdI1bP4v6Htc3cJLzYw0M3 ReoR/TlmJPk2rYMRQm2pS1+V3Fdz4ECfNImHdVZpHlVaf/jQig7N2X8bVodAgfM+fM5s iJeg== 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=fTO1lKU2iSZqygz5aFoZvNbXCozzqE1NGKNsBrflzc1IKZz4h1CGL2hRHsJSVNDteC oQ6LbSaYuOp0QoP7p+aquCaP30Bbro2bUKQjp8KvQGwaDQaws/IYlba5UCy4Fn/1d9+Q AXelLSFpTTgbzR1jp5HE36rcA5KwUlMJHhlyjmr+bvCcrwWtMrcmO38hELZASUHtSaIe ohjtpkt0PraaQ0JhgGXEwEKxH4/iaf07hNgS2hUCKrafehp3XuqBWR6Gq9MhkQdv9Hl3 G8WssIbxr+mfF3r7koUcb1neM5OPIwSLB9Do5g71zeoNkZRO0QtulVjiLebS0jn8gMw6 dw+g== X-Gm-Message-State: AOAM530y2S/zxZJAhV8TfnpKo7rchv/uVDBfNhCk/XkwHR89cEqq3+6A xq6CaKnQos+qQuL/rIo/l48xw029Ml+bQA== X-Google-Smtp-Source: ABdhPJzvphMMDKLwh6V7uuK0tkb/TtP5b6ddZodDm62ELPfZvVL6k0ak0NYk8BhNVF+lt/JEoiNYEw== X-Received: by 2002:a0c:d841:: with SMTP id i1mr7796705qvj.126.1638382653251; Wed, 01 Dec 2021 10:17:33 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id q20sm260058qkl.53.2021.12.01.10.17.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Dec 2021 10:17:32 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 11/22] btrfs-progs: qgroup-verify: scan extents based on block groups Date: Wed, 1 Dec 2021 13:17:05 -0500 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org When we switch to per-block group extent roots we'll need to scan each individual extent root. To make this easier in the future go ahead and use the range of the block groups to scan the extents. Signed-off-by: Josef Bacik --- check/qgroup-verify.c | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/check/qgroup-verify.c b/check/qgroup-verify.c index 0813b841..45007d8c 100644 --- a/check/qgroup-verify.c +++ b/check/qgroup-verify.c @@ -1400,6 +1400,7 @@ static bool is_bad_qgroup(struct qgroup_count *count) */ int qgroup_verify_all(struct btrfs_fs_info *info) { + struct rb_node *n; int ret; bool found_err = false; bool skip_err = false; @@ -1430,10 +1431,17 @@ int qgroup_verify_all(struct btrfs_fs_info *info) /* * Put all extent refs into our rbtree */ - ret = scan_extents(info, 0, ~0ULL); - if (ret) { - fprintf(stderr, "ERROR: while scanning extent tree: %d\n", ret); - goto out; + for (n = rb_first(&info->block_group_cache_tree); n; n = rb_next(n)) { + struct btrfs_block_group *bg; + + bg = rb_entry(n, struct btrfs_block_group, cache_node); + ret = scan_extents(info, bg->start, + bg->start + bg->length - 1); + if (ret) { + fprintf(stderr, "ERROR: while scanning extent tree: %d\n", + ret); + goto out; + } } ret = map_implied_refs(info); @@ -1507,6 +1515,7 @@ static void print_subvol_info(u64 subvolid, u64 bytenr, u64 num_bytes, int print_extent_state(struct btrfs_fs_info *info, u64 subvol) { + struct rb_node *n; int ret; tree_blocks = ulist_alloc(0); @@ -1519,10 +1528,17 @@ int print_extent_state(struct btrfs_fs_info *info, u64 subvol) /* * Put all extent refs into our rbtree */ - ret = scan_extents(info, 0, ~0ULL); - if (ret) { - fprintf(stderr, "ERROR: while scanning extent tree: %d\n", ret); - goto out; + for (n = rb_first(&info->block_group_cache_tree); n; n = rb_next(n)) { + struct btrfs_block_group *bg; + + bg = rb_entry(n, struct btrfs_block_group, cache_node); + ret = scan_extents(info, bg->start, + bg->start + bg->length - 1); + if (ret) { + fprintf(stderr, "ERROR: while scanning extent tree: %d\n", + ret); + goto out; + } } ret = map_implied_refs(info); From patchwork Wed Dec 1 18:17:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12650667 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2B6D2C433F5 for ; Wed, 1 Dec 2021 18:17:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352226AbhLASVF (ORCPT ); Wed, 1 Dec 2021 13:21:05 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42552 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1352252AbhLASU4 (ORCPT ); Wed, 1 Dec 2021 13:20:56 -0500 Received: from mail-qk1-x72e.google.com (mail-qk1-x72e.google.com [IPv6:2607:f8b0:4864:20::72e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B1B73C061757 for ; Wed, 1 Dec 2021 10:17:35 -0800 (PST) Received: by mail-qk1-x72e.google.com with SMTP id de30so32073568qkb.0 for ; Wed, 01 Dec 2021 10:17:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=4l91HVV/v5Bstov0d0M5YDFYrPEwlzXFTGAFfoyqa14=; b=Lr6HUZvqRj62kQgw0IkSU6RLbJq9KJJk6sgiBnyYSMka8VovxCOP8xSc+PK3XIxoym 7+MLfoI4aq/WJFnhdTPqs1u5iC9tz3IB5praGkcsmIW8rumYoNgRMTh6JR+7jN88upS4 OQEPZ+uJSLIoAqdqbnF5maea5qZe53Ne/VDLIVWeCwTcVLA9J82Ttn5iiUbg8Z1V+c2L ZCqsxLK28TCX7ytn9P+dj2zYIxPDWN9xAwOIYPZI/6dPsq/8Dd98AXn69xLQK/e8z+Uv uGNEJV7W952Nc64vsuBIbenRR1xUmwVfK34g/1N4cPjV3H+KnH/v0s/lSpKiJhTp7ZfM QczA== 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=4l91HVV/v5Bstov0d0M5YDFYrPEwlzXFTGAFfoyqa14=; b=cyqg2pnJOaF8XyrlLnMAVADM9TN9rVMqVIQEdLNV+BZg6o2912xOF0xS2aljSNst8i 0Sp3d1d2P3G8s+KXK0IrnnXFMc+0IO2YuIjoF3A9q3OYdbwRMKYXEZVNJQ0ADOtC6WzX EiclaPoi2UoKMH/x/159M1ziFoQrcnTrHkucFWAtYTI4nFIQQd/Dnd19N2iLK3TK1nLI 6RJBb8+DdaqICok3zYyeyKboF8QmQ/DXpzhWZqdYyfJMP81pcr/ewmC8q5PvqRcXDWuY GHQE3ewu56mms+THDR94LjQXU7KqUbXhnzYvaYwL6Jy6DqlZaNkdFvi9STjFJm9voczE yflg== X-Gm-Message-State: AOAM531d3XQp2EJ+1mytHiPQeWzaPxxAA++K5XZ69JOVQ+aMIeFIRmRY PhqK3jX+n8rFROAYnP34tmxWMqdkwjUU+w== X-Google-Smtp-Source: ABdhPJyQvscB8tKp7q3/AvrYnbHGz5EA2Y4mc5qYutlaGYwiBTCiFUvgfkPRdkHPQK85LkRhJA6A4Q== X-Received: by 2002:a05:620a:652:: with SMTP id a18mr8073181qka.146.1638382654567; Wed, 01 Dec 2021 10:17:34 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id 139sm244297qkn.37.2021.12.01.10.17.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Dec 2021 10:17:34 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 12/22] btrfs-progs: check: make free space tree validation extent tree v2 aware Date: Wed, 1 Dec 2021 13:17:06 -0500 Message-Id: <67cc55b2906ccd9ccfe62174158c39a39fe835e4.1638382588.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 6341dd43..4b7b52b5 100644 --- a/check/main.c +++ b/check/main.c @@ -5611,72 +5611,38 @@ static int check_cache_range(struct btrfs_root *root, } static int verify_space_cache(struct btrfs_root *root, - struct btrfs_block_group *cache) + struct btrfs_block_group *cache, + struct extent_io_tree *used) { - struct btrfs_path path; - struct extent_buffer *leaf; - struct btrfs_key key; - u64 last; + u64 start, end, last_end, bg_end; int ret = 0; - root = btrfs_extent_root(root->fs_info, cache->start); + start = cache->start; + bg_end = cache->start + cache->length; + last_end = start; - last = max_t(u64, cache->start, BTRFS_SUPER_INFO_OFFSET); - - btrfs_init_path(&path); - key.objectid = last; - key.offset = 0; - key.type = BTRFS_EXTENT_ITEM_KEY; - ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0); - if (ret < 0) - goto out; - ret = 0; - while (1) { - if (path.slots[0] >= btrfs_header_nritems(path.nodes[0])) { - ret = btrfs_next_leaf(root, &path); - if (ret < 0) - goto out; - if (ret > 0) { - ret = 0; - break; - } - } - leaf = path.nodes[0]; - btrfs_item_key_to_cpu(leaf, &key, path.slots[0]); - if (key.objectid >= cache->start + cache->length) + while (start < bg_end) { + ret = find_first_extent_bit(used, cache->start, &start, &end, + EXTENT_DIRTY); + if (ret || start >= bg_end) { + ret = 0; break; - if (key.type != BTRFS_EXTENT_ITEM_KEY && - key.type != BTRFS_METADATA_ITEM_KEY) { - path.slots[0]++; - continue; } - - if (last == key.objectid) { - if (key.type == BTRFS_EXTENT_ITEM_KEY) - last = key.objectid + key.offset; - else - last = key.objectid + gfs_info->nodesize; - path.slots[0]++; - continue; + if (last_end < start) { + ret = check_cache_range(root, cache, last_end, + start - last_end); + if (ret) + return ret; } - - ret = check_cache_range(root, cache, last, - key.objectid - last); - if (ret) - break; - if (key.type == BTRFS_EXTENT_ITEM_KEY) - last = key.objectid + key.offset; - else - last = key.objectid + gfs_info->nodesize; - path.slots[0]++; + end = min(end, bg_end - 1); + clear_extent_dirty(used, start, end); + start = end + 1; + last_end = start; } - if (last < cache->start + cache->length) - ret = check_cache_range(root, cache, last, - cache->start + cache->length - last); - -out: - btrfs_release_path(&path); + if (last_end < bg_end) + ret = check_cache_range(root, cache, last_end, + bg_end - last_end); if (!ret && !RB_EMPTY_ROOT(&cache->free_space_ctl->free_space_offset)) { @@ -5690,11 +5656,17 @@ out: static int check_space_cache(struct btrfs_root *root) { + struct extent_io_tree used; struct btrfs_block_group *cache; u64 start = BTRFS_SUPER_INFO_OFFSET + BTRFS_SUPER_INFO_SIZE; int ret; int error = 0; + extent_io_tree_init(&used); + ret = btrfs_mark_used_blocks(gfs_info, &used); + if (ret) + return ret; + while (1) { ctx.item_count++; cache = btrfs_lookup_first_block_group(gfs_info, start); @@ -5739,14 +5711,14 @@ static int check_space_cache(struct btrfs_root *root) continue; } - ret = verify_space_cache(root, cache); + ret = verify_space_cache(root, cache, &used); if (ret) { fprintf(stderr, "cache appears valid but isn't %llu\n", cache->start); error++; } } - + extent_io_tree_cleanup(&used); return error ? -EINVAL : 0; } From patchwork Wed Dec 1 18:17:07 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12650669 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 18FCFC433FE for ; Wed, 1 Dec 2021 18:17:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352247AbhLASVH (ORCPT ); Wed, 1 Dec 2021 13:21:07 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42556 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1352255AbhLASU6 (ORCPT ); Wed, 1 Dec 2021 13:20:58 -0500 Received: from mail-qk1-x729.google.com (mail-qk1-x729.google.com [IPv6:2607:f8b0:4864:20::729]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1F4B5C061574 for ; Wed, 1 Dec 2021 10:17:37 -0800 (PST) Received: by mail-qk1-x729.google.com with SMTP id a11so31945615qkh.13 for ; Wed, 01 Dec 2021 10:17:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=v4FABLQaO1+JZ6SjwMvWfD+bmFkhD+Xzd02HcEUXRyY=; b=NSPvlskMaDMYlzvVSgIGymiTy41/Igz36QdADAhpfRRwrt/92sbF/Etjfl/wnw4WvE 3L38heW3UC6zjbLCarXvEYmoVz9cFF2Hv1DMLSdvmFd2NIeDsfP2UdL7M15D2fEI1+2S H69B+kArApFNQ3EC5jZvzoWLogI1qIbKRUdbm7kuSaU0Y+ro+LdG7Wctn+bjtTAnBW9+ GTDwwWeQNlYU2s/JMaLNNIWsizJD8pqvqxefkS0LJ8OPAm5qc9WNGg9mYzXqG/UEGli1 ZheMGlm/WfUOIgLf5VMfvghF0M59DKP0JNU9dtgElm3Z2BjK4WGQdUKBVxxJcpaeg2Mb lKNg== 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=v4FABLQaO1+JZ6SjwMvWfD+bmFkhD+Xzd02HcEUXRyY=; b=j8hClyM+DdpBR43R9/SVoDh64ax4mxQAXmO42QooD5JE8UquVKhgiMTt4tIKhI17zx H4Tyfll2H0EKlLX+3kziO2m+1Oj7Quo6It10D/9kWkgSvCI7wsOWUdl0Wx4x4we7orW6 S2Pc/lkn7GtvkK6VMzUEMkoQALlRPTlPlOa8X/3iBLxO/MCsBe5GA0vznBNQbmLMapqA PlRWJr6h54ia5QLVqli9BGdJS1mD5SQiCeuH7s/jQL09Z2crGsHMo0twdZ6pkRP+7F7m DQi5J2Dp9WZjgH0GMCGn1dhW4tMK1vzLxkpslC+7gcRE7A/9DhOJS3p4FU26rpqg3OGH 2Shw== X-Gm-Message-State: AOAM533zJJa1jNIal4y3dVxUfpA8kCkZrjYFF18dAAV3hd6ZeFaQOKTS 3/9fI7gJVzZ6wOh1tNAisvz26Ve+/YD0vw== X-Google-Smtp-Source: ABdhPJy4fOQxL0otgaut83jV4NLsMmWZcD+uXzSRIzsfBx8iimD0ERb8gjlF9zrV3iAVl+jHaX9r9Q== X-Received: by 2002:a05:620a:2239:: with SMTP id n25mr7707399qkh.758.1638382655905; Wed, 01 Dec 2021 10:17:35 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id y18sm323230qtx.19.2021.12.01.10.17.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Dec 2021 10:17:35 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 13/22] btrfs-progs: check: add helper to reinit the root based on a key Date: Wed, 1 Dec 2021 13:17:07 -0500 Message-Id: <2c51d6b12e40cd31a505db8bea5210d37c0ef067.1638382588.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 4b7b52b5..97cd3249 100644 --- a/check/main.c +++ b/check/main.c @@ -9103,29 +9103,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); @@ -9135,25 +9140,48 @@ static int btrfs_fsck_reinit_root(struct btrfs_trans_handle *trans, BTRFS_UUID_SIZE); btrfs_mark_buffer_dirty(c); + /* - * this case can happen in the following case: - * - * reinit reloc data root, this is because we skip pin - * down reloc data tree before which means we can allocate - * same block bytenr here. + * The root item may not exist, try to insert an empty one so it exists, + * otherwise simply update the existing one with the correct settings. */ - if (old->start == c->start) { - btrfs_set_root_generation(&root->root_item, - trans->transid); - root->root_item.level = btrfs_header_level(root->node); - ret = btrfs_update_root(trans, gfs_info->tree_root, - &root->root_key, &root->root_item); - if (ret) { - free_extent_buffer(c); - return ret; - } - } - free_extent_buffer(old); + ret = btrfs_insert_empty_item(trans, gfs_info->tree_root, path, key, + sizeof(ri)); + if (ret == -EEXIST) { + read_extent_buffer(path->nodes[0], &ri, + btrfs_item_ptr_offset(path->nodes[0], + path->slots[0]), + sizeof(ri)); + } else if (ret) { + btrfs_free_path(path); + free_extent_buffer(c); + return ERR_PTR(ret); + } + btrfs_set_root_bytenr(&ri, c->start); + btrfs_set_root_generation(&ri, trans->transid); + btrfs_set_root_refs(&ri, 1); + btrfs_set_root_used(&ri, c->len); + btrfs_set_root_generation_v2(&ri, trans->transid); + + write_extent_buffer(path->nodes[0], &ri, + btrfs_item_ptr_offset(path->nodes[0], + path->slots[0]), + sizeof(ri)); + btrfs_mark_buffer_dirty(path->nodes[0]); + btrfs_free_path(path); + return c; +} + +static int btrfs_fsck_reinit_root(struct btrfs_trans_handle *trans, + struct btrfs_root *root) +{ + struct extent_buffer *c; + + c = btrfs_fsck_clear_root(trans, &root->root_key); + if (IS_ERR(c)) + return PTR_ERR(c); + + free_extent_buffer(root->node); root->node = c; add_root_to_dirty_list(root); return 0; From patchwork Wed Dec 1 18:17:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12650675 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4C2BAC433EF for ; Wed, 1 Dec 2021 18:17:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352250AbhLASVI (ORCPT ); Wed, 1 Dec 2021 13:21:08 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42566 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243455AbhLASU7 (ORCPT ); Wed, 1 Dec 2021 13:20:59 -0500 Received: from mail-qv1-xf2b.google.com (mail-qv1-xf2b.google.com [IPv6:2607:f8b0:4864:20::f2b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 787B1C061574 for ; Wed, 1 Dec 2021 10:17:38 -0800 (PST) Received: by mail-qv1-xf2b.google.com with SMTP id bu11so22587419qvb.0 for ; Wed, 01 Dec 2021 10:17:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=WIYv919bF2sxsTp8hgqPuuZCHRSwanWy/d5wVXN/PCs=; b=NegPROj+CUzCHFrokgUCRB3IAmjImG+1KCAk4plMkoU2J+wWcxkYsSxBLcOl1i72m5 mwlJLE0FMHqymENqSFBSHJOTV8WxuBswaWfGhWBetUXoHAx4pj8LOzSHZUF/sIqpfYUk greSCCxPOpIPjAP5co31Nwlj2pnQwy9vDOa5h+9yIh3A8EprL9eetROsREG8lyY7p6uU HPEhxiGhS+RUx9M2c3cLwqBlhDcznOyymWOHdHTSIHXl7IgMuR52f30b68TUfVzto+Iv OijIDagPu6zjTW2jkSVekw+ujJRYHOwfsk/4N4kvLr+QsPGekPlQI3/YliAgE9iBQIHz WTBw== 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=WIYv919bF2sxsTp8hgqPuuZCHRSwanWy/d5wVXN/PCs=; b=4XRgXv0RNTPPA2n557WcGg4fK7leGi6Vsh24K3um1+JCJY0c4g9s3sb6VwYOB/Lj6u mfAVsHw24MYf3JA9J57uNjeJVKyx8eAx7E/sCwE6CEnRL/TkRRZJb4jMAwgKadoIPH4s AXizVxqbaDrnzzYVvllrwWHePGpYFcP/FqVLheKZgA625xeq8sH8pOmAF0C4V/qjh5S+ dndf0IldM236nRaWy8GulRXVJpgMI3WHq/sEvY/eYqPlFvZEYbS/F3B94WpUaCSZb7nH f/xriI7xL/bjj95en78uywb109KM/qIwnJGBg2fx4V5CFzDO23CEq9bPayvff+PdI0tG w2nQ== X-Gm-Message-State: AOAM531jZ49eclaGo++TO0ZryXJYmooK7XJvE2rdzn/tSb3sgVjqF6ot OaAJAtoesAR5Oq8yA91KXHZTQL2ATs5u8Q== X-Google-Smtp-Source: ABdhPJwr4txGNCSUVMxO6un0MNyTsbzxjdAF1BL94ZLbIqU2/epQQa8szZdf6BO4UaFsd4N0taLf6A== X-Received: by 2002:ad4:54f2:: with SMTP id k18mr8078369qvx.63.1638382657380; Wed, 01 Dec 2021 10:17:37 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id l2sm273447qtk.41.2021.12.01.10.17.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Dec 2021 10:17:36 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 14/22] btrfs-progs: check: handle the block group tree properly Date: Wed, 1 Dec 2021 13:17:08 -0500 Message-Id: <59cdd0bd10cded5bccf4692b2c9587ae532c9ff4.1638382588.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We need to make sure we process the block group root, and mark its blocks as used for the free space tree checking. Signed-off-by: Josef Bacik --- check/main.c | 27 +++++++++++++++++---------- common/repair.c | 3 +++ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/check/main.c b/check/main.c index 97cd3249..6be22d77 100644 --- a/check/main.c +++ b/check/main.c @@ -8921,6 +8921,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; @@ -8939,9 +8951,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; @@ -8974,16 +8984,13 @@ static int check_chunks_and_extents(void) } again: - root1 = gfs_info->tree_root; - level = btrfs_header_level(root1->node); - ret = add_root_item_to_list(&normal_trees, root1->root_key.objectid, - root1->node->start, 0, level, 0, NULL); + ret = load_super_root(&normal_trees, gfs_info->tree_root); + if (ret < 0) + goto out; + ret = load_super_root(&normal_trees, gfs_info->chunk_root); if (ret < 0) goto out; - root1 = gfs_info->chunk_root; - level = btrfs_header_level(root1->node); - ret = add_root_item_to_list(&normal_trees, root1->root_key.objectid, - root1->node->start, 0, level, 0, NULL); + ret = load_super_root(&normal_trees, gfs_info->block_group_root); if (ret < 0) goto out; diff --git a/common/repair.c b/common/repair.c index f8c3f89c..9071e627 100644 --- a/common/repair.c +++ b/common/repair.c @@ -149,6 +149,9 @@ int btrfs_mark_used_tree_blocks(struct btrfs_fs_info *fs_info, ret = traverse_tree_blocks(tree, fs_info->chunk_root->node, 0); if (!ret) ret = traverse_tree_blocks(tree, fs_info->tree_root->node, 1); + if (!ret && fs_info->block_group_root) + ret = traverse_tree_blocks(tree, + fs_info->block_group_root->node, 0); return ret; } From patchwork Wed Dec 1 18:17:09 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12650681 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9400FC433F5 for ; Wed, 1 Dec 2021 18:17:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352263AbhLASVJ (ORCPT ); Wed, 1 Dec 2021 13:21:09 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42574 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1352201AbhLASVB (ORCPT ); Wed, 1 Dec 2021 13:21:01 -0500 Received: from mail-qt1-x831.google.com (mail-qt1-x831.google.com [IPv6:2607:f8b0:4864:20::831]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E83CDC061574 for ; Wed, 1 Dec 2021 10:17:39 -0800 (PST) Received: by mail-qt1-x831.google.com with SMTP id v22so24960372qtx.8 for ; Wed, 01 Dec 2021 10:17:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=ZzQyX1O4+i0YK8TYwov+OiFd5E7vIpk4yBgi6KZ1DSE=; b=oSFR1B0PZ39WEVUrXrz+wk9H4XTgTzzKNQyWxGs+lm9Ro080LtOGkvEhOkv8kGxmr/ ToFMrs+4LXoCa2qwqCzhCCFfGalJ48V+uKaiNTakLyTSgZH3chnINa4qWfVeC0HdBUSw ouzLimLCxCXE9+9ptQWp2t0Mx7o28prcH8N5QOf3id6T4uRplDg0756/0cYBrTbmpawh RptP97OhsG+HAhuMnuStUW2/D/+8MacpNiUbAg7YIDCoRxuHKi3tGFnemWUXlCbFX9WT GI/+GfxbhxB3dIwuloV/DNcuY5iYC9xyRc9UQQkA50C571XBDMoQj3dfWJn4n2F5gKr8 jXHg== 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=ZzQyX1O4+i0YK8TYwov+OiFd5E7vIpk4yBgi6KZ1DSE=; b=0caEbXiC10aWP6TM7wYrWIONfcxQdaKe5BXdy0tWSpXUCSuGp2xeWN+qKNvyduaLAn QRxy5+380qR45wfKMEkMMdiVWXvkn36trpA9+8fHQPr0djbaswd6VYUP9sbqbVuU+1LW Z+TF5zfM8Cbbgeibl5NFODg2ooEkHmpujojjwk4bONLkw2vNZlKtMsgxNMclnkXn2mFn ++dX5mDkyz5awStpKCwvo0wIyGsIdhaIwYosBzSF203ITTfHsVEVRVeclTs/hkYeudJI MllCzlW3ze26P50NRXzFG54brsMfe0I+LYCg4+siuPOiyaVepBscoZWzT3+pPfxgVEje 3dpg== X-Gm-Message-State: AOAM532SSwRmjPBvRmIbJMXX2pbFmnBpX7IvQ1Ifndos9y65nq4MMX7E dntrSkbEvNA1VD1KtxBlPtp85/yLDvF6OQ== X-Google-Smtp-Source: ABdhPJxwvi7KiBlugEiKHElRQ1F5ZoZYFKvq4YiJUx3H1DrLJOIZ+yrWa3v5dKJQ+gLbseOCNOVdfw== X-Received: by 2002:ac8:5a42:: with SMTP id o2mr8845466qta.400.1638382658900; Wed, 01 Dec 2021 10:17:38 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id y15sm263999qko.74.2021.12.01.10.17.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Dec 2021 10:17:38 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 15/22] btrfs-progs: load the number of global roots into the fs_info Date: Wed, 1 Dec 2021 13:17:09 -0500 Message-Id: <821c6ec198d80991ca480cc7f628c0621ca2bf8e.1638382588.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 944bec36..9530db8b 100644 --- a/kernel-shared/ctree.h +++ b/kernel-shared/ctree.h @@ -1270,6 +1270,8 @@ struct btrfs_fs_info { u16 csum_type; u16 csum_size; + 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 d6cc7fd3..3283120c 100644 --- a/kernel-shared/disk-io.c +++ b/kernel-shared/disk-io.c @@ -1450,6 +1450,44 @@ int btrfs_setup_chunk_tree_and_device_map(struct btrfs_fs_info *fs_info, return 0; } +static int btrfs_get_global_roots_count(struct btrfs_fs_info *fs_info) +{ + struct btrfs_key key = { + .objectid = BTRFS_EXTENT_TREE_OBJECTID, + .type = BTRFS_ROOT_ITEM_KEY, + .offset = (u64)-1, + }; + struct btrfs_path *path; + int ret; + + if (!btrfs_fs_incompat(fs_info, EXTENT_TREE_V2)) + return 0; + + path = btrfs_alloc_path(); + if (!path) + return -ENOMEM; + ret = btrfs_search_slot(NULL, fs_info->tree_root, &key, path, 0, 0); + if (ret < 0) + goto out; + if (ret == 0) { + ret = -EINVAL; + error("Found a corrupt root item looking for global roots count"); + goto out; + } + ret = btrfs_previous_item(fs_info->tree_root, path, key.objectid, + key.type); + if (ret) { + ret = -EINVAL; + error("Didn't find a extent root looking for global roots count"); + goto out; + } + btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]); + fs_info->num_global_roots = key.offset + 1; +out: + btrfs_free_path(path); + return ret; +} + static struct btrfs_fs_info *__open_ctree_fd(int fp, struct open_ctree_flags *ocf) { struct btrfs_fs_info *fs_info; @@ -1598,6 +1636,10 @@ static struct btrfs_fs_info *__open_ctree_fd(int fp, struct open_ctree_flags *oc !fs_info->ignore_chunk_tree_error) goto out_chunk; + ret = btrfs_get_global_roots_count(fs_info); + if (ret && !(flags & OPEN_CTREE_PARTIAL)) + goto out_chunk; + return fs_info; out_chunk: From patchwork Wed Dec 1 18:17:10 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12650677 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E11BBC4321E for ; Wed, 1 Dec 2021 18:17:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352252AbhLASVI (ORCPT ); Wed, 1 Dec 2021 13:21:08 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42580 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1352220AbhLASVC (ORCPT ); Wed, 1 Dec 2021 13:21:02 -0500 Received: from mail-qk1-x72c.google.com (mail-qk1-x72c.google.com [IPv6:2607:f8b0:4864:20::72c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 47A59C061748 for ; Wed, 1 Dec 2021 10:17:41 -0800 (PST) Received: by mail-qk1-x72c.google.com with SMTP id de30so32073856qkb.0 for ; Wed, 01 Dec 2021 10:17:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=nS+tqew8QWOc9LBM0MXg9F9F2D7TlV1JSdFrftR6fAk=; b=BER00S73WD6DGCxkaGnwBgZvj+lDIYeJTkkgAD3XmkWIuhl8UNhPsE+LtK8OR1mklb gQik7IPe3bjRCnEMUseZmpi31iSz1fuHdeKruFMGERP5F1ee6NbKO7/fE01wInSsgs4S jv/iQBoj7bGwCc9qZEEgUUm4QggfkZe74/ueqoZmCUl7ICtNqyFWDqImfIG3EjnALqSQ +/OIIksixHE1z6Vb8eEJyA7CnTU6/tEFk8sHIqGBEPl4lesLV9C6BkJQw75FNbsRrtZK H7sDmSpappkVxGem/CdXnVtpn9ExOaj8A2dPA66T+oc2rno6Js0gx8cGHx+kAp+nixsK tfvA== 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=nS+tqew8QWOc9LBM0MXg9F9F2D7TlV1JSdFrftR6fAk=; b=uWxbukH/xkzWc2985p4tJNmxpjZ850bEkUQSLONRlAnYVGhC2rXe6+z/FuhnswHyue r7K5XCr/2WhCVB2z3Y1w6ImArA2eS3tSUSmJNlZtnAEoqabRmZFWwNxaWa5lZambJ+uF pZihy/tNLs47EZMvxWZnOIEaU01+H97iym7E7dUb4EzYLfyYVCeLoPsZJg2FD9ighkKv 4ILu920yYcnCwHbkDhMTpKU87gRhe+Hd9LBNbOM9fFKCrNiXoCyJbiXvm57Bdm8Dbn7N zjgKP/2Jk87XV/yhH+ED4DOW0nEk7MWs6MdsFsoPXZqgMx91AGtlK8D1d+FhF7kOVyNZ ZekQ== X-Gm-Message-State: AOAM5318b8Hgn3qU53VdygNkPEgtfvK2q3bqj8nZf0eNlH5YVBk2ew8Q nTcmNOFHeo40QknJOKPzKGkQdX+judJH6g== X-Google-Smtp-Source: ABdhPJyCn4FHKl0D5QOSLcDrq+ODu7wuWXTdeZ01X6tsI0gvwEdEe1Z+rdEPFievSF3VOxG56Np0EQ== X-Received: by 2002:a05:620a:c84:: with SMTP id q4mr8230120qki.176.1638382660187; Wed, 01 Dec 2021 10:17:40 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id u21sm298047qtw.29.2021.12.01.10.17.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Dec 2021 10:17:39 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 16/22] btrfs-progs: handle the per-block group global root id Date: Wed, 1 Dec 2021 13:17:10 -0500 Message-Id: <41a5fae09dd501915695a5ff673466077f3c1cc6.1638382588.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We will now be using block_group->chunk_objectid to point at the global root id for this particular block group. For now we'll assign this based on mod'ing the offset of the block group against the number of global root id's and handle the block_group_item updating appropriately. Signed-off-by: Josef Bacik --- kernel-shared/ctree.h | 2 ++ kernel-shared/disk-io.c | 24 ++++++++++++++++++++++-- kernel-shared/disk-io.h | 1 + kernel-shared/extent-tree.c | 24 ++++++++++++++++++++++-- kernel-shared/free-space-tree.c | 3 +++ 5 files changed, 50 insertions(+), 4 deletions(-) diff --git a/kernel-shared/ctree.h b/kernel-shared/ctree.h index 9530db8b..82a4a2eb 100644 --- a/kernel-shared/ctree.h +++ b/kernel-shared/ctree.h @@ -1188,6 +1188,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 3283120c..38118e1d 100644 --- a/kernel-shared/disk-io.c +++ b/kernel-shared/disk-io.c @@ -798,13 +798,33 @@ struct btrfs_root *btrfs_global_root(struct btrfs_fs_info *fs_info, return NULL; } +u64 btrfs_global_root_id(struct btrfs_fs_info *fs_info, u64 bytenr) +{ + struct btrfs_block_group *block_group; + u64 ret = 0; + + if (!btrfs_fs_incompat(fs_info, EXTENT_TREE_V2)) + return ret; + + /* + * We use this because we won't have this many global roots, and -1 is + * special, so we need something that'll not be found if we have any + * errors from here on. + */ + ret = BTRFS_LAST_FREE_OBJECTID; + block_group = btrfs_lookup_first_block_group(fs_info, bytenr); + if (block_group) + ret = block_group->global_root_id; + return ret; +} + struct btrfs_root *btrfs_csum_root(struct btrfs_fs_info *fs_info, u64 bytenr) { struct btrfs_key key = { .objectid = BTRFS_CSUM_TREE_OBJECTID, .type = BTRFS_ROOT_ITEM_KEY, - .offset = 0, + .offset = btrfs_global_root_id(fs_info, bytenr), }; return btrfs_global_root(fs_info, &key); @@ -816,7 +836,7 @@ struct btrfs_root *btrfs_extent_root(struct btrfs_fs_info *fs_info, struct btrfs_key key = { .objectid = BTRFS_EXTENT_TREE_OBJECTID, .type = BTRFS_ROOT_ITEM_KEY, - .offset = 0, + .offset = btrfs_global_root_id(fs_info, bytenr), }; return btrfs_global_root(fs_info, &key); diff --git a/kernel-shared/disk-io.h b/kernel-shared/disk-io.h index cb1ba4e2..4f58cad1 100644 --- a/kernel-shared/disk-io.h +++ b/kernel-shared/disk-io.h @@ -218,6 +218,7 @@ struct btrfs_root *btrfs_csum_root(struct btrfs_fs_info *fs_info, u64 bytenr); struct btrfs_root *btrfs_extent_root(struct btrfs_fs_info *fs_inf, u64 bytenr); struct btrfs_root *btrfs_global_root(struct btrfs_fs_info *fs_info, struct btrfs_key *key); +u64 btrfs_global_root_id(struct btrfs_fs_info *fs_info, u64 bytenr); int btrfs_global_root_insert(struct btrfs_fs_info *fs_info, struct btrfs_root *root); diff --git a/kernel-shared/extent-tree.c b/kernel-shared/extent-tree.c index a1c061fa..1469f5c3 100644 --- a/kernel-shared/extent-tree.c +++ b/kernel-shared/extent-tree.c @@ -1561,7 +1561,7 @@ static int update_block_group_item(struct btrfs_trans_handle *trans, btrfs_set_stack_block_group_used(&bgi, cache->used); btrfs_set_stack_block_group_flags(&bgi, cache->flags); btrfs_set_stack_block_group_chunk_objectid(&bgi, - BTRFS_FIRST_CHUNK_TREE_OBJECTID); + cache->global_root_id); write_extent_buffer(leaf, &bgi, bi, sizeof(bgi)); btrfs_mark_buffer_dirty(leaf); fail: @@ -2658,6 +2658,7 @@ static int read_block_group_item(struct btrfs_block_group *cache, sizeof(bgi)); cache->used = btrfs_stack_block_group_used(&bgi); cache->flags = btrfs_stack_block_group_flags(&bgi); + cache->global_root_id = btrfs_stack_block_group_chunk_objectid(&bgi); return 0; } @@ -2765,6 +2766,24 @@ error: return ret; } +/* + * For extent tree v2 we use the block_group_item->chunk_offset to point at our + * global root id. For v1 it's always set to BTRFS_FIRST_CHUNK_TREE_OBJECTID. + */ +static u64 calculate_global_root_id(struct btrfs_fs_info *fs_info, u64 offset) +{ + u64 div = SZ_1G; + + if (!btrfs_fs_incompat(fs_info, EXTENT_TREE_V2)) + return BTRFS_FIRST_CHUNK_TREE_OBJECTID; + + /* If we have a smaller fs index based on 128m. */ + if (btrfs_super_total_bytes(fs_info->super_copy) <= (SZ_1G * 10ULL)) + div = SZ_128M; + + return (div_u64(offset, div) % fs_info->num_global_roots); +} + struct btrfs_block_group * btrfs_add_block_group(struct btrfs_fs_info *fs_info, u64 bytes_used, u64 type, u64 chunk_offset, u64 size) @@ -2776,6 +2795,7 @@ btrfs_add_block_group(struct btrfs_fs_info *fs_info, u64 bytes_used, u64 type, BUG_ON(!cache); cache->start = chunk_offset; cache->length = size; + cache->global_root_id = calculate_global_root_id(fs_info, chunk_offset); ret = btrfs_load_block_group_zone_info(fs_info, cache); BUG_ON(ret); @@ -2806,7 +2826,7 @@ static int insert_block_group_item(struct btrfs_trans_handle *trans, btrfs_set_stack_block_group_used(&bgi, block_group->used); btrfs_set_stack_block_group_chunk_objectid(&bgi, - BTRFS_FIRST_CHUNK_TREE_OBJECTID); + block_group->global_root_id); btrfs_set_stack_block_group_flags(&bgi, block_group->flags); key.objectid = block_group->start; key.type = BTRFS_BLOCK_GROUP_ITEM_KEY; diff --git a/kernel-shared/free-space-tree.c b/kernel-shared/free-space-tree.c index 896bd3a2..a82865d3 100644 --- a/kernel-shared/free-space-tree.c +++ b/kernel-shared/free-space-tree.c @@ -34,6 +34,9 @@ static struct btrfs_root *btrfs_free_space_root(struct btrfs_fs_info *fs_info, .offset = 0, }; + if (btrfs_fs_incompat(fs_info, EXTENT_TREE_V2)) + key.offset = block_group->global_root_id; + return btrfs_global_root(fs_info, &key); } From patchwork Wed Dec 1 18:17:11 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12650683 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E7AD7C433F5 for ; Wed, 1 Dec 2021 18:17:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352271AbhLASVN (ORCPT ); Wed, 1 Dec 2021 13:21:13 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42586 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1352221AbhLASVE (ORCPT ); Wed, 1 Dec 2021 13:21:04 -0500 Received: from mail-qt1-x832.google.com (mail-qt1-x832.google.com [IPv6:2607:f8b0:4864:20::832]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A2649C06174A for ; Wed, 1 Dec 2021 10:17:42 -0800 (PST) Received: by mail-qt1-x832.google.com with SMTP id f20so24960575qtb.4 for ; Wed, 01 Dec 2021 10:17:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=hvun/+HRL+6LYd2tOwl8rJy2nnu6TTIeUJki2EZxWtM=; b=p1f7gqqgfShGUqmanrvY8WXrD7ZqBUDnG+4EblxJMpIQIZDZpGJDW6Rnaribl/jKGS MhM8lzi6dekM9n8KsMhJfrDugiWDkaM/Z34ebBsIreUpaii0hITSqiFE41hbwkCDE31Z AyKXqvfXNiEA5aqJdPpndrX89F7ZFmkvUdHXTZQjd4LmJ4FqWP8J8HKSYizRvw16B9ry Qk4YDikIOt4z6J2/2q20ETDtD0VIOsYNzN/3Wge1M8xdqpyP9boR2qkwUTOssdbis7Th 0Dz24cJD72j7dQY1wde9Y+daFbTt1Emgr8ip9tmIVAbG2DwL5/Sjr+6jynJSF5laBtn9 zNRQ== 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=hvun/+HRL+6LYd2tOwl8rJy2nnu6TTIeUJki2EZxWtM=; b=fPqiJu16ygEiDu7nB6v/qOzHSI5IgL23K16B5t/G93IdbbrCFJJ88SO3GxRshBeR+a AiFJBu2dofw9A40RUY65dHu50NCf49P1MC5KR4LpbcCXro0OMpdxYe0+ao066LkH9qyv 0pnzXzeEL5AiKL5yk45uK9nwXzp9bOXYq5JeOMXQ+OiyEa9dhbMVBy9lJp7OibwlPVO2 Cfb3MssQEUGm4YEDWQYVdPG4KdanBLkZuf8MfFyJ/7GPh7aOljJjCJpP2h/vFqXxLGwu W+U7B6wroi5DCM/5MUsy7C+VcAp8rCGGbtgsJzbfyWYc46sAIwVi2SYJ/JAaFpbts2s8 4Duw== X-Gm-Message-State: AOAM533y6ck8Wn3TSNFXmvCRJiyZMdMFEIZODeqSFA1HqlGq3/NTQ3lc qT5XO4a3ef2gIW9C6K+9RKSFejC7h8U/+Q== X-Google-Smtp-Source: ABdhPJz0SgyiS7Q3j4ZmmMXLRFWY8f87XNWS9WP8XPeVWa4FGPI9JtC0qcjrnIeTk+NXnWESglqPVg== X-Received: by 2002:ac8:5713:: with SMTP id 19mr8690361qtw.642.1638382661531; Wed, 01 Dec 2021 10:17:41 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id b5sm238860qka.51.2021.12.01.10.17.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Dec 2021 10:17:41 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 17/22] btrfs-progs: add a btrfs_delete_and_free_root helper Date: Wed, 1 Dec 2021 13:17:11 -0500 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org The free space tree 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 38118e1d..83977cec 100644 --- a/kernel-shared/disk-io.c +++ b/kernel-shared/disk-io.c @@ -2368,6 +2368,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 4f58cad1..6a64b620 100644 --- a/kernel-shared/disk-io.h +++ b/kernel-shared/disk-io.h @@ -214,6 +214,8 @@ int btrfs_fs_roots_compare_roots(struct rb_node *node1, struct rb_node *node2); struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans, struct btrfs_fs_info *fs_info, u64 objectid); +int btrfs_delete_and_free_root(struct btrfs_trans_handle *trans, + struct btrfs_root *root); struct btrfs_root *btrfs_csum_root(struct btrfs_fs_info *fs_info, u64 bytenr); struct btrfs_root *btrfs_extent_root(struct btrfs_fs_info *fs_inf, u64 bytenr); struct btrfs_root *btrfs_global_root(struct btrfs_fs_info *fs_info, diff --git a/kernel-shared/free-space-tree.c b/kernel-shared/free-space-tree.c index a82865d3..0a13b1d6 100644 --- a/kernel-shared/free-space-tree.c +++ b/kernel-shared/free-space-tree.c @@ -1257,27 +1257,9 @@ int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info) if (ret) goto abort; - ret = btrfs_del_root(trans, tree_root, &free_space_root->root_key); - if (ret) - goto abort; - - list_del(&free_space_root->dirty_list); - - ret = clean_tree_block(free_space_root->node); - if (ret) - goto abort; - ret = btrfs_free_tree_block(trans, free_space_root, - free_space_root->node, 0, 1); - if (ret) - goto abort; - - rb_erase(&free_space_root->rb_node, &fs_info->global_roots_tree); - free_extent_buffer(free_space_root->node); - free_extent_buffer(free_space_root->commit_root); - kfree(free_space_root); - - ret = btrfs_commit_transaction(trans, tree_root); - + ret = btrfs_delete_and_free_root(trans, free_space_root); + if (!ret) + ret = btrfs_commit_transaction(trans, tree_root); abort: return ret; } From patchwork Wed Dec 1 18:17:12 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12650679 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 015FCC433EF for ; Wed, 1 Dec 2021 18:17:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352257AbhLASVK (ORCPT ); Wed, 1 Dec 2021 13:21:10 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42594 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1352223AbhLASVF (ORCPT ); Wed, 1 Dec 2021 13:21:05 -0500 Received: from mail-qt1-x82c.google.com (mail-qt1-x82c.google.com [IPv6:2607:f8b0:4864:20::82c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 328C3C061574 for ; Wed, 1 Dec 2021 10:17:44 -0800 (PST) Received: by mail-qt1-x82c.google.com with SMTP id 8so24975064qtx.5 for ; Wed, 01 Dec 2021 10:17:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=AkCQ2BcBy4V2mlHKFbwaIlcHABtcv/nGbJ+ZWF8MQr8=; b=u2wbQPMoPRhI121q4hCZiYnvxLPEnGojFHqWij34f5TwXgdK5Jd5lLcHYMUMk2eVgx 8CcLwsqCFuujzOsaPdfoIQwRVQ6FvHe3COZ01T5J1cVgP2WLW479dNdukLYWzzq1m9rZ KNdxjYE801apwUxVj3QBsza4Yj/w45sf0cpQELkEOWVoyDKac7dY6741M17KcRsZdb0w 3weD+l3NLBZyD3KEsIeijcIR2oJSDyOexBJ3LEp0t5XTcZc8TNnJRVMydzHbERv6UPRO 02cZ5xTNUMRzDMt1a8/o4DzAvD1JR7d1lhhU4V2Ofm6txGZSVS0tcrBs5xCLwfi1GV3w bwYA== 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=mmw4/wn20rbThRKKmpTfMqy1nTs9DLc7TVJUIOoL1r+Cg6IuEr82kxVm7F3ZDCcuTx gzU7puKbIW1ZNQMHPKfAZNZwcfymgBO/S4x4N35U+FHJO6cxbZdZeFEaXRfVKCTUww0B mANHApQmSECM90RHwGBvZ5tph1UTvegbYfgKpjAZkfM2Xh+iPJPG/9dIpGNbBngXVwEv iBRHpFdsmYCEF4sXLR1rW56RATg2y86Qtd6bNoqNPUeB5WqTv8wn/cRaKcPqXMiRMrno oj5su2TmFegyWpXaiyBc0NvrNMgXgrlu79NfJX/wM8cB1pP0YHSXnf8db1JWSsPfElme PN8w== X-Gm-Message-State: AOAM530+k/tSCX6WXUL3BQgUTPV2ZzFM+Aa6dOzE8hza/R17kTwrrOv5 Web5/5UZ0djURpx/+7FxZN5XXk+9zQVWlQ== X-Google-Smtp-Source: ABdhPJxA5U2acDYHLjMziK0F+ppZZ5SNiVYYBj2f53c9slfL4iVfieVrBmzdvho6lHDDxv6yhTzDVA== X-Received: by 2002:ac8:7d8a:: with SMTP id c10mr8872235qtd.415.1638382662944; Wed, 01 Dec 2021 10:17:42 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id o17sm276036qtv.30.2021.12.01.10.17.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Dec 2021 10:17:42 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 18/22] btrfs-progs: make btrfs_clear_free_space_tree extent tree v2 aware Date: Wed, 1 Dec 2021 13:17:12 -0500 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org With extent tree v2 we'll have multiple free space trees, and we can't just unset the feature flags for the free space tree. Fix this to loop through all of the free space trees and clear them out properly. Signed-off-by: Josef Bacik --- kernel-shared/free-space-tree.c | 37 ++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/kernel-shared/free-space-tree.c b/kernel-shared/free-space-tree.c index 0a13b1d6..70306175 100644 --- a/kernel-shared/free-space-tree.c +++ b/kernel-shared/free-space-tree.c @@ -1248,18 +1248,35 @@ int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info) if (IS_ERR(trans)) return PTR_ERR(trans); - features = btrfs_super_compat_ro_flags(fs_info->super_copy); - features &= ~(BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE_VALID | - BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE); - btrfs_set_super_compat_ro_flags(fs_info->super_copy, features); + if (btrfs_fs_incompat(fs_info, EXTENT_TREE_V2)) { + struct btrfs_key key = { + .objectid = BTRFS_FREE_SPACE_TREE_OBJECTID, + .type = BTRFS_ROOT_ITEM_KEY, + .offset = 0, + }; + + while (key.offset < fs_info->num_global_roots) { + free_space_root = btrfs_global_root(fs_info, &key); + ret = clear_free_space_tree(trans, free_space_root); + if (ret) + goto abort; + key.offset++; + } + } else { + features = btrfs_super_compat_ro_flags(fs_info->super_copy); + features &= ~(BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE_VALID | + BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE); + btrfs_set_super_compat_ro_flags(fs_info->super_copy, features); - ret = clear_free_space_tree(trans, free_space_root); - if (ret) - goto abort; + ret = clear_free_space_tree(trans, free_space_root); + if (ret) + goto abort; - ret = btrfs_delete_and_free_root(trans, free_space_root); - if (!ret) - ret = btrfs_commit_transaction(trans, tree_root); + ret = btrfs_delete_and_free_root(trans, free_space_root); + if (ret) + goto abort; + } + ret = btrfs_commit_transaction(trans, tree_root); abort: return ret; } From patchwork Wed Dec 1 18:17:13 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12650685 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C29A1C4332F for ; Wed, 1 Dec 2021 18:17:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352273AbhLASVP (ORCPT ); Wed, 1 Dec 2021 13:21:15 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42600 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1352246AbhLASVG (ORCPT ); Wed, 1 Dec 2021 13:21:06 -0500 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 5746EC061574 for ; Wed, 1 Dec 2021 10:17:45 -0800 (PST) Received: by mail-qt1-x82b.google.com with SMTP id n15so25023928qta.0 for ; Wed, 01 Dec 2021 10:17:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=twh96mWAB+UJ70Mw9hmxyNXcK3rV2c2vsfNMBJ2GGZM=; b=ZnOLS9A09nwA1OS1gXOm9wUHulUiUNtrTP0pCZjC9odDfxayxV2TuytTfZFC9HegNk KiCCWsceuUBSnv9GbytHCBlZ4Bz0Jj1pf6APH/+jMv1qNRahVu/QCaQC1Y3C9XpfUdj8 qulU0OxeDzHATtrOnCDGpP21oYEbsftmvBFr6uWjc12Z3kZVN1Uqv7G9MMr48G/nFqLT pV5DqtqdRYtR5nW6f0VJXo3TCxhZiOPs75o9wE0hM2yYp/yuGDx3oMLKKxDivfGNgddG KgHHTf9B4Bdn64jaHi8szUc5tpCw+kQzcQM++rJwRerzJDVuN8GY0nU5+sa3Ro30+6tp iZ1A== 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=twh96mWAB+UJ70Mw9hmxyNXcK3rV2c2vsfNMBJ2GGZM=; b=ASLgjIeORDndCpGZTRxplCjUzrOlhK00YmG14nDguDKEp6fOcHo1yu5YXgy5uKZJSZ 7iotkKnnwxZ8O5WBD+l++O1dx8ieatARgLT7u5cUV7NEkEFuyXdv/JaANkO/7c3pbOEZ PmupIbf+bDSLZtxSMUmRuiA4nu/RIvrWHWIVXnhXBRhI70dOOdikvBVjFcdfYwSxGv/v 4arc4gEm9rkdzhdPdxtSAhbC7e7UREW4E2oxl8KNMmW2sLXCxVJqQ5fQM20CEkWuNbCl 9R/BnGlcJ5wggMKyx+6XEmCKE1HroJz7awgZKvux6eA49uroGcYZivsCRsiL5ULfYBjg mnCg== X-Gm-Message-State: AOAM532btRT+JHk/rQQYV9MQ07rQncHTMKoUp7bHYDGm1vGNHyH8e1FA RH2zLnwaD8zNEqpuaMr8msHkVscGr+OGZw== X-Google-Smtp-Source: ABdhPJz97ghCZEKCn/3f1lPdyVD7Ayau/CaBB3kX8/Ao9bwF/7cv8kYVCvs06AB6RU/o4gqwNbjByg== X-Received: by 2002:a05:622a:1484:: with SMTP id t4mr8622323qtx.57.1638382664215; Wed, 01 Dec 2021 10:17:44 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id bm25sm260229qkb.4.2021.12.01.10.17.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Dec 2021 10:17:43 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 19/22] btrfs-progs: make btrfs_create_tree take a key for the root key Date: Wed, 1 Dec 2021 13:17:13 -0500 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org We're going to start create global roots from mkfs, and we need to have a offset set for the root key. Make the btrfs_create_tree() take a key for the root_key instead of just the objectid so we can setup these new style roots properly. Signed-off-by: Josef Bacik --- kernel-shared/disk-io.c | 21 ++++++++------------- kernel-shared/disk-io.h | 2 +- kernel-shared/free-space-tree.c | 7 +++++-- mkfs/main.c | 13 ++++++++++--- 4 files changed, 24 insertions(+), 19 deletions(-) diff --git a/kernel-shared/disk-io.c b/kernel-shared/disk-io.c index 83977cec..40097930 100644 --- a/kernel-shared/disk-io.c +++ b/kernel-shared/disk-io.c @@ -2395,25 +2395,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; @@ -2424,7 +2421,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); @@ -2449,10 +2446,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 6a64b620..4007abd1 100644 --- a/kernel-shared/disk-io.h +++ b/kernel-shared/disk-io.h @@ -213,7 +213,7 @@ int write_and_map_eb(struct btrfs_fs_info *fs_info, struct extent_buffer *eb); int btrfs_fs_roots_compare_roots(struct rb_node *node1, struct rb_node *node2); struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans, struct btrfs_fs_info *fs_info, - u64 objectid); + struct btrfs_key *key); int btrfs_delete_and_free_root(struct btrfs_trans_handle *trans, struct btrfs_root *root); struct btrfs_root *btrfs_csum_root(struct btrfs_fs_info *fs_info, u64 bytenr); diff --git a/kernel-shared/free-space-tree.c b/kernel-shared/free-space-tree.c index 70306175..23fb67bf 100644 --- a/kernel-shared/free-space-tree.c +++ b/kernel-shared/free-space-tree.c @@ -1475,14 +1475,17 @@ int btrfs_create_free_space_tree(struct btrfs_fs_info *fs_info) struct btrfs_root *free_space_root; struct btrfs_block_group *block_group; u64 start = BTRFS_SUPER_INFO_OFFSET + BTRFS_SUPER_INFO_SIZE; + struct btrfs_key root_key = { + .objectid = BTRFS_FREE_SPACE_TREE_OBJECTID, + .type = BTRFS_ROOT_ITEM_KEY, + }; int ret; trans = btrfs_start_transaction(tree_root, 0); if (IS_ERR(trans)) return PTR_ERR(trans); - free_space_root = btrfs_create_tree(trans, fs_info, - BTRFS_FREE_SPACE_TREE_OBJECTID); + free_space_root = btrfs_create_tree(trans, fs_info, &root_key); if (IS_ERR(free_space_root)) { ret = PTR_ERR(free_space_root); goto abort; diff --git a/mkfs/main.c b/mkfs/main.c index 1653ab32..fd40c70e 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -717,12 +717,15 @@ static int create_data_reloc_tree(struct btrfs_trans_handle *trans) struct btrfs_inode_item *inode; struct btrfs_root *root; struct btrfs_path path; - struct btrfs_key key; + struct btrfs_key key = { + .objectid = BTRFS_DATA_RELOC_TREE_OBJECTID, + .type = BTRFS_ROOT_ITEM_KEY, + }; u64 ino = BTRFS_FIRST_FREE_OBJECTID; char *name = ".."; int ret; - root = btrfs_create_tree(trans, fs_info, BTRFS_DATA_RELOC_TREE_OBJECTID); + root = btrfs_create_tree(trans, fs_info, &key); if (IS_ERR(root)) { ret = PTR_ERR(root); goto out; @@ -782,10 +785,14 @@ static int create_uuid_tree(struct btrfs_trans_handle *trans) { struct btrfs_fs_info *fs_info = trans->fs_info; struct btrfs_root *root; + struct btrfs_key key = { + .objectid = BTRFS_UUID_TREE_OBJECTID, + .type = BTRFS_ROOT_ITEM_KEY, + }; int ret = 0; ASSERT(fs_info->uuid_root == NULL); - root = btrfs_create_tree(trans, fs_info, BTRFS_UUID_TREE_OBJECTID); + root = btrfs_create_tree(trans, fs_info, &key); if (IS_ERR(root)) { ret = PTR_ERR(root); goto out; From patchwork Wed Dec 1 18:17:14 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12650687 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 39825C43217 for ; Wed, 1 Dec 2021 18:17:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352277AbhLASVR (ORCPT ); Wed, 1 Dec 2021 13:21:17 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42606 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1352248AbhLASVH (ORCPT ); Wed, 1 Dec 2021 13:21:07 -0500 Received: from mail-qv1-xf31.google.com (mail-qv1-xf31.google.com [IPv6:2607:f8b0:4864:20::f31]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8CD67C061574 for ; Wed, 1 Dec 2021 10:17:46 -0800 (PST) Received: by mail-qv1-xf31.google.com with SMTP id s9so22505161qvk.12 for ; Wed, 01 Dec 2021 10:17:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=R0Yqbdx52zzymv5qMCjmgCl6pa/p1yR9G70vfd4nzVk=; b=OM+cqFWb4lf/oSfvJaTw7c5TEBn/pWY9HWyW6a1ABtjjPTd+pINnx+0sCwPeWkwEZ5 txkKgwnJZPAXpEnZ3VfNoap8K7yeYVqulliGx9M4L1DerO1OcGokusvXATCo82GnQh+h kb9EQznT5U4uim2cD9TmndwAoeKis6egD28ikVd+CLibhvJJbBTxIrh32Oszz2vexuZ3 GF9eBHupiJJx1DPKbsS2l7UqjeyFOL/a7rPP9ZsIUvapUb4pmrEFy+V8BAO9T6M1rC6T ZnoYzV/YDlijZcwIu033lC/rduesU2JHgzw4X4dppR6FBd1pRj0BwSfwTPl8Qyv75w7x GTgw== 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=R0Yqbdx52zzymv5qMCjmgCl6pa/p1yR9G70vfd4nzVk=; b=F5XhgktPTqP9L/iY5VySspcEhQMy8+6ga6y3+Irm7R0WAKbfdJopUBLhuEGMRNh31p r8B+uBa4tC/5aOw2D4VeUuQwe01mLVE8i1ja4Nc2FJH9E1miaUoAyLO4X9cNKMFlHE8F 2N0SUtrFlRBLkAf+qVD3ybXjTa4A1w8NOR6CHNmWWi38KwEFQ7ouC0SkrzDGdiZCjRtT tAswdjAkvZ64Q78f+2U2gayUyE/jC510Tez1GFkBIKsQp68FfXn/qXrmIheOXsm2/PQD a+nL6m3r7YQsdLMaEpPCC8vezRgvvcLO7t6uWqxUaf0tdwIgsueZvC8xzp/qGiz5ZUG/ /m2A== X-Gm-Message-State: AOAM530iyLupnyNrieJsiCgIOB47e3rgnMKf/wsiZQEudkTo9PgpL3dl QSkHm6vAmLSayotCoF7p6btBYDR425/Lkg== X-Google-Smtp-Source: ABdhPJyQ/BOKn9UJ4tTDJf8Lv5feVNoFaYP9jEX9mapeMavDjl/gpePwyfwO/K+qL66X6zPSFfQ4yA== X-Received: by 2002:a05:6214:2301:: with SMTP id gc1mr7977485qvb.107.1638382665509; Wed, 01 Dec 2021 10:17:45 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id o17sm276093qtv.30.2021.12.01.10.17.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Dec 2021 10:17:45 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 20/22] btrfs-progs: mkfs: set chunk_item_objectid properly for extent tree v2 Date: Wed, 1 Dec 2021 13:17:14 -0500 Message-Id: <7c4ad2510de6f6df0efa16278d762ba7d8d9ffc8.1638382588.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Our initial block group will use global root id 0 with extent tree v2, so adjust the helper to take the chunk_objectid as an argument, as we'll set this to 0 for extent tree v2 and then BTRFS_FIRST_CHUNK_TREE_OBJECTID for extent tree v1. Signed-off-by: Josef Bacik --- mkfs/common.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mkfs/common.c b/mkfs/common.c index d91b1e6f..a4412a1f 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]); @@ -405,6 +404,7 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg) write_block_group_item(buf, nritems, system_group_offset, system_group_size, total_used, + BTRFS_FIRST_CHUNK_TREE_OBJECTID, itemoff); add_block_group = false; nritems++; From patchwork Wed Dec 1 18:17:15 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12650689 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7E923C43219 for ; Wed, 1 Dec 2021 18:17:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352279AbhLASVR (ORCPT ); Wed, 1 Dec 2021 13:21:17 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42614 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1352220AbhLASVJ (ORCPT ); Wed, 1 Dec 2021 13:21:09 -0500 Received: from mail-qt1-x82f.google.com (mail-qt1-x82f.google.com [IPv6:2607:f8b0:4864:20::82f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id ED5A6C061574 for ; Wed, 1 Dec 2021 10:17:47 -0800 (PST) Received: by mail-qt1-x82f.google.com with SMTP id t11so24975531qtw.3 for ; Wed, 01 Dec 2021 10:17:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=2ULWo7dXnBz43mpsZKXK9aQnQ5yFxD5PDch6Mh7G+PY=; b=k/aUjhEttKPqZKEXDloh6GhpIOipm2G2wUUKpV3YQU/0Cy5ddRgPcrizehZp0P9S0H RaS2QWjuvfBCyR/TWUmVhbHaiY90lI0ipEj33MPB4BGqzjnD/xyX51zuYS8vNp73uB+b WJ89CZQUfhpZBwNcwcRn+k5M20CA9nxOFUku2q4ko/SSWmhSqDy4azu2aGtKFywmHK+c aF66PCFXt4+ZQgolnarK6889IRnrJId3hajw5dm2LfGItdh/hRV8XW3DtcmdMsiDjmpi 3T891YfVTGU4/oVc3Z7Ct1Z9BB/Qpcl/M+6G9Uh4dLfR9BNuBu7apLVU2VD+9AcpuwYY HhjA== 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=2ULWo7dXnBz43mpsZKXK9aQnQ5yFxD5PDch6Mh7G+PY=; b=KhZjfpZ8C5J2080qBp1PYz2y/Mr6zSkEKVw9KF/C88kIM6u+IHi9FLikkuQX8c/EX9 3yYMxwtm2VpXIKbh6heDqwKIVl9ePBT5bNFG2zM+wJRQzvrnQajLSsInqbEQXiUzCaxO C9T6+DdLpKCMjkinh3ECw8TJl5sLkop89Vjln6lj3+XGGUo2aDgj68jQlHFNL/ioAHr0 ZB8XTmbOrsKFcRRg++LSjzv5ATxQFLD/J4btg8jWHiYOU5xEgb5Ry+VVoSqx1+EN0HKf m2oe/GrkHGb96EaGBzgO33FU09cwHkUwNIn8aQZ3Po6KBODXp+xtflGRuT9ApBV9s6wA QDxA== X-Gm-Message-State: AOAM531Cc+Z8nCGCsy6cOil/FDPZzGLd//4cfKdWRPVIkt49VAnjahnG mmqkpcF9xg79g4a8xYofeD1TxkOry3R9iw== X-Google-Smtp-Source: ABdhPJw/HrI62GOfRCn40/XZGP0FQr8v2833X9md2KvFaslqes32KmGpGsRMT5rNkpLECF/XxZCy5g== X-Received: by 2002:a05:622a:1310:: with SMTP id v16mr8704395qtk.431.1638382666862; Wed, 01 Dec 2021 10:17:46 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id s7sm294501qta.31.2021.12.01.10.17.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Dec 2021 10:17:46 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 21/22] btrfs-progs: mkfs: create the global root's Date: Wed, 1 Dec 2021 13:17:15 -0500 Message-Id: <72c58772a7cd5824430eb0a230388bf259e3940f.1638382588.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 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 | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) diff --git a/mkfs/main.c b/mkfs/main.c index fd40c70e..beed511c 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,9 @@ int BOX_MAIN(mkfs)(int argc, char **argv) { "quiet", 0, NULL, 'q' }, { "verbose", 0, NULL, 'v' }, { "shrink", no_argument, NULL, GETOPT_VAL_SHRINK }, +#if EXPERIMENTAL + { "num-global-roots", required_argument, NULL, GETOPT_VAL_GLOBAL_ROOTS }, +#endif { "help", no_argument, NULL, GETOPT_VAL_HELP }, { NULL, 0, NULL, 0} }; @@ -1100,6 +1152,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 +1294,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 +1526,14 @@ int BOX_MAIN(mkfs)(int argc, char **argv) goto error; } + if (features & BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2) { + ret = create_global_roots(trans, nr_global_roots); + if (ret) { + error("failed to create global roots: %d", ret); + goto error; + } + } + ret = make_root_dir(trans, root); if (ret) { error("failed to setup the root directory: %d", ret); From patchwork Wed Dec 1 18:17:16 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12650691 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 63BF1C433EF for ; Wed, 1 Dec 2021 18:17:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352280AbhLASVS (ORCPT ); Wed, 1 Dec 2021 13:21:18 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42620 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1352266AbhLASVK (ORCPT ); Wed, 1 Dec 2021 13:21:10 -0500 Received: from mail-qk1-x72c.google.com (mail-qk1-x72c.google.com [IPv6:2607:f8b0:4864:20::72c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7CCCEC061574 for ; Wed, 1 Dec 2021 10:17:49 -0800 (PST) Received: by mail-qk1-x72c.google.com with SMTP id m192so32011028qke.2 for ; Wed, 01 Dec 2021 10:17:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=wIgFFcG7g9rufAttVebNoLhVAZ0VrSc6lTny3+BHXIU=; b=7a4J6B0cKbBzcmLp0c9yHHyT8tya5Gx4hySkowhxRXQdHlJvLyDBcpwtVr7Mz/GT/C BoN9Vbt5HFKH+//ESvwGVDIVpI94ni25H8PuftpBxs1CLblAjPasNJBkeXllvCNzWlkz FYWijY+TzCBFoxwY1vtaZsZSfaTGsLF+b2SqINcIhT2HFifbAuAgfQQMo904xuotQZ9L NmW7zNb4edk8MTWffeK+FebkDZ6QaMBYWVyvbeKg0aSobioNltkeBuUFbvxuuPFJaLrw Mao+DlcXWmgoUwCY+D11zbIwcQlQPhaVD9zCjPH14gCd/83ldBftpFGv0YZOM/uUTCHt 8ZYA== 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=wIgFFcG7g9rufAttVebNoLhVAZ0VrSc6lTny3+BHXIU=; b=m2j/YdkEKZTwwbv7jTZOeWNHkP9TQLC7hEkwmvhhXntjhjhB0b0hFd3WytwTtl2e0N 7WpKRVp/octHwPzoMCGZrT3w2wzO15Z/xnXywPuSKmRX00Rte8bLh298PErTTfGuII/0 vdwsaMBNpzlqePY0PtZiyqSRFF3urwydEMkHg7gQb8xUxIHL3dKHUC2QUt8bhMcUQdmM myGXyOyO46brcKLySHZc6Lg+Vk0aBnTiN0eJt6How5cineVbmHM4kGfnUSn06DSUYl2x 3O1RyMZhX1yHY4aDY4XAO/9Xob1hd92lStO0llnLHR7b6D3RLCrIXWPK+kb7BhdjxKXv Szdw== X-Gm-Message-State: AOAM530XfM6KxdHlxNc6zfRYCO6pKVLNqWYfoJZWq+HIw+0FjXkEex7g 7ufqmx4Frl0ekiIK1B4UHjEuAfA+QRqSKQ== X-Google-Smtp-Source: ABdhPJxpru+qsSfkd/fuQRb8Boxl0xc5RKlGfFvJhFz1+ZPB5TSu+rPOzgznVogs87p6XcqpR70PPQ== X-Received: by 2002:a37:92c4:: with SMTP id u187mr8023530qkd.721.1638382668263; Wed, 01 Dec 2021 10:17:48 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id e17sm291688qtw.18.2021.12.01.10.17.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Dec 2021 10:17:47 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 22/22] btrfs-progs: check: don't do the root item check for extent tree v2 Date: Wed, 1 Dec 2021 13:17:16 -0500 Message-Id: X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org 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 6be22d77..831f7d0d 100644 --- a/check/main.c +++ b/check/main.c @@ -10078,6 +10078,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();