From: Johannes Thumshirn <johannes.thumshirn@wdc.com>
To: David Sterba <dsterba@suse.com>
Cc: linux-btrfs@vger.kernel.org,
Johannes Thumshirn <johannes.thumshirn@wdc.com>
Subject: [PATCH v4 4/6] btrfs-progs: allow zoned RAID
Date: Thu, 14 Sep 2023 09:05:35 -0700 [thread overview]
Message-ID: <20230914-raid-stripe-tree-v4-4-c921c15ec052@wdc.com> (raw)
In-Reply-To: <20230914-raid-stripe-tree-v4-0-c921c15ec052@wdc.com>
Allow for RAID levels 0, 1 and 10 on zoned devices if the RAID stripe tree
is used.
Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
common/fsfeatures.c | 8 ++++++
kernel-shared/ctree.h | 3 +-
kernel-shared/zoned.c | 34 ++++++++++++++++++++--
kernel-shared/zoned.h | 4 +--
mkfs/main.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++---
5 files changed, 118 insertions(+), 10 deletions(-)
diff --git a/common/fsfeatures.c b/common/fsfeatures.c
index 00658fa5159f..2658f5072af4 100644
--- a/common/fsfeatures.c
+++ b/common/fsfeatures.c
@@ -189,6 +189,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 de09c15ca0eb..f6ee467adaab 100644
--- a/kernel-shared/ctree.h
+++ b/kernel-shared/ctree.h
@@ -102,7 +102,8 @@ static inline u32 __BTRFS_LEAF_DATA_SIZE(u32 nodesize)
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 d187c5763406..d8fad4319e44 100644
--- a/kernel-shared/zoned.c
+++ b/kernel-shared/zoned.c
@@ -737,7 +737,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);
@@ -746,9 +746,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;
@@ -863,7 +891,7 @@ 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, !!fs_info->stripe_root)) {
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 9e4162cf25c5..6efc60281bc9 100644
--- a/kernel-shared/zoned.h
+++ b/kernel-shared/zoned.h
@@ -133,7 +133,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);
@@ -214,7 +214,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 7acd39ec6531..7d07ba1e7001 100644
--- a/mkfs/main.c
+++ b/mkfs/main.c
@@ -962,6 +962,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)
{
@@ -1472,10 +1504,39 @@ 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:
+ 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));
@@ -1585,6 +1646,15 @@ int BOX_MAIN(mkfs)(int argc, char **argv)
goto error;
}
+ 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;
+ }
+ }
+
trans = btrfs_start_transaction(root, 1);
if (IS_ERR(trans)) {
errno = -PTR_ERR(trans);
@@ -1750,6 +1820,7 @@ raid_groups:
goto out;
}
}
+
if (bconf.verbose) {
char features_buf[BTRFS_FEATURE_STRING_BUF_SIZE];
--
2.41.0
next prev parent reply other threads:[~2023-09-14 16:05 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-14 16:05 [PATCH v4 0/6] btrfs-progs: add support for RAID stripe tree Johannes Thumshirn
2023-09-14 16:05 ` [PATCH v4 1/6] btrfs-progs: add raid-stripe-tree definitions Johannes Thumshirn
2023-09-14 16:05 ` [PATCH v4 2/6] btrfs-progs: read fs with stripe tree from disk Johannes Thumshirn
2023-09-14 16:05 ` [PATCH v4 3/6] btrfs-progs: add dump tree support for the raid stripe tree Johannes Thumshirn
2023-09-14 16:05 ` Johannes Thumshirn [this message]
2023-09-14 16:05 ` [PATCH v4 5/6] btrfs-progs: load zone info for all zoned devices Johannes Thumshirn
2023-09-14 16:05 ` [PATCH v4 6/6] btrfs-progs: read stripe tree when mapping blocks Johannes Thumshirn
2023-09-14 18:43 ` [PATCH v4 0/6] btrfs-progs: add support for RAID stripe tree David Sterba
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230914-raid-stripe-tree-v4-4-c921c15ec052@wdc.com \
--to=johannes.thumshirn@wdc.com \
--cc=dsterba@suse.com \
--cc=linux-btrfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).