From: Boris Burkov <boris@bur.io>
To: Mark Harmstone <mark@harmstone.com>
Cc: linux-btrfs@vger.kernel.org
Subject: Re: [PATCH v4 03/16] btrfs: allow remapped chunks to have zero stripes
Date: Fri, 31 Oct 2025 14:39:58 -0700 [thread overview]
Message-ID: <aQUsoIndrcguYvO0@devvm12410.ftw0.facebook.com> (raw)
In-Reply-To: <20251024181227.32228-4-mark@harmstone.com>
On Fri, Oct 24, 2025 at 07:12:04PM +0100, Mark Harmstone wrote:
> When a chunk has been fully remapped, we are going to set its
> num_stripes to 0, as it will no longer represent a physical location on
> disk.
>
> Change tree-checker to allow for this, and fix read_one_chunk() to avoid
> a divide by zero.
>
> Signed-off-by: Mark Harmstone <mark@harmstone.com>
Reviewed-by: Boris Burkov <boris@bur.io>
> ---
> fs/btrfs/tree-checker.c | 65 ++++++++++++++++++++++++++++-------------
> fs/btrfs/volumes.c | 7 ++++-
> 2 files changed, 51 insertions(+), 21 deletions(-)
>
> diff --git a/fs/btrfs/tree-checker.c b/fs/btrfs/tree-checker.c
> index 681c5c7fae35..b6827c2a7815 100644
> --- a/fs/btrfs/tree-checker.c
> +++ b/fs/btrfs/tree-checker.c
> @@ -816,6 +816,41 @@ static void chunk_err(const struct btrfs_fs_info *fs_info,
> va_end(args);
> }
>
> +static bool valid_stripe_count(u64 profile, u16 num_stripes,
> + u16 sub_stripes)
> +{
> + switch (profile) {
> + case BTRFS_BLOCK_GROUP_RAID0:
> + return true;
> + case BTRFS_BLOCK_GROUP_RAID10:
> + return sub_stripes ==
> + btrfs_raid_array[BTRFS_RAID_RAID10].sub_stripes;
> + case BTRFS_BLOCK_GROUP_RAID1:
> + return num_stripes ==
> + btrfs_raid_array[BTRFS_RAID_RAID1].devs_min;
> + case BTRFS_BLOCK_GROUP_RAID1C3:
> + return num_stripes ==
> + btrfs_raid_array[BTRFS_RAID_RAID1C3].devs_min;
> + case BTRFS_BLOCK_GROUP_RAID1C4:
> + return num_stripes ==
> + btrfs_raid_array[BTRFS_RAID_RAID1C4].devs_min;
> + case BTRFS_BLOCK_GROUP_RAID5:
> + return num_stripes >=
> + btrfs_raid_array[BTRFS_RAID_RAID5].devs_min;
> + case BTRFS_BLOCK_GROUP_RAID6:
> + return num_stripes >=
> + btrfs_raid_array[BTRFS_RAID_RAID6].devs_min;
> + case BTRFS_BLOCK_GROUP_DUP:
> + return num_stripes ==
> + btrfs_raid_array[BTRFS_RAID_DUP].dev_stripes;
> + case 0: /* SINGLE */
> + return num_stripes ==
> + btrfs_raid_array[BTRFS_RAID_SINGLE].dev_stripes;
> + default:
> + BUG();
> + }
> +}
> +
> /*
> * The common chunk check which could also work on super block sys chunk array.
> *
> @@ -839,6 +874,7 @@ int btrfs_check_chunk_valid(const struct btrfs_fs_info *fs_info,
> u64 features;
> u32 chunk_sector_size;
> bool mixed = false;
> + bool remapped;
> int raid_index;
> int nparity;
> int ncopies;
> @@ -862,12 +898,14 @@ int btrfs_check_chunk_valid(const struct btrfs_fs_info *fs_info,
> ncopies = btrfs_raid_array[raid_index].ncopies;
> nparity = btrfs_raid_array[raid_index].nparity;
>
> - if (unlikely(!num_stripes)) {
> + remapped = type & BTRFS_BLOCK_GROUP_REMAPPED;
> +
> + if (unlikely(!remapped && !num_stripes)) {
> chunk_err(fs_info, leaf, chunk, logical,
> "invalid chunk num_stripes, have %u", num_stripes);
> return -EUCLEAN;
> }
> - if (unlikely(num_stripes < ncopies)) {
> + if (unlikely(num_stripes != 0 && num_stripes < ncopies)) {
> chunk_err(fs_info, leaf, chunk, logical,
> "invalid chunk num_stripes < ncopies, have %u < %d",
> num_stripes, ncopies);
> @@ -965,22 +1003,9 @@ int btrfs_check_chunk_valid(const struct btrfs_fs_info *fs_info,
> }
> }
>
> - if (unlikely((type & BTRFS_BLOCK_GROUP_RAID10 &&
> - sub_stripes != btrfs_raid_array[BTRFS_RAID_RAID10].sub_stripes) ||
> - (type & BTRFS_BLOCK_GROUP_RAID1 &&
> - num_stripes != btrfs_raid_array[BTRFS_RAID_RAID1].devs_min) ||
> - (type & BTRFS_BLOCK_GROUP_RAID1C3 &&
> - num_stripes != btrfs_raid_array[BTRFS_RAID_RAID1C3].devs_min) ||
> - (type & BTRFS_BLOCK_GROUP_RAID1C4 &&
> - num_stripes != btrfs_raid_array[BTRFS_RAID_RAID1C4].devs_min) ||
> - (type & BTRFS_BLOCK_GROUP_RAID5 &&
> - num_stripes < btrfs_raid_array[BTRFS_RAID_RAID5].devs_min) ||
> - (type & BTRFS_BLOCK_GROUP_RAID6 &&
> - num_stripes < btrfs_raid_array[BTRFS_RAID_RAID6].devs_min) ||
> - (type & BTRFS_BLOCK_GROUP_DUP &&
> - num_stripes != btrfs_raid_array[BTRFS_RAID_DUP].dev_stripes) ||
> - ((type & BTRFS_BLOCK_GROUP_PROFILE_MASK) == 0 &&
> - num_stripes != btrfs_raid_array[BTRFS_RAID_SINGLE].dev_stripes))) {
> + if (!remapped &&
> + !valid_stripe_count(type & BTRFS_BLOCK_GROUP_PROFILE_MASK,
> + num_stripes, sub_stripes)) {
> chunk_err(fs_info, leaf, chunk, logical,
> "invalid num_stripes:sub_stripes %u:%u for profile %llu",
> num_stripes, sub_stripes,
> @@ -1004,11 +1029,11 @@ static int check_leaf_chunk_item(struct extent_buffer *leaf,
> struct btrfs_fs_info *fs_info = leaf->fs_info;
> int num_stripes;
>
> - if (unlikely(btrfs_item_size(leaf, slot) < sizeof(struct btrfs_chunk))) {
> + if (unlikely(btrfs_item_size(leaf, slot) < offsetof(struct btrfs_chunk, stripe))) {
> chunk_err(fs_info, leaf, chunk, key->offset,
> "invalid chunk item size: have %u expect [%zu, %u)",
> btrfs_item_size(leaf, slot),
> - sizeof(struct btrfs_chunk),
> + offsetof(struct btrfs_chunk, stripe),
> BTRFS_LEAF_DATA_SIZE(fs_info));
> return -EUCLEAN;
> }
> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
> index 82b8189f3e81..8a9bff0426ae 100644
> --- a/fs/btrfs/volumes.c
> +++ b/fs/btrfs/volumes.c
> @@ -7059,7 +7059,12 @@ static int read_one_chunk(struct btrfs_key *key, struct extent_buffer *leaf,
> */
> map->sub_stripes = btrfs_raid_array[index].sub_stripes;
> map->verified_stripes = 0;
> - map->stripe_size = btrfs_calc_stripe_length(map);
> +
> + if (num_stripes > 0)
> + map->stripe_size = btrfs_calc_stripe_length(map);
> + else
> + map->stripe_size = 0;
> +
> for (i = 0; i < num_stripes; i++) {
> map->stripes[i].physical =
> btrfs_stripe_offset_nr(leaf, chunk, i);
> --
> 2.49.1
>
next prev parent reply other threads:[~2025-10-31 21:40 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-24 18:12 [PATCH v4 00/16] Remap tree Mark Harmstone
2025-10-24 18:12 ` [PATCH v4 01/16] btrfs: add definitions and constants for remap-tree Mark Harmstone
2025-10-31 22:50 ` Boris Burkov
2025-11-03 12:18 ` Mark Harmstone
2025-10-24 18:12 ` [PATCH v4 02/16] btrfs: add REMAP chunk type Mark Harmstone
2025-10-24 18:12 ` [PATCH v4 03/16] btrfs: allow remapped chunks to have zero stripes Mark Harmstone
2025-10-31 21:39 ` Boris Burkov [this message]
2025-10-24 18:12 ` [PATCH v4 04/16] btrfs: remove remapped block groups from the free-space tree Mark Harmstone
2025-10-31 21:44 ` Boris Burkov
2025-11-03 12:39 ` Mark Harmstone
2025-10-24 18:12 ` [PATCH v4 05/16] btrfs: don't add metadata items for the remap tree to the extent tree Mark Harmstone
2025-10-24 18:12 ` [PATCH v4 06/16] btrfs: add extended version of struct block_group_item Mark Harmstone
2025-10-31 21:47 ` Boris Burkov
2025-10-24 18:12 ` [PATCH v4 07/16] btrfs: allow mounting filesystems with remap-tree incompat flag Mark Harmstone
2025-10-24 18:12 ` [PATCH v4 08/16] btrfs: redirect I/O for remapped block groups Mark Harmstone
2025-10-31 22:03 ` Boris Burkov
2025-10-24 18:12 ` [PATCH v4 09/16] btrfs: handle deletions from remapped block group Mark Harmstone
2025-10-31 23:05 ` Boris Burkov
2025-11-03 15:51 ` Mark Harmstone
2025-10-31 23:30 ` Boris Burkov
2025-11-04 12:30 ` Mark Harmstone
2025-10-24 18:12 ` [PATCH v4 10/16] btrfs: handle setting up relocation of block group with remap-tree Mark Harmstone
2025-10-31 23:43 ` Boris Burkov
2025-11-03 18:45 ` Mark Harmstone
2025-10-24 18:12 ` [PATCH v4 11/16] btrfs: move existing remaps before relocating block group Mark Harmstone
2025-11-01 0:02 ` Boris Burkov
2025-11-04 13:00 ` Mark Harmstone
2025-11-01 0:10 ` Boris Burkov
2025-10-24 18:12 ` [PATCH v4 12/16] btrfs: replace identity remaps with actual remaps when doing relocations Mark Harmstone
2025-11-01 0:09 ` Boris Burkov
2025-11-04 14:31 ` Mark Harmstone
2025-10-24 18:12 ` [PATCH v4 13/16] btrfs: add do_remap param to btrfs_discard_extent() Mark Harmstone
2025-11-01 0:12 ` Boris Burkov
2025-10-24 18:12 ` [PATCH v4 14/16] btrfs: allow balancing remap tree Mark Harmstone
2025-10-24 18:12 ` [PATCH v4 15/16] btrfs: handle discarding fully-remapped block groups Mark Harmstone
2025-10-27 16:04 ` kernel test robot
2025-10-31 22:12 ` Boris Burkov
2025-11-03 16:49 ` Mark Harmstone
2025-11-09 8:42 ` Philip Li
2025-10-31 22:11 ` Boris Burkov
2025-11-03 17:01 ` Mark Harmstone
2025-10-24 18:12 ` [PATCH v4 16/16] btrfs: add stripe removal pending flag Mark Harmstone
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=aQUsoIndrcguYvO0@devvm12410.ftw0.facebook.com \
--to=boris@bur.io \
--cc=linux-btrfs@vger.kernel.org \
--cc=mark@harmstone.com \
/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