From patchwork Wed Feb 15 14:31:04 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johannes Thumshirn X-Patchwork-Id: 13141729 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 C227EC636D4 for ; Wed, 15 Feb 2023 14:31:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229664AbjBOObX (ORCPT ); Wed, 15 Feb 2023 09:31:23 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59466 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229592AbjBOObV (ORCPT ); Wed, 15 Feb 2023 09:31:21 -0500 Received: from esa6.hgst.iphmx.com (esa6.hgst.iphmx.com [216.71.154.45]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 267DD38EAF for ; Wed, 15 Feb 2023 06:31:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1676471473; x=1708007473; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=l+3/IGzQkpR3EhYQgh6lncbPjq3djAtMHmNM9K5vBJk=; b=a9ChJ0fw+/gpBlytOGoaQFTamxdTV/UnEYxytZexeFHn2+hSCSh6EWjx j0fCr1ctg1JMAOm7ZbZf9SS9nyxioiM4/vO+rn7jPj1unPGP6C8NRqm1F KHr76OGIDCBTsONKV3+0L4QzPTUr76WeFz0a965egKUEO8lChTGr0aF+d GxgGkE2IwEqTkFUMke5YoN6oI7EaEEbQ+SYczVKVsdOWuSlbpzRxO8vMp 8X+3EVZGMjenwKYjbHMwfX7kSr0JyITBmC+s92X7t5alBOsEKw2ncYCay Fp+NEEIRRmL4LBppKbt52NB/hthRoqBG/IGnMjh3HKKzN580moqiD5b+6 g==; X-IronPort-AV: E=Sophos;i="5.97,299,1669046400"; d="scan'208";a="223393908" Received: from h199-255-45-14.hgst.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 15 Feb 2023 22:31:12 +0800 IronPort-SDR: dRQiSGaQ4F92qF3SkA9pBN7A0vDjwtmzHtBuH+f51Njsya2D8F+oVNwJZe/If0vimms67+VZUo T1gySmxAe76+8zgFpxoHc5AnRfTcifWp6pTr693u8Ug3otR7EptSo0BMOlIHG+v7cj1nF9RMJy M3gt5UWIsNWo/KSey2Ad24RIbQSQ4uIzpSoyVLabiZtQMDTlWFjkqbvHThqTXlAqYy4ymCSvXx VSmHqZaD9ICxGuAyWeByaZ18oZV9v6shZBi0svAqi65aYRawWW06efM+mP/b9BNA37kRGNvxkd KRA= Received: from uls-op-cesaip01.wdc.com ([10.248.3.36]) by uls-op-cesaep01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 15 Feb 2023 05:48:19 -0800 IronPort-SDR: VssUs9Y5crXmt+qmrFIruSFYxxUtI9WKARl5Fjvkk112h4QMCrQ+Gck0RoD8Oxr1kRWVExcq6D quV/UE3pVqlinHCPkDXZRzEzej7hbF2F1LwYblLv/8mht+qiHDBh9OUUimtxIprp2yZkVvcU80 CJR6TeochM9W0T8oi2iGsXYdwTzxatZcVoau7rn4v7h8PKfnu4TjSuoDbG8QenMtD5Isqv5mZM TKCOxk1oGmur7Luvh9R154tlXebChMwVIuC2rdAWUeXMdSs5vPF6PUhjXaziJFtmL8KWpopz0o 2po= WDCIronportException: Internal Received: from unknown (HELO redsun91.ssa.fujisawa.hgst.com) ([10.149.66.72]) by uls-op-cesaip01.wdc.com with ESMTP; 15 Feb 2023 06:31:13 -0800 From: Johannes Thumshirn To: linux-btrfs@vger.kernel.org Cc: Johannes Thumshirn Subject: [PATCH v2 1/6] btrfs-progs: add raid-stripe-tree definitions Date: Wed, 15 Feb 2023 06:31:04 -0800 Message-Id: <20230215143109.2721722-2-johannes.thumshirn@wdc.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20230215143109.2721722-1-johannes.thumshirn@wdc.com> References: <20230215143109.2721722-1-johannes.thumshirn@wdc.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Add the definitions for the on-disk format of the RAID stripe tree. Signed-off-by: Johannes Thumshirn --- kernel-shared/ctree.h | 41 ++++++++++++++++++++++++++++++++++++++ kernel-shared/print-tree.c | 1 + 2 files changed, 42 insertions(+) diff --git a/kernel-shared/ctree.h b/kernel-shared/ctree.h index a969125e0e36..a91c7dac4403 100644 --- a/kernel-shared/ctree.h +++ b/kernel-shared/ctree.h @@ -292,6 +292,18 @@ struct btrfs_chunk { /* additional stripes go here */ } __attribute__ ((__packed__)); +struct btrfs_raid_stride { + /* btrfs device-id this raid extent lives on */ + __le64 devid; + /* offset from the devextent start */ + __le64 offset; +} __attribute__ ((__packed__)); + +struct btrfs_stripe_extent { + /* array of raid strides this stripe is comprised of */ + struct btrfs_raid_stride strides; +} __attribute__ ((__packed__)); + #define BTRFS_FREE_SPACE_EXTENT 1 #define BTRFS_FREE_SPACE_BITMAP 2 @@ -515,6 +527,7 @@ BUILD_ASSERT(sizeof(struct btrfs_super_block) == BTRFS_SUPER_INFO_SIZE); #define BTRFS_FEATURE_INCOMPAT_RAID1C34 (1ULL << 11) #define BTRFS_FEATURE_INCOMPAT_ZONED (1ULL << 12) #define BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2 (1ULL << 13) +#define BTRFS_FEATURE_INCOMPAT_RAID_STRIPE_TREE (1ULL << 14) #define BTRFS_FEATURE_COMPAT_SUPP 0ULL @@ -1761,6 +1774,34 @@ BTRFS_SETGET_FUNCS(free_space_extent_count, struct btrfs_free_space_info, extent_count, 32); BTRFS_SETGET_FUNCS(free_space_flags, struct btrfs_free_space_info, flags, 32); +/* struct btrfs_stripe_extent */ +BTRFS_SETGET_FUNCS(raid_stride_devid, struct btrfs_raid_stride, devid, 64); +BTRFS_SETGET_FUNCS(raid_stride_offset, struct btrfs_raid_stride, offset, 64); + +static inline struct btrfs_raid_stride *btrfs_raid_stride_nr( + struct btrfs_stripe_extent *dps, + int nr) +{ + unsigned long offset = (unsigned long)dps; + offset += offsetof(struct btrfs_stripe_extent, strides); + offset += nr * sizeof(struct btrfs_raid_stride); + return (struct btrfs_raid_stride *)offset; +} + +static inline u64 btrfs_raid_stride_devid_nr(struct extent_buffer *eb, + struct btrfs_stripe_extent *dps, + int nr) +{ + return btrfs_raid_stride_devid(eb, btrfs_raid_stride_nr(dps, nr)); +} + +static inline u64 btrfs_raid_stride_offset_nr(struct extent_buffer *eb, + struct btrfs_stripe_extent *dps, + int nr) +{ + return btrfs_raid_stride_offset(eb, btrfs_raid_stride_nr(dps, nr)); +} + /* struct btrfs_inode_ref */ BTRFS_SETGET_FUNCS(inode_ref_name_len, struct btrfs_inode_ref, name_len, 16); BTRFS_SETGET_STACK_FUNCS(stack_inode_ref_name_len, struct btrfs_inode_ref, name_len, 16); diff --git a/kernel-shared/print-tree.c b/kernel-shared/print-tree.c index ba1caa88fcf1..78e6aa2dcd5a 100644 --- a/kernel-shared/print-tree.c +++ b/kernel-shared/print-tree.c @@ -1691,6 +1691,7 @@ static struct readable_flag_entry incompat_flags_array[] = { DEF_INCOMPAT_FLAG_ENTRY(RAID1C34), DEF_INCOMPAT_FLAG_ENTRY(ZONED), DEF_INCOMPAT_FLAG_ENTRY(EXTENT_TREE_V2), + DEF_INCOMPAT_FLAG_ENTRY(RAID_STRIPE_TREE), }; static const int incompat_flags_num = sizeof(incompat_flags_array) / sizeof(struct readable_flag_entry); From patchwork Wed Feb 15 14:31:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johannes Thumshirn X-Patchwork-Id: 13141730 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 E6770C64EC4 for ; Wed, 15 Feb 2023 14:31:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229672AbjBOObY (ORCPT ); Wed, 15 Feb 2023 09:31:24 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59474 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229652AbjBOObV (ORCPT ); Wed, 15 Feb 2023 09:31:21 -0500 Received: from esa6.hgst.iphmx.com (esa6.hgst.iphmx.com [216.71.154.45]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6132E36685 for ; Wed, 15 Feb 2023 06:31:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1676471475; x=1708007475; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=k4TMuTD5kAQ7AQKNfm0FN1sj8dRuM6RB+2txzcfxk/4=; b=cBzs6RBLFG7s6KVUgzhqtsn5+FSPY/Ra36iAEaRes8YcmA2TNNSCiiAC BfVVBxhwr589VlpssSyvE8QRO0nI2tbaDdmpagPytJn03zB/LaJvMBpeB +aYsCcMR25R1Zj5oNXTFPw6D2k233u5WcxQ9GIXfhylJ/nLvCWRJLh+UC +QMlKrAN6NTeLgkxz2umUG8Yw+dIQrf3cswSzNy0rK/0enl+I7SGSiQdQ ydzqMEZOcnpIb2GZDRNxGJBQGgM/yVfNRP39ZyL6ileWwexvDE6DzPPa5 K/MjiD5kGHNd+ThHEHkmSMWFrGxjCywu/kOzc/d4zXiJqx3wvItpXR+08 Q==; X-IronPort-AV: E=Sophos;i="5.97,299,1669046400"; d="scan'208";a="223393909" Received: from h199-255-45-14.hgst.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 15 Feb 2023 22:31:13 +0800 IronPort-SDR: b/qSPktTES6bsn0DBmGOv2poX+nNPf3Ig7buFg9lC8S9UH6YlbtZRbykBNNzcIsPXKUJV9Hn/T Lpz5bqv6J9Rpmkkt6mVvPVTwvlAghMTmWRYnZzgb2ewwwEM8JoQ1fH4kcgvjwpXvN4p/HwHjS+ q2DoIxIXPOB85a8kKGPzpxbcjFAGdRT2CbuKnkw4nEISDx3VwNBMpAn3c/ajb9kRZTSBLHMtcP CCqrR2ltpKdVkVc6ulznnklHfy5URKR2xckZ3rdfHKuq+gFm4XrAzB+ejnB+94a8x0Cw+aCYHJ iKo= Received: from uls-op-cesaip01.wdc.com ([10.248.3.36]) by uls-op-cesaep01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 15 Feb 2023 05:48:19 -0800 IronPort-SDR: cyOT1EeiBTCLelQ0fGZGecO/vXQSXfXo9KglNCVfdNcX5M8oeU6lAHbehfqIIe+gocbf5e8CIe Pse4mA4QNkehcaiyr2rHlocTUqNA6wrQWw6u6GndcAeofpwR0GnWpgKww0BrNhRKhs54nbTw/p MLo3BTlROU5c8ASYqC8yQPwIXKjb2j7up4JutY9YOPzOU32cpyNQxq1HjeVWJ0e0yQKHnQ3vyN GX93TWTSUEnwAPe24AHDV8WFiwHxaJc93kGgOXhQJHOyGhfOwf/7glMYbLGxIxbx4dElabUSxh CXs= WDCIronportException: Internal Received: from unknown (HELO redsun91.ssa.fujisawa.hgst.com) ([10.149.66.72]) by uls-op-cesaip01.wdc.com with ESMTP; 15 Feb 2023 06:31:13 -0800 From: Johannes Thumshirn To: linux-btrfs@vger.kernel.org Cc: Johannes Thumshirn Subject: [PATCH v2 2/6] btrfs-progs: read fs with stripe tree from disk Date: Wed, 15 Feb 2023 06:31:05 -0800 Message-Id: <20230215143109.2721722-3-johannes.thumshirn@wdc.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20230215143109.2721722-1-johannes.thumshirn@wdc.com> References: <20230215143109.2721722-1-johannes.thumshirn@wdc.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org When encountering a filesystem formatted with the raid stripe tree feature, read it from disk. Signed-off-by: Johannes Thumshirn --- kernel-shared/ctree.h | 4 ++++ kernel-shared/disk-io.c | 32 +++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/kernel-shared/ctree.h b/kernel-shared/ctree.h index a91c7dac4403..ab6b20a1abca 100644 --- a/kernel-shared/ctree.h +++ b/kernel-shared/ctree.h @@ -80,6 +80,9 @@ struct btrfs_free_space_ctl; /* hold the block group items. */ #define BTRFS_BLOCK_GROUP_TREE_OBJECTID 11ULL +/* holds raid stripe entries */ +#define BTRFS_RAID_STRIPE_TREE_OBJECTID 12ULL + /* device stats in the device tree */ #define BTRFS_DEV_STATS_OBJECTID 0ULL @@ -1214,6 +1217,7 @@ struct btrfs_fs_info { struct btrfs_root *quota_root; struct btrfs_root *uuid_root; struct btrfs_root *block_group_root; + struct btrfs_root *stripe_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 4050566a8b48..f4f9a4792d29 100644 --- a/kernel-shared/disk-io.c +++ b/kernel-shared/disk-io.c @@ -800,6 +800,12 @@ struct btrfs_root *btrfs_read_fs_root(struct btrfs_fs_info *fs_info, return fs_info->block_group_root ? fs_info->block_group_root : ERR_PTR(-ENOENT); +#if EXPERIMENTAL + if (location->objectid == BTRFS_RAID_STRIPE_TREE_OBJECTID) + return fs_info->stripe_root ? fs_info->stripe_root : + ERR_PTR(-ENOENT); +#endif + BUG_ON(location->objectid == BTRFS_TREE_RELOC_OBJECTID); node = rb_search(&fs_info->fs_root_tree, (void *)&objectid, @@ -832,6 +838,9 @@ void btrfs_free_fs_info(struct btrfs_fs_info *fs_info) if (fs_info->quota_root) free(fs_info->quota_root); + if (fs_info->stripe_root) + free(fs_info->stripe_root); + free_global_roots_tree(&fs_info->global_roots_tree); free(fs_info->tree_root); free(fs_info->chunk_root); @@ -856,12 +865,14 @@ struct btrfs_fs_info *btrfs_new_fs_info(int writable, u64 sb_bytenr) fs_info->dev_root = calloc(1, sizeof(struct btrfs_root)); fs_info->quota_root = calloc(1, sizeof(struct btrfs_root)); fs_info->uuid_root = calloc(1, sizeof(struct btrfs_root)); + fs_info->stripe_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->block_group_root || !fs_info->super_copy) + !fs_info->block_group_root || !fs_info->super_copy || + !fs_info->stripe_root) goto free_all; extent_buffer_init_cache(fs_info); @@ -1270,6 +1281,23 @@ int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info, u64 root_tree_bytenr, return -EIO; } +#if EXPERIMENTAL + if (btrfs_fs_incompat(fs_info, RAID_STRIPE_TREE)) { + ret = btrfs_find_and_setup_root(root, fs_info, + BTRFS_RAID_STRIPE_TREE_OBJECTID, + fs_info->stripe_root); + if (ret) { + free(fs_info->stripe_root); + fs_info->stripe_root = NULL; + } else { + fs_info->stripe_root->track_dirty = 1; + } + } else { + free(fs_info->stripe_root); + fs_info->stripe_root = NULL; + } +#endif + if (maybe_load_block_groups(fs_info, flags)) { ret = btrfs_read_block_groups(fs_info); /* @@ -1327,6 +1355,8 @@ void btrfs_release_all_roots(struct btrfs_fs_info *fs_info) free_extent_buffer(fs_info->chunk_root->node); if (fs_info->uuid_root) free_extent_buffer(fs_info->uuid_root->node); + if (fs_info->stripe_root) + free_extent_buffer(fs_info->stripe_root->node); } static void free_map_lookup(struct cache_extent *ce) From patchwork Wed Feb 15 14:31:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johannes Thumshirn X-Patchwork-Id: 13141731 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 19ED1C636CC for ; Wed, 15 Feb 2023 14:31:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229632AbjBOObZ (ORCPT ); Wed, 15 Feb 2023 09:31:25 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59492 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229670AbjBOObX (ORCPT ); Wed, 15 Feb 2023 09:31:23 -0500 Received: from esa6.hgst.iphmx.com (esa6.hgst.iphmx.com [216.71.154.45]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 59B1238B53 for ; Wed, 15 Feb 2023 06:31:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1676471481; x=1708007481; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=WRtiSJO75ebZn8ltuTIySQlqT+20ngqQqnNsQlEx4zw=; b=DQzAgPXHUK8MJmsNTzITwfFxFO/OK8zcU8D/Z0j6wsB0hI2xgkOPEhOS rUKUxzZpnFFkYsnSMl9HS5Cd3QLz9Eo3PTR+oZQ2kyjMxndRTr7pdKAJf rt/3KiaUFLYMA3kz656Gqm9nIYhhkEuuhzzW34NcRezwASOz4r6brTiBd oXahkgTZKfp0Ent9HpWUgOE+RA2pBm/xmVPHafAp7mwkA+itAEejOXqyY IOZPoQsAGUciUkXRJQ16iIVc9zUof+0kddt8KSj5H/2bNnW4hiV5KbcjQ jQacvSSVcPP/NoghjAvNX/CsG3jRyxSZkedzNIJo9HcNpAJHCubv2dg8v Q==; X-IronPort-AV: E=Sophos;i="5.97,299,1669046400"; d="scan'208";a="223393913" Received: from h199-255-45-14.hgst.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 15 Feb 2023 22:31:14 +0800 IronPort-SDR: YGcBdK+FL46TMRqC7HPKwaaZXKeqdAeEKST+aM5dKTrpWfAcN8HJltM3GRPIxyI2OlCNY5xrKB BooOuozLf3/QbTdUenK2elNvIGw7qVkDw3PFTcRiqr427ZPGEuZmXhOI/6kGFEDClj3e+Sejpv APx+cRmZZSdwkqijcTQZNhlnE+Puy938Ftk2md3U4ipW/lG+wIb6mkEGRefB8pLRowq5JwGrc+ RWxWW8+0yx84zFsLCWqQRlekry1Pbo7s68jwbUPPqEMfyyWc5oq2ISWVO5qAso9kAuSWqNylBh Yxo= Received: from uls-op-cesaip01.wdc.com ([10.248.3.36]) by uls-op-cesaep01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 15 Feb 2023 05:48:20 -0800 IronPort-SDR: cy4aamJFLe+Ayx3T6LPFAqiIcTEIPTbahwdjypRVZV6XDbNZcW8hkrOogr//sctBlzptHmIAkU cNv1ri1QpuxSU9d6D9AyWxeFadHOQlERYwYrgm734UeCBB2GOSJgTyKEhO3hL3CEK8F0zDczVA iYFRiluXr0xmW2D0bZrkp3aCBXpjeKILl013THSJ9a36g2zz3k8PO/DQuLxhjgfAZg6GUjfB7M azxG+VukjEnyO9S5Fklzrm7/K+MiZznkgHvc30mmnoFubr98xXHbQm0CwWo5wGUsed8mavURHJ cuw= WDCIronportException: Internal Received: from unknown (HELO redsun91.ssa.fujisawa.hgst.com) ([10.149.66.72]) by uls-op-cesaip01.wdc.com with ESMTP; 15 Feb 2023 06:31:14 -0800 From: Johannes Thumshirn To: linux-btrfs@vger.kernel.org Cc: Johannes Thumshirn Subject: [PATCH v2 3/6] btrfs-progs: add dump tree support for the raid stripe tree Date: Wed, 15 Feb 2023 06:31:06 -0800 Message-Id: <20230215143109.2721722-4-johannes.thumshirn@wdc.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20230215143109.2721722-1-johannes.thumshirn@wdc.com> References: <20230215143109.2721722-1-johannes.thumshirn@wdc.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Add support for the RAID stripe tree to btrfs inspect-internal dump-tree. Signed-off-by: Johannes Thumshirn --- cmds/inspect-dump-tree.c | 5 +++++ kernel-shared/ctree.h | 3 +++ kernel-shared/print-tree.c | 23 +++++++++++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/cmds/inspect-dump-tree.c b/cmds/inspect-dump-tree.c index 8f28779c6d2f..a0c9163884d7 100644 --- a/cmds/inspect-dump-tree.c +++ b/cmds/inspect-dump-tree.c @@ -169,6 +169,7 @@ static u64 treeid_from_string(const char *str, const char **end) { "TREE_RELOC", BTRFS_TREE_RELOC_OBJECTID }, { "DATA_RELOC", BTRFS_DATA_RELOC_TREE_OBJECTID }, { "BLOCK_GROUP_TREE", BTRFS_BLOCK_GROUP_TREE_OBJECTID }, + { "RAID_STRIPE", BTRFS_RAID_STRIPE_TREE_OBJECTID }, }; if (strncasecmp("BTRFS_", str, strlen("BTRFS_")) == 0) @@ -724,6 +725,10 @@ again: if (!skip) pr_verbose(LOG_DEFAULT, "block group"); break; + case BTRFS_RAID_STRIPE_TREE_OBJECTID: + if (!skip) + printf("raid stripe"); + break; default: if (!skip) { pr_verbose(LOG_DEFAULT, "file"); diff --git a/kernel-shared/ctree.h b/kernel-shared/ctree.h index ab6b20a1abca..a9bb6eb39752 100644 --- a/kernel-shared/ctree.h +++ b/kernel-shared/ctree.h @@ -1503,6 +1503,9 @@ static inline u32 BTRFS_MAX_XATTR_SIZE(const struct btrfs_fs_info *info) #define BTRFS_QGROUP_LIMIT_KEY 244 #define BTRFS_QGROUP_RELATION_KEY 246 + +#define BTRFS_RAID_STRIPE_KEY 247 + /* * Obsolete name, see BTRFS_TEMPORARY_ITEM_KEY. */ diff --git a/kernel-shared/print-tree.c b/kernel-shared/print-tree.c index 78e6aa2dcd5a..d6706f683bc1 100644 --- a/kernel-shared/print-tree.c +++ b/kernel-shared/print-tree.c @@ -635,6 +635,22 @@ static void print_free_space_header(struct extent_buffer *leaf, int slot) (unsigned long long)btrfs_free_space_bitmaps(leaf, header)); } +static void print_raid_stripe_key(struct extent_buffer *eb, + u32 item_size, + struct btrfs_stripe_extent *stripe) +{ + int num_stripes; + int i; + + num_stripes = (item_size - offsetof(struct btrfs_stripe_extent, strides)) / + sizeof(struct btrfs_raid_stride); + + for (i = 0; i < num_stripes; i++) + printf("\t\t\tstripe %d devid %llu offset %llu\n", i, + (unsigned long long)btrfs_raid_stride_devid_nr(eb, stripe, i), + (unsigned long long)btrfs_raid_stride_offset_nr(eb, stripe, i)); +} + void print_key_type(FILE *stream, u64 objectid, u8 type) { static const char* key_to_str[256] = { @@ -679,6 +695,7 @@ void print_key_type(FILE *stream, u64 objectid, u8 type) [BTRFS_PERSISTENT_ITEM_KEY] = "PERSISTENT_ITEM", [BTRFS_UUID_KEY_SUBVOL] = "UUID_KEY_SUBVOL", [BTRFS_UUID_KEY_RECEIVED_SUBVOL] = "UUID_KEY_RECEIVED_SUBVOL", + [BTRFS_RAID_STRIPE_KEY] = "RAID_STRIPE_KEY", }; if (type == 0 && objectid == BTRFS_FREE_SPACE_OBJECTID) { @@ -788,6 +805,9 @@ void print_objectid(FILE *stream, u64 objectid, u8 type) case BTRFS_BLOCK_GROUP_TREE_OBJECTID: fprintf(stream, "BLOCK_GROUP_TREE"); break; + case BTRFS_RAID_STRIPE_TREE_OBJECTID: + fprintf(stream, "RAID_STRIPE_TREE"); + break; case (u64)-1: fprintf(stream, "-1"); break; @@ -1454,6 +1474,9 @@ void btrfs_print_leaf(struct extent_buffer *eb, unsigned int mode) case BTRFS_TEMPORARY_ITEM_KEY: print_temporary_item(eb, ptr, objectid, offset); break; + case BTRFS_RAID_STRIPE_KEY: + print_raid_stripe_key(eb, item_size, ptr); + break; }; fflush(stdout); } From patchwork Wed Feb 15 14:31:07 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johannes Thumshirn X-Patchwork-Id: 13141733 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 AD6D6C64EC4 for ; Wed, 15 Feb 2023 14:31:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229592AbjBOOb1 (ORCPT ); Wed, 15 Feb 2023 09:31:27 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59526 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229679AbjBOObX (ORCPT ); Wed, 15 Feb 2023 09:31:23 -0500 Received: from esa6.hgst.iphmx.com (esa6.hgst.iphmx.com [216.71.154.45]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5C85138B55 for ; Wed, 15 Feb 2023 06:31:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1676471481; x=1708007481; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=fMIiQTrI/2Ssh3uyoT3ZTUAoTdNt3Yd9TyQ7h3/8LPs=; b=j80J13Q8hophbWmvZHRumntAFYIwoCkAuEizyxJCPc3mILrBOdAES/Ly OXXAdN4jnwn5WlWvYmGGow6BUVJ/qDZROCrgro3UyIqB8QjOGmIAWduCs xsigenlbrYSgkIdQqCUkTJ3vbNK4XH11YGobtt8ZJ5r34iuae0FEF7Fk6 XktrbHnyZv6g1McAONvqQeY7N+aqjipZJLqfQG0W1hMxCBpNMH9JFRpuG Q8bJyYaFF6D95o7dKtxNTkiRORUV8jnSqNQL1/+ao+iHRTnAQ7exvn8Gk 7HCMsyqSNId4+LCsGIi5/lUTR5239J2+B2YAMuSzIMnq5cUyaEIDBjXdB Q==; X-IronPort-AV: E=Sophos;i="5.97,299,1669046400"; d="scan'208";a="223393918" Received: from h199-255-45-14.hgst.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 15 Feb 2023 22:31:14 +0800 IronPort-SDR: tGOIFkZa+aMXM8OyG9SjygYLvds41VNmqs8IIe/PnBzf05HpXxgFZHKnVq9UhTAZ+XIapfAGV3 SgcENXW+ul9Lj1CpCDQmTIB599R82lhCll10YfFtRJ0iC3rHhrtbU8VkES3Opcv7IOQ2I99WNQ gjpTV86Mg6Eka3aCG7BTTsGHaEfrgnuN1mvHjuLWevb0Jt2+sDnzn1wxI9LayYt5rahJBpBRCX 2/a1aoqzpDosuKjcugh6Rf5WK2Skq7qldRn+iggW2ZXR9S464VqxcLU9aOmeap3OT8+UffS2ve icI= Received: from uls-op-cesaip01.wdc.com ([10.248.3.36]) by uls-op-cesaep01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 15 Feb 2023 05:48:21 -0800 IronPort-SDR: wzFGQxWX/BZGO6CJnxN+FyqFAjX8wMerlX2WrZUK3UpBRjI7aTHjfIho91/e/fDP2NMSg2pDua jUC8tAcbLxL6aGpZFHG+WJCTnBn4S4tqXFLzayQf+jT6URA3z2WjqMC/+Lxzy9tIN5W9aOkiBs BjzU2vvaK3TN7+sEE/ZN/ICTXpaPUShbjlZ27WWM67Ke3BIrObkC0feDPegA05Vu1QS1VxaC73 RalucPqDx+aKQjwlOkFO6LQMt5v2vrVKY9xR4LITwOrazOGWmtQUjNA8Mk+G+cniMv5jRwbkq+ uKs= WDCIronportException: Internal Received: from unknown (HELO redsun91.ssa.fujisawa.hgst.com) ([10.149.66.72]) by uls-op-cesaip01.wdc.com with ESMTP; 15 Feb 2023 06:31:14 -0800 From: Johannes Thumshirn To: linux-btrfs@vger.kernel.org Cc: Johannes Thumshirn Subject: [PATCH v2 4/6] btrfs-progs: read stripe tree when mapping blocks Date: Wed, 15 Feb 2023 06:31:07 -0800 Message-Id: <20230215143109.2721722-5-johannes.thumshirn@wdc.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20230215143109.2721722-1-johannes.thumshirn@wdc.com> References: <20230215143109.2721722-1-johannes.thumshirn@wdc.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Signed-off-by: Johannes Thumshirn --- kernel-shared/volumes.c | 116 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 113 insertions(+), 3 deletions(-) diff --git a/kernel-shared/volumes.c b/kernel-shared/volumes.c index 65147d064934..466c0382bf10 100644 --- a/kernel-shared/volumes.c +++ b/kernel-shared/volumes.c @@ -1795,6 +1795,105 @@ int btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, multi_ret, mirror_num, raid_map_ret); } +static bool btrfs_need_stripe_tree_update(struct btrfs_fs_info *fs_info, + u64 map_type) +{ +#if EXPERIMENTAL + const bool is_data = (map_type & BTRFS_BLOCK_GROUP_DATA); + + if (!btrfs_fs_incompat(fs_info, RAID_STRIPE_TREE)) + return false; + + if (!fs_info->stripe_root) + return false; + + if (!is_data) + return false; + + if (map_type & BTRFS_BLOCK_GROUP_DUP) + return true; + + if (map_type & BTRFS_BLOCK_GROUP_RAID1_MASK) + return true; + + if (map_type & BTRFS_BLOCK_GROUP_RAID0) + return true; + + if (map_type & BTRFS_BLOCK_GROUP_RAID10) + return true; + +#endif + return false; +} + +static int btrfs_stripe_tree_logical_to_physical(struct btrfs_fs_info *fs_info, + u64 logical, + struct btrfs_bio_stripe *stripe) +{ + struct btrfs_root *root = fs_info->stripe_root; + struct btrfs_path path = { 0 }; + struct btrfs_key key; + struct extent_buffer *leaf; + int slot; + int ret; + + key.objectid = logical; + key.type = BTRFS_RAID_STRIPE_KEY; + key.offset = 0; + + ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0); + if (ret < 0) + return ret; + + while (1) { + struct btrfs_key found_key; + struct btrfs_stripe_extent *extent; + int num_stripes; + u32 item_size; + int i; + + leaf = path.nodes[0]; + slot = path.slots[0]; + + if (slot >= btrfs_header_nritems(leaf)) { + ret = btrfs_next_leaf(root, &path); + if (ret == 0) + continue; + if (ret < 0) + goto error; + break; + } + + btrfs_item_key_to_cpu(leaf, &found_key, slot); + + if (found_key.type != BTRFS_RAID_STRIPE_KEY) + goto next; + + extent = btrfs_item_ptr(leaf, slot, + struct btrfs_stripe_extent); + item_size = btrfs_item_size(leaf, slot); + num_stripes = (item_size - + offsetof(struct btrfs_stripe_extent, strides)) / + sizeof(struct btrfs_raid_stride); + + for (i = 0; i < num_stripes; i++) { + if (stripe->dev->devid != + btrfs_raid_stride_devid_nr(leaf, extent, i)) + continue; + stripe->physical = btrfs_raid_stride_offset_nr(leaf, extent, i); + btrfs_release_path(&path); + return 0; + } + +next: + path.slots[0]++; + } + + btrfs_release_path(&path); +error: + return ret; +} + int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, u64 logical, u64 *length, u64 *type, struct btrfs_multi_bio **multi_ret, int mirror_num, @@ -1987,10 +2086,21 @@ again: BUG_ON(stripe_index >= map->num_stripes); for (i = 0; i < multi->num_stripes; i++) { - multi->stripes[i].physical = - map->stripes[stripe_index].physical + stripe_offset + - stripe_nr * map->stripe_len; multi->stripes[i].dev = map->stripes[stripe_index].dev; + + if (stripes_allocated && + btrfs_need_stripe_tree_update(fs_info, map->type)) { + int ret; + + ret = btrfs_stripe_tree_logical_to_physical(fs_info, logical, + &multi->stripes[i]); + if (ret) + return ret; + } else { + multi->stripes[i].physical = + map->stripes[stripe_index].physical + + stripe_offset + stripe_nr * map->stripe_len; + } stripe_index++; } *multi_ret = multi; From patchwork Wed Feb 15 14:31:08 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johannes Thumshirn X-Patchwork-Id: 13141732 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 E62F3C636D4 for ; Wed, 15 Feb 2023 14:31:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229683AbjBOOb0 (ORCPT ); Wed, 15 Feb 2023 09:31:26 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59528 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229592AbjBOObX (ORCPT ); Wed, 15 Feb 2023 09:31:23 -0500 Received: from esa6.hgst.iphmx.com (esa6.hgst.iphmx.com [216.71.154.45]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DE81C38B57 for ; Wed, 15 Feb 2023 06:31:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1676471481; x=1708007481; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=u95jO6mXgW1aRkfnKEmm6qy9fm5sQOtKImE++W0MI1I=; b=HQny/LkxKvTRxvwehEWeS//yppehJJk09BkTCocowsGKlofiHEE4kgG9 unuomAUBl3VJs5jsaCBmqkF2peP2Mvwt2YYeO6bZJYy6QGwGd58w6ITIN haPdd1BzAb+p2wVcD/cBM5FcDoCLDIE2e2kzP6gXzG6lRChad4LpMxPk5 f4HM5RcGJSbi2FdsY/Nd8PIXquJ6bqBsxxrUWhIDL3pJ91P6C2cfgFoYZ AuyvtLvVfI2Z3VBppnphNfhMVhTTcOevat3URcPlRM/LBMI+ZcJvdqnvh ybFR9uc/ZAJcafiahRdcILyZC0iIo70TXFbNiN/7cvkhcVq4oXc+Nxoe2 w==; X-IronPort-AV: E=Sophos;i="5.97,299,1669046400"; d="scan'208";a="223393922" Received: from h199-255-45-14.hgst.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 15 Feb 2023 22:31:15 +0800 IronPort-SDR: 9Cp6ULydp5lLtZwFAB929l1wAsg68bY2+WA28jh3UhT4BIKSejbmgUiYQpalh9S69E+epRn6xw Q5iJiOKukKJdKlmPk/0cEwsAAbqeBffcm16GHOu3+fgRPIZDrNA5WRBtpD0xH16JKgtLuMvItL TARgSozANnZ70RMKXCqAfgaFWpJo5eaTQa2dnd8SIPJ/k1OYn3XEMACymiR4q1hFZB6zlOmZAD 44qgrDpAhI51bPa6HbREt6sOHtl3GLZZ2Vdf4nrsv/wko2K8LWWU/M5IqHKBhsTmHcByKs5AEg AA8= Received: from uls-op-cesaip01.wdc.com ([10.248.3.36]) by uls-op-cesaep01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 15 Feb 2023 05:48:21 -0800 IronPort-SDR: bhI0O7Me3OLlRYiIu57YfJ2E1WVmgi8DU5lizu3jxbFXhWEUlSdeIa5ASfIBhQHfOV6xZEgk/6 Dmu92mKshRH6QUhUjwAgLZesCH06hFdidwoX0Tm2RUmBFRb/QIFxEJ5N1Vk5fI8IO+SiQIZjhh rEkF92qev/0jdRnrh4IXeYBJADzLJFC50CV2cjmRTM4GldjAvrQ7QoznaTjNCPPHYh7W5zNrhR 4Sx3mSJqktHrakHcWLTlXkYmhYMOj1SpE983Re4W/smSSroYwi7y9X15R0KvZehxYC1irHB2gm k7Y= WDCIronportException: Internal Received: from unknown (HELO redsun91.ssa.fujisawa.hgst.com) ([10.149.66.72]) by uls-op-cesaip01.wdc.com with ESMTP; 15 Feb 2023 06:31:15 -0800 From: Johannes Thumshirn To: linux-btrfs@vger.kernel.org Cc: Johannes Thumshirn Subject: [PATCH v2 5/6] btrfs-progs: load zone info for all zoned devices Date: Wed, 15 Feb 2023 06:31:08 -0800 Message-Id: <20230215143109.2721722-6-johannes.thumshirn@wdc.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20230215143109.2721722-1-johannes.thumshirn@wdc.com> References: <20230215143109.2721722-1-johannes.thumshirn@wdc.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Signed-off-by: Johannes Thumshirn --- mkfs/main.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mkfs/main.c b/mkfs/main.c index df091b16760c..f4ff2c58a81f 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -1667,6 +1667,10 @@ int BOX_MAIN(mkfs)(int argc, char **argv) } } + + if (opt_zoned) + btrfs_get_dev_zone_info_all_devices(fs_info); + raid_groups: ret = create_raid_groups(trans, root, data_profile, metadata_profile, mixed, &allocation); From patchwork Wed Feb 15 14:31:09 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johannes Thumshirn X-Patchwork-Id: 13141734 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 90301C636D7 for ; Wed, 15 Feb 2023 14:31:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229687AbjBOOb2 (ORCPT ); Wed, 15 Feb 2023 09:31:28 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59502 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229653AbjBOObY (ORCPT ); Wed, 15 Feb 2023 09:31:24 -0500 Received: from esa6.hgst.iphmx.com (esa6.hgst.iphmx.com [216.71.154.45]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7032336685 for ; Wed, 15 Feb 2023 06:31:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1676471483; x=1708007483; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=blfcU0s5Kw+ypvhMtDL0LEuaz785wjuRoja2kAmzW8s=; b=oyv02dqPSqM+OgScRKOiOOkLtG/DZK7VynXYtazvOeTia1eFUy+jyZEG UWgnQiXO9QF/Ov8MrcD+8KJyd13RFgnHFQXwd+vo65V7qDnex7gTdjlRz Br/i9DJGl2O98ZWQLiGdOnHgP+ymriTvfetYjFOjd6LCj/KFwN8207hbY //q3sQgQKx1b/AThTVTYOsVAbd1bSqZwK4OmmFrvBYl/aBdnBbNzdrpoX bSNinAhzmcsBJgnGU4M8DfC2wRtxaWQPZTehrNtwrLEg8vmhG/7ktSLfM ssKhbhwim3jKm50McXuVGVjmiP77bFymdBpXxYGa2h+qQNrvH+LYrOIYm g==; X-IronPort-AV: E=Sophos;i="5.97,299,1669046400"; d="scan'208";a="223393923" Received: from h199-255-45-14.hgst.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 15 Feb 2023 22:31:16 +0800 IronPort-SDR: dK+PlJN1Rgdt6YHaIdiWMsfSn/rMa6XGJRpvJpkBDYspunMd/82d4K7UuQ4zylCY2MWVXV33Vh NrpP52NR45P4k0+ERnWoLxhfdBXn7JK1DZVtBfjlvNTU/m8442DJDvPIGPUVPWqusTH4MLiIJ1 bs5YPEmLJ4RenFVQYaZFr/oylkxd0zL3Y05zNy5L+O3VdpRKJR4pFUVDxrJHfLDHdNH7I0g7BQ kkcR+6CoLWQskSNdi0mWxfRwsMxEH5gD2IbO3bi6/O0tET23nFbTEShFVab6Iy9B3ARqRS1qzn qag= Received: from uls-op-cesaip01.wdc.com ([10.248.3.36]) by uls-op-cesaep01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 15 Feb 2023 05:48:22 -0800 IronPort-SDR: ggSoVIMjoLL7u+EjSIAtGysv+h4WQIyE5ulNOWzat2UEw0reH2BXhZDifUpb7T8UrhRioHRm0v Y+OvduBQcV1UUKXOFcSK6cknl4IziaOiCfVfXo/qBE9esXtlm7NM7ZXSXeoSYT4p+c13mjlI7y KKgfaHKUUwC1clr669TAjFB6oZ24UOfaj0JN+AT3mLjJOL1SBtgqwGMjd9eSZvknTzP9DSG9Ht hOvB0slG0mLPfRiw88rTN4iYiISbK7xUTMqVUArigY3nnoaFFMKAemKSDBBSTHwdTC+jHBUah7 n7U= WDCIronportException: Internal Received: from unknown (HELO redsun91.ssa.fujisawa.hgst.com) ([10.149.66.72]) by uls-op-cesaip01.wdc.com with ESMTP; 15 Feb 2023 06:31:16 -0800 From: Johannes Thumshirn To: linux-btrfs@vger.kernel.org Cc: Johannes Thumshirn Subject: [PATCH v2 6/6] btrfs-progs: allow zoned RAID Date: Wed, 15 Feb 2023 06:31:09 -0800 Message-Id: <20230215143109.2721722-7-johannes.thumshirn@wdc.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20230215143109.2721722-1-johannes.thumshirn@wdc.com> References: <20230215143109.2721722-1-johannes.thumshirn@wdc.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Allow for RAID levels 0, 1 and 10 on zoned devices if the RAID stripe tree is used. Signed-off-by: Johannes Thumshirn --- common/fsfeatures.c | 8 +++++ kernel-shared/ctree.h | 3 +- kernel-shared/zoned.c | 35 ++++++++++++++++-- kernel-shared/zoned.h | 4 +-- mkfs/main.c | 82 ++++++++++++++++++++++++++++++++++++++++--- 5 files changed, 122 insertions(+), 10 deletions(-) diff --git a/common/fsfeatures.c b/common/fsfeatures.c index 169e47e92582..d18226f43d7c 100644 --- a/common/fsfeatures.c +++ b/common/fsfeatures.c @@ -195,6 +195,14 @@ static const struct btrfs_feature mkfs_features[] = { VERSION_NULL(safe), VERSION_NULL(default), .desc = "new extent tree format" + } , { + .name = "raid-stripe-tree", + .incompat_flag = BTRFS_FEATURE_INCOMPAT_RAID_STRIPE_TREE, + .sysfs_name = NULL, + VERSION_NULL(compat), + VERSION_NULL(safe), + VERSION_NULL(default), + .desc = "raid stripe tree" }, #endif /* Keep this one last */ diff --git a/kernel-shared/ctree.h b/kernel-shared/ctree.h index a9bb6eb39752..0fb5014d0696 100644 --- a/kernel-shared/ctree.h +++ b/kernel-shared/ctree.h @@ -560,7 +560,8 @@ BUILD_ASSERT(sizeof(struct btrfs_super_block) == BTRFS_SUPER_INFO_SIZE); BTRFS_FEATURE_INCOMPAT_RAID1C34 | \ BTRFS_FEATURE_INCOMPAT_METADATA_UUID | \ BTRFS_FEATURE_INCOMPAT_ZONED | \ - BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2) + BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2 | \ + BTRFS_FEATURE_INCOMPAT_RAID_STRIPE_TREE) #else #define BTRFS_FEATURE_INCOMPAT_SUPP \ (BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF | \ diff --git a/kernel-shared/zoned.c b/kernel-shared/zoned.c index a79fc6a5dbc3..4f07384817aa 100644 --- a/kernel-shared/zoned.c +++ b/kernel-shared/zoned.c @@ -795,7 +795,7 @@ out: return ret; } -bool zoned_profile_supported(u64 map_type) +bool zoned_profile_supported(u64 map_type, bool rst) { bool data = (map_type & BTRFS_BLOCK_GROUP_DATA); u64 flags = (map_type & BTRFS_BLOCK_GROUP_PROFILE_MASK); @@ -804,9 +804,37 @@ bool zoned_profile_supported(u64 map_type) if (flags == 0) return true; - /* We can support DUP on metadata */ +#if EXPERIMENTAL + if (data) { + if ((flags & BTRFS_BLOCK_GROUP_DUP) && rst) + return true; + /* Data RAID1 needs a raid-stripe-tree */ + if ((flags & BTRFS_BLOCK_GROUP_RAID1_MASK) && rst) + return true; + /* Data RAID0 needs a raid-stripe-tree */ + if ((flags & BTRFS_BLOCK_GROUP_RAID0) && rst) + return true; + /* Data RAID10 needs a raid-stripe-tree */ + if ((flags & BTRFS_BLOCK_GROUP_RAID10) && rst) + return true; + } else { + /* We can support DUP on metadata/system */ + if (flags & BTRFS_BLOCK_GROUP_DUP) + return true; + /* We can support RAID1 on metadata/system */ + if (flags & BTRFS_BLOCK_GROUP_RAID1_MASK) + return true; + /* We can support RAID0 on metadata/system */ + if (flags & BTRFS_BLOCK_GROUP_RAID0) + return true; + /* We can support RAID10 on metadata/system */ + if (flags & BTRFS_BLOCK_GROUP_RAID10) + return true; + } +#else if (!data && (flags & BTRFS_BLOCK_GROUP_DUP)) return true; +#endif /* All other profiles are not supported yet */ return false; @@ -923,7 +951,8 @@ int btrfs_load_block_group_zone_info(struct btrfs_fs_info *fs_info, } } - if (!zoned_profile_supported(map->type)) { + if (!zoned_profile_supported(map->type, + btrfs_fs_incompat(fs_info, RAID_STRIPE_TREE))) { error("zoned: profile %s not yet supported", btrfs_group_profile_str(map->type)); ret = -EINVAL; diff --git a/kernel-shared/zoned.h b/kernel-shared/zoned.h index cc0d6b6f166d..c56788bcf07b 100644 --- a/kernel-shared/zoned.h +++ b/kernel-shared/zoned.h @@ -132,7 +132,7 @@ static inline bool btrfs_dev_is_empty_zone(struct btrfs_device *device, u64 pos) return zinfo->zones[zno].cond == BLK_ZONE_COND_EMPTY; } -bool zoned_profile_supported(u64 map_type); +bool zoned_profile_supported(u64 map_type, bool rst); int btrfs_reset_dev_zone(int fd, struct blk_zone *zone); u64 btrfs_find_allocatable_zones(struct btrfs_device *device, u64 hole_start, u64 hole_end, u64 num_bytes); @@ -213,7 +213,7 @@ static inline int btrfs_wipe_temporary_sb(struct btrfs_fs_devices *fs_devices) return 0; } -static inline bool zoned_profile_supported(u64 map_type) +static inline bool zoned_profile_supported(u64 map_type, bool rst) { return false; } diff --git a/mkfs/main.c b/mkfs/main.c index f4ff2c58a81f..a8a370d1c4df 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -958,6 +958,38 @@ fail: return ret; } +static int setup_raid_stripe_tree_root(struct btrfs_fs_info *fs_info) +{ + struct btrfs_trans_handle *trans; + struct btrfs_root *stripe_root; + struct btrfs_key key = { + .objectid = BTRFS_RAID_STRIPE_TREE_OBJECTID, + .type = BTRFS_ROOT_ITEM_KEY, + }; + int ret; + + trans = btrfs_start_transaction(fs_info->tree_root, 0); + if (IS_ERR(trans)) + return PTR_ERR(trans); + + stripe_root = btrfs_create_tree(trans, fs_info, &key); + if (IS_ERR(stripe_root)) { + ret = PTR_ERR(stripe_root); + goto abort; + } + fs_info->stripe_root = stripe_root; + add_root_to_dirty_list(stripe_root); + + ret = btrfs_commit_transaction(trans, fs_info->tree_root); + if (ret) + return ret; + + return 0; +abort: + btrfs_abort_transaction(trans, ret); + return ret; +} + /* Thread callback for device preparation */ static void *prepare_one_device(void *ctx) { @@ -1356,10 +1388,12 @@ int BOX_MAIN(mkfs)(int argc, char **argv) exit(1); } +#if !defined(EXPERIMENTAL) if (features.incompat_flags & BTRFS_FEATURE_INCOMPAT_RAID56) { error("cannot enable RAID5/6 in zoned mode"); exit(1); } +#endif } if (btrfs_check_nodesize(nodesize, sectorsize, &features)) @@ -1464,10 +1498,40 @@ int BOX_MAIN(mkfs)(int argc, char **argv) if (ret) goto error; - if (opt_zoned && (!zoned_profile_supported(BTRFS_BLOCK_GROUP_METADATA | metadata_profile) || - !zoned_profile_supported(BTRFS_BLOCK_GROUP_DATA | data_profile))) { - error("zoned mode does not yet support RAID/DUP profiles, please specify '-d single -m single' manually"); - goto error; +#if EXPERIMENTAL + if (opt_zoned && device_count) { + switch (data_profile & BTRFS_BLOCK_GROUP_PROFILE_MASK) { + case BTRFS_BLOCK_GROUP_DUP: + case BTRFS_BLOCK_GROUP_RAID1: + case BTRFS_BLOCK_GROUP_RAID1C3: + case BTRFS_BLOCK_GROUP_RAID1C4: + case BTRFS_BLOCK_GROUP_RAID0: + case BTRFS_BLOCK_GROUP_RAID10: + case BTRFS_BLOCK_GROUP_RAID56_MASK: + features.incompat_flags |= + BTRFS_FEATURE_INCOMPAT_RAID_STRIPE_TREE; + break; + default: + break; + } + } +#endif + + if (opt_zoned) { + u64 metadata = BTRFS_BLOCK_GROUP_METADATA | metadata_profile; + u64 data = BTRFS_BLOCK_GROUP_DATA | data_profile; +#if EXPERIMENTAL + bool rst = features.incompat_flags & + BTRFS_FEATURE_INCOMPAT_RAID_STRIPE_TREE; +#else + bool rst = false; +#endif + + if (!zoned_profile_supported(metadata, rst) || + !zoned_profile_supported(data, rst)) { + error("zoned mode does not yet support RAID/DUP profiles, please specify '-d single -m single' manually"); + goto error; + } } t_prepare = calloc(device_count, sizeof(*t_prepare)); @@ -1755,6 +1819,16 @@ raid_groups: goto out; } } + if (features.incompat_flags & BTRFS_FEATURE_INCOMPAT_RAID_STRIPE_TREE) { + ret = setup_raid_stripe_tree_root(fs_info); + if (ret < 0) { + error("failed to initialize raid-stripe-tree: %d (%m)", + ret); + goto out; + } + } + + if (bconf.verbose) { char features_buf[BTRFS_FEATURE_STRING_BUF_SIZE];