Re: [RFC ONLY 1/8] btrfs: add raid stripe tree definitions

Qu Wenruo
2022-05-17T07:42:03Z

On 2022/5/16 22:31, Johannes Thumshirn wrote:
> Add definitions for the raid-stripe-tree. This tree will hold informatioin
> about the on-disk layout of the stripes in a RAID set.
>
> Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
> ---
> fs/btrfs/ctree.h | 28 ++++++++++++++++++++++++++++
> include/uapi/linux/btrfs_tree.h | 17 +++++++++++++++++
> 2 files changed, 45 insertions(+)
>
> diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
> index 7328fb17b7f5..20aa2ebac7cd 100644
> --- a/fs/btrfs/ctree.h
> +++ b/fs/btrfs/ctree.h
> @@ -1878,6 +1878,34 @@ BTRFS_SETGET_FUNCS(timespec_nsec, struct btrfs_timespec, nsec, 32);
> BTRFS_SETGET_STACK_FUNCS(stack_timespec_sec, struct btrfs_timespec, sec, 64);
> BTRFS_SETGET_STACK_FUNCS(stack_timespec_nsec, struct btrfs_timespec, nsec, 32);
>
> +BTRFS_SETGET_FUNCS(stripe_extent_devid, struct btrfs_stripe_extent, devid, 64);
> +BTRFS_SETGET_FUNCS(stripe_extent_offset, struct btrfs_stripe_extent, offset, 64);
> +BTRFS_SETGET_STACK_FUNCS(stack_stripe_extent_devid, struct btrfs_stripe_extent, devid, 64);
> +BTRFS_SETGET_STACK_FUNCS(stack_stripe_extent_offset, struct btrfs_stripe_extent, offset, 64);
> +
> +static inline struct btrfs_stripe_extent *btrfs_stripe_extent_nr(
> + struct btrfs_dp_stripe *dps, int nr)
> +{
> + unsigned long offset = (unsigned long)dps;
> + offset += offsetof(struct btrfs_dp_stripe, extents);
> + offset += nr * sizeof(struct btrfs_stripe_extent);
> + return (struct btrfs_stripe_extent *)offset;
> +}
> +
> +static inline u64 btrfs_stripe_extent_devid_nr(const struct extent_buffer *eb,
> + struct btrfs_dp_stripe *dps,
> + int nr)
> +{
> + return btrfs_stripe_extent_devid(eb, btrfs_stripe_extent_nr(dps, nr));
> +}
> +
> +static inline u64 btrfs_stripe_extent_offset_nr(const struct extent_buffer *eb,
> + struct btrfs_dp_stripe *dps,
> + int nr)
> +{
> + return btrfs_stripe_extent_offset(eb, btrfs_stripe_extent_nr(dps, nr));
> +}
> +
> /* struct btrfs_dev_extent */
> BTRFS_SETGET_FUNCS(dev_extent_chunk_tree, struct btrfs_dev_extent,
> chunk_tree, 64);
> diff --git a/include/uapi/linux/btrfs_tree.h b/include/uapi/linux/btrfs_tree.h
> index b069752a8ecf..a2d28d83cc96 100644
> --- a/include/uapi/linux/btrfs_tree.h
> +++ b/include/uapi/linux/btrfs_tree.h
> @@ -56,6 +56,9 @@
> /* Holds the block group items for extent tree v2. */
> #define BTRFS_BLOCK_GROUP_TREE_OBJECTID 11ULL
>
> +/* tracks RAID stripes in block groups. */
> +#define BTRFS_RAID_STRIPE_TREE_OBJECTID 12ULL
> +
> /* device stats in the device tree */
> #define BTRFS_DEV_STATS_OBJECTID 0ULL
>
> @@ -264,6 +267,8 @@
> */
> #define BTRFS_QGROUP_RELATION_KEY 246
>
> +#define BTRFS_RAID_STRIPE_KEY 247
> +
> /*
> * Obsolete name, see BTRFS_TEMPORARY_ITEM_KEY.
> */
> @@ -488,6 +493,18 @@ struct btrfs_free_space_header {
> __le64 num_bitmaps;
> } __attribute__ ((__packed__));
>
> +struct btrfs_stripe_extent {
> + /* btrfs device-id this raid extent lives on */
> + __le64 devid;
> + /* offset from the devextent start */
> + __le64 offset;

Considering we have 1G stripe length limit (at least for now), u32 may
be large enough?

Although u64 is definitely future proof.

> +} __attribute__ ((__packed__));
> +

Mind to mention the key format?

My guess is, it's (<logical bytenr>, BTRFS_RAID_STRIPE_KEY, <length>)?

Thanks,
Qu

> +struct btrfs_dp_stripe {
> + /* array of stripe extents this stripe is comprised of */
> + struct btrfs_stripe_extent extents;
> +} __attribute__ ((__packed__));
> +
> #define BTRFS_HEADER_FLAG_WRITTEN (1ULL << 0)
> #define BTRFS_HEADER_FLAG_RELOC (1ULL << 1)
>