1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright (C) 2023 Western Digital Corporation or its affiliates. 4 */ 5 6 #ifndef BTRFS_RAID_STRIPE_TREE_H 7 #define BTRFS_RAID_STRIPE_TREE_H 8 9 #include <linux/types.h> 10 #include <uapi/linux/btrfs_tree.h> 11 #include "fs.h" 12 13 #define BTRFS_RST_SUPP_BLOCK_GROUP_MASK (BTRFS_BLOCK_GROUP_DUP | \ 14 BTRFS_BLOCK_GROUP_RAID1_MASK | \ 15 BTRFS_BLOCK_GROUP_RAID0 | \ 16 BTRFS_BLOCK_GROUP_RAID10) 17 18 struct btrfs_io_context; 19 struct btrfs_io_stripe; 20 struct btrfs_fs_info; 21 struct btrfs_ordered_extent; 22 struct btrfs_trans_handle; 23 24 int btrfs_delete_raid_extent(struct btrfs_trans_handle *trans, u64 start, u64 length); 25 int btrfs_get_raid_extent_offset(struct btrfs_fs_info *fs_info, 26 u64 logical, u64 *length, u64 map_type, 27 u32 stripe_index, struct btrfs_io_stripe *stripe); 28 int btrfs_insert_raid_extent(struct btrfs_trans_handle *trans, 29 struct btrfs_ordered_extent *ordered_extent); 30 31 static inline bool btrfs_need_stripe_tree_update(struct btrfs_fs_info *fs_info, 32 u64 map_type) 33 { 34 u64 type = map_type & BTRFS_BLOCK_GROUP_TYPE_MASK; 35 u64 profile = map_type & BTRFS_BLOCK_GROUP_PROFILE_MASK; 36 37 if (!btrfs_fs_incompat(fs_info, RAID_STRIPE_TREE)) 38 return false; 39 40 if (type != BTRFS_BLOCK_GROUP_DATA) 41 return false; 42 43 if (profile & BTRFS_RST_SUPP_BLOCK_GROUP_MASK) 44 return true; 45 46 return false; 47 } 48 49 static inline int btrfs_num_raid_stripes(u32 item_size) 50 { 51 return (item_size - offsetof(struct btrfs_stripe_extent, strides)) / 52 sizeof(struct btrfs_raid_stride); 53 } 54 55 #endif 56