xref: /linux/fs/btrfs/raid-stripe-tree.h (revision d0fde6aae2bacdc024fff43461ba0f325375fa97)
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 #define BTRFS_RST_SUPP_BLOCK_GROUP_MASK    (BTRFS_BLOCK_GROUP_DUP |		\
10 					    BTRFS_BLOCK_GROUP_RAID1_MASK |	\
11 					    BTRFS_BLOCK_GROUP_RAID0 |		\
12 					    BTRFS_BLOCK_GROUP_RAID10)
13 
14 struct btrfs_io_context;
15 struct btrfs_io_stripe;
16 struct btrfs_ordered_extent;
17 struct btrfs_trans_handle;
18 
19 int btrfs_delete_raid_extent(struct btrfs_trans_handle *trans, u64 start, u64 length);
20 int btrfs_get_raid_extent_offset(struct btrfs_fs_info *fs_info,
21 				 u64 logical, u64 *length, u64 map_type,
22 				 u32 stripe_index, struct btrfs_io_stripe *stripe);
23 int btrfs_insert_raid_extent(struct btrfs_trans_handle *trans,
24 			     struct btrfs_ordered_extent *ordered_extent);
25 
26 static inline bool btrfs_need_stripe_tree_update(struct btrfs_fs_info *fs_info,
27 						 u64 map_type)
28 {
29 	u64 type = map_type & BTRFS_BLOCK_GROUP_TYPE_MASK;
30 	u64 profile = map_type & BTRFS_BLOCK_GROUP_PROFILE_MASK;
31 
32 	if (!btrfs_fs_incompat(fs_info, RAID_STRIPE_TREE))
33 		return false;
34 
35 	if (type != BTRFS_BLOCK_GROUP_DATA)
36 		return false;
37 
38 	if (profile & BTRFS_RST_SUPP_BLOCK_GROUP_MASK)
39 		return true;
40 
41 	return false;
42 }
43 
44 static inline int btrfs_num_raid_stripes(u32 item_size)
45 {
46 	return (item_size - offsetof(struct btrfs_stripe_extent, strides)) /
47 		sizeof(struct btrfs_raid_stride);
48 }
49 
50 #endif
51