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